Index: uspace/app/dnsres/dnsres.c
===================================================================
--- uspace/app/dnsres/dnsres.c	(revision 287d729f794bf828f2721da0c621cd40924d377d)
+++ uspace/app/dnsres/dnsres.c	(revision fff7ef4b73612f7e181f2ba2f74883b9de53f46f)
@@ -65,11 +65,4 @@
 	char *saddr;
 
-	rc = dnsr_init();
-	if (rc != EOK) {
-		printf(NAME ": Failed connecting to DNS resolution service "
-		    "(%d).\n", rc);
-		return 1;
-	}
-
 	if (argc != 2) {
 		print_syntax();
Index: uspace/app/nettest1/nettest1.c
===================================================================
--- uspace/app/nettest1/nettest1.c	(revision 287d729f794bf828f2721da0c621cd40924d377d)
+++ uspace/app/nettest1/nettest1.c	(revision fff7ef4b73612f7e181f2ba2f74883b9de53f46f)
@@ -354,11 +354,4 @@
 	if (rc != EOK) {
 		/* Try interpreting as a host name */
-		rc = dnsr_init();
-		if (rc != EOK) {
-			printf("Failed connecting DNS resolution "
-			    "service (%d).\n", rc);
-			return rc;
-		}
-
 		rc = dnsr_name2host(argv[argc - 1], &hinfo);
 		if (rc != EOK) {
Index: uspace/app/nettest2/nettest2.c
===================================================================
--- uspace/app/nettest2/nettest2.c	(revision 287d729f794bf828f2721da0c621cd40924d377d)
+++ uspace/app/nettest2/nettest2.c	(revision fff7ef4b73612f7e181f2ba2f74883b9de53f46f)
@@ -300,11 +300,4 @@
 	if (rc != EOK) {
 		/* Try interpreting as a host name */
-		rc = dnsr_init();
-		if (rc != EOK) {
-			printf("Failed connecting DNS resolution "
-			    "service (%d).\n", rc);
-			return rc;
-		}
-
 		rc = dnsr_name2host(argv[argc - 1], &hinfo);
 		if (rc != EOK) {
Index: uspace/app/nettest3/nettest3.c
===================================================================
--- uspace/app/nettest3/nettest3.c	(revision 287d729f794bf828f2721da0c621cd40924d377d)
+++ uspace/app/nettest3/nettest3.c	(revision fff7ef4b73612f7e181f2ba2f74883b9de53f46f)
@@ -78,11 +78,4 @@
 		if (rc != EOK) {
 			/* Try interpreting as a host name */
-			rc = dnsr_init();
-			if (rc != EOK) {
-				printf("Failed connecting DNS resolution "
-				    "service (%d).\n", rc);
-				return rc;
-			}
-
 			rc = dnsr_name2host(argv[1], &hinfo);
 			if (rc != EOK) {
Index: uspace/app/nterm/conn.c
===================================================================
--- uspace/app/nterm/conn.c	(revision 287d729f794bf828f2721da0c621cd40924d377d)
+++ uspace/app/nterm/conn.c	(revision fff7ef4b73612f7e181f2ba2f74883b9de53f46f)
@@ -85,11 +85,4 @@
 	if (rc != EOK) {
 		/* Try interpreting as a host name */
-		rc = dnsr_init();
-		if (rc != EOK) {
-			printf("Failed connecting DNS resolution "
-			    "service (%d).\n", rc);
-			goto error;
-		}
-
 		rc = dnsr_name2host(addr_s, &hinfo);
 		if (rc != EOK) {
Index: uspace/app/ping/ping.c
===================================================================
--- uspace/app/ping/ping.c	(revision 287d729f794bf828f2721da0c621cd40924d377d)
+++ uspace/app/ping/ping.c	(revision fff7ef4b73612f7e181f2ba2f74883b9de53f46f)
@@ -245,11 +245,4 @@
 	if (rc != EOK) {
 		/* Try interpreting as a host name */
-		rc = dnsr_init();
-		if (rc != EOK) {
-			printf(NAME ": Failed connecting DNS resolution "
-			    "service (%d).\n", rc);
-			goto error;
-		}
-
 		rc = dnsr_name2host(argv[argi], &hinfo);
 		if (rc != EOK) {
Index: uspace/lib/c/generic/dnsr.c
===================================================================
--- uspace/lib/c/generic/dnsr.c	(revision 287d729f794bf828f2721da0c621cd40924d377d)
+++ uspace/lib/c/generic/dnsr.c	(revision fff7ef4b73612f7e181f2ba2f74883b9de53f46f)
@@ -30,4 +30,5 @@
 #include <assert.h>
 #include <errno.h>
+#include <fibril_synch.h>
 #include <inet/dnsr.h>
 #include <ipc/dnsr.h>
@@ -37,29 +38,37 @@
 #include <str.h>
 
+static FIBRIL_MUTEX_INITIALIZE(dnsr_sess_mutex);
+
 static async_sess_t *dnsr_sess = NULL;
 
-int dnsr_init(void)
+static async_exch_t *dnsr_exchange_begin(void)
 {
+	async_sess_t *sess;
 	service_id_t dnsr_svc;
-	int rc;
 
-	assert(dnsr_sess == NULL);
+	fibril_mutex_lock(&dnsr_sess_mutex);
 
-	rc = loc_service_get_id(SERVICE_NAME_DNSR, &dnsr_svc,
-	    IPC_FLAG_BLOCKING);
-	if (rc != EOK)
-		return ENOENT;
+	if (dnsr_sess == NULL) {
+		(void) loc_service_get_id(SERVICE_NAME_DNSR, &dnsr_svc,
+		    IPC_FLAG_BLOCKING);
 
-	dnsr_sess = loc_service_connect(EXCHANGE_SERIALIZE, dnsr_svc,
-	    IPC_FLAG_BLOCKING);
-	if (dnsr_sess == NULL)
-		return ENOENT;
+		dnsr_sess = loc_service_connect(EXCHANGE_SERIALIZE, dnsr_svc,
+		    IPC_FLAG_BLOCKING);
+	}
 
-	return EOK;
+	sess = dnsr_sess;
+	fibril_mutex_unlock(&dnsr_sess_mutex);
+
+	return async_exchange_begin(sess);
+}
+
+static void dnsr_exchange_end(async_exch_t *exch)
+{
+	async_exchange_end(exch);
 }
 
 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo)
 {
-	async_exch_t *exch = async_exchange_begin(dnsr_sess);
+	async_exch_t *exch = dnsr_exchange_begin();
 	dnsr_hostinfo_t *info;
 
@@ -68,5 +77,5 @@
 	sysarg_t retval = async_data_write_start(exch, name, str_size(name));
 
-	async_exchange_end(exch);
+	dnsr_exchange_end(exch);
 
 	if (retval != EOK) {
@@ -102,8 +111,8 @@
 {
 	sysarg_t addr;
-	async_exch_t *exch = async_exchange_begin(dnsr_sess);
+	async_exch_t *exch = dnsr_exchange_begin();
 
 	int rc = async_req_0_1(exch, DNSR_GET_SRVADDR, &addr);
-	async_exchange_end(exch);
+	dnsr_exchange_end(exch);
 
 	if (rc != EOK)
@@ -116,8 +125,8 @@
 int dnsr_set_srvaddr(inet_addr_t *srvaddr)
 {
-	async_exch_t *exch = async_exchange_begin(dnsr_sess);
+	async_exch_t *exch = dnsr_exchange_begin();
 
 	int rc = async_req_1_0(exch, DNSR_SET_SRVADDR, srvaddr->ipv4);
-	async_exchange_end(exch);
+	dnsr_exchange_end(exch);
 
 	if (rc != EOK)
