Index: uspace/app/loc/loc.c
===================================================================
--- uspace/app/loc/loc.c	(revision 3f57fb73696fea31ef6a619b390a707b4091eda9)
+++ uspace/app/loc/loc.c	(revision a3fcfbab8ada7658810ed4966e92d5dc1f3cfec7)
@@ -48,4 +48,5 @@
 	size_t svc_cnt;
 	char *svc_name;
+	char *server_name;
 	int rc;
 	size_t j;
@@ -67,6 +68,20 @@
 			continue;
 		}
-		printf("\t%s (%" PRIun ")\n", svc_name, svc_ids[j]);
+
+		rc = loc_service_get_server_name(svc_ids[j], &server_name);
+		if (rc != EOK && rc != EINVAL) {
+			free(svc_name);
+			printf(NAME ": Unknown service name (SID %"
+			    PRIun ").\n", svc_ids[j]);
+			continue;
+		}
+
+		if (rc == EOK)
+			printf("\t%s : %s\n", svc_name, server_name);
+		else
+			printf("\t%s\n", svc_name);
+	
 		free(svc_name);
+		free(server_name);
 	}
 
Index: uspace/lib/c/generic/loc.c
===================================================================
--- uspace/lib/c/generic/loc.c	(revision 3f57fb73696fea31ef6a619b390a707b4091eda9)
+++ uspace/lib/c/generic/loc.c	(revision a3fcfbab8ada7658810ed4966e92d5dc1f3cfec7)
@@ -450,4 +450,18 @@
 }
 
+/** Get service server name.
+ *
+ * Provided ID of a service, return the name of its server.
+ *
+ * @param svc_id	Service ID
+ * @param name		Place to store pointer to new string. Caller should
+ *			free it using free().
+ * @return		EOK on success or negative error code
+ */
+int loc_service_get_server_name(service_id_t svc_id, char **name)
+{
+	return loc_get_name_internal(LOC_SERVICE_GET_SERVER_NAME, svc_id, name);
+}
+
 int loc_namespace_get_id(const char *name, service_id_t *handle,
     unsigned int flags)
Index: uspace/lib/c/include/ipc/loc.h
===================================================================
--- uspace/lib/c/include/ipc/loc.h	(revision 3f57fb73696fea31ef6a619b390a707b4091eda9)
+++ uspace/lib/c/include/ipc/loc.h	(revision a3fcfbab8ada7658810ed4966e92d5dc1f3cfec7)
@@ -56,4 +56,5 @@
 	LOC_SERVICE_GET_ID,
 	LOC_SERVICE_GET_NAME,
+	LOC_SERVICE_GET_SERVER_NAME,
 	LOC_NAMESPACE_GET_ID,
 	LOC_CALLBACK_CREATE,
Index: uspace/lib/c/include/loc.h
===================================================================
--- uspace/lib/c/include/loc.h	(revision 3f57fb73696fea31ef6a619b390a707b4091eda9)
+++ uspace/lib/c/include/loc.h	(revision a3fcfbab8ada7658810ed4966e92d5dc1f3cfec7)
@@ -56,4 +56,5 @@
     unsigned int);
 extern int loc_service_get_name(service_id_t, char **);
+extern int loc_service_get_server_name(service_id_t, char **);
 extern int loc_namespace_get_id(const char *, service_id_t *,
     unsigned int);
Index: uspace/srv/locsrv/locsrv.c
===================================================================
--- uspace/srv/locsrv/locsrv.c	(revision 3f57fb73696fea31ef6a619b390a707b4091eda9)
+++ uspace/srv/locsrv/locsrv.c	(revision a3fcfbab8ada7658810ed4966e92d5dc1f3cfec7)
@@ -656,4 +656,50 @@
 }
 
+static void loc_service_get_server_name(ipc_callid_t iid, ipc_call_t *icall)
+{
+	ipc_callid_t callid;
+	size_t size;
+	size_t act_size;
+	loc_service_t *svc;
+	
+	if (!async_data_read_receive(&callid, &size)) {
+		async_answer_0(callid, EREFUSED);
+		async_answer_0(iid, EREFUSED);
+		return;
+	}
+	
+	fibril_mutex_lock(&services_list_mutex);
+	
+	svc = loc_service_find_id(IPC_GET_ARG1(*icall));
+	if (svc == NULL) {
+		fibril_mutex_unlock(&services_list_mutex);
+		async_answer_0(callid, ENOENT);
+		async_answer_0(iid, ENOENT);
+		return;
+	}
+	
+	if (svc->server == NULL) {
+		fibril_mutex_unlock(&services_list_mutex);
+		async_answer_0(callid, EINVAL);
+		async_answer_0(iid, EINVAL);
+		return;
+	}
+	
+	act_size = str_size(svc->server->name);
+	if (act_size > size) {
+		fibril_mutex_unlock(&services_list_mutex);
+		async_answer_0(callid, EOVERFLOW);
+		async_answer_0(iid, EOVERFLOW);
+		return;
+	}
+	
+	sysarg_t retval = async_data_read_finalize(callid, svc->server->name,
+	    min(size, act_size));
+	
+	fibril_mutex_unlock(&services_list_mutex);
+	
+	async_answer_0(iid, retval);
+}
+
 /** Connect client to the service.
  *
@@ -1404,4 +1450,7 @@
 		case LOC_SERVICE_GET_NAME:
 			loc_service_get_name(callid, &call);
+			break;
+		case LOC_SERVICE_GET_SERVER_NAME:
+			loc_service_get_server_name(callid, &call);
 			break;
 		case LOC_NAMESPACE_GET_ID:
