Index: uspace/lib/c/generic/iplink_srv.c
===================================================================
--- uspace/lib/c/generic/iplink_srv.c	(revision ceba4bed90274ab7e0275c4ddcb524984cc64a39)
+++ uspace/lib/c/generic/iplink_srv.c	(revision 4f64a523695d07f25f0d3382ba626f4d1ec45c79)
@@ -41,5 +41,5 @@
 #include <inet/iplink_srv.h>
 
-static void iplink_get_mtu_srv(iplink_conn_t *conn, ipc_callid_t callid,
+static void iplink_get_mtu_srv(iplink_srv_t *srv, ipc_callid_t callid,
     ipc_call_t *call)
 {
@@ -47,9 +47,9 @@
 	size_t mtu;
 
-	rc = conn->srv->ops->get_mtu(conn, &mtu);
+	rc = srv->ops->get_mtu(srv, &mtu);
 	async_answer_1(callid, rc, mtu);
 }
 
-static void iplink_send_srv(iplink_conn_t *conn, ipc_callid_t callid,
+static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t callid,
     ipc_call_t *call)
 {
@@ -66,7 +66,16 @@
 	}
 
-	rc = conn->srv->ops->send(conn, &sdu);
+	rc = srv->ops->send(srv, &sdu);
 	free(sdu.data);
 	async_answer_0(callid, rc);
+}
+
+void iplink_srv_init(iplink_srv_t *srv)
+{
+	fibril_mutex_initialize(&srv->lock);
+	srv->connected = false;
+	srv->ops = NULL;
+	srv->arg = NULL;
+	srv->client_sess = NULL;
 }
 
@@ -74,6 +83,15 @@
 {
 	iplink_srv_t *srv = (iplink_srv_t *)arg;
-	iplink_conn_t conn;
 	int rc;
+
+	fibril_mutex_lock(&srv->lock);
+	if (srv->connected) {
+		fibril_mutex_unlock(&srv->lock);
+		async_answer_0(iid, EBUSY);
+		return EBUSY;
+	}
+
+	srv->connected = true;
+	fibril_mutex_unlock(&srv->lock);
 
 	/* Accept the connection */
@@ -84,8 +102,7 @@
 		return ENOMEM;
 
-	conn.srv = srv;
-	conn.client_sess = sess;
+	srv->client_sess = sess;
 
-	rc = srv->ops->open(&conn);
+	rc = srv->ops->open(srv);
 	if (rc != EOK)
 		return rc;
@@ -104,8 +121,8 @@
 		switch (method) {
 		case IPLINK_GET_MTU:
-			iplink_get_mtu_srv(&conn, callid, &call);
+			iplink_get_mtu_srv(srv, callid, &call);
 			break;
 		case IPLINK_SEND:
-			iplink_send_srv(&conn, callid, &call);
+			iplink_send_srv(srv, callid, &call);
 			break;
 		default:
@@ -114,10 +131,13 @@
 	}
 
-	return srv->ops->close(&conn);
+	return srv->ops->close(srv);
 }
 
-int iplink_ev_recv(iplink_conn_t *conn, iplink_srv_sdu_t *sdu)
+int iplink_ev_recv(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
 {
-	async_exch_t *exch = async_exchange_begin(conn->client_sess);
+	if (srv->client_sess == NULL)
+		return EIO;
+
+	async_exch_t *exch = async_exchange_begin(srv->client_sess);
 
 	ipc_call_t answer;
Index: uspace/lib/c/include/inet/iplink_srv.h
===================================================================
--- uspace/lib/c/include/inet/iplink_srv.h	(revision ceba4bed90274ab7e0275c4ddcb524984cc64a39)
+++ uspace/lib/c/include/inet/iplink_srv.h	(revision 4f64a523695d07f25f0d3382ba626f4d1ec45c79)
@@ -37,4 +37,6 @@
 
 #include <async.h>
+#include <fibril_synch.h>
+#include <bool.h>
 #include <sys/types.h>
 
@@ -42,12 +44,10 @@
 
 typedef struct {
+	fibril_mutex_t lock;
+	bool connected;
 	struct iplink_ops *ops;
 	void *arg;
+	async_sess_t *client_sess;
 } iplink_srv_t;
-
-typedef struct {
-	iplink_srv_t *srv;
-	async_sess_t *client_sess;
-} iplink_conn_t;
 
 typedef struct {
@@ -68,12 +68,14 @@
 
 typedef struct iplink_ops {
-	int (*open)(iplink_conn_t *);
-	int (*close)(iplink_conn_t *);
-	int (*send)(iplink_conn_t *, iplink_srv_sdu_t *);
-	int (*get_mtu)(iplink_conn_t *, size_t *);
+	int (*open)(iplink_srv_t *);
+	int (*close)(iplink_srv_t *);
+	int (*send)(iplink_srv_t *, iplink_srv_sdu_t *);
+	int (*get_mtu)(iplink_srv_t *, size_t *);
 } iplink_ops_t;
 
+extern void iplink_srv_init(iplink_srv_t *);
+
 extern int iplink_conn(ipc_callid_t, ipc_call_t *, void *);
-extern int iplink_ev_recv(iplink_conn_t *, iplink_srv_sdu_t *);
+extern int iplink_ev_recv(iplink_srv_t *, iplink_srv_sdu_t *);
 
 #endif
