diff --git a/esp8266/modesp.c b/esp8266/modesp.c
index ac9da09a563a811cc10300e03534d446f922b28d..e7f2b0ab4a96edb919cfd2fcb9bad3b94fd6040a 100644
--- a/esp8266/modesp.c
+++ b/esp8266/modesp.c
@@ -47,6 +47,7 @@ typedef struct _esp_socket_obj_t {
 
     mp_obj_t cb_connect;
     mp_obj_t cb_recv;
+    mp_obj_t cb_sent;
     mp_obj_t cb_disconnect;
 
     uint8_t *recvbuf;
@@ -69,6 +70,7 @@ STATIC mp_obj_t esp_socket_make_new_base() {
     s->cb_connect = mp_const_none;
     s->cb_recv = mp_const_none;
     s->cb_disconnect = mp_const_none;
+    s->cb_sent = mp_const_none;
     s->fromserver = false;
     s->connlist = NULL;
     return s;
@@ -168,6 +170,12 @@ STATIC void esp_socket_recv_callback(void *arg, char *pdata, unsigned short len)
 }
 
 STATIC void esp_socket_sent_callback(void *arg) {
+    struct espconn *conn = arg;
+    esp_socket_obj_t *s = conn->reverse;
+
+    if (s->cb_sent != mp_const_none) {
+        call_function_1_protected(s->cb_sent, s);
+    }
 }
 
 STATIC void esp_socket_disconnect_callback(void *arg) {
@@ -379,6 +387,13 @@ STATIC mp_obj_t esp_socket_onrecv(mp_obj_t self_in, mp_obj_t lambda_in) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(esp_socket_onrecv_obj, esp_socket_onrecv);
 
+STATIC mp_obj_t esp_socket_onsent(mp_obj_t self_in, mp_obj_t lambda_in) {
+    esp_socket_obj_t *s = self_in;
+    s->cb_sent = lambda_in;
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(esp_socket_onsent_obj, esp_socket_onsent);
+
 STATIC mp_obj_t esp_socket_ondisconnect(mp_obj_t self_in, mp_obj_t lambda_in) {
     esp_socket_obj_t *s = self_in;
     s->cb_disconnect = lambda_in;
@@ -454,6 +469,7 @@ STATIC const mp_map_elem_t esp_socket_locals_dict_table[] = {
     { MP_OBJ_NEW_QSTR(MP_QSTR_recvfrom), (mp_obj_t)&esp_socket_recvfrom_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_onconnect), (mp_obj_t)&esp_socket_onconnect_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_onrecv), (mp_obj_t)&esp_socket_onrecv_obj },
+    { MP_OBJ_NEW_QSTR(MP_QSTR_onsent), (mp_obj_t)&esp_socket_onsent_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_ondisconnect), (mp_obj_t)&esp_socket_ondisconnect_obj },
 };
 STATIC MP_DEFINE_CONST_DICT(esp_socket_locals_dict, esp_socket_locals_dict_table);
diff --git a/esp8266/qstrdefsport.h b/esp8266/qstrdefsport.h
index fb064095e416e524b2d5f0d0eadb420f3a7c022c..704cb70c0ed30aa70ed4c8ad25df6dbbbf342aa2 100644
--- a/esp8266/qstrdefsport.h
+++ b/esp8266/qstrdefsport.h
@@ -62,6 +62,7 @@ Q(close)
 Q(protocol)
 Q(onconnect)
 Q(onrecv)
+Q(onsent)
 Q(ondisconnect)
 Q(STAT_IDLE)
 Q(STAT_CONNECTING)