diff --git a/changelog b/changelog
index fc866deefbed81a5f9e02f3fa0f7a792560fa596..ea3cdf0da8a662f4a72acfcc994b87119a007f0c 100644
--- a/changelog
+++ b/changelog
@@ -1,6 +1,16 @@
 Changelog
 ---------
 
+(development since 1.22)
+
+User api additions
+------------------
+
+ - You can now call libwebsocket_callback_on_writable() on http connectons,
+ 	and get a LWS_CALLBACK_HTTP_WRITEABLE callback, the same way you can
+	regulate writes with a websocket protocol connection.
+
+
 v1.21-chrome26-firefox18
 ========================
 
diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h
index d038a44a927e23605e0f29bae79c0c48e761e95a..3b1e83739617caf66057eccc857442e14f5f5867 100644
--- a/lib/libwebsockets.h
+++ b/lib/libwebsockets.h
@@ -134,6 +134,7 @@ enum libwebsocket_callback_reasons {
 	LWS_CALLBACK_SERVER_WRITEABLE,
 	LWS_CALLBACK_HTTP,
 	LWS_CALLBACK_HTTP_FILE_COMPLETION,
+	LWS_CALLBACK_HTTP_WRITEABLE,
 	LWS_CALLBACK_FILTER_NETWORK_CONNECTION,
 	LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION,
 	LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS,
@@ -436,6 +437,9 @@ struct libwebsocket_extension;
  *				total number of client connections allowed set
  *				by MAX_CLIENTS.
  *
+ *	LWS_CALLBACK_HTTP_WRITEABLE: you can write more down the http protocol
+ *		link now.
+ *
  *	LWS_CALLBACK_HTTP_FILE_COMPLETION: a file requested to be send down
  *				http link has completed.
  *
diff --git a/lib/server.c b/lib/server.c
index 3e81290f6a1129f0456f380d7c20cbd83128ad2e..72d9e08474fcb0cd3f9da0a08753761311bf9cd3 100644
--- a/lib/server.c
+++ b/lib/server.c
@@ -192,8 +192,19 @@ int lws_server_socket_service(struct libwebsocket_context *context,
 		/* one shot */
 		pollfd->events &= ~POLLOUT;
 
-		if (wsi->state != WSI_STATE_HTTP_ISSUING_FILE)
+		if (wsi->state != WSI_STATE_HTTP_ISSUING_FILE) {
+			n = user_callback_handle_rxflow(
+					wsi->protocol->callback,
+					wsi->protocol->owning_server,
+					wsi, LWS_CALLBACK_HTTP_WRITEABLE,
+					wsi->user_space,
+					NULL,
+					0);
+			if (n < 0)
+				libwebsocket_close_and_free_session(
+				       context, wsi, LWS_CLOSE_STATUS_NOSTATUS);
 			break;
+		}
 
 		/* nonzero for completion or error */
 		if (libwebsockets_serve_http_file_fragment(context, wsi))