diff --git a/lib/context.c b/lib/context.c
index 28db7aa45e37c14b6749f5a04ba3ecefd903d9ed..67636c34526492fd969fe06def6414fc3bc3c15c 100644
--- a/lib/context.c
+++ b/lib/context.c
@@ -958,6 +958,16 @@ lws_create_event_pipes(struct lws_context *context)
 	return 0;
 }
 
+static void
+lws_destroy_event_pipe(struct lws *wsi)
+{
+	lws_plat_pipe_close(wsi);
+	remove_wsi_socket_from_fds(wsi);
+	lws_libevent_destroy(wsi);
+	wsi->context->count_wsi_allocated--;
+	lws_free(wsi);
+}
+
 LWS_VISIBLE struct lws_context *
 lws_create_context(struct lws_context_creation_info *info)
 {
@@ -1682,12 +1692,9 @@ lws_context_destroy(struct lws_context *context)
 			if (!wsi)
 				continue;
 
-			if (wsi->event_pipe) {
-				lws_plat_pipe_close(wsi);
-				remove_wsi_socket_from_fds(wsi);
-				lws_free(wsi);
-				context->count_wsi_allocated--;
-			} else
+			if (wsi->event_pipe)
+				lws_destroy_event_pipe(wsi);
+			else
 				lws_close_free_wsi(wsi,
 					LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY
 					/* no protocol close */);
diff --git a/lib/event-libs/libevent.c b/lib/event-libs/libevent.c
index ad12ac5133e20c7ae4a3ed0351ce51194fb462d0..61af5d3f93376bdac8ba7d6411a031e406c6a3d5 100644
--- a/lib/event-libs/libevent.c
+++ b/lib/event-libs/libevent.c
@@ -185,6 +185,19 @@ lws_libevent_accept(struct lws *new_wsi, lws_sock_file_fd_type desc)
 		(EV_WRITE | EV_PERSIST), lws_event_cb, &new_wsi->w_write);
 }
 
+LWS_VISIBLE void
+lws_libevent_destroy(struct lws *wsi)
+{
+	if (!wsi)
+		return;
+
+	if(wsi->w_read.event_watcher)
+		event_free(wsi->w_read.event_watcher);
+
+	if(wsi->w_write.event_watcher)
+		event_free(wsi->w_write.event_watcher);
+}
+
 LWS_VISIBLE void
 lws_libevent_io(struct lws *wsi, int flags)
 {
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index 32157effb9de874c819494c9c1e2c2b2c7f8e0c0..bba1182ad633e87b5f030b27671e39dbfd510e7d 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -124,6 +124,8 @@ lws_free_wsi(struct lws *wsi)
 	lws_ssl_remove_wsi_from_buffered_list(wsi);
 	lws_remove_from_timeout_list(wsi);
 
+	lws_libevent_destroy(wsi);
+
 	wsi->context->count_wsi_allocated--;
 	lwsl_debug("%s: %p, remaining wsi %d\n", __func__, wsi,
 			wsi->context->count_wsi_allocated);
diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index 04b312cabbf0724dc712a2949ca6e4b7c0c8caab..a3c38e00784adec90b5c993992b824aa186df7aa 100644
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -1275,6 +1275,8 @@ LWS_EXTERN void lws_feature_status_libuv(struct lws_context_creation_info *info)
 #if defined(LWS_WITH_LIBEVENT)
 LWS_EXTERN void
 lws_libevent_accept(struct lws *new_wsi, lws_sock_file_fd_type desc);
+LWS_VISIBLE void
+lws_libevent_destroy(struct lws *wsi);
 LWS_EXTERN void
 lws_libevent_io(struct lws *wsi, int flags);
 LWS_EXTERN int
@@ -1287,6 +1289,7 @@ lws_libevent_run(const struct lws_context *context, int tsi);
 LWS_EXTERN void lws_feature_status_libevent(struct lws_context_creation_info *info);
 #else
 #define lws_libevent_accept(_a, _b) ((void) 0)
+#define lws_libevent_destroy(_a) ((void) 0)
 #define lws_libevent_io(_a, _b) ((void) 0)
 #define lws_libevent_init_fd_table(_a) (0)
 #define lws_libevent_run(_a, _b) ((void) 0)