diff --git a/examples/websocket.c b/examples/websocket.c
index 1cfb83dc4297dad947355b068f15c90033dc7e74..8810e4387c86c68f138840a5d0fa37531e35bd0b 100644
--- a/examples/websocket.c
+++ b/examples/websocket.c
@@ -9,10 +9,10 @@
 extern const char *find_embedded_file(const char *, size_t *);
 
 static int iterate_callback(struct mg_connection *c, enum mg_event ev) {
-  static int counter = 0;
   if (ev == MG_POLL && c->is_websocket) {
     char buf[20];
-    int len = snprintf(buf, sizeof(buf), "%d", counter++);
+    int len = snprintf(buf, sizeof(buf), "%lu",
+     (unsigned long) * (time_t *) c->callback_param);
     mg_websocket_write(c, 1, buf, len);
   }
   return MG_TRUE;
@@ -58,7 +58,7 @@ int main(void) {
     current_timer = time(NULL);
     if (current_timer - last_timer > 0) {
       last_timer = current_timer;
-      mg_iterate_over_connections(server, iterate_callback);
+      mg_iterate_over_connections(server, iterate_callback, &current_timer);
     }
   }
 
diff --git a/mongoose.c b/mongoose.c
index f51d2ed228d53d2939fdb1ed75ddcc91571a8f2b..e704b1e77289c5bb12f5e874eeb1af18a47190a0 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -4254,20 +4254,21 @@ struct mg_iterator {
   mg_handler_t cb;
   void *param;
 };
-union variant { mg_handler_t cb; void *p; };
 
 static void iter(struct ns_connection *nsconn, enum ns_event ev, void *param) {
   if (ev == NS_POLL) {
-    union variant *variant = (union variant *) param;
+    struct mg_iterator *it = (struct mg_iterator *) param;
     struct connection *c = (struct connection *) nsconn->connection_data;
-    variant->cb(&c->mg_conn, MG_POLL);
+    c->mg_conn.callback_param = it->param;
+    it->cb(&c->mg_conn, MG_POLL);
   }
 }
 
 // Apply function to all active connections.
-void mg_iterate_over_connections(struct mg_server *server, mg_handler_t cb) {
-  union variant variant = { cb };
-  ns_iterate(&server->ns_server, iter, &variant);
+void mg_iterate_over_connections(struct mg_server *server, mg_handler_t cb,
+  void *param) {
+  struct mg_iterator it = { cb, param };
+  ns_iterate(&server->ns_server, iter, &it);
 }
 
 static int get_var(const char *data, size_t data_len, const char *name,
diff --git a/mongoose.h b/mongoose.h
index ffee8ef62ab426094f4069114ae0922a1c635954..954f44a944ffd2f30841af453a58744a2c57ddc2 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -48,13 +48,14 @@ struct mg_connection {
   } http_headers[30];
 
   char *content;              // POST (or websocket message) data, or NULL
-  size_t content_len;       // content length
+  size_t content_len;         // Data length
 
   int is_websocket;           // Connection is a websocket connection
   int status_code;            // HTTP status code for HTTP error handler
   int wsbits;                 // First byte of the websocket frame
   void *server_param;         // Parameter passed to mg_add_uri_handler()
   void *connection_param;     // Placeholder for connection-specific data
+  void *callback_param;       // Needed by mg_iterate_over_connections()
 };
 
 struct mg_server; // Opaque structure describing server instance
@@ -80,7 +81,7 @@ const char **mg_get_valid_option_names(void);
 const char *mg_get_option(const struct mg_server *server, const char *name);
 void mg_set_listening_socket(struct mg_server *, int sock);
 int mg_get_listening_socket(struct mg_server *);
-void mg_iterate_over_connections(struct mg_server *, mg_handler_t);
+void mg_iterate_over_connections(struct mg_server *, mg_handler_t, void *);
 void mg_wakeup_server(struct mg_server *);
 struct mg_connection *mg_connect(struct mg_server *, const char *, int, int);