diff --git a/src/Makefile.in b/src/Makefile.in
index 45787c11f9e55919fad6dd6c34415990daa21a03..49fb2092e2afedff712b49e4140b5ebedcb19588 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,5 +1,5 @@
 #
-# $Id: Makefile.in,v 1.125 1999/01/24 12:02:20 hubbe Exp $
+# $Id: Makefile.in,v 1.126 1999/02/01 02:41:39 hubbe Exp $
 #
 
 # This line is needed on some machines.
@@ -392,15 +392,15 @@ TAGS:
 	etags -t *.h *.c
 
 # verify / debug
-verify_modules:
-	( cd modules ; $(MAKE) $(MAKE_FLAGS) verify )
-
 module_testsuites:
 	( cd modules ; $(MAKE) $(MAKE_FLAGS) testsuites )
 
 verify: module_testsuites testsuite master.pike
 	$(RUNPIKE) $(TMP_BINDIR)/test_pike.pike modules/*/module_testsuite testsuite 
 
+verify_installed: module_testsuites testsuite master.pike
+	$(exec_prefix)/pike $(TMP_BINDIR)/test_pike.pike modules/*/module_testsuite testsuite 
+
 check: verify
 
 sure: verify
diff --git a/src/modules/Gdbm/gdbmmod.c b/src/modules/Gdbm/gdbmmod.c
index 998ef1b9c00fae93c2f093154f9a4a20c8a90b5c..5d2a5fefb338be9268b125581b40250620b6acb5 100644
--- a/src/modules/Gdbm/gdbmmod.c
+++ b/src/modules/Gdbm/gdbmmod.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: gdbmmod.c,v 1.5 1997/08/30 22:21:49 grubba Exp $");
+RCSID("$Id: gdbmmod.c,v 1.6 1999/02/01 02:42:09 hubbe Exp $");
 #include "gdbm_machine.h"
 #include "threads.h"
 
@@ -334,7 +334,7 @@ void pike_module_init(void)
 {
 #if defined(HAVE_GDBM_H) && defined(HAVE_LIBGDBM)
   start_new_program();
-  add_storage(sizeof(struct gdbm_glue));
+  ADD_STORAGE(struct gdbm_glue);
   
   add_function("create",gdbmmod_create,"function(void|string,void|string:void)",0);
 
diff --git a/src/modules/Gmp/mpz_glue.c b/src/modules/Gmp/mpz_glue.c
index 3ddf26ccd41af982e14c69766ade2e5d97a5d412..a5b05b1248660d8712d1d641324809ffdead198c 100644
--- a/src/modules/Gmp/mpz_glue.c
+++ b/src/modules/Gmp/mpz_glue.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: mpz_glue.c,v 1.36 1998/07/19 21:57:45 nisse Exp $");
+RCSID("$Id: mpz_glue.c,v 1.37 1999/02/01 02:42:21 hubbe Exp $");
 #include "gmp_machine.h"
 
 #if defined(HAVE_GMP2_GMP_H) && defined(HAVE_LIBGMP2)
@@ -920,7 +920,7 @@ void pike_module_init(void)
 {
 #if defined(USE_GMP) || defined(USE_GMP2)
   start_new_program();
-  add_storage(sizeof(MP_INT));
+  ADD_STORAGE(MP_INT);
   
   add_function("create", mpzmod_create,
   "function(void|string|int|float|object:void)"
diff --git a/src/modules/Gz/zlibmod.c b/src/modules/Gz/zlibmod.c
index db5e04cf5fb990fda0e2df2f0a5563683906e0e5..54ac5b9a67f0e30c938b44db1fab5137734556df 100644
--- a/src/modules/Gz/zlibmod.c
+++ b/src/modules/Gz/zlibmod.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: zlibmod.c,v 1.21 1998/05/07 23:51:43 hubbe Exp $");
+RCSID("$Id: zlibmod.c,v 1.22 1999/02/01 02:42:32 hubbe Exp $");
 
 #include "zlib_machine.h"
 
@@ -377,7 +377,7 @@ void pike_module_init(void)
 {
 #ifdef HAVE_ZLIB_H
   start_new_program();
-  add_storage(sizeof(struct zipper));
+  ADD_STORAGE(struct zipper);
   
   add_function("create",gz_deflate_create,"function(int|void:void)",0);
   add_function("deflate",gz_deflate,"function(string,int|void:string)",0);
@@ -393,7 +393,7 @@ void pike_module_init(void)
   end_class("deflate",0);
 
   start_new_program();
-  add_storage(sizeof(struct zipper));
+  ADD_STORAGE(struct zipper);
   
   add_function("create",gz_inflate_create,"function(int|void:void)",0);
   add_function("inflate",gz_inflate,"function(string:string)",0);
diff --git a/src/modules/Image/colors.c b/src/modules/Image/colors.c
index 7edc22ec4eb47b8d204d8ded467facd5f8406780..89637b31cfb20cfb318b23ce591ff0b6a766ced5 100644
--- a/src/modules/Image/colors.c
+++ b/src/modules/Image/colors.c
@@ -1,7 +1,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: colors.c,v 1.7 1999/01/26 02:02:31 mirar Exp $
+**!	$Id: colors.c,v 1.8 1999/02/01 02:43:09 hubbe Exp $
 **! submodule color
 **!
 **!	This module keeps names and easy handling 
@@ -97,7 +97,7 @@
 #include "global.h"
 #include <config.h>
 
-RCSID("$Id: colors.c,v 1.7 1999/01/26 02:02:31 mirar Exp $");
+RCSID("$Id: colors.c,v 1.8 1999/02/01 02:43:09 hubbe Exp $");
 
 #include "config.h"
 
@@ -1392,7 +1392,7 @@ void init_image_colors(void)
 
    start_new_program();
 
-   add_storage(sizeof(struct color_struct));
+   ADD_STORAGE(struct color_struct);
    set_init_callback(init_color_struct);
    set_exit_callback(exit_color_struct);
 
diff --git a/src/modules/Image/colortable.c b/src/modules/Image/colortable.c
index 8ee2d5d56a4a1aff46bd29dc77d62c75b4433736..62842f7bceef4322faba066c80892922e0f9db0f 100644
--- a/src/modules/Image/colortable.c
+++ b/src/modules/Image/colortable.c
@@ -1,12 +1,12 @@
 #include "global.h"
 #include <config.h>
 
-/* $Id: colortable.c,v 1.46 1998/04/30 00:00:57 mirar Exp $ */
+/* $Id: colortable.c,v 1.47 1999/02/01 02:43:10 hubbe Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: colortable.c,v 1.46 1998/04/30 00:00:57 mirar Exp $
+**!	$Id: colortable.c,v 1.47 1999/02/01 02:43:10 hubbe Exp $
 **! class colortable
 **!
 **!	This object keeps colortable information,
@@ -21,7 +21,7 @@
 #undef COLORTABLE_DEBUG
 #undef COLORTABLE_REDUCE_DEBUG
 
-RCSID("$Id: colortable.c,v 1.46 1998/04/30 00:00:57 mirar Exp $");
+RCSID("$Id: colortable.c,v 1.47 1999/02/01 02:43:10 hubbe Exp $");
 
 #include <math.h> /* fabs() */
 
@@ -3911,7 +3911,7 @@ void image_colortable_image(INT32 args)
 void init_colortable_programs(void)
 {
    start_new_program();
-   add_storage(sizeof(struct neo_colortable));
+   ADD_STORAGE(struct neo_colortable);
 
    set_init_callback(init_colortable_struct);
 
diff --git a/src/modules/Image/font.c b/src/modules/Image/font.c
index 734890b9d268082c3b4c7a4cd2bf404887255c2c..a23efcd639b7a6a7523c5cd84f29dfe37027783e 100644
--- a/src/modules/Image/font.c
+++ b/src/modules/Image/font.c
@@ -1,4 +1,4 @@
-/* $Id: font.c,v 1.41 1998/11/03 08:38:05 per Exp $ */
+/* $Id: font.c,v 1.42 1999/02/01 02:43:12 hubbe Exp $ */
 #include "global.h"
 #include <config.h>
 
@@ -7,7 +7,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: font.c,v 1.41 1998/11/03 08:38:05 per Exp $
+**!	$Id: font.c,v 1.42 1999/02/01 02:43:12 hubbe Exp $
 **! class font
 **!
 **! note
@@ -881,7 +881,7 @@ int baseline();             // font baseline
 void init_font_programs(void)
 {
    start_new_program();
-   add_storage(sizeof(struct font*));
+   ADD_STORAGE(struct font*);
 
    add_function("load",font_load,
                 "function(string:object|int)",0);
diff --git a/src/modules/Image/image.c b/src/modules/Image/image.c
index 83dd67f8e93348fd05a0c147b989b62a111c0ac9..778ff9660cd01179f87fb0631938b8c7f941da76 100644
--- a/src/modules/Image/image.c
+++ b/src/modules/Image/image.c
@@ -1,9 +1,9 @@
-/* $Id: image.c,v 1.109 1999/01/26 02:23:33 mirar Exp $ */
+/* $Id: image.c,v 1.110 1999/02/01 02:43:13 hubbe Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: image.c,v 1.109 1999/01/26 02:23:33 mirar Exp $
+**!	$Id: image.c,v 1.110 1999/02/01 02:43:13 hubbe Exp $
 **! class image
 **!
 **!	The main object of the <ref>Image</ref> module, this object
@@ -97,7 +97,7 @@
 
 #include "stralloc.h"
 #include "global.h"
-RCSID("$Id: image.c,v 1.109 1999/01/26 02:23:33 mirar Exp $");
+RCSID("$Id: image.c,v 1.110 1999/02/01 02:43:13 hubbe Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -3546,7 +3546,7 @@ void pike_module_init(void)
    image_noise_init();
 
    start_new_program();
-   add_storage(sizeof(struct image));
+   ADD_STORAGE(struct image);
 
    add_function("create",image_create,
 		"function(int|void,int|void,"RGB_TYPE":void)",0);
diff --git a/src/modules/Msql/msqlmod.c b/src/modules/Msql/msqlmod.c
index cce0d7d6a5af766b342f87d9ed90c777bd18805c..7c9494e093da10d2ced73bd23def28dba14bc684 100644
--- a/src/modules/Msql/msqlmod.c
+++ b/src/modules/Msql/msqlmod.c
@@ -2,7 +2,7 @@
  * This code is (C) Francesco Chemolli, 1997.
  * You may use, modify and redistribute it freely under the terms
  * of the GNU General Public License, version 2.
- * $Id: msqlmod.c,v 1.8 1998/07/04 16:58:06 grubba Exp $
+ * $Id: msqlmod.c,v 1.9 1999/02/01 02:43:37 hubbe Exp $
  *
  * This version is intended for Pike/0.5 and later.
  * It won't compile under older versions of the Pike interpreter.
@@ -35,7 +35,7 @@
 #include "operators.h"
 #include "multiset.h"
 
-RCSID("$Id: msqlmod.c,v 1.8 1998/07/04 16:58:06 grubba Exp $");
+RCSID("$Id: msqlmod.c,v 1.9 1999/02/01 02:43:37 hubbe Exp $");
 #include "version.h"
 
 #ifdef _REENTRANT
@@ -706,7 +706,7 @@ static void do_list_index (INT32 args)
 void pike_module_init(void)
 {
 	start_new_program();
-	add_storage(sizeof(struct msql_my_data));
+	ADD_STORAGE(struct msql_my_data);
 
 	set_init_callback (msql_object_created);
 	set_exit_callback (msql_object_destroyed);
diff --git a/src/modules/Mysql/mysql.c b/src/modules/Mysql/mysql.c
index 5f91ba545e4d07d4398cdba2e41d820c58fc72d7..0082c90ecbb5448ede3b2abb1791eb2f81b0e821 100644
--- a/src/modules/Mysql/mysql.c
+++ b/src/modules/Mysql/mysql.c
@@ -1,5 +1,5 @@
 /*
- * $Id: mysql.c,v 1.24 1998/09/01 17:01:04 hubbe Exp $
+ * $Id: mysql.c,v 1.25 1999/02/01 02:43:55 hubbe Exp $
  *
  * SQL database functionality for Pike
  *
@@ -79,7 +79,7 @@ typedef struct dynamic_buffer_s dynamic_buffer;
  * Globals
  */
 
-RCSID("$Id: mysql.c,v 1.24 1998/09/01 17:01:04 hubbe Exp $");
+RCSID("$Id: mysql.c,v 1.25 1999/02/01 02:43:55 hubbe Exp $");
 
 /*
 **! module Mysql
@@ -91,7 +91,7 @@ RCSID("$Id: mysql.c,v 1.24 1998/09/01 17:01:04 hubbe Exp $");
 **! see also: Mysql.mysql, Mysql.result, Sql.sql
 **!
 **! note
-**!	$Id: mysql.c,v 1.24 1998/09/01 17:01:04 hubbe Exp $
+**!	$Id: mysql.c,v 1.25 1999/02/01 02:43:55 hubbe Exp $
 **! class mysql
 **!
 **!	Mysql.mysql is a pre-compiled Pike program. It enables
@@ -1369,7 +1369,7 @@ void pike_module_init(void)
    */
  
   start_new_program();
-  add_storage(sizeof(struct precompiled_mysql));
+  ADD_STORAGE(struct precompiled_mysql);
 
   add_function("error", f_error, "function(void:int|string)", ID_PUBLIC);
   add_function("create", f_create, "function(string|void, string|void, string|void, string|void:void)", ID_PUBLIC);
diff --git a/src/modules/Mysql/result.c b/src/modules/Mysql/result.c
index 33b9a85cfc708de763b2f2ac92b2bb5a43595497..5e8ebefc2560a844039f8223ae1c90f4690bf9c7 100644
--- a/src/modules/Mysql/result.c
+++ b/src/modules/Mysql/result.c
@@ -1,5 +1,5 @@
 /*
- * $Id: result.c,v 1.13 1998/09/01 17:01:06 hubbe Exp $
+ * $Id: result.c,v 1.14 1999/02/01 02:43:56 hubbe Exp $
  *
  * mysql query result
  *
@@ -83,7 +83,7 @@ typedef struct dynamic_buffer_s dynamic_buffer;
  * Globals
  */
 
-RCSID("$Id: result.c,v 1.13 1998/09/01 17:01:06 hubbe Exp $");
+RCSID("$Id: result.c,v 1.14 1999/02/01 02:43:56 hubbe Exp $");
 
 struct program *mysql_result_program = NULL;
 
@@ -436,7 +436,7 @@ void init_mysql_res_programs(void)
    */
  
   start_new_program();
-  add_storage(sizeof(struct precompiled_mysql_result));
+  ADD_STORAGE(struct precompiled_mysql_result);
 
   add_function("create", f_create, "function(object:void)", ID_PUBLIC);
   add_function("num_rows", f_num_rows, "function(void:int)", ID_PUBLIC);
diff --git a/src/modules/Odbc/odbc.c b/src/modules/Odbc/odbc.c
index 4d408a746f86616ba2acf0bff0470ca8ae7076ab..57fb1262bd9d3fa344ccfaaf4c02a7897712b340 100644
--- a/src/modules/Odbc/odbc.c
+++ b/src/modules/Odbc/odbc.c
@@ -1,5 +1,5 @@
 /*
- * $Id: odbc.c,v 1.12 1998/11/22 11:04:48 hubbe Exp $
+ * $Id: odbc.c,v 1.13 1999/02/01 02:44:08 hubbe Exp $
  *
  * Pike interface to ODBC compliant databases.
  *
@@ -16,7 +16,7 @@
 #include "config.h"
 #endif /* HAVE_CONFIG_H */
 
-RCSID("$Id: odbc.c,v 1.12 1998/11/22 11:04:48 hubbe Exp $");
+RCSID("$Id: odbc.c,v 1.13 1999/02/01 02:44:08 hubbe Exp $");
 
 #include "interpret.h"
 #include "object.h"
@@ -325,7 +325,7 @@ void pike_module_init(void)
   }
 
   start_new_program();
-  add_storage(sizeof(struct precompiled_odbc));
+  ADD_STORAGE(struct precompiled_odbc);
 
   add_function("error", f_error, "function(void:int|string)", ID_PUBLIC);
   add_function("create", f_create, "function(string|void, string|void, string|void, string|void:void)", ID_PUBLIC);
diff --git a/src/modules/Odbc/odbc_result.c b/src/modules/Odbc/odbc_result.c
index 195f31bc0a64c3e56c312d7e665e53cb541f5424..414ba9f1e82c4196c22e7743b65b731d4283466b 100644
--- a/src/modules/Odbc/odbc_result.c
+++ b/src/modules/Odbc/odbc_result.c
@@ -1,5 +1,5 @@
 /*
- * $Id: odbc_result.c,v 1.15 1998/10/19 00:56:27 grubba Exp $
+ * $Id: odbc_result.c,v 1.16 1999/02/01 02:44:10 hubbe Exp $
  *
  * Pike  interface to ODBC compliant databases
  *
@@ -16,7 +16,7 @@
 #include "config.h"
 #endif /* HAVE_CONFIG_H */
 
-RCSID("$Id: odbc_result.c,v 1.15 1998/10/19 00:56:27 grubba Exp $");
+RCSID("$Id: odbc_result.c,v 1.16 1999/02/01 02:44:10 hubbe Exp $");
 
 #include "interpret.h"
 #include "object.h"
@@ -491,7 +491,7 @@ void init_odbc_res_programs(void)
    */
  
   start_new_program();
-  add_storage(sizeof(struct precompiled_odbc_result));
+  ADD_STORAGE(struct precompiled_odbc_result);
 
   map_variable("_odbc", "object", 0,
 	       OFFSETOF(precompiled_odbc_result, obj), T_OBJECT);
diff --git a/src/modules/Oracle/oracle.c b/src/modules/Oracle/oracle.c
index 9503d7fca735179280e91d47a177216f6da2a867..46c1df7bf3d9ac1c980e3f7740ca3cdc1ddfada2 100644
--- a/src/modules/Oracle/oracle.c
+++ b/src/modules/Oracle/oracle.c
@@ -1,5 +1,5 @@
 /*
- * $Id: oracle.c,v 1.14 1998/07/04 17:00:25 grubba Exp $
+ * $Id: oracle.c,v 1.15 1999/02/01 02:44:20 hubbe Exp $
  *
  * Pike interface to Oracle databases.
  *
@@ -36,7 +36,7 @@
 
 #endif
 
-RCSID("$Id: oracle.c,v 1.14 1998/07/04 17:00:25 grubba Exp $");
+RCSID("$Id: oracle.c,v 1.15 1999/02/01 02:44:20 hubbe Exp $");
 
 #ifdef HAVE_ORACLE
 
@@ -702,7 +702,7 @@ void pike_module_init(void)
   /*  opinit(OCI_EV_TSF); */
 
   start_new_program();
-  add_storage(sizeof(struct dbcon));
+  ADD_STORAGE(struct dbcon);
 
   add_function("create", f_create, "function(string|void, string|void, string|void, string|void:void)", ID_PUBLIC);
   add_function("big_query", f_big_query, "function(string,mapping(int|string:int|float|string|multiset(string))|void:object)", ID_PUBLIC);
@@ -715,7 +715,7 @@ void pike_module_init(void)
   add_program_constant("oracle", oracle_program, 0);
 
   start_new_program();
-  add_storage(sizeof(struct dbresult));
+  ADD_STORAGE(struct dbresult);
 
   add_function("create", f_result_create, "function(object, array(string|int):void)", ID_PUBLIC);
   add_function("num_fields", f_num_fields, "function(:int)", ID_PUBLIC);
diff --git a/src/modules/Perl/perlmod.c b/src/modules/Perl/perlmod.c
index 73809f6f3e423513cc0d3c6e8bf3c0d0f1da8324..efaf61fec61566d2a8db9a786cf8105147f487fc 100644
--- a/src/modules/Perl/perlmod.c
+++ b/src/modules/Perl/perlmod.c
@@ -221,7 +221,7 @@ void pike_module_init(void)
 {
   perl_destruct_level=2;
   start_new_program();
-  add_storage(sizeof(struct perlmod_storage));
+  ADD_STORAGE(struct perlmod_storage);
   add_function("create",perlmod_create,"function(array(string),void|mapping(string:string):int)",0);
   add_function("run",perlmod_run,"function(:int)",0);
   add_function("eval",perlmod_eval,"function(string:int)",0);
diff --git a/src/modules/Pipe/pipe.c b/src/modules/Pipe/pipe.c
index 70e16deb9c228353261ffac0b6020b25f089b8cd..2dab0737e9b88907e6ba00e2e9628e2c16b67d32 100644
--- a/src/modules/Pipe/pipe.c
+++ b/src/modules/Pipe/pipe.c
@@ -26,7 +26,7 @@
 
 #include <fcntl.h>
 
-RCSID("$Id: pipe.c,v 1.28 1998/10/23 01:03:18 grubba Exp $");
+RCSID("$Id: pipe.c,v 1.29 1999/02/01 02:44:43 hubbe Exp $");
 
 #include "threads.h"
 #include "stralloc.h"
@@ -1241,7 +1241,7 @@ void f__pipe_debug(INT32 args)
 void pike_module_init(void)
 {
    start_new_program();
-   add_storage(sizeof(struct pipe));
+   ADD_STORAGE(struct pipe);
    add_efun("_pipe_debug", f__pipe_debug, "function(:array)", 0);
    add_function("input",pipe_input,"function(object:void)",0);
    add_function("output",pipe_output,"function(object:void)",0);
@@ -1285,7 +1285,7 @@ void pike_module_init(void)
 
 
    start_new_program();
-   add_storage(sizeof(struct output));
+   ADD_STORAGE(struct output);
    set_init_callback(init_output_struct);
    set_exit_callback(exit_output_struct);
    output_program=end_program();
diff --git a/src/modules/Postgres/pgresult.c b/src/modules/Postgres/pgresult.c
index 385d7dc2376fd72178369569e2a4b0c830d9e3aa..fe26b9f9b435c3f06740bc776fc7f61e58dbc53f 100644
--- a/src/modules/Postgres/pgresult.c
+++ b/src/modules/Postgres/pgresult.c
@@ -1,5 +1,5 @@
 /*
- * $Id: pgresult.c,v 1.8 1998/07/15 19:01:31 grubba Exp $
+ * $Id: pgresult.c,v 1.9 1999/02/01 02:45:00 hubbe Exp $
  *
  * Postgres95 support for pike/0.5 and up
  *
@@ -63,7 +63,7 @@
 #include "builtin_functions.h"
 #include "module_support.h"
 
-RCSID("$Id: pgresult.c,v 1.8 1998/07/15 19:01:31 grubba Exp $");
+RCSID("$Id: pgresult.c,v 1.9 1999/02/01 02:45:00 hubbe Exp $");
 
 #ifdef _REENTRANT
 MUTEX_T pike_postgres_result_mutex;
@@ -216,7 +216,7 @@ struct program * pgresult_program;
 void pgresult_init (void)
 {
 	start_new_program();
-	add_storage(sizeof(struct postgres_result_object_data));
+	ADD_STORAGE(struct postgres_result_object_data);
 	set_init_callback(result_create);
 	set_exit_callback(result_destroy);
 
diff --git a/src/modules/Postgres/postgres.c b/src/modules/Postgres/postgres.c
index c2391a6da9b36df765ecac4e5bf9b70e81712cc6..348646f2b771a8b9e3638c1ba2f09370ddf68c45 100644
--- a/src/modules/Postgres/postgres.c
+++ b/src/modules/Postgres/postgres.c
@@ -62,7 +62,7 @@ static void pgdebug (char * a, ...) {}
 
 struct program * postgres_program;
 
-RCSID("$Id: postgres.c,v 1.10 1998/11/22 11:05:17 hubbe Exp $");
+RCSID("$Id: postgres.c,v 1.11 1999/02/01 02:45:01 hubbe Exp $");
 
 #define THIS ((struct pgres_object_data *) fp->current_storage)
 
@@ -429,7 +429,7 @@ static void f_host_info (INT32 args)
 void pike_module_init (void)
 {
 	start_new_program();
-	add_storage(sizeof(struct pgres_object_data));
+	ADD_STORAGE(struct pgres_object_data);
 	set_init_callback(pgres_create);
 	set_exit_callback(pgres_destroy);
 
diff --git a/src/modules/Regexp/glue.c b/src/modules/Regexp/glue.c
index 567c0d6f100e96ee2ea5e05b329c0a586bd5500b..8461ea0ddcab2a60e8ee9e772aec8de0e3d16d77 100644
--- a/src/modules/Regexp/glue.c
+++ b/src/modules/Regexp/glue.c
@@ -19,7 +19,7 @@
 #include "threads.h"
 #include "module_support.h"
 
-RCSID("$Id: glue.c,v 1.12 1998/07/04 17:02:00 grubba Exp $");
+RCSID("$Id: glue.c,v 1.13 1999/02/01 02:45:11 hubbe Exp $");
 
 #ifdef USE_SYSTEM_REGEXP
 #include <regexp.h>
@@ -204,7 +204,7 @@ void pike_module_exit(void) {}
 void pike_module_init(void)
 {
   start_new_program();
-  add_storage(sizeof(struct regexp_glue));
+  ADD_STORAGE(struct regexp_glue);
   
   add_function("create",regexp_create,"function(void|string:void)",0);
   add_function("match",regexp_match,"function(string:int)",0);
diff --git a/src/modules/Ssleay/ssleay.c b/src/modules/Ssleay/ssleay.c
index 60bbcabd9f40943d40dcbbf76de1a94c988589b1..843a83fb9ce91deb771b257a29a403078c2daaaf 100644
--- a/src/modules/Ssleay/ssleay.c
+++ b/src/modules/Ssleay/ssleay.c
@@ -8,7 +8,7 @@
 
 #include "config.h"
 
-RCSID("$Id: ssleay.c,v 1.9 1998/07/04 17:02:27 grubba Exp $");
+RCSID("$Id: ssleay.c,v 1.10 1999/02/01 02:45:21 hubbe Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "stralloc.h"
@@ -281,7 +281,7 @@ void pike_module_init(void)
   ssleay_init_threads();
 #endif /* _REENTRANT */
   start_new_program();
-  add_storage(sizeof(struct ssleay_context));
+  ADD_STORAGE(struct ssleay_context);
 
   add_function("create", ssleay_create, "function(void:void)",0);
   add_function("use_certificate_file", ssleay_use_certificate_file, "function(string:void)", 0);
@@ -295,7 +295,7 @@ void pike_module_init(void)
   add_program_constant("ssleay", ssleay_program, 0);
   
   start_new_program();
-  add_storage(sizeof(struct ssleay_connection));
+  ADD_STORAGE(struct ssleay_connection);
 
   add_function("create", ssleay_connection_create, "function(object:void)",0);
   add_function("accept", ssleay_connection_accept, "function(void:int)", 0);
diff --git a/src/modules/Yp/yp.c b/src/modules/Yp/yp.c
index 90f4726174ceb232ec0f7e9d2335a34d7bd73b61..ec422ba2ebd8134171d3b10e2741414110cbea17 100644
--- a/src/modules/Yp/yp.c
+++ b/src/modules/Yp/yp.c
@@ -28,7 +28,7 @@
 #include "builtin_functions.h"
 #include "module_support.h"
 
-RCSID("$Id: yp.c,v 1.14 1998/08/08 13:56:56 grubba Exp $");
+RCSID("$Id: yp.c,v 1.15 1999/02/01 02:45:31 hubbe Exp $");
 
 #define YPERROR(fun,err) do{ if(err) error("yp->%s(): %s\n", (fun), \
                                            yperr_string(err)); }while(0)
@@ -221,7 +221,7 @@ void pike_module_init(void)
 
   start_new_program();
 
-  add_storage(sizeof(struct my_yp_domain));
+  ADD_STORAGE(struct my_yp_domain);
   
   set_init_callback( init_yp_struct );
   set_exit_callback( exit_yp_struct );
diff --git a/src/modules/_Charset/charsetmod.c b/src/modules/_Charset/charsetmod.c
index c52325f7768dc7e6af41a800e7e2336f01ae0c7d..a92eb63980b8f13e296d7c5c8c11d398cbab7c0a 100644
--- a/src/modules/_Charset/charsetmod.c
+++ b/src/modules/_Charset/charsetmod.c
@@ -3,7 +3,7 @@
 #endif /* HAVE_CONFIG_H */
 
 #include "global.h"
-RCSID("$Id: charsetmod.c,v 1.7 1999/01/05 15:38:06 marcus Exp $");
+RCSID("$Id: charsetmod.c,v 1.8 1999/02/01 02:45:42 hubbe Exp $");
 #include "program.h"
 #include "interpret.h"
 #include "stralloc.h"
@@ -1065,7 +1065,7 @@ void pike_module_init(void)
     add_program_constant("ISO2022", iso2022_program, ID_STATIC|ID_NOMASK);
 
   start_new_program();
-  add_storage(sizeof(struct std_cs_stor));
+  ADD_STORAGE(struct std_cs_stor);
   add_function("drain", f_drain, "function(:string)", 0);
   add_function("clear", f_clear, "function(:object)", 0);
   add_function("create", f_create, "function(string|void:void)", 0);
@@ -1083,7 +1083,7 @@ void pike_module_init(void)
 
   start_new_program();
   do_inherit(&prog, 0, NULL);
-  utf7_stor_offs = add_storage(sizeof(struct utf7_stor));
+  utf7_stor_offs = ADD_STORAGE(struct utf7_stor);
   add_function("feed", f_feed_utf7, "function(string:object)", 0);
   add_function("clear", f_clear_utf7, "function(:object)", 0);
   set_init_callback(utf7_init_stor);
@@ -1109,7 +1109,7 @@ void pike_module_init(void)
 
   start_new_program();
   do_inherit(&prog, 0, NULL);
-  std8e_stor_offs = add_storage(sizeof(struct std8e_stor));
+  std8e_stor_offs = ADD_STORAGE(struct std8e_stor);
   add_function("feed", f_feed_std8e, "function(string:object)", 0);
   set_init_callback(std_8bite_init_stor);
   set_exit_callback(std_8bite_exit_stor);
@@ -1117,7 +1117,7 @@ void pike_module_init(void)
 
   start_new_program();
   do_inherit(&prog, 0, NULL);
-  std16e_stor_offs = add_storage(sizeof(struct std16e_stor));
+  std16e_stor_offs = ADD_STORAGE(struct std16e_stor);
   add_function("feed", f_feed_std16e, "function(string:object)", 0);
   set_init_callback(std_16bite_init_stor);
   set_exit_callback(std_16bite_exit_stor);
@@ -1125,7 +1125,7 @@ void pike_module_init(void)
 
   start_new_program();
   do_inherit(&prog, 0, NULL);
-  std_rfc_stor_offs = add_storage(sizeof(struct std_rfc_stor));
+  std_rfc_stor_offs = ADD_STORAGE(struct std_rfc_stor);
   std_rfc_program = end_program();
 
   prog.u.program = std_rfc_program;
@@ -1152,7 +1152,7 @@ void pike_module_init(void)
 
   start_new_program();
   do_inherit(&prog, 0, NULL);
-  std_misc_stor_offs = add_storage(sizeof(struct std_misc_stor));
+  std_misc_stor_offs = ADD_STORAGE(struct std_misc_stor);
   add_function("feed", f_feed_8bit, "function(string:object)", 0);
   std_8bit_program = end_program();
 
diff --git a/src/modules/_Charset/iso2022.c b/src/modules/_Charset/iso2022.c
index bff268c6eb3174dfee8e9f68ee7712e95f7de099..4b3bb5ae388366bbd6e5b1588741eaf079f94d2d 100644
--- a/src/modules/_Charset/iso2022.c
+++ b/src/modules/_Charset/iso2022.c
@@ -3,7 +3,7 @@
 #endif /* HAVE_CONFIG_H */
 
 #include "global.h"
-RCSID("$Id: iso2022.c,v 1.2 1998/11/06 02:27:20 marcus Exp $");
+RCSID("$Id: iso2022.c,v 1.3 1999/02/01 02:45:44 hubbe Exp $");
 #include "program.h"
 #include "interpret.h"
 #include "stralloc.h"
@@ -409,7 +409,7 @@ static void exit_stor(struct object *o)
 struct program *iso2022_init(void)
 {
   start_new_program();
-  add_storage(sizeof(struct iso2022_stor));
+  ADD_STORAGE(struct iso2022_stor);
   add_function("feed", f_feed, "function(string:object)", 0);
   add_function("drain", f_drain, "function(:string)", 0);
   add_function("clear", f_clear, "function(:object)", 0);
diff --git a/src/modules/_Crypto/cast.c b/src/modules/_Crypto/cast.c
index 26319bcb8a2bf3fb765eb61f973b9d17a3906a61..e61c3a5f30b3cacd5add6597f299f2009b1b41be 100644
--- a/src/modules/_Crypto/cast.c
+++ b/src/modules/_Crypto/cast.c
@@ -1,5 +1,5 @@
 /*
- * $Id: cast.c,v 1.4 1998/04/24 00:59:26 hubbe Exp $
+ * $Id: cast.c,v 1.5 1999/02/01 02:45:57 hubbe Exp $
  *
  * CAST crypto module for Pike
  *
@@ -172,7 +172,7 @@ void pike_cast_init(void)
    */
 
   start_new_program();
-  add_storage(sizeof(struct pike_crypto_cast));
+  ADD_STORAGE(struct pike_crypto_cast);
 
   add_function("name", f_name, "function(void:string)", 0);
   add_function("query_block_size", f_query_block_size, "function(void:int)", 0);
diff --git a/src/modules/_Crypto/cbc.c b/src/modules/_Crypto/cbc.c
index 2d14e4f363d9f4472604179f87a914e28ebef85f..f705ea2c7e1414da4216f845c1208d484b53af8f 100644
--- a/src/modules/_Crypto/cbc.c
+++ b/src/modules/_Crypto/cbc.c
@@ -1,5 +1,5 @@
 /*
- * $Id: cbc.c,v 1.12 1998/08/26 16:33:48 nisse Exp $
+ * $Id: cbc.c,v 1.13 1999/02/01 02:45:58 hubbe Exp $
  *
  * CBC (Cipher Block Chaining Mode) crypto module for Pike.
  *
@@ -331,7 +331,7 @@ void pike_cbc_init(void)
    */
 
   start_new_program();
-  add_storage(sizeof(struct pike_crypto_cbc));
+  ADD_STORAGE(struct pike_crypto_cbc);
 
   add_function("create", f_create, "function(program|object:void)", 0);
 
diff --git a/src/modules/_Crypto/crypto.c b/src/modules/_Crypto/crypto.c
index 1b1ea777b9fd0551f51fa75cc73ffc84900509ac..d7dda61d38c247b55ab069dc6973175b1dd8ca2c 100644
--- a/src/modules/_Crypto/crypto.c
+++ b/src/modules/_Crypto/crypto.c
@@ -1,5 +1,5 @@
 /*
- * $Id: crypto.c,v 1.25 1998/04/20 18:53:55 grubba Exp $
+ * $Id: crypto.c,v 1.26 1999/02/01 02:45:59 hubbe Exp $
  *
  * A pike module for getting access to some common cryptos.
  *
@@ -465,7 +465,7 @@ void pike_crypto_init(void)
    */
   
   start_new_program();
-  add_storage(sizeof(struct pike_crypto));
+  ADD_STORAGE(struct pike_crypto);
 
   add_function("create", f_create, "function(program|object:void)", 0);
 
diff --git a/src/modules/_Crypto/des.c b/src/modules/_Crypto/des.c
index f1405408647149682d6b6f45a689f70987d4019b..7a8a2f2962079876c463599b280fc54c88f7ea0b 100644
--- a/src/modules/_Crypto/des.c
+++ b/src/modules/_Crypto/des.c
@@ -1,5 +1,5 @@
 /*
- * $Id: des.c,v 1.11 1998/01/13 23:01:11 hubbe Exp $
+ * $Id: des.c,v 1.12 1999/02/01 02:46:00 hubbe Exp $
  *
  * A pike module for getting access to some common cryptos.
  *
@@ -178,7 +178,7 @@ void pike_des_init(void)
 
   /* /precompiled/crypto/des */
   start_new_program();
-  add_storage(sizeof(struct pike_crypto_des));
+  ADD_STORAGE(struct pike_crypto_des);
 
   add_function("query_block_size", f_query_block_size, "function(void:int)", 0);
   add_function("query_key_length", f_query_key_length, "function(void:int)", 0);
diff --git a/src/modules/_Crypto/idea.c b/src/modules/_Crypto/idea.c
index 9632b850af3874aac04b9ff10bf29467e327506d..ab4f4697bc733b2943ebeddebe4a293d0771ef4a 100644
--- a/src/modules/_Crypto/idea.c
+++ b/src/modules/_Crypto/idea.c
@@ -1,5 +1,5 @@
 /*
- * $Id: idea.c,v 1.11 1998/04/24 00:59:26 hubbe Exp $
+ * $Id: idea.c,v 1.12 1999/02/01 02:46:02 hubbe Exp $
  *
  * IDEA crypto module for Pike
  *
@@ -158,7 +158,7 @@ void pike_idea_init(void)
    */
 
   start_new_program();
-  add_storage(sizeof(INT16[IDEA_KEYLEN]));
+  low_add_storage(sizeof(INT16[IDEA_KEYLEN]),ALIGNOF(INT16),0);
 
   add_function("name", f_name, "function(void:string)", 0);
   add_function("query_block_size", f_query_block_size, "function(void:int)", 0);
diff --git a/src/modules/_Crypto/md2.c b/src/modules/_Crypto/md2.c
index 2eb6f0b86e908f61b90c778b48f167eeae76585a..1ddc73048208206e3cbd1df2305db59b4731a9f0 100644
--- a/src/modules/_Crypto/md2.c
+++ b/src/modules/_Crypto/md2.c
@@ -1,5 +1,5 @@
 /*
- * $Id: md2.c,v 1.4 1998/04/20 18:53:56 grubba Exp $
+ * $Id: md2.c,v 1.5 1999/02/01 02:46:03 hubbe Exp $
  *
  * A pike module for getting access to some common cryptos.
  *
@@ -155,7 +155,7 @@ void init_md2_programs(void)
 
   /* /precompiled/crypto/md2 */
   start_new_program();
-  add_storage(sizeof(struct pike_md2));
+  ADD_STORAGE(struct pike_md2);
 
   add_function("push", f_push, "function(string:void)", 0);
   add_function("cast", f_cast, "function(string:mixed)", 0);
diff --git a/src/modules/_Crypto/md5.c b/src/modules/_Crypto/md5.c
index 3f1b4c283fcc8f5fa65e54e7333da978ea7c44dd..06b8cdcddc58f0fe994300318565ed9c0da0dfb0 100644
--- a/src/modules/_Crypto/md5.c
+++ b/src/modules/_Crypto/md5.c
@@ -1,5 +1,5 @@
 /*
- * $Id: md5.c,v 1.10 1998/07/19 23:04:33 grubba Exp $
+ * $Id: md5.c,v 1.11 1999/02/01 02:46:04 hubbe Exp $
  *
  * A pike module for getting access to some common cryptos.
  *
@@ -100,7 +100,7 @@ void pike_md5_exit(void)
 void pike_md5_init(void)
 {
   start_new_program();
-  add_storage(sizeof(struct md5_ctx));
+  ADD_STORAGE(struct md5_ctx);
   add_function("name", f_name, "function(void:string)", 0);
   add_function("create", f_create, "function(void|object:void)", 0);
   add_function("update", f_update, "function(string:object)", 0);
diff --git a/src/modules/_Crypto/pipe.c b/src/modules/_Crypto/pipe.c
index 895e5bfb227d46253b479887a456c5fa08881ea2..071b43d957d61f356110dec99f5fb9548d0ee4b8 100644
--- a/src/modules/_Crypto/pipe.c
+++ b/src/modules/_Crypto/pipe.c
@@ -1,5 +1,5 @@
 /*
- * $Id: pipe.c,v 1.12 1998/04/20 18:53:57 grubba Exp $
+ * $Id: pipe.c,v 1.13 1999/02/01 02:46:05 hubbe Exp $
  *
  * PIPE crypto module for Pike.
  *
@@ -304,7 +304,7 @@ void pike_pipe_init(void)
 
   /* /precompiled/crypto/pipe */
   start_new_program();
-  add_storage(sizeof(struct pike_crypto_pipe));
+  ADD_STORAGE(struct pike_crypto_pipe);
 
   add_function("create", f_create,
 	       "function(program|object|array(program|mixed) ...:void)", 0);
diff --git a/src/modules/_Crypto/rc4.c b/src/modules/_Crypto/rc4.c
index 7c8918603dcfce65d0c269de6c6a6f31e5bd5a33..9581102a1ab51a1b2c8a9cd0b803ee13bfc30c8f 100644
--- a/src/modules/_Crypto/rc4.c
+++ b/src/modules/_Crypto/rc4.c
@@ -16,7 +16,7 @@
 
 #include "rc4.h"
 
-RCSID("$Id: rc4.c,v 1.7 1998/04/24 00:59:26 hubbe Exp $");
+RCSID("$Id: rc4.c,v 1.8 1999/02/01 02:46:06 hubbe Exp $");
 
 #undef THIS
 #define THIS ((struct rc4_ctx *)(fp->current_storage))
@@ -96,7 +96,7 @@ static void f_crypt(INT32 args)
 void pike_rc4_init(void)
 {
   start_new_program();
-  add_storage(sizeof(struct rc4_ctx));
+  ADD_STORAGE(struct rc4_ctx);
 
   add_function("name", f_name, "function(void:string)", 0);
   add_function("query_key_length", f_query_key_length, "function(void:int)", 0);
diff --git a/src/modules/_Crypto/sha.c b/src/modules/_Crypto/sha.c
index 59736179887e9aa284aecd45bd7aa4b520a5e78e..155baade3372f6428f3498a4ca2d7d891c87864a 100644
--- a/src/modules/_Crypto/sha.c
+++ b/src/modules/_Crypto/sha.c
@@ -1,4 +1,4 @@
-/* $Id: sha.c,v 1.13 1998/07/19 23:08:06 grubba Exp $
+/* $Id: sha.c,v 1.14 1999/02/01 02:46:07 hubbe Exp $
  *
  * Written by Niels Möller
  */
@@ -16,7 +16,7 @@
 #include "module_support.h"
 #include "las.h"
 
-RCSID("$Id: sha.c,v 1.13 1998/07/19 23:08:06 grubba Exp $");
+RCSID("$Id: sha.c,v 1.14 1999/02/01 02:46:07 hubbe Exp $");
 
 #include <sha.h>
 
@@ -98,7 +98,7 @@ void pike_sha_exit(void)
 void pike_sha_init(void)
 {
   start_new_program();
-  add_storage(sizeof(struct sha_ctx));
+  ADD_STORAGE(struct sha_ctx);
   add_function("name", f_name, "function(void:string)", OPT_TRY_OPTIMIZE);
   add_function("create", f_create, "function(void|object:void)", 0);
   add_function("update", f_update, "function(string:object)", 0);
diff --git a/src/modules/_Image_TTF/image_ttf.c b/src/modules/_Image_TTF/image_ttf.c
index 920b813aadf2d066bf927105329f64ad35c75f74..65bbd957ece0a5346c990b1986f3b2bf1b2d9bdd 100644
--- a/src/modules/_Image_TTF/image_ttf.c
+++ b/src/modules/_Image_TTF/image_ttf.c
@@ -1,12 +1,12 @@
 /*
- * $Id: image_ttf.c,v 1.8 1999/02/01 00:03:03 per Exp $
+ * $Id: image_ttf.c,v 1.9 1999/02/01 02:46:21 hubbe Exp $
  */
 
 #include "config.h"
 
 
 #include "global.h"
-RCSID("$Id: image_ttf.c,v 1.8 1999/02/01 00:03:03 per Exp $");
+RCSID("$Id: image_ttf.c,v 1.9 1999/02/01 02:46:21 hubbe Exp $");
 
 #ifdef HAVE_LIBTTF
 #include <freetype.h>
@@ -1278,7 +1278,7 @@ void pike_module_init(void)
       /* make face program */
 
       start_new_program();
-      add_storage(sizeof(struct image_ttf_face_struct));
+      ADD_STORAGE(struct image_ttf_face_struct);
 
       add_function("properties",image_ttf_face_properties,
 		   "function(:mapping)",0);
@@ -1298,7 +1298,7 @@ void pike_module_init(void)
       /* make face instance program */
 
       start_new_program();
-      add_storage(sizeof(struct image_ttf_faceinstance_struct));
+      ADD_STORAGE(struct image_ttf_faceinstance_struct);
       
       add_function("create",image_ttf_faceinstance_create,
 		   "function(object:void)",0);
diff --git a/src/modules/files/file.c b/src/modules/files/file.c
index c68b0c30738b68eb8a03f18c319275c7e6709d63..d402c78c468e6a4898acc0515f3b6c8ac9ddce24 100644
--- a/src/modules/files/file.c
+++ b/src/modules/files/file.c
@@ -5,7 +5,7 @@
 \*/
 
 #include "global.h"
-RCSID("$Id: file.c,v 1.136 1999/01/31 20:35:04 grubba Exp $");
+RCSID("$Id: file.c,v 1.137 1999/02/01 02:46:41 hubbe Exp $");
 #include "fdlib.h"
 #include "interpret.h"
 #include "svalue.h"
@@ -2298,7 +2298,7 @@ static void init_file_locking(void)
 {
   INT32 off;
   start_new_program();
-  off=add_storage(sizeof(struct file_lock_key_storage));
+  off=ADD_STORAGE(struct file_lock_key_storage);
 #ifdef _REENTRANT
   map_variable("_owner","object",0,
 	       off + OFFSETOF(file_lock_key_storage, owner),
@@ -2391,7 +2391,7 @@ void pike_module_init(void)
   init_files_efuns();
 
   start_new_program();
-  add_storage(sizeof(struct my_file));
+  ADD_STORAGE(struct my_file);
 
 #define FILE_FUNC(X,Y,Z) PIKE_CONCAT(Y,_function_number)=add_function(X,Y,Z,0);
 #include "file_functions.h"
@@ -2429,7 +2429,7 @@ void pike_module_init(void)
   free_object(o);
   
   start_new_program();
-  add_storage(sizeof(struct object *));
+  ADD_STORAGE(struct object *);
   map_variable("_fd","object",0,0,T_OBJECT);
 
 #define FILE_FUNC(X,Y,Z) add_function(X,PIKE_CONCAT(Y,_ref),Z,0);
diff --git a/src/modules/files/socket.c b/src/modules/files/socket.c
index 1ff61217a299d68a9ddc187eb445b546a4be3e18..d8e1663c9bd1096a87f6dc479614ec35e2e84e93 100644
--- a/src/modules/files/socket.c
+++ b/src/modules/files/socket.c
@@ -18,7 +18,7 @@
 #include "file_machine.h"
 #include "file.h"
 
-RCSID("$Id: socket.c,v 1.40 1998/11/22 11:08:06 hubbe Exp $");
+RCSID("$Id: socket.c,v 1.41 1999/02/01 02:46:43 hubbe Exp $");
 
 #ifdef HAVE_SYS_TYPE_H
 #include <sys/types.h>
@@ -395,7 +395,7 @@ void port_setup_program(void)
 {
   INT32 offset;
   start_new_program();
-  offset=add_storage(sizeof(struct port));
+  offset=ADD_STORAGE(struct port);
   map_variable("_accept_callback","mixed",0,offset+OFFSETOF(port,accept_callback),T_MIXED);
   map_variable("_id","mixed",0,offset+OFFSETOF(port,id),T_MIXED);
   add_function("bind",port_bind,"function(int,void|mixed,void|string:int)",0);
diff --git a/src/modules/spider/accesseddb.c b/src/modules/spider/accesseddb.c
index b3357afdf2e8846b92eef39c18ac1690b50993b2..cee2c576dbd6591644f0cd05ae0ec89dad20af82 100644
--- a/src/modules/spider/accesseddb.c
+++ b/src/modules/spider/accesseddb.c
@@ -1,5 +1,5 @@
 /*
- * $Id: accesseddb.c,v 1.16 1998/07/04 17:03:31 grubba Exp $
+ * $Id: accesseddb.c,v 1.17 1999/02/01 02:47:02 hubbe Exp $
  */
 
 #include "global.h"
@@ -18,7 +18,7 @@
 #include "error.h"
 #include "builtin_functions.h"
 
-RCSID("$Id: accesseddb.c,v 1.16 1998/07/04 17:03:31 grubba Exp $");
+RCSID("$Id: accesseddb.c,v 1.17 1999/02/01 02:47:02 hubbe Exp $");
 
 #include <stdio.h>
 
@@ -540,7 +540,7 @@ static void free_file_head(struct object *o)
 void init_accessdb_program(void)
 {
    start_new_program();
-   add_storage(sizeof(struct file_head));
+   ADD_STORAGE(struct file_head);
    add_function("create", f_create, "function(string:void)", ID_PUBLIC);
    add_function("add", f_add, "function(string,int ...:mapping(string:int))",
 		ID_PUBLIC);
diff --git a/src/modules/spider/dumudp.c b/src/modules/spider/dumudp.c
index 9b48141426480154940502ba7b85186f41de9121..6083fa6afd64d1a4da4544cf62ea90a277773df8 100644
--- a/src/modules/spider/dumudp.c
+++ b/src/modules/spider/dumudp.c
@@ -1,12 +1,12 @@
 /*
- * $Id: dumudp.c,v 1.41 1998/08/08 13:53:37 grubba Exp $
+ * $Id: dumudp.c,v 1.42 1999/02/01 02:47:03 hubbe Exp $
  */
 
 #include "global.h"
 
 #include "config.h"
 
-RCSID("$Id: dumudp.c,v 1.41 1998/08/08 13:53:37 grubba Exp $");
+RCSID("$Id: dumudp.c,v 1.42 1999/02/01 02:47:03 hubbe Exp $");
 #include "fdlib.h"
 #include "interpret.h"
 #include "svalue.h"
@@ -438,7 +438,7 @@ void init_udp(void)
 {
   start_new_program();
 
-  add_storage(sizeof(struct dumudp));
+  ADD_STORAGE(struct dumudp);
   add_function("bind",udp_bind,"function(int,void|function,void|string:int)",0);
   add_function("enable_broadcast", udp_enable_broadcast, "function(:void)", 0);
   add_function("read",udp_read,"function(int|void:mapping(string:int|string))",0);
diff --git a/src/modules/spider/xml.c b/src/modules/spider/xml.c
index ce7b910a36c3c70c73069b915800c7c0106cbd10..c201fe2ca73594e85694d8f4d3a52db69cabf9c7 100644
--- a/src/modules/spider/xml.c
+++ b/src/modules/spider/xml.c
@@ -2284,7 +2284,7 @@ void init_xml(void)
 {
   INT32 off;
   start_new_program();
-  off=add_storage(sizeof(struct xmlobj));
+  off=ADD_STORAGE(struct xmlobj);
   map_variable("__entities","mapping",0,
 	       off + OFFSETOF(xmlobj, entities),T_MAPPING);
   map_variable("__attributes","mapping",0,
diff --git a/src/modules/system/nt.c b/src/modules/system/nt.c
index 96e892370534774854d0659575bcf85330faeac7..6a211fa1105f6c5753759a6bc213ae2618578c3f 100644
--- a/src/modules/system/nt.c
+++ b/src/modules/system/nt.c
@@ -1,5 +1,5 @@
 /*
- * $Id: nt.c,v 1.6 1998/10/22 00:33:55 hubbe Exp $
+ * $Id: nt.c,v 1.7 1999/02/01 02:47:18 hubbe Exp $
  *
  * NT system calls for Pike
  *
@@ -529,7 +529,7 @@ void init_nt_system_calls(void)
       SIMPCONST(LOGON32_PROVIDER_DEFAULT);
       
       start_new_program();
-      add_storage(sizeof(HANDLE));
+      ADD_STORAGE(HANDLE);
       set_init_callback(init_token);
       set_exit_callback(exit_token);
       token_program=end_program();
diff --git a/src/object.c b/src/object.c
index ad2175ea5478f3d15f664ba52c0364fbb2005c48..15c766ece80dd2e3b1b70f7111bec4c4feb15bc8 100644
--- a/src/object.c
+++ b/src/object.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: object.c,v 1.55 1999/01/31 09:01:56 hubbe Exp $");
+RCSID("$Id: object.c,v 1.56 1999/02/01 02:41:40 hubbe Exp $");
 #include "object.h"
 #include "dynamic_buffer.h"
 #include "interpret.h"
@@ -72,7 +72,7 @@ struct object *low_clone(struct program *p)
 
   GC_ALLOC();
 
-  o=(struct object *)xalloc( ((long)(((struct object *)0)->storage))+p->storage_needed);
+  o=(struct object *)xalloc( ((long)(((struct object *)0)->storage))+p->storage_needed+p->inherits[0].storage_offset);
 
   o->prog=p;
   add_ref(p);
diff --git a/src/operators.c b/src/operators.c
index e57e14d7c71ea4782418c65c7a2f17b4924071b8..b102c8729ea62e93becb66d31d99d2b97f2d58a9 100644
--- a/src/operators.c
+++ b/src/operators.c
@@ -5,7 +5,7 @@
 \*/
 #include "global.h"
 #include <math.h>
-RCSID("$Id: operators.c,v 1.44 1998/11/22 11:03:06 hubbe Exp $");
+RCSID("$Id: operators.c,v 1.45 1999/02/01 02:41:41 hubbe Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "multiset.h"
@@ -1992,7 +1992,7 @@ void init_operators(void)
 
 
   start_new_program();
-  add_storage(sizeof(struct string_assignment_storage));
+  ADD_STORAGE(struct string_assignment_storage);
   add_function("`[]",f_string_assignment_index,"function(int:int)",0);
   add_function("`[]=",f_string_assignment_assign_index,"function(int,int:int)",0);
   set_init_callback(init_string_assignment_storage);
diff --git a/src/pike_macros.h b/src/pike_macros.h
index 04c9ac87a81e44175820b935b6c2c36c61109228..106074c1d2649e32e0b2eaecb9ab7a20d336bc1a 100644
--- a/src/pike_macros.h
+++ b/src/pike_macros.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: pike_macros.h,v 1.10 1999/01/31 22:22:05 grubba Exp $
+ * $Id: pike_macros.h,v 1.11 1999/02/01 02:41:42 hubbe Exp $
  */
 #ifndef MACROS_H
 #define MACROS_H
@@ -52,18 +52,12 @@
 #define isgraph(X)	(ispunct(X) || isupper(X) || islower(X) || isdigit(X))
 #endif /* !HAVE_ISGRAPH */
 
-/* FIXME: On some OS's sizeof(long long) is 8 and sizeof(char *) 4 bytes.
+/*
+ * #define ALIGNOF(X) __alignof__(X)
+ * #define ALIGNOF(X) (sizeof(X)>ALIGN_BOUND?ALIGN_BOUND:( 1<<my_log2(sizeof(X))))
  */
-#define ALIGN_BOUND 16 /* sizeof(char *) */
 
-#ifdef __GNUC__
-#define ALIGNOF(X) __alignof__(X)
-#define HAVE_ALIGNOF
-#else
-#define ALIGNOF(X) (sizeof(X)>ALIGN_BOUND?ALIGN_BOUND:( 1<<my_log2(sizeof(X))))
-#endif
+#define ALIGNOF(X) ((int)&(((struct { char ignored_ ; X fooo_; } *)0)->fooo_))
 
 #define DO_ALIGN(X,Y) (((long)(X)+((Y)-1)) & -(Y))
-#define MY_ALIGN(X) DO_ALIGN((X),ALIGN_BOUND)
-#define SMART_ALIGN(X,Y) DO_ALIGN((X),(Y)>ALIGN_BOUND? (((Y)-1) & ~(Y)) :ALIGN_BOUND)
 #endif
diff --git a/src/program.c b/src/program.c
index 2639b873e1c9d18f96ab849804642411940e25ca..432c000183c5fc1a05da587b2a823b48d1a9d92e 100644
--- a/src/program.c
+++ b/src/program.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: program.c,v 1.107 1999/01/31 09:02:00 hubbe Exp $");
+RCSID("$Id: program.c,v 1.108 1999/02/01 02:41:43 hubbe Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -488,6 +488,7 @@ struct program *low_allocate_program(void)
   struct program *p;
   p=ALLOC_STRUCT(program);
   MEMSET(p, 0, sizeof(struct program));
+  p->alignment_needed=1;
   
   GC_ALLOC();
   p->refs=1;
@@ -775,12 +776,7 @@ static int alignof_variable(int run_time_type)
   switch(run_time_type)
   {
     case T_FUNCTION:
-    case T_MIXED:
-#ifdef HAVE_ALIGNOF
-      return ALIGNOF(struct svalue);
-#else
-      return ALIGNOF(union anything);
-#endif
+    case T_MIXED: return ALIGNOF(struct svalue);
     case T_INT: return ALIGNOF(INT_TYPE);
     case T_FLOAT: return ALIGNOF(FLOAT_TYPE);
     default: return ALIGNOF(char *);
@@ -868,13 +864,6 @@ void check_program(struct program *p)
     if(p->inherits[e].storage_offset < 0)
       fatal("Inherit->storage_offset is wrong.\n");
 
-#if 0
-    /* This test doesn't really work... */
-    if(p->inherits[e].storage_offset & (ALIGN_BOUND-1))
-    {
-      fatal("inherit[%d].storage_offset is not properly aligned (%d).\n",e,p->inherits[e].storage_offset);
-    }
-#endif
   }
 }
 #endif
@@ -981,24 +970,31 @@ struct program *debug_end_program(void)
  * Allocate needed for this program in the object structure.
  * An offset to the data is returned.
  */
-SIZE_T low_add_storage(SIZE_T size, SIZE_T alignment)
+SIZE_T low_add_storage(SIZE_T size, SIZE_T alignment, int modulo)
 {
   SIZE_T offset;
-  offset=DO_ALIGN(new_program->storage_needed, alignment);
+#ifdef PIKE_DEBUG
+  if(alignment <=0 || (alignment & (alignment-1)) || alignment > 256)
+    fatal("Alignment must be 1,2,4,8,16,32,64,128 or 256 not %d\n",alignment);
+#endif
+  offset=DO_ALIGN(OFFSETOF(object,storage)+
+		  new_program->storage_needed,
+		  alignment)+modulo-OFFSETOF(object,storage);
+
+  if(!new_program->storage_needed)
+    new_program->inherits[0].storage_offset=offset;
+
+  if(new_program->alignment_needed<alignment)
+    new_program->alignment_needed=alignment;
+
   new_program->storage_needed = offset + size;
 #ifdef PIKE_DEBUG
-  if(alignment <=0) fatal("Alignment must be at least 1\n");
   if(new_program->storage_needed<0)
     fatal("add_storage failed horribly!\n");
 #endif
   return offset;
 }
 
-SIZE_T add_storage(SIZE_T storage)
-{
-  return low_add_storage(storage,
-			 storage>ALIGN_BOUND? ALIGN_BOUND : storage ? (1<<my_log2(storage)) : 1);
-}
 
 /*
  * set a callback used to initialize clones of this program
@@ -1162,7 +1158,11 @@ void low_inherit(struct program *p,
 
   inherit_offset = new_program->num_inherits;
 
-  storage_offset=add_storage(p->storage_needed);
+  /* alignment magic */
+  storage_offset=p->inherits[0].storage_offset % p->alignment_needed;
+  storage_offset=low_add_storage(p->storage_needed,
+				 p->alignment_needed,
+				 storage_offset)-storage_offset;
 
   for(e=0; e<(int)p->num_inherits; e++)
   {
@@ -1520,7 +1520,7 @@ int define_variable(struct pike_string *name,
   
   n=low_define_variable(name,type,flags,
 			low_add_storage(sizeof_variable(run_time_type),
-					alignof_variable(run_time_type)),
+					alignof_variable(run_time_type),0),
 			run_time_type);
   
 
@@ -2406,6 +2406,8 @@ void check_all_programs(void)
 }
 #endif
 
+#undef THIS
+#define THIS ((struct pike_trampoline *)(fp->current_storage))
 struct program *pike_trampoline_program=0;
 
 static void apply_trampoline(INT32 args)
@@ -2413,11 +2415,66 @@ static void apply_trampoline(INT32 args)
   error("Internal error: Trampoline magic failed!\n");
 }
 
+static void init_trampoline(struct object *o)
+{
+  THIS->frame=0;
+}
+
+static void exit_trampoline(struct object *o)
+{
+  if(THIS->frame)
+  {
+    free_pike_frame(THIS->frame);
+    THIS->frame=0;
+  }
+}
+
+static void gc_check_frame(struct pike_frame *f)
+{
+  if(!f) return;
+  if(!debug_gc_check(f,T_UNKNOWN,f) && f->malloced_locals)
+  {
+    if(f->current_object) gc_check(f->current_object);
+    if(f->context.prog)   gc_check(f->context.prog);
+    if(f->context.parent) gc_check(f->context.parent);
+    gc_check_svalues(f->locals,f->num_locals);
+    if(f->scope)          gc_check_frame(f->scope);
+  }
+}
+
+static void gc_check_trampoline(struct object *o)
+{
+  gc_check_frame(THIS->frame);
+}
+
+static void gc_mark_frame(struct pike_frame *f)
+{
+  if(!f) return;
+  if(gc_mark(f))
+  {
+    if(f->current_object) gc_mark_object_as_referenced(f->current_object);
+    if(f->context.prog)   gc_mark_program_as_referenced(f->context.prog);
+    if(f->context.parent) gc_mark_object_as_referenced(f->context.parent);
+    if(f->malloced_locals)gc_mark_svalues(f->locals,f->num_locals);
+    if(f->scope)          gc_mark_frame(f->scope);
+  }
+}
+
+static void gc_mark_trampoline(struct object *o)
+{
+  gc_mark_frame(THIS->frame);
+}
+
+
 void init_program(void)
 {
   start_new_program();
-  add_storage(sizeof(struct pike_trampoline));
+  ADD_STORAGE(struct pike_trampoline);
   add_function("`()",apply_trampoline,"function(mixed...:mixed)",0);
+  set_init_callback(init_trampoline);
+  set_exit_callback(exit_trampoline);
+  set_gc_check_callback(gc_check_trampoline);
+  set_gc_mark_callback(gc_mark_trampoline);
   pike_trampoline_program=end_program();
 }
 
diff --git a/src/program.h b/src/program.h
index 67b9f9b5a3f6154b374493afb6c2682e1710acb9..50ba895c6fa3f994efae201c4af8b2876c43b38c 100644
--- a/src/program.h
+++ b/src/program.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: program.h,v 1.48 1999/01/31 09:02:02 hubbe Exp $
+ * $Id: program.h,v 1.49 1999/02/01 02:41:45 hubbe Exp $
  */
 #ifndef PROGRAM_H
 #define PROGRAM_H
@@ -13,6 +13,7 @@
 #include <stdarg.h>
 #include "global.h"
 #include "pike_types.h"
+#include "pike_macros.h"
 #include "svalue.h"
 #include "time_stuff.h"
 
@@ -193,6 +194,7 @@ struct program
   INT32 id;             /* used to identify program in caches */
   INT32 flags;
   INT32 storage_needed; /* storage needed in the object struct */
+  unsigned INT8 alignment_needed;
   struct timeval timestamp;
 
   struct program *next;
@@ -250,6 +252,8 @@ extern struct program *pike_trampoline_program;
 
 #define COMPILER_IN_CATCH 1
 
+#define ADD_STORAGE(X) low_add_storage(sizeof(X), ALIGNOF(X),0)
+
 #define FOO(NUMTYPE,TYPE,NAME) void PIKE_CONCAT(add_to_,NAME(TYPE ARG));
 #include "program_areas.h"
 
@@ -275,8 +279,7 @@ int sizeof_variable(int run_time_type);
 void check_program(struct program *p);
 struct program *end_first_pass(int finish);
 struct program *debug_end_program(void);
-SIZE_T low_add_storage(SIZE_T size, SIZE_T alignment);
-SIZE_T add_storage(SIZE_T storage);
+SIZE_T low_add_storage(SIZE_T size, SIZE_T alignment, int modulo);
 void set_init_callback(void (*init)(struct object *));
 void set_exit_callback(void (*exit)(struct object *));
 void set_gc_mark_callback(void (*m)(struct object *));
diff --git a/src/security.c b/src/security.c
index 188cf813c902b5e83e1d092c8aa76db05ed7332b..e53c6b16522934938c523e5a43711fdd21518b6f 100644
--- a/src/security.c
+++ b/src/security.c
@@ -140,7 +140,7 @@ void init_pike_security(void)
   start_new_program();
 
   start_new_program();
-  add_storage(sizeof(struct pike_creds));
+  ADD_STORAGE(struct pike_creds);
   add_function("set_default_creds",set_default_creds,"function(object:void)",0);
   add_function("get_default_creds",get_default_creds,"function(:object)",0);
   add_function("init_creds",init_creds,"function(object,int,int:void)",0);
diff --git a/src/signal_handler.c b/src/signal_handler.c
index b188c11f6c6f0c55a2a3450fb111d7723310e27b..2f1ff6e6ee24a7df89d3aaa1741dbdcd07000a37 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -23,7 +23,7 @@
 #include "builtin_functions.h"
 #include <signal.h>
 
-RCSID("$Id: signal_handler.c,v 1.101 1999/01/16 01:32:06 hubbe Exp $");
+RCSID("$Id: signal_handler.c,v 1.102 1999/02/01 02:41:47 hubbe Exp $");
 
 #ifdef HAVE_PASSWD_H
 # include <passwd.h>
@@ -2262,7 +2262,7 @@ void init_signals(void)
 #endif
 
   start_new_program();
-  add_storage(sizeof(struct pid_status));
+  ADD_STORAGE(struct pid_status);
   set_init_callback(init_pid_status);
   set_exit_callback(exit_pid_status);
   add_function("wait",f_pid_status_wait,"function(:int)",0);
diff --git a/src/stralloc.c b/src/stralloc.c
index 90d8174b9f1457d23a3b8cd031ff9e5e7b1ce02f..04eefb1ebbeb85fec1509c7c0c06327c4fdb3f17 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -15,7 +15,7 @@
 
 #include <ctype.h>
 
-RCSID("$Id: stralloc.c,v 1.52 1998/12/20 09:24:26 hubbe Exp $");
+RCSID("$Id: stralloc.c,v 1.53 1999/02/01 02:41:48 hubbe Exp $");
 
 #define BEGIN_HASH_SIZE 997
 #define MAX_AVG_LINK_LENGTH 3
@@ -658,9 +658,9 @@ struct pike_string *add_string_status(int verbose)
       for(p=base_table[e];p;p=p->next)
       {
 	num_distinct_strings++;
-	bytes_distinct_strings+=MY_ALIGN(p->len);
+	bytes_distinct_strings+=DO_ALIGN(p->len,sizeof(void *));
 	allocd_strings+=p->refs;
-	allocd_bytes+=p->refs*MY_ALIGN(p->len+3);
+	allocd_bytes+=p->refs*DO_ALIGN(p->len+3,sizeof(void *));
       }
 
     }
diff --git a/src/threads.c b/src/threads.c
index 065b35735c4c6e2ad5e0feb14551e78bb4cf262a..a6df23e7aeb73ab4b6e10291b045f4b7fed240a3 100644
--- a/src/threads.c
+++ b/src/threads.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: threads.c,v 1.86 1999/01/21 09:15:19 hubbe Exp $");
+RCSID("$Id: threads.c,v 1.87 1999/02/01 02:41:50 hubbe Exp $");
 
 int num_threads = 1;
 int threads_disabled = 0;
@@ -990,7 +990,7 @@ void th_init(void)
   add_efun("thread_local",f_thread_local,"function(:object)",OPT_SIDE_EFFECT);
 
   start_new_program();
-  add_storage(sizeof(struct mutex_storage));
+  ADD_STORAGE(struct mutex_storage);
   add_function("lock",f_mutex_lock,"function(int|void:object)",0);
   add_function("trylock",f_mutex_trylock,"function(int|void:object)",0);
   set_init_callback(init_mutex_obj);
@@ -998,7 +998,7 @@ void th_init(void)
   end_class("mutex", 0);
 
   start_new_program();
-  mutex_key_offset = add_storage(sizeof(struct key_storage));
+  mutex_key_offset = ADD_STORAGE(struct key_storage);
   /* This is needed to allow the gc to find the possible circular reference.
    * It also allows a process to take over ownership of a key.
    */
@@ -1014,7 +1014,7 @@ void th_init(void)
 #endif
 
   start_new_program();
-  add_storage(sizeof(COND_T));
+  ADD_STORAGE(COND_T);
   add_function("wait",f_cond_wait,"function(void|object:void)",0);
   add_function("signal",f_cond_signal,"function(:void)",0);
   add_function("broadcast",f_cond_broadcast,"function(:void)",0);
@@ -1034,7 +1034,7 @@ void th_init(void)
   }
 
   start_new_program();
-  add_storage(sizeof(struct thread_local));
+  ADD_STORAGE(struct thread_local);
   add_function("get",f_thread_local_get,"function(:mixed)",0);
   add_function("set",f_thread_local_set,"function(mixed:mixed)",0);
   thread_local_prog=end_program();
@@ -1042,7 +1042,7 @@ void th_init(void)
     fatal("Failed to initialize thread_local program!\n");
 
   start_new_program();
-  add_storage(sizeof(struct thread_state));
+  ADD_STORAGE(struct thread_state);
   thread_id_result_variable=simple_add_variable("result","mixed",0);
   add_function("backtrace",f_thread_backtrace,"function(:array)",0);
   add_function("wait",f_thread_id_result,"function(:mixed)",0);