Index: uspace/srv/net/tcp/conn.c
===================================================================
--- uspace/srv/net/tcp/conn.c	(revision 04ecc6df166749e3133297733e30b460612c119f)
+++ uspace/srv/net/tcp/conn.c	(revision b243da3434115a8101e3ebac364a0a3b75aaf102)
@@ -381,5 +381,5 @@
  * @param conn	Connection
  */
-static void tcp_conn_reset(tcp_conn_t *conn)
+void tcp_conn_reset(tcp_conn_t *conn)
 {
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_conn_reset()", conn->name);
Index: uspace/srv/net/tcp/conn.h
===================================================================
--- uspace/srv/net/tcp/conn.h	(revision 04ecc6df166749e3133297733e30b460612c119f)
+++ uspace/srv/net/tcp/conn.h	(revision b243da3434115a8101e3ebac364a0a3b75aaf102)
@@ -43,4 +43,5 @@
 extern void tcp_conn_add(tcp_conn_t *);
 extern void tcp_conn_remove(tcp_conn_t *);
+extern void tcp_conn_reset(tcp_conn_t *conn);
 extern void tcp_conn_sync(tcp_conn_t *);
 extern void tcp_conn_fin_sent(tcp_conn_t *);
Index: uspace/srv/net/tcp/sock.c
===================================================================
--- uspace/srv/net/tcp/sock.c	(revision 04ecc6df166749e3133297733e30b460612c119f)
+++ uspace/srv/net/tcp/sock.c	(revision b243da3434115a8101e3ebac364a0a3b75aaf102)
@@ -882,4 +882,5 @@
 	tcp_sockdata_t *socket;
 	tcp_error_t trc;
+	int i;
 	int rc;
 
@@ -897,4 +898,5 @@
 
 	if (socket->conn != NULL) {
+		/* Close connection */
 		trc = tcp_uc_close(socket->conn);
 		if (trc != TCP_EOK && trc != TCP_ENOTEXIST) {
@@ -905,4 +907,20 @@
 	}
 
+	if (socket->lconn != NULL) {
+		/* Close listening connections */
+		for (i = 0; i < socket->backlog; i++) {
+			tcp_uc_set_cstate_cb(socket->lconn[i]->conn, NULL, NULL);
+			trc = tcp_uc_close(socket->lconn[i]->conn);
+			if (trc != TCP_EOK && trc != TCP_ENOTEXIST) {
+				fibril_mutex_unlock(&socket->lock);
+				async_answer_0(callid, EBADF);
+				return;
+			}
+
+			free(socket->lconn[i]);
+			socket->lconn[i] = NULL;
+		}
+	}
+
 	/* Grab recv_buffer_lock because of CV wait in tcp_sock_recv_fibril() */
 	fibril_mutex_lock(&socket->recv_buffer_lock);
Index: uspace/srv/net/tcp/ucall.c
===================================================================
--- uspace/srv/net/tcp/ucall.c	(revision 04ecc6df166749e3133297733e30b460612c119f)
+++ uspace/srv/net/tcp/ucall.c	(revision b243da3434115a8101e3ebac364a0a3b75aaf102)
@@ -83,4 +83,5 @@
 
 	if (oflags == tcp_open_nonblock) {
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open -> %p", nconn);
 		*conn = nconn;
 		return TCP_EOK;
@@ -234,18 +235,29 @@
 tcp_error_t tcp_uc_close(tcp_conn_t *conn)
 {
-	log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close()", conn->name);
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close(%p)", conn->name,
+	    conn);
 
 	fibril_mutex_lock(&conn->lock);
 
 	if (conn->cstate == st_closed) {
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ENOTEXIST");
 		fibril_mutex_unlock(&conn->lock);
 		return TCP_ENOTEXIST;
 	}
 
+	if (conn->cstate == st_listen || conn->cstate == st_syn_sent) {
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - listen/syn_sent");
+		tcp_conn_reset(conn);
+		tcp_conn_remove(conn);
+		return TCP_EOK;
+	}
+
 	if (conn->snd_buf_fin) {
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ECLOSING");
 		fibril_mutex_unlock(&conn->lock);
 		return TCP_ECLOSING;
 	}
 
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - set snd_buf_fin");
 	conn->snd_buf_fin = true;
 	tcp_tqueue_new_data(conn);
