Index: uspace/lib/c/generic/loc.c
===================================================================
--- uspace/lib/c/generic/loc.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/lib/c/generic/loc.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -329,5 +329,5 @@
 	async_exch_t *exch;
 
-	if (flags & IPC_FLAG_BLOCKING)
+	if ((flags & IPC_FLAG_BLOCKING) || flags & IPC_FLAG_AUTOSTART)
 		exch = loc_exchange_begin_blocking(INTERFACE_LOC_CONSUMER);
 	else {
Index: uspace/srv/devman/driver.c
===================================================================
--- uspace/srv/devman/driver.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/devman/driver.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -186,4 +186,26 @@
 
 	return drv_cnt;
+}
+
+/** Get name of unit that represents the driver
+ *
+ * @param[in]  drv
+ * @param[out] unit_name_ptr  should be free'd after use, not touched on fail
+ *
+ * @return     EOK on success
+ * @return     ENOMEM
+ */
+errno_t driver_unit_name(driver_t *drv, char **unit_name_ptr)
+{
+	char *unit_name = NULL;
+	asprintf(&unit_name, "%s%c%s", drv->name, UNIT_NAME_SEPARATOR,
+	    UNIT_SVC_TYPE_NAME);
+
+	if (unit_name == NULL) {
+		return ENOMEM;
+	} else {
+		*unit_name_ptr = unit_name;
+		return EOK;
+	}
 }
 
@@ -320,7 +342,5 @@
 
 	char *unit_name = NULL;
-	asprintf(&unit_name, "%s%c%s", drv->name, UNIT_NAME_SEPARATOR,
-	    UNIT_SVC_TYPE_NAME);
-	if (unit_name == NULL) {
+	if (driver_unit_name(drv, &unit_name) != EOK) {
 		return false;
 	}
@@ -333,4 +353,5 @@
 	int flags = 0;
 	rc = sysman_unit_start(unit_name, flags);
+	free(unit_name);
 
 	if (rc != EOK) {
@@ -338,10 +359,8 @@
 		    "Request to start driver `%s' failed: %s.",
 		    drv->name, str_error(rc));
-		free(unit_name);
 		return false;
 	}
 
 	drv->state = DRIVER_STARTING;
-	free(unit_name);
 	return true;
 }
Index: uspace/srv/devman/driver.h
===================================================================
--- uspace/srv/devman/driver.h	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/devman/driver.h	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -42,4 +42,5 @@
 extern bool get_driver_info(const char *, const char *, driver_t *);
 extern int lookup_available_drivers(driver_list_t *, const char *);
+extern int driver_unit_name(driver_t *, char **);
 
 extern driver_t *find_best_match_driver(driver_list_t *, dev_node_t *);
Index: uspace/srv/devman/drv_conn.c
===================================================================
--- uspace/srv/devman/drv_conn.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/devman/drv_conn.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -36,17 +36,19 @@
 
 #include <assert.h>
+#include <async.h>
+#include <errno.h>
+#include <fibril_synch.h>
+#include <io/log.h>
+#include <ipc/devman.h>
+#include <ipc/driver.h>
 #include <ipc/services.h>
+#include <loc.h>
 #include <ns.h>
-#include <async.h>
+#include <stdbool.h>
 #include <stdio.h>
-#include <errno.h>
-#include <str_error.h>
-#include <stdbool.h>
-#include <fibril_synch.h>
 #include <stdlib.h>
 #include <str.h>
-#include <io/log.h>
-#include <ipc/devman.h>
-#include <loc.h>
+#include <str_error.h>
+#include <sysman/broker.h>
 
 #include "client_conn.h"
@@ -67,4 +69,5 @@
 	driver_t *driver = NULL;
 	char *drv_name = NULL;
+	char *unit_name = NULL;
 
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "devman_driver_register");
@@ -104,4 +107,14 @@
 	}
 
+	/* Notify sysman about started driver */
+	rc = driver_unit_name(driver, &unit_name);
+	if (rc != EOK) {
+		fibril_mutex_unlock(&driver->driver_mutex);
+		async_answer_0(callid, rc);
+		return NULL;
+	}
+	sysman_main_exposee_added(unit_name, call->in_task_id);
+	free(unit_name);
+	
 	switch (driver->state) {
 	case DRIVER_NOT_STARTED:
Index: uspace/srv/hid/compositor/compositor.c
===================================================================
--- uspace/srv/hid/compositor/compositor.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/hid/compositor/compositor.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -2267,5 +2267,4 @@
 	if (!list_empty(&viewport_list))
 		input_activate(input);
-
 ret:
 	fibril_mutex_unlock(&discovery_mtx);
@@ -2285,25 +2284,34 @@
 	bg_color = PIXEL(255, 69, 51, 103);
 
-	/* Register compositor server. */
-	async_set_fallback_port_handler(client_connection, NULL);
-
-	errno_t rc = loc_server_register(NAME);
+	/* Establish input bidirectional connection. */
+	errno_t rc = input_connect(input_svc);
+	if (rc != EOK) {
+		printf("%s: Failed to connect to input service.\n", NAME);
+		return rc;
+	}
+
+	rc = loc_register_cat_change_cb(category_change_cb, NULL);
+	if (rc != EOK) {
+		printf("%s: Failed to register category change callback\n", NAME);
+		input_disconnect();
+		return rc;
+	}
+
+	discover_viewports();
+
+	comp_restrict_pointers();
+	comp_damage(0, 0, UINT32_MAX, UINT32_MAX);
+
+	/* Finally, register compositor server. */
+	async_set_fallback_port_handler(client_connection);
+	
+	rc = loc_server_register(NAME);
 	if (rc != EOK) {
 		printf("%s: Unable to register server (%s)\n", NAME, str_error(rc));
-		return -1;
-	}
-
+		return rc;
+	}
+	
 	server_name = name;
-
-	char svc[LOC_NAME_MAXLEN + 1];
-	snprintf(svc, LOC_NAME_MAXLEN, "%s/%s", NAMESPACE, server_name);
-
-	service_id_t service_id;
-	rc = loc_service_register(svc, &service_id);
-	if (rc != EOK) {
-		printf("%s: Unable to register service %s\n", NAME, svc);
-		return rc;
-	}
-
+	
 	/* Prepare window registrator (entrypoint for clients). */
 	char winreg[LOC_NAME_MAXLEN + 1];
@@ -2311,25 +2319,6 @@
 	if (loc_service_register(winreg, &winreg_id) != EOK) {
 		printf("%s: Unable to register service %s\n", NAME, winreg);
-		return -1;
-	}
-
-	/* Establish input bidirectional connection. */
-	rc = input_connect(input_svc);
-	if (rc != EOK) {
-		printf("%s: Failed to connect to input service.\n", NAME);
 		return rc;
 	}
-
-	rc = loc_register_cat_change_cb(category_change_cb, NULL);
-	if (rc != EOK) {
-		printf("%s: Failed to register category change callback\n", NAME);
-		input_disconnect();
-		return rc;
-	}
-
-	discover_viewports();
-
-	comp_restrict_pointers();
-	comp_damage(0, 0, UINT32_MAX, UINT32_MAX);
 
 	return EOK;
Index: uspace/srv/locsrv/locsrv.c
===================================================================
--- uspace/srv/locsrv/locsrv.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/locsrv/locsrv.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -64,4 +64,9 @@
 } cb_sess_t;
 
+typedef enum {
+	NAME_TO_START,
+	NAME_TO_EXPOSE
+} unit_name_t;
+
 LIST_INITIALIZE(services_list);
 LIST_INITIALIZE(namespaces_list);
@@ -335,15 +340,17 @@
 }
 
-static int loc_service_request_start(const char *ns_name, const char *name)
+/** Derive unit name from service name according to purpose
+ *
+ * All services in 'device' namespace are considered to be drivers and
+ * devman is thus requested to start. Otherwise name of unit is made
+ * from fully qualified name of service (namespace separator is changed
+ * for usage in unit name.
+ */
+static int loc_service_unit_name(const char *ns_name, const char *name,
+    unit_name_t name_type, char **unit_name_ptr)
 {
 	char *service_name = NULL;
-
-	/*
-	 * All services in 'device' namespace are considered to be drivers and
-	 * devman is thus requested to start. Otherwise name of unit is made
-	 * from fully qualified name of service (namespace separator is changed
-	 * for usage in unit name.
-	 */
-	if (str_cmp(ns_name, LOC_DEVICE_NAMESPACE) == 0) {
+	if (name_type == NAME_TO_START &&
+	    str_cmp(ns_name, LOC_DEVICE_NAMESPACE) == 0) {
 		asprintf(&service_name, "%s", SERVICE_NAME_DEVMAN);
 	} else if (str_cmp(ns_name, "") == 0) {
@@ -365,7 +372,18 @@
 	}
 
-	int rc = sysman_unit_start(unit_name, IPC_FLAG_BLOCKING);
+	*unit_name_ptr = unit_name;
+	return EOK;
+}
+
+static int loc_service_request_start(const char *ns_name, const char *name)
+{
+	char *unit_name;
+	int rc = loc_service_unit_name(ns_name, name, NAME_TO_START, &unit_name);
+	if (rc != EOK) {
+		return rc;
+	}
+
+	rc = sysman_unit_start(unit_name, IPC_FLAG_BLOCKING);
 	free(unit_name);
-	free(service_name);
 	return rc;
 }
@@ -555,4 +573,25 @@
 		return;
 	}
+
+	/* Notify sysman about new exposee */
+	char *unit_name = NULL;
+	rc = loc_service_unit_name(namespace->name, service->name,
+	    NAME_TO_EXPOSE, &unit_name);
+	if (rc != EOK) {
+		loc_namespace_destroy(namespace);
+		fibril_mutex_unlock(&services_list_mutex);
+		free(service->name);
+		free(service);
+		free(unit_name);
+		async_answer_0(iid, rc);
+		return;
+	}
+
+	if (str_cmp(namespace->name, LOC_DEVICE_NAMESPACE) == 0) {
+		sysman_exposee_added(unit_name);
+	} else {
+		sysman_main_exposee_added(unit_name, icall->in_task_id);
+	}
+	free(unit_name);
 
 	/* Get unique service ID */
@@ -837,5 +876,5 @@
 		}
 
-		if (flags & IPC_FLAG_BLOCKING) {
+		if ((flags & IPC_FLAG_BLOCKING) || flags & IPC_FLAG_AUTOSTART) {
 			fibril_condvar_wait(&services_list_cv,
 			    &services_list_mutex);
Index: uspace/srv/sysman/connection_broker.c
===================================================================
--- uspace/srv/sysman/connection_broker.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/sysman/connection_broker.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -29,7 +29,10 @@
 #include <errno.h>
 #include <ipc/sysman.h>
+#include <stdlib.h>
 
+#include "configuration.h"
 #include "connection_broker.h"
 #include "log.h"
+#include "sysman.h"
 
 static void sysman_broker_register(ipc_callid_t iid, ipc_call_t *icall)
@@ -54,14 +57,51 @@
 static void sysman_main_exposee_added(ipc_callid_t iid, ipc_call_t *icall)
 {
-	sysman_log(LVL_DEBUG2, "%s", __func__);
-	async_answer_0(iid, ENOTSUP);
-	// TODO implement
+	char *unit_name = NULL;
+	sysarg_t retval;
+
+	int rc = async_data_write_accept((void **) &unit_name, true,
+	    0, 0, 0, NULL);
+	if (rc != EOK) {
+		retval = rc;
+		goto finish;
+	}
+
+	unit_t *unit = configuration_find_unit_by_name(unit_name);
+	if (unit == NULL) {
+		//sysman_log(LVL_NOTE, "Unit '%s' not found.", unit_name);
+		retval = ENOENT;
+		goto finish;
+	}
+
+	// TODO propagate caller task ID
+	sysman_raise_event(&sysman_event_unit_exposee_created, unit);
+
+	retval = EOK;
+
+finish:
+	async_answer_0(iid, retval);
+	free(unit_name);
 }
 
 static void sysman_exposee_added(ipc_callid_t iid, ipc_call_t *icall)
 {
-	sysman_log(LVL_DEBUG2, "%s", __func__);
-	async_answer_0(iid, ENOTSUP);
-	// TODO implement
+	char *exposee = NULL;
+	sysarg_t retval;
+
+	/* Just accept data and further not supported. */
+	int rc = async_data_write_accept((void **) &exposee, true,
+	    0, 0, 0, NULL);
+	if (rc != EOK) {
+		retval = rc;
+		goto finish;
+	}
+
+	//sysman_log(LVL_DEBUG2, "%s(%s)", __func__, exposee);
+
+	retval = ENOTSUP;
+
+finish:
+	async_answer_0(iid, retval);
+	free(exposee);
 }
 
Index: uspace/srv/sysman/connection_ctl.c
===================================================================
--- uspace/srv/sysman/connection_ctl.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/sysman/connection_ctl.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -84,5 +84,5 @@
 
 	if (!(flags & IPC_FLAG_BLOCKING)) {
-		retval = sysman_queue_job(unit, STATE_STARTED, NULL, NULL);
+		retval = sysman_run_job(unit, STATE_STARTED, NULL, NULL);
 		goto answer;
 	}
@@ -93,5 +93,5 @@
 		goto answer;
 	}
-	retval = sysman_queue_job(unit, STATE_STARTED, &answer_callback,
+	retval = sysman_run_job(unit, STATE_STARTED, &answer_callback,
 	    iid_ptr);
 	if (retval != EOK) {
Index: uspace/srv/sysman/job.c
===================================================================
--- uspace/srv/sysman/job.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/sysman/job.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -487,4 +487,5 @@
 	}
 	if (rc != EOK) {
+		//TODO here is 'rc' value "lost" (not propagated further)
 		sysman_log(LVL_DEBUG, "%s(%p), %s -> %i, error: %i",
 		    __func__, job, unit_name(u), job->target_state, rc);
Index: uspace/srv/sysman/unit.h
===================================================================
--- uspace/srv/sysman/unit.h	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/sysman/unit.h	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -73,7 +73,9 @@
 	link_t bfs_link;
 
-	/** Seen tag for BFS traverse, must be reset before each BFS */
-	bool bfs_tag;
+	/** Auxiliary job created during BFS traverse, its presence serves also
+	 * as BFS tag */
+	job_t *bfs_job;
 
+	/** Job assigned to unit in transitional state */
 	job_t *job;
 
Index: uspace/srv/sysman/units/unit_svc.c
===================================================================
--- uspace/srv/sysman/units/unit_svc.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/sysman/units/unit_svc.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -93,22 +93,30 @@
 	}
 
+	unit->state = STATE_STARTING;
+
 	/*
 	 * This is temporary workaround, until proper reporting from brokers
 	 * about exposees will work. We assume the service succesfully starts
-	 * in a moment.
+	 * in a moment. Applies to naming service only.
 	 */
-	unit->state = STATE_STARTING;
-	async_usleep(20000);
-	unit->state = STATE_STARTED;
+	// TODO this is even hack in the workaround, exposees doesn't work properly
+	if (true || str_cmp(unit->name, "devman.svc") == 0 ||
+	    str_cmp(unit->name, "logger.svc") == 0 ||
+	    str_cmp(unit->name, "irc.svc") == 0) {
+		async_usleep(100000);
+		unit->state = STATE_STARTED;
+	}
 
 	/*
 	 * Workaround to see log output even after devman starts (and overrides
-	 * kernel's frame buffer. It's here since devman is started as a
-	 * service (however not all services are devman...).
+	 * kernel's frame buffer.
 	 */
-	if (console_kcon()) {
-		sysman_log(LVL_DEBUG2, "%s: Kconsole grabbed.", __func__);
-	} else {
-		sysman_log(LVL_DEBUG2, "%s: no kconsole.", __func__);
+	if (str_cmp(unit->name, "devman.svc") == 0) {
+		async_usleep(100000);
+		if (console_kcon()) {
+			sysman_log(LVL_DEBUG2, "%s: Kconsole grabbed.", __func__);
+		} else {
+			sysman_log(LVL_DEBUG2, "%s: no kconsole.", __func__);
+		}
 	}
 
@@ -118,5 +126,9 @@
 static void unit_svc_exposee_created(unit_t *unit)
 {
-	// TODO implement
+	assert(CAST_SVC(unit));
+	assert(unit->state == STATE_STOPPED || unit->state == STATE_STARTING || unit->state==STATE_STARTED);
+
+	unit->state = STATE_STARTED;
+	unit_notify_state(unit);
 }
 
Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/vfs/vfs.h	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -176,7 +176,7 @@
 extern void vfs_exchange_release(async_exch_t *);
 
-extern fs_handle_t fs_name_to_handle(unsigned int instance, const char *, bool);
+extern fs_handle_t fs_name_to_handle(const char *, unsigned int instance, bool);
 extern vfs_info_t *fs_handle_to_info(fs_handle_t);
-extern errno_t vfs_get_fstypes(vfs_fstypes_t *);
+extern errno_t fs_unit_name(const char *, unsigned int, char **);
 
 extern errno_t vfs_lookup_internal(vfs_node_t *, char *, int, vfs_lookup_res_t *);
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/vfs/vfs_ops.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -136,5 +136,5 @@
 	fibril_mutex_lock(&fs_list_lock);
 	while (true) {
-		fs_handle = fs_name_to_handle(instance, fsname, false);
+		fs_handle = fs_name_to_handle(fsname, instance, false);
 		if (!fs_handle) {
 			if ((flags & IPC_FLAG_AUTOSTART)) {
@@ -220,17 +220,10 @@
 	char *unit_name = NULL;
 
-	assert(instance == 0);
-	/*
-	 * Unit name is made simply by considering service of the same name as
-	 * given FS name.
-	 * TODO instance identifier is not implemented.
-	 */
-	asprintf(&unit_name, "%s%c%s", fs_name, UNIT_NAME_SEPARATOR,
-	    UNIT_SVC_TYPE_NAME);
-	if (unit_name == NULL) {
-		return ENOMEM;
-	}
-
-	int rc = sysman_unit_start(unit_name, IPC_FLAG_BLOCKING);
+	errno_t rc = fs_unit_name(fs_name, instance, &unit_name);
+	if (rc != EOK) {
+		return rc;
+	}
+
+	rc = sysman_unit_start(unit_name, IPC_FLAG_BLOCKING);
 
 	free(unit_name);
@@ -246,5 +239,5 @@
 
 	fibril_mutex_lock(&fs_list_lock);
-	fs_handle = fs_name_to_handle(0, fs_name, false);
+	fs_handle = fs_name_to_handle(fs_name, 0, false);
 	fibril_mutex_unlock(&fs_list_lock);
 
Index: uspace/srv/vfs/vfs_register.c
===================================================================
--- uspace/srv/vfs/vfs_register.c	(revision 72c8f77fe49645071c65e51c20256117bc69eb5c)
+++ uspace/srv/vfs/vfs_register.c	(revision 63a3276125498d691e4cbe1e0266954b6656ee4d)
@@ -36,19 +36,19 @@
  */
 
-#include <ipc/services.h>
+#include <adt/list.h>
+#include <as.h>
+#include <assert.h>
 #include <async.h>
+#include <atomic.h>
+#include <ctype.h>
+#include <errno.h>
 #include <fibril.h>
 #include <fibril_synch.h>
-#include <errno.h>
+#include <ipc/services.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <str.h>
-#include <ctype.h>
-#include <stdbool.h>
-#include <adt/list.h>
-#include <as.h>
-#include <assert.h>
-#include <stdatomic.h>
-#include <vfs/vfs.h>
+#include <sysman/broker.h>
 #include "vfs.h"
 
@@ -149,6 +149,6 @@
 	 * Check for duplicit registrations.
 	 */
-	if (fs_name_to_handle(fs_info->vfs_info.instance,
-	    fs_info->vfs_info.name, false)) {
+	if (fs_name_to_handle(fs_info->vfs_info.name,
+	    fs_info->vfs_info.instance, false)) {
 		/*
 		 * We already register a fs like this.
@@ -161,4 +161,18 @@
 	}
 
+	/* Notify sysman about started FS server */
+	char *unit_name = NULL;
+	rc = fs_unit_name(fs_info->vfs_info.name, fs_info->vfs_info.instance,
+	    &unit_name);
+	if (rc != EOK) {
+		dprintf("Unknow unit name for FS server.\n");
+		fibril_mutex_unlock(&fs_list_lock);
+		free(fs_info);
+		async_answer_0(rid, rc);
+		return;
+	}
+	sysman_main_exposee_added(unit_name, request->in_task_id);
+	free(unit_name);
+	
 	/*
 	 * Add fs_info to the list of registered FS's.
@@ -288,4 +302,5 @@
  *
  * @param name File system name.
+ * @param instance
  * @param lock If true, the function will lock and unlock the
  *             fs_list_lock.
@@ -294,5 +309,5 @@
  *
  */
-fs_handle_t fs_name_to_handle(unsigned int instance, const char *name, bool lock)
+fs_handle_t fs_name_to_handle(const char *name, unsigned int instance, bool lock)
 {
 	int handle = 0;
@@ -393,4 +408,34 @@
 }
 
+/** Get name of unit that represents the filesystem server
+ *
+ * Unit name is made simply by considering service of the same name as
+ * given FS name.
+ * TODO instance identifier is not implemented.
+ *
+ * @param[in]  fs_name
+ * @param[in]  instance
+ * @param[out] unit_name_ptr  should be free'd after use, not touched on fail
+ *
+ * @return     EOK on success
+ * @return     ENOMEM
+ */
+errno_t fs_unit_name(const char *fs_name, unsigned int instance,
+    char **unit_name_ptr)
+{
+	assert(instance == 0);
+
+	char *unit_name = NULL;
+	asprintf(&unit_name, "%s%c%s", fs_name, UNIT_NAME_SEPARATOR,
+	    UNIT_SVC_TYPE_NAME);
+
+	if (unit_name == NULL) {
+		return ENOMEM;
+	} else {
+		*unit_name_ptr = unit_name;
+		return EOK;
+	}
+}
+
 /**
  * @}
