diff --git a/src/helper/log.c b/src/helper/log.c
index 9bfe4d11c56f81c7c0fb9cc9bbf6c4aa59cb9cbb..f68c9a3ee4bc7ab925641f4cc882e27d27fea031 100644
--- a/src/helper/log.c
+++ b/src/helper/log.c
@@ -64,6 +64,95 @@ static char *log_strings[5] =
 
 static int count = 0;
 
+
+static struct store_log_forward * log_head = NULL;
+static int log_forward_count = 0;
+
+struct store_log_forward
+{
+	struct store_log_forward * next;
+	const char * file;
+	int line;
+	const char * function;
+	const char * string;
+};
+
+/* either forward the log to the listeners or store it for possible forwarding later */
+static void log_forward(const char *file, int line, const char *function, const char *string)
+{
+	if (log_forward_count==0)
+	{
+		log_callback_t *cb, *next;
+		cb = log_callbacks;
+		/* DANGER!!!! the log callback can remove itself!!!! */
+		while (cb)
+		{
+			next = cb->next;
+			cb->fn(cb->priv, file, line, function, string);
+			cb = next;
+		}
+	} else
+	{
+		struct store_log_forward *log = malloc(sizeof (struct store_log_forward));
+		log->file = strdup(file);
+		log->line = line;
+		log->function = strdup(function);
+		log->string = strdup(string);
+		log->next = NULL;
+		if (log_head==NULL)
+			log_head = log;
+		else
+		{
+			/* append to tail */
+			struct store_log_forward * t;
+			t = log_head;
+			while (t->next!=NULL)
+			{
+				t = t->next;
+			}
+			t->next = log;
+		}
+	}
+}
+
+void log_try(void)
+{
+	log_forward_count++;
+}
+
+void log_catch(void)
+{
+	assert(log_forward_count>0);
+	log_forward_count--;
+}
+
+void log_rethrow(void)
+{
+	log_catch();
+	if (log_forward_count==0)
+	{
+		struct store_log_forward *log;
+
+		log = log_head;
+		while (log != NULL)
+		{
+			log_forward(log->file, log->line, log->function, log->string);
+
+			struct store_log_forward *t=log;
+			log = log->next;
+
+			free((void *)t->file);
+			free((void *)t->function);
+			free((void *)t->string);
+			free(t);
+
+		}
+
+		log_head = NULL;
+	}
+}
+
+
 /* The log_puts() serves to somewhat different goals:
  *
  * - logging
@@ -131,18 +220,11 @@ static void log_puts(enum log_levels level, const char *file, int line, const ch
 	/* Never forward LOG_LVL_DEBUG, too verbose and they can be found in the log if need be */
 	if (level <= LOG_LVL_INFO)
 	{
-		log_callback_t *cb, *next;
-		cb = log_callbacks;
-		/* DANGER!!!! the log callback can remove itself!!!! */
-		while (cb)
-		{
-			next = cb->next;
-			cb->fn(cb->priv, file, line, function, string);
-			cb = next;
-		}
+		log_forward(file, line, function, string);
 	}
 }
 
+
 void log_printf(enum log_levels level, const char *file, int line, const char *function, const char *format, ...)
 {
 	char *string;
diff --git a/src/helper/log.h b/src/helper/log.h
index c3be0747ad6d44c723cb9ae6e1af457705f505a3..7fc5a886e84bc3d8ee5464ecc2cf6f64f44520dd 100644
--- a/src/helper/log.h
+++ b/src/helper/log.h
@@ -64,6 +64,15 @@ extern void kept_alive(void);
 extern void alive_sleep(int ms);
 extern void busy_sleep(int ms);
 
+
+/* log entries can be paused and replayed roughly according to the try/catch/rethrow
+ * concepts in C++
+ */
+void log_try(void);
+void log_catch(void);
+void log_rethrow(void);
+
+
 typedef void (*log_callback_fn)(void *priv, const char *file, int line,
 		const char *function, const char *string);