diff -ru ../orig-gateway/gw/bb.h ./gw/bb.h
--- ../orig-gateway/gw/bb.h	Tue May 28 20:46:12 2002
+++ ./gw/bb.h	Tue May 28 21:48:28 2002
@@ -13,7 +13,6 @@
 #define BB_DEFAULT_WAPBOX_PORT	13002
 #define BB_DEFAULT_HTTP_PORT	13000
 
-#define BB_DEFAULT_HEARTBEAT	30
 #define BB_DEFAULT_MAX_QUEUE	1000
 
 #endif
diff -ru ../orig-gateway/gw/heartbeat.c ./gw/heartbeat.c
--- ../orig-gateway/gw/heartbeat.c	Tue May 28 20:46:33 2002
+++ ./gw/heartbeat.c	Tue May 28 23:44:03 2002
@@ -73,7 +73,7 @@
 
     info = gw_malloc(sizeof(*info));
     info->send_func = send_func;
-    info->freq = freq;
+    info->freq = (freq <= 0 ? DEFAULT_HEARTBEAT : freq);
     info->load_func = load_func;
     info->running = 1;
     info->thread = gwthread_create(heartbeat_thread, info);
@@ -88,27 +88,44 @@
     }
 }
 
+/*
+ * function : heartbeat_stop
+ * arguments: long hb_thread, the thread number of the heartbeat
+ *            that is wished to be stopped.
+ *            if hb_thread == ALL_HEARTBEATS then all heartbeats
+ *            are stopped.
+ * returns  : -
+ */
 void heartbeat_stop(long hb_thread)
 {
     List *matching_info;
     struct hb_info *info;
 
-    matching_info = list_extract_matching(heartbeats, &hb_thread, find_hb);
-    if (matching_info == NULL) {
-        warning(0, "Could not stop heartbeat %ld: not found.", hb_thread);
-	return;
+    if (hb_thread == ALL_HEARTBEATS) {
+        while (NULL != (info = list_extract_first(heartbeats))) {
+            gw_assert(info);
+            info->running = 0;
+            gwthread_wakeup(info->thread);
+            gwthread_join(info->thread);
+            gw_free(info);
+        }
+    } else {
+        matching_info = list_extract_matching(heartbeats, &hb_thread, find_hb);
+        if (matching_info == NULL) {
+            warning(0, "Could not stop heartbeat %ld: not found.", hb_thread);
+	    return;
+        }
+        gw_assert(list_len(matching_info) == 1);
+        info = list_extract_first(matching_info);
+        list_destroy(matching_info, NULL);
+     
+        info->running = 0;
+        gwthread_wakeup(hb_thread);
+        gwthread_join(hb_thread);
+        gw_free(info);
     }
-    gw_assert(list_len(matching_info) == 1);
-    info = list_extract_first(matching_info);
-    list_destroy(matching_info, NULL);
- 
-    info->running = 0;
-    gwthread_wakeup(hb_thread);
-    gwthread_join(hb_thread);
-
-    gw_free(info);
     if (list_len(heartbeats) == 0) {
-	list_destroy(heartbeats, NULL);
-	heartbeats = NULL;
+        list_destroy(heartbeats, NULL);
+        heartbeats = NULL;
     }
 }
diff -ru ../orig-gateway/gw/heartbeat.h ./gw/heartbeat.h
--- ../orig-gateway/gw/heartbeat.h	Tue May 28 20:46:33 2002
+++ ./gw/heartbeat.h	Tue May 28 22:49:41 2002
@@ -8,6 +8,8 @@
 #include "gwlib/gwlib.h"
 #include "msg.h"
 
+#define DEFAULT_HEARTBEAT    30
+#define ALL_HEARTBEATS       -1
 /*
  * Signature for a function that returns the current load value.
  */
Binary files ../orig-gateway/gw/heartbeat.o and ./gw/heartbeat.o differ
diff -ru ../orig-gateway/gw/smsbox.c ./gw/smsbox.c
--- ../orig-gateway/gw/smsbox.c	Tue May 28 20:46:12 2002
+++ ./gw/smsbox.c	Tue May 28 22:07:10 2002
@@ -46,7 +46,6 @@
 static Octstr *xmlrpc_url = NULL;
 static Octstr *bb_host;
 static char *pid_file;
-static int heartbeat_freq;
 static Octstr *accepted_chars = NULL;
 static int only_try_http = 0;
 static URLTranslationList *translations = NULL;
@@ -2692,7 +2691,6 @@
     bb_port = BB_DEFAULT_SMSBOX_PORT;
     bb_ssl = 0;
     bb_host = octstr_create(BB_DEFAULT_HOST);
-    heartbeat_freq = BB_DEFAULT_HEARTBEAT;
     logfile = NULL;
     lvl = 0;
 
@@ -2853,8 +2851,8 @@
 int main(int argc, char **argv)
 {
     int cf_index;
-    long heartbeat_thread;
     Octstr *cfg_name;
+    double heartbeat_freq = DEFAULT_HEARTBEAT;
 
     gwlib_init();
     cf_index = get_and_set_debugs(argc, argv, check_args);
@@ -2897,14 +2895,16 @@
     connect_to_bearerbox(bb_host, bb_port, bb_ssl, NULL /* bb_our_host */);
 	/* XXX add our_host if required */
 
-    heartbeat_thread = heartbeat_start(write_to_bearerbox, heartbeat_freq,
-				       outstanding_requests);
+    if (0 > heartbeat_start(write_to_bearerbox, heartbeat_freq,
+				       outstanding_requests)) {
+        info(0, GW_NAME "Could not start heartbeat.");
+    }
 
     read_messages_from_bearerbox();
 
     info(0, GW_NAME " smsbox terminating.");
 
-    heartbeat_stop(heartbeat_thread);
+    heartbeat_stop(ALL_HEARTBEATS);
     http_close_all_ports();
     gwthread_join_every(sendsms_thread);
     list_remove_producer(smsbox_requests);
diff -ru ../orig-gateway/gw/wapbox.c ./gw/wapbox.c
--- ../orig-gateway/gw/wapbox.c	Tue May 28 20:46:13 2002
+++ ./gw/wapbox.c	Tue May 28 22:07:49 2002
@@ -40,8 +40,6 @@
 static Octstr *bearerbox_host;
 static long bearerbox_port = BB_DEFAULT_WAPBOX_PORT;
 static int bearerbox_ssl = 0;
-static long heartbeat_freq = BB_DEFAULT_HEARTBEAT;
-static long heartbeat_thread;
 static Counter *sequence_counter = NULL;
 int wtp_forced_sar = 0;
 int wsp_smart_errors = 0;
@@ -410,6 +408,7 @@
     Msg *msg;
     Octstr *filename;
     Cfg *cfg;
+    double heartbeat_freq =  DEFAULT_HEARTBEAT;
     
     gwlib_init();
     cf_index = get_and_set_debugs(argc, argv, NULL);
@@ -467,8 +466,10 @@
         wap_push_ota_bb_address_set(bearerbox_host);
 	    
     program_status = running;
-    heartbeat_thread = heartbeat_start(write_to_bearerbox, heartbeat_freq, 
-    	    	    	    	       wap_appl_get_load);
+    if (0 > heartbeat_start(write_to_bearerbox, heartbeat_freq, 
+    	    	    	    	       wap_appl_get_load)) {
+        info(0, GW_NAME "Could not start heartbeat.");
+    }
 
     while (program_status != shutting_down) {
 	WAPEvent *dgram;
@@ -520,7 +521,7 @@
     info(0, GW_NAME " wapbox terminating.");
     
     program_status = shutting_down;
-    heartbeat_stop(heartbeat_thread);
+    heartbeat_stop(ALL_HEARTBEATS);
     counter_destroy(sequence_counter);
 
     if (cfg)
