Index: boot/Makefile.common
===================================================================
--- boot/Makefile.common	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ boot/Makefile.common	(revision 763e0cddf0e1c4057130bf42fd3ecf4c6658bc63)
@@ -150,4 +150,5 @@
 	$(USPACE_PATH)/app/kill/kill \
 	$(USPACE_PATH)/app/killall/killall \
+	$(USPACE_PATH)/app/locinfo/locinfo \
 	$(USPACE_PATH)/app/mkfat/mkfat \
 	$(USPACE_PATH)/app/lsusb/lsusb \
Index: uspace/Makefile
===================================================================
--- uspace/Makefile	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/Makefile	(revision 763e0cddf0e1c4057130bf42fd3ecf4c6658bc63)
@@ -44,4 +44,5 @@
 	app/killall \
 	app/klog \
+	app/locinfo \
 	app/lsusb \
 	app/mkfat \
Index: uspace/lib/c/generic/loc.c
===================================================================
--- uspace/lib/c/generic/loc.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/lib/c/generic/loc.c	(revision 763e0cddf0e1c4057130bf42fd3ecf4c6658bc63)
@@ -364,14 +364,15 @@
 }
 
-/** Get service name.
- *
- * Provided ID of a service, return its name.
- *
- * @param svc_id	Service ID
+/** Get object name.
+ *
+ * Provided ID of an object, return its name.
+ *
+ * @param method	IPC method
+ * @param id		Object 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_name(service_id_t svc_id, char **name)
+static int loc_get_name_internal(sysarg_t method, sysarg_t id, char **name)
 {
 	async_exch_t *exch;
@@ -385,5 +386,5 @@
 	
 	ipc_call_t answer;
-	aid_t req = async_send_1(exch, LOC_SERVICE_GET_NAME, svc_id, &answer);
+	aid_t req = async_send_1(exch, method, id, &answer);
 	aid_t dreq = async_data_read(exch, name_buf, LOC_NAME_MAXLEN,
 	    &dreply);
@@ -414,4 +415,31 @@
 }
 
+/** Get category name.
+ *
+ * Provided ID of a service, return its name.
+ *
+ * @param cat_id	Category 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_category_get_name(category_id_t cat_id, char **name)
+{
+	return loc_get_name_internal(LOC_CATEGORY_GET_NAME, cat_id, name);
+}
+
+/** Get service name.
+ *
+ * Provided ID of a service, return its name.
+ *
+ * @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_name(service_id_t svc_id, char **name)
+{
+	return loc_get_name_internal(LOC_SERVICE_GET_NAME, svc_id, name);
+}
 
 int loc_namespace_get_id(const char *name, service_id_t *handle,
Index: uspace/lib/c/include/ipc/loc.h
===================================================================
--- uspace/lib/c/include/ipc/loc.h	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/lib/c/include/ipc/loc.h	(revision 763e0cddf0e1c4057130bf42fd3ecf4c6658bc63)
@@ -59,4 +59,5 @@
 	LOC_CALLBACK_CREATE,
 	LOC_CATEGORY_GET_ID,
+	LOC_CATEGORY_GET_NAME,
 	LOC_CATEGORY_GET_SVCS,
 	LOC_ID_PROBE,
Index: uspace/srv/loc/loc.c
===================================================================
--- uspace/srv/loc/loc.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/srv/loc/loc.c	(revision 763e0cddf0e1c4057130bf42fd3ecf4c6658bc63)
@@ -536,4 +536,43 @@
 }
 
+static void loc_category_get_name(ipc_callid_t iid, ipc_call_t *icall)
+{
+	ipc_callid_t callid;
+	size_t size;
+	size_t act_size;
+	category_t *cat;
+	
+	if (!async_data_read_receive(&callid, &size)) {
+		async_answer_0(callid, EREFUSED);
+		async_answer_0(iid, EREFUSED);
+		return;
+	}
+	
+	fibril_mutex_lock(&cdir.mutex);
+	
+	cat = category_get(&cdir, IPC_GET_ARG1(*icall));
+	if (cat == NULL) {
+		fibril_mutex_unlock(&cdir.mutex);
+		async_answer_0(callid, ENOENT);
+		async_answer_0(iid, ENOENT);
+		return;
+	}
+	
+	act_size = str_size(cat->name);
+	if (act_size > size) {
+		fibril_mutex_unlock(&cdir.mutex);
+		async_answer_0(callid, EOVERFLOW);
+		async_answer_0(iid, EOVERFLOW);
+		return;
+	}
+	
+	sysarg_t retval = async_data_read_finalize(callid, cat->name,
+	    min(size, act_size));
+	
+	fibril_mutex_unlock(&cdir.mutex);
+	
+	async_answer_0(iid, retval);
+}
+
 static void loc_service_get_name(ipc_callid_t iid, ipc_call_t *icall)
 {
@@ -574,5 +613,4 @@
 	async_answer_0(iid, retval);
 }
-
 
 /** Connect client to the service.
@@ -1298,4 +1336,7 @@
 			loc_category_get_id(callid, &call);
 			break;
+		case LOC_CATEGORY_GET_NAME:
+			loc_category_get_name(callid, &call);
+			break;
 		case LOC_CATEGORY_GET_SVCS:
 			loc_category_get_svcs(callid, &call);
