Index: uspace/srv/net/tl/tcp/conn.c
===================================================================
--- uspace/srv/net/tl/tcp/conn.c	(revision 6df418c4ef80dc56e75e408fbe68f7d9b495baa9)
+++ uspace/srv/net/tl/tcp/conn.c	(revision 6e88fea54ce8605a469de92c0d47f6a35461c26c)
@@ -120,4 +120,13 @@
 }
 
+/** Delist connection.
+ *
+ * Remove connection from the connection map.
+ */
+void tcp_conn_remove(tcp_conn_t *conn)
+{
+	list_remove(&conn->link);
+}
+
 /** Synchronize connection.
  *
@@ -150,5 +159,5 @@
 		break;
 	case st_close_wait:
-		log_msg(LVL_DEBUG, "FIN sent -> Close-Wait");
+		log_msg(LVL_DEBUG, "FIN sent -> Last-Ack");
 		conn->cstate = st_last_ack;
 		break;
@@ -596,5 +605,11 @@
 		return cp_done;
 
-	/* TODO */
+	if (conn->fin_is_acked) {
+		log_msg(LVL_DEBUG, " FIN acked -> Closed");
+		tcp_conn_remove(conn);
+		conn->cstate = st_closed;
+		return cp_done;
+	}
+
 	return cp_continue;
 }
@@ -762,4 +777,7 @@
 	if (tcp_segment_text_size(seg) == 0 && (seg->ctrl & CTL_FIN) != 0) {
 		log_msg(LVL_DEBUG, " - FIN found in segment.");
+
+		/* Send ACK */
+		tcp_tqueue_ctrl_seg(conn, CTL_ACK);
 
 		conn->rcv_nxt++;
Index: uspace/srv/net/tl/tcp/conn.h
===================================================================
--- uspace/srv/net/tl/tcp/conn.h	(revision 6df418c4ef80dc56e75e408fbe68f7d9b495baa9)
+++ uspace/srv/net/tl/tcp/conn.h	(revision 6e88fea54ce8605a469de92c0d47f6a35461c26c)
@@ -40,5 +40,6 @@
 
 extern tcp_conn_t *tcp_conn_new(tcp_sock_t *, tcp_sock_t *);
-void tcp_conn_add(tcp_conn_t *);
+extern void tcp_conn_add(tcp_conn_t *);
+extern void tcp_conn_remove(tcp_conn_t *);
 extern void tcp_conn_sync(tcp_conn_t *);
 extern void tcp_conn_fin_sent(tcp_conn_t *);
Index: uspace/srv/net/tl/tcp/test.c
===================================================================
--- uspace/srv/net/tl/tcp/test.c	(revision 6df418c4ef80dc56e75e408fbe68f7d9b495baa9)
+++ uspace/srv/net/tl/tcp/test.c	(revision 6e88fea54ce8605a469de92c0d47f6a35461c26c)
@@ -73,4 +73,9 @@
 	}
 
+	async_usleep(1000*1000);
+
+	printf("test_srv() close connection\n");
+	tcp_uc_close(conn);
+
 	printf("test_srv() terminating\n");
 }
