Index: uspace/srv/net/tl/tcp/conn.c
===================================================================
--- uspace/srv/net/tl/tcp/conn.c	(revision b0d82d144af58a5bab3051633170f945ea88bfa1)
+++ uspace/srv/net/tl/tcp/conn.c	(revision 704586fb42a90393ccfdb239145e215bec6fd552)
@@ -59,4 +59,5 @@
 static void tcp_conn_seg_process(tcp_conn_t *conn, tcp_segment_t *seg);
 static void tcp_conn_tw_timer_set(tcp_conn_t *conn);
+static void tcp_conn_tw_timer_clear(tcp_conn_t *conn);
 
 /** Create new segment structure.
@@ -255,5 +256,9 @@
 	list_foreach(conn_list, link) {
 		tcp_conn_t *conn = list_get_instance(link, tcp_conn_t, link);
-		if (tcp_sockpair_match(sp, &conn->ident)) {
+		tcp_sockpair_t *csp = &conn->ident;
+		log_msg(LVL_DEBUG, "compare with conn (f:(%x,%u), l:(%x,%u))",
+		    csp->foreign.addr.ipv4, csp->foreign.port,
+		    csp->local.addr.ipv4, csp->local.port);
+		if (tcp_sockpair_match(sp, csp)) {
 			return conn;
 		}
@@ -261,4 +266,16 @@
 
 	return NULL;
+}
+
+/** Reset connection.
+ *
+ * @param conn	Connection
+ */
+static void tcp_conn_reset(tcp_conn_t *conn)
+{
+	log_msg(LVL_DEBUG, "%s: tcp_conn_reset()", conn->name);
+	tcp_conn_state_set(conn, st_closed);
+	tcp_conn_tw_timer_clear(conn);
+	tcp_tqueue_clear(&conn->retransmit);
 }
 
@@ -370,6 +387,6 @@
 		log_msg(LVL_DEBUG, "%s: Connection reset. -> Closed",
 		    conn->name);
-		/* XXX Signal user error */
-		tcp_conn_state_set(conn, st_closed);
+		/* Reset connection */
+		tcp_conn_reset(conn);
 		/* XXX delete connection */
 		return;
@@ -1003,6 +1020,11 @@
 
 	log_msg(LVL_DEBUG, "tw_timeout_func(%p)", conn);
+
+	if (conn->cstate == st_closed) {
+		log_msg(LVL_DEBUG, "Connection already closed.");
+		return;
+	}
+
 	log_msg(LVL_DEBUG, "%s: TW Timeout -> Closed", conn->name);
-
 	tcp_conn_remove(conn);
 	tcp_conn_state_set(conn, st_closed);
@@ -1019,4 +1041,13 @@
 }
 
+/** Clear the Time-Wait timeout.
+ *
+ * @param conn		Connection
+ */
+void tcp_conn_tw_timer_clear(tcp_conn_t *conn)
+{
+	fibril_timer_clear(conn->tw_timer);
+}
+
 /** Trim segment to the receive window.
  *
@@ -1067,12 +1098,10 @@
 void tcp_reply_rst(tcp_sockpair_t *sp, tcp_segment_t *seg)
 {
-	tcp_sockpair_t rsp;
 	tcp_segment_t *rseg;
 
 	log_msg(LVL_DEBUG, "tcp_reply_rst(%p, %p)", sp, seg);
 
-	tcp_sockpair_flipped(sp, &rsp);
 	rseg = tcp_segment_make_rst(seg);
-	tcp_transmit_segment(&rsp, rseg);
+	tcp_transmit_segment(sp, rseg);
 }
 
Index: uspace/srv/net/tl/tcp/sock.c
===================================================================
--- uspace/srv/net/tl/tcp/sock.c	(revision b0d82d144af58a5bab3051633170f945ea88bfa1)
+++ uspace/srv/net/tl/tcp/sock.c	(revision 704586fb42a90393ccfdb239145e215bec6fd552)
@@ -248,5 +248,7 @@
 
 	trc = tcp_uc_open(lport, &fsocket, ap_active, &socket->conn);
-	socket->conn->name = (char *)"C";
+
+	if (socket->conn != NULL)
+		socket->conn->name = (char *)"C";
 
 	switch (trc) {
@@ -307,5 +309,6 @@
 
 	trc = tcp_uc_open(sock_core->port, &fsocket, ap_passive, &conn);
-	conn->name = (char *)"S";
+	if (conn != NULL)
+		conn->name = (char *)"S";
 
 	log_msg(LVL_DEBUG, " - decode TCP return code");
Index: uspace/srv/net/tl/tcp/tqueue.c
===================================================================
--- uspace/srv/net/tl/tcp/tqueue.c	(revision b0d82d144af58a5bab3051633170f945ea88bfa1)
+++ uspace/srv/net/tl/tcp/tqueue.c	(revision 704586fb42a90393ccfdb239145e215bec6fd552)
@@ -71,4 +71,9 @@
 }
 
+void tcp_tqueue_clear(tcp_tqueue_t *tqueue)
+{
+	tcp_tqueue_timer_clear(tqueue->conn);
+}
+
 void tcp_tqueue_fini(tcp_tqueue_t *tqueue)
 {
@@ -267,5 +272,7 @@
 void tcp_transmit_segment(tcp_sockpair_t *sp, tcp_segment_t *seg)
 {
-	log_msg(LVL_DEBUG, "tcp_transmit_segment(%p, %p)", sp, seg);
+	log_msg(LVL_DEBUG, "tcp_transmit_segment(f:(%x,%u),l:(%x,%u), %p)",
+	    sp->foreign.addr.ipv4, sp->foreign.port,
+	    sp->local.addr.ipv4, sp->local.port, seg);
 
 	log_msg(LVL_DEBUG, "SEG.SEQ=%" PRIu32 ", SEG.WND=%" PRIu32,
@@ -299,4 +306,10 @@
 
 	log_msg(LVL_DEBUG, "### %s: retransmit_timeout_func(%p)", conn->name, conn);
+
+	if (conn->cstate == st_closed) {
+		log_msg(LVL_DEBUG, "Connection already closed.");
+		return;
+	}
+
 	link = list_first(&conn->retransmit.list);
 	if (link == NULL) {
Index: uspace/srv/net/tl/tcp/tqueue.h
===================================================================
--- uspace/srv/net/tl/tcp/tqueue.h	(revision b0d82d144af58a5bab3051633170f945ea88bfa1)
+++ uspace/srv/net/tl/tcp/tqueue.h	(revision 704586fb42a90393ccfdb239145e215bec6fd552)
@@ -40,4 +40,5 @@
 
 extern int tcp_tqueue_init(tcp_tqueue_t *, tcp_conn_t *);
+extern void tcp_tqueue_clear(tcp_tqueue_t *);
 extern void tcp_tqueue_fini(tcp_tqueue_t *);
 extern void tcp_tqueue_ctrl_seg(tcp_conn_t *, tcp_control_t);
Index: uspace/srv/net/tl/tcp/ucall.c
===================================================================
--- uspace/srv/net/tl/tcp/ucall.c	(revision b0d82d144af58a5bab3051633170f945ea88bfa1)
+++ uspace/srv/net/tl/tcp/ucall.c	(revision 704586fb42a90393ccfdb239145e215bec6fd552)
@@ -91,6 +91,4 @@
 
 	if (nconn->cstate != st_established) {
-		fibril_mutex_unlock(&nconn->cstate_lock);
-
 		log_msg(LVL_DEBUG, "tcp_uc_open: Connection was reset.");
 		assert(nconn->cstate == st_closed);
@@ -238,5 +236,7 @@
 	tcp_conn_t *conn;
 
-	log_msg(LVL_DEBUG, "tcp_as_segment_arrived()");
+	log_msg(LVL_DEBUG, "tcp_as_segment_arrived(f:(%x,%u), l:(%x,%u))",
+	    sp->foreign.addr.ipv4, sp->foreign.port,
+	    sp->local.addr.ipv4, sp->local.port);
 
 	conn = tcp_conn_find(sp);
