diff --git a/src/callback.c b/src/callback.c
index 0ff8ca355ce1e3653e9bda54e81b18634f1dab78..4c05b76a462dd907e315eded97e6608e62c7130c 100644
--- a/src/callback.c
+++ b/src/callback.c
@@ -7,6 +7,7 @@
 #include "pike_macros.h"
 #include "callback.h"
 #include "error.h"
+#include "block_alloc.h"
 
 struct callback_list fork_child_callback;
 
@@ -27,15 +28,8 @@ struct callback
 };
 
 #define CALLBACK_CHUNK 128
+BLOCK_ALLOC(callback, CALLBACK_CHUNK)
 
-struct callback_block {
-  struct callback_block *next;
-  struct callback callbacks[CALLBACK_CHUNK];
-};
-
-static struct callback_block *callback_chunks=0;
-static struct callback *first_callback =0;
-static struct callback *free_callbacks =0;
 
 #ifdef DEBUG
 extern int d_flag;
@@ -73,35 +67,35 @@ static void check_callback_chain(struct callback_list *lst)
       len++;
     }
     
-    for(tmp=callback_chunks;tmp;tmp=tmp->next)
+    for(tmp=callback_blocks;tmp;tmp=tmp->next)
     {
       for(e=0;e<CALLBACK_CHUNK;e++)
       {
 	int d;
 	struct callback_block *tmp2;
 	
-	if(tmp->callbacks[e].free_func == (callback_func)remove_callback)
+	if(tmp->x[e].free_func == (callback_func)remove_callback)
 	{
-	  if(!is_in_free_list(tmp->callbacks+e))
+	  if(!is_in_free_list(tmp->x+e))
 	    fatal("Lost track of a struct callback!\n");
 
-	  if(tmp->callbacks[e].next &&
-	     !is_in_free_list(tmp->callbacks[e].next))
+	  if(tmp->x[e].next &&
+	     !is_in_free_list(tmp->x[e].next))
 	    fatal("Free callback has next in Z'ha'dum!\n");
 
 	}else{
-	  if(is_in_free_list(tmp->callbacks[e].next))
+	  if(is_in_free_list(tmp->x[e].next))
 	    fatal("Non-free callback has next in free list!\n");
 	}
 	
-	if(tmp->callbacks[e].next)
+	if(tmp->x[e].next)
 	{
 	  d=CALLBACK_CHUNK;
-	  for(tmp2=callback_chunks;tmp2;tmp2=tmp2->next)
+	  for(tmp2=callback_blocks;tmp2;tmp2=tmp2->next)
 	  {
 	    for(d=0;d<CALLBACK_CHUNK;d++)
 	    {
-	      if(tmp2->callbacks+d == tmp->callbacks[e].next)
+	      if(tmp2->x+d == tmp->x[e].next)
 		break;
 	      
 	      if(d < CALLBACK_CHUNK) break;
@@ -120,28 +114,7 @@ static void check_callback_chain(struct callback_list *lst)
 #endif
 
 /* Return the first free callback struct, allocate more if needed */
-static struct callback *get_free_callback(void)
-{
-  struct callback *tmp;
-  if(!free_callbacks)
-  {
-    int e;
-    struct callback_block *tmp2;
-    tmp2=ALLOC_STRUCT(callback_block);
-    tmp2->next=callback_chunks;
-    callback_chunks=tmp2;
 
-    for(e=0;e<CALLBACK_CHUNK;e++)
-    {
-      tmp2->callbacks[e].next=free_callbacks;
-      tmp2->callbacks[e].free_func=(callback_func)remove_callback;
-      free_callbacks=tmp2->callbacks+e;
-    }
-  }
-  tmp=free_callbacks;
-  free_callbacks=tmp->next;
-  return tmp;
-}
 
 /* Traverse a linked list of callbacks and call all the active callbacks
  * in the list. Deactivated callbacks are freed and placed in the free list.
@@ -180,8 +153,8 @@ void call_callback(struct callback_list *lst, void *arg)
       }
 
       *ptr=l->next;
-      l->next=free_callbacks;
-      free_callbacks=l;
+      free_callback(l);
+
 #ifdef DEBUG
       l->free_func=(callback_func)remove_callback;
 #endif
@@ -199,7 +172,7 @@ struct callback *add_to_callback(struct callback_list *lst,
 				 callback_func free_func)
 {
   struct callback *l;
-  l=get_free_callback();
+  l=alloc_callback();
   l->call=call;
   l->arg=arg;
   l->free_func=free_func;
@@ -223,7 +196,7 @@ void *remove_callback(struct callback *l)
 }
 
 /* Free all the callbacks in a linked list of callbacks */
-void free_callback(struct callback_list *lst)
+void free_callback_list(struct callback_list *lst)
 {
   struct callback *l,**ptr;
   check_callback_chain(lst);
@@ -233,8 +206,7 @@ void free_callback(struct callback_list *lst)
     if(l->free_func)
       l->free_func(l, l->arg, 0);
     *ptr=l->next;
-    l->next=free_callbacks;
-    free_callbacks=l;
+    free_callback(l);
 #ifdef DEBUG
     l->free_func=(callback_func)remove_callback;
 #endif
@@ -243,13 +215,7 @@ void free_callback(struct callback_list *lst)
 
 void cleanup_callbacks(void)
 {
-  while(callback_chunks)
-  {
-    struct callback_block *tmp=callback_chunks;
-    callback_chunks=tmp->next;
-    free((char *)tmp);
-  }
-  free_callbacks=0;
+  free_all_callback_blocks();
 }
 
 
@@ -258,7 +224,7 @@ void count_memory_in_callbacks(INT32 *num_, INT32 *size_)
   INT32 num=0, size=0;
   struct callback_block *tmp;
   struct callback *tmp2;
-  for(tmp=callback_chunks;tmp;tmp=tmp->next)
+  for(tmp=callback_blocks;tmp;tmp=tmp->next)
   {
     num+=CALLBACK_CHUNK;
     size+=sizeof(struct callback_block);
diff --git a/src/callback.h b/src/callback.h
index 388d4a761e8fb137c959e074ae9f1237c939a660..c66cbe9cd70d8af037e069c8aedb5c2a10d8bab4 100644
--- a/src/callback.h
+++ b/src/callback.h
@@ -29,7 +29,7 @@ struct callback *add_to_callback(struct callback_list *lst,
 				 void *arg,
 				 callback_func free_func);
 void *remove_callback(struct callback *l);
-void free_callback(struct callback_list *lst);
+void free_callback_list(struct callback_list *lst);
 void cleanup_callbacks(void);
 void count_memory_in_callbacks(INT32 *num_, INT32 *size_);
 /* Prototypes end here */