Index: uspace/lib/c/generic/inet/tcp.c
===================================================================
--- uspace/lib/c/generic/inet/tcp.c	(revision 779541be88a7692182b80bde3b7fae49f3832431)
+++ uspace/lib/c/generic/inet/tcp.c	(revision 1d4b81591a929b53375c465b56682d296889dd8e)
@@ -274,6 +274,16 @@
 int tcp_conn_wait_connected(tcp_conn_t *conn)
 {
-	async_usleep(1000 * 1000);
-	return 0;
+	fibril_mutex_lock(&conn->lock);
+	while (!conn->connected && !conn->conn_failed && !conn->conn_reset)
+		fibril_condvar_wait(&conn->cv, &conn->lock);
+
+	if (conn->connected) {
+		fibril_mutex_unlock(&conn->lock);
+		return EOK;
+	} else {
+		assert(conn->conn_failed || conn->conn_reset);
+		fibril_mutex_unlock(&conn->lock);
+		return EIO;
+	}
 }
 
@@ -442,18 +452,75 @@
 static void tcp_ev_connected(tcp_t *tcp, ipc_callid_t iid, ipc_call_t *icall)
 {
+	tcp_conn_t *conn;
+	sysarg_t conn_id;
+	int rc;
+
 	printf("tcp_ev_connected()\n");
-	async_answer_0(iid, ENOTSUP);
+	conn_id = IPC_GET_ARG1(*icall);
+
+	rc = tcp_conn_get(tcp, conn_id, &conn);
+	if (rc != EOK) {
+		printf("conn ID %zu not found\n",
+		    conn_id);
+		async_answer_0(iid, ENOENT);
+		return;
+	}
+
+	fibril_mutex_lock(&conn->lock);
+	conn->connected = true;
+	fibril_condvar_broadcast(&conn->cv);
+	fibril_mutex_unlock(&conn->lock);
+
+	async_answer_0(iid, EOK);
 }
 
 static void tcp_ev_conn_failed(tcp_t *tcp, ipc_callid_t iid, ipc_call_t *icall)
 {
+	tcp_conn_t *conn;
+	sysarg_t conn_id;
+	int rc;
+
 	printf("tcp_ev_conn_failed()\n");
-	async_answer_0(iid, ENOTSUP);
+	conn_id = IPC_GET_ARG1(*icall);
+
+	rc = tcp_conn_get(tcp, conn_id, &conn);
+	if (rc != EOK) {
+		printf("conn ID %zu not found\n",
+		    conn_id);
+		async_answer_0(iid, ENOENT);
+		return;
+	}
+
+	fibril_mutex_lock(&conn->lock);
+	conn->conn_failed = true;
+	fibril_condvar_broadcast(&conn->cv);
+	fibril_mutex_unlock(&conn->lock);
+
+	async_answer_0(iid, EOK);
 }
 
 static void tcp_ev_conn_reset(tcp_t *tcp, ipc_callid_t iid, ipc_call_t *icall)
 {
+	tcp_conn_t *conn;
+	sysarg_t conn_id;
+	int rc;
+
 	printf("tcp_ev_conn_reset()\n");
-	async_answer_0(iid, ENOTSUP);
+	conn_id = IPC_GET_ARG1(*icall);
+
+	rc = tcp_conn_get(tcp, conn_id, &conn);
+	if (rc != EOK) {
+		printf("conn ID %zu not found\n",
+		    conn_id);
+		async_answer_0(iid, ENOENT);
+		return;
+	}
+
+	fibril_mutex_lock(&conn->lock);
+	conn->conn_reset = true;
+	fibril_condvar_broadcast(&conn->cv);
+	fibril_mutex_unlock(&conn->lock);
+
+	async_answer_0(iid, EOK);
 }
 
Index: uspace/lib/c/include/inet/tcp.h
===================================================================
--- uspace/lib/c/include/inet/tcp.h	(revision 779541be88a7692182b80bde3b7fae49f3832431)
+++ uspace/lib/c/include/inet/tcp.h	(revision 1d4b81591a929b53375c465b56682d296889dd8e)
@@ -52,4 +52,7 @@
 	/** Some received data available in TCP server */
 	bool data_avail;
+	bool connected;
+	bool conn_failed;
+	bool conn_reset;
 } tcp_conn_t;
 
