Index: uspace/app/vol/vol.c
===================================================================
--- uspace/app/vol/vol.c	(revision 1bb43d57766a1e12206e990eb06601d692228dba)
+++ uspace/app/vol/vol.c	(revision f0f87879a2e9616ccbf28e95d70d5e6ec25cf738)
@@ -44,8 +44,7 @@
 #define NAME "vol"
 
-static char *volspec;
-
 typedef enum {
 	vcmd_eject,
+	vcmd_insert,
 	vcmd_help,
 	vcmd_list,
@@ -127,4 +126,34 @@
 	if (rc != EOK) {
 		printf("Error ejecting volume.\n");
+		goto out;
+	}
+
+	rc = EOK;
+out:
+	vol_destroy(vol);
+	return rc;
+}
+
+static errno_t vol_cmd_insert(const char *volspec)
+{
+	vol_t *vol = NULL;
+	service_id_t svc_id;
+	errno_t rc;
+
+	rc = loc_service_get_id(volspec, &svc_id, 0);
+	if (rc != EOK) {
+		printf("Error looking up service '%s'.\n", volspec);
+		goto out;
+	}
+
+	rc = vol_create(&vol);
+	if (rc != EOK) {
+		printf("Error contacting volume service.\n");
+		goto out;
+	}
+
+	rc = vol_part_insert(vol, svc_id);
+	if (rc != EOK) {
+		printf("Error inserting volume.\n");
 		goto out;
 	}
@@ -215,5 +244,6 @@
 	printf("  %s                List volumes\n", NAME);
 	printf("  %s -h             Print help\n", NAME);
-	printf("  %s eject <volume> Eject volume\n", NAME);
+	printf("  %s eject <mp>     Eject volume mounted in a directory\n", NAME);
+	printf("  %s insert <svc>   Insert volume based on service identifier\n", NAME);
 }
 
@@ -221,4 +251,5 @@
 {
 	char *cmd;
+	char *volspec;
 	vol_cmd_t vcmd;
 	int i;
@@ -240,4 +271,11 @@
 			}
 			volspec = argv[i++];
+		} else if (str_cmp(cmd, "insert") == 0) {
+			vcmd = vcmd_insert;
+			if (argc <= i) {
+				printf("Parameter missing.\n");
+				goto syntax_error;
+			}
+			volspec = argv[i++];
 		} else {
 			printf("Invalid sub-command '%s'.\n", cmd);
@@ -254,4 +292,7 @@
 	case vcmd_eject:
 		rc = vol_cmd_eject(volspec);
+		break;
+	case vcmd_insert:
+		rc = vol_cmd_insert(volspec);
 		break;
 	case vcmd_help:
Index: uspace/lib/c/generic/vol.c
===================================================================
--- uspace/lib/c/generic/vol.c	(revision 1bb43d57766a1e12206e990eb06601d692228dba)
+++ uspace/lib/c/generic/vol.c	(revision f0f87879a2e9616ccbf28e95d70d5e6ec25cf738)
@@ -196,4 +196,8 @@
  * the dummy partition is created), it can take some (unknown) time
  * until it is discovered.
+ *
+ * @param vol Volume service
+ * @param sid Service ID of the partition
+ * @return EOK on success or an error code
  */
 errno_t vol_part_add(vol_t *vol, service_id_t sid)
@@ -212,5 +216,11 @@
 }
 
-/** Get partition information. */
+/** Get partition information.
+ *
+ * @param vol Volume service
+ * @param sid Service ID of the partition
+ * @param vinfo Place to sore partition information
+ * @return EOK on success or an error code
+ */
 errno_t vol_part_info(vol_t *vol, service_id_t sid, vol_part_info_t *vinfo)
 {
@@ -236,5 +246,10 @@
 }
 
-/** Unmount partition (and possibly eject the media). */
+/** Unmount partition (and possibly eject the media).
+ *
+ * @param vol Volume service
+ * @param sid Service ID of the partition
+ * @return EOK on success or an error code
+ */
 errno_t vol_part_eject(vol_t *vol, service_id_t sid)
 {
@@ -254,4 +269,8 @@
 /** Erase partition (to the extent where we will consider it not containing
  * a file system.
+ *
+ * @param vol Volume service
+ * @param sid Service ID of the partition
+ * @return EOK on success or an error code
  */
 errno_t vol_part_empty(vol_t *vol, service_id_t sid)
@@ -270,5 +289,34 @@
 }
 
-/** Get volume label support. */
+/** Insert volume.
+ *
+ * This will re-mount the volume if it has been ejected previously.
+ *
+ * @param vol Volume service
+ * @param sid Service ID of the partition
+ * @return EOK on success or an error code
+ */
+errno_t vol_part_insert(vol_t *vol, service_id_t sid)
+{
+	async_exch_t *exch;
+	errno_t retval;
+
+	exch = async_exchange_begin(vol->sess);
+	retval = async_req_1_0(exch, VOL_PART_INSERT, sid);
+	async_exchange_end(exch);
+
+	if (retval != EOK)
+		return retval;
+
+	return EOK;
+}
+
+/** Get volume label support.
+ *
+ * @param vol Volume service
+ * @param fstype File system type
+ * @param vlsupp Place to store volume label support information
+ * @return EOK on success or an error code
+ */
 errno_t vol_part_get_lsupp(vol_t *vol, vol_fstype_t fstype,
     vol_label_supp_t *vlsupp)
Index: uspace/lib/c/include/ipc/vol.h
===================================================================
--- uspace/lib/c/include/ipc/vol.h	(revision 1bb43d57766a1e12206e990eb06601d692228dba)
+++ uspace/lib/c/include/ipc/vol.h	(revision f0f87879a2e9616ccbf28e95d70d5e6ec25cf738)
@@ -45,4 +45,5 @@
 	VOL_PART_EJECT,
 	VOL_PART_EMPTY,
+	VOL_PART_INSERT,
 	VOL_PART_LSUPP,
 	VOL_PART_MKFS,
Index: uspace/lib/c/include/vol.h
===================================================================
--- uspace/lib/c/include/vol.h	(revision 1bb43d57766a1e12206e990eb06601d692228dba)
+++ uspace/lib/c/include/vol.h	(revision f0f87879a2e9616ccbf28e95d70d5e6ec25cf738)
@@ -50,4 +50,5 @@
 extern errno_t vol_part_eject(vol_t *, service_id_t);
 extern errno_t vol_part_empty(vol_t *, service_id_t);
+extern errno_t vol_part_insert(vol_t *, service_id_t);
 extern errno_t vol_part_get_lsupp(vol_t *, vol_fstype_t, vol_label_supp_t *);
 extern errno_t vol_part_mkfs(vol_t *, service_id_t, vol_fstype_t, const char *,
Index: uspace/srv/volsrv/part.c
===================================================================
--- uspace/srv/volsrv/part.c	(revision 1bb43d57766a1e12206e990eb06601d692228dba)
+++ uspace/srv/volsrv/part.c	(revision f0f87879a2e9616ccbf28e95d70d5e6ec25cf738)
@@ -602,4 +602,38 @@
 }
 
+/** Insert volume.
+ *
+ * Re-mount the volume in the partition, if applicable.
+ *
+ * @param part Partition
+ */
+errno_t vol_part_insert_part(vol_part_t *part)
+{
+	int rc;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_insert_part()");
+
+	fibril_mutex_lock(&part->parts->lock);
+
+	if (part->cur_mp != NULL) {
+		fibril_mutex_unlock(&part->parts->lock);
+		return EOK;
+	}
+
+	rc = vol_part_probe(part);
+	if (rc != EOK)
+		goto error;
+
+	rc = vol_part_mount(part);
+	if (rc != EOK)
+		goto error;
+
+	fibril_mutex_unlock(&part->parts->lock);
+
+	return EOK;
+error:
+	return rc;
+}
+
 /** Set mount point.
  *
Index: uspace/srv/volsrv/part.h
===================================================================
--- uspace/srv/volsrv/part.h	(revision 1bb43d57766a1e12206e990eb06601d692228dba)
+++ uspace/srv/volsrv/part.h	(revision f0f87879a2e9616ccbf28e95d70d5e6ec25cf738)
@@ -55,4 +55,5 @@
 extern errno_t vol_part_eject_part(vol_part_t *);
 extern errno_t vol_part_empty_part(vol_part_t *);
+extern errno_t vol_part_insert_part(vol_part_t *);
 extern errno_t vol_part_mkfs_part(vol_part_t *, vol_fstype_t, const char *,
     const char *);
Index: uspace/srv/volsrv/volsrv.c
===================================================================
--- uspace/srv/volsrv/volsrv.c	(revision 1bb43d57766a1e12206e990eb06601d692228dba)
+++ uspace/srv/volsrv/volsrv.c	(revision f0f87879a2e9616ccbf28e95d70d5e6ec25cf738)
@@ -210,8 +210,34 @@
 	if (rc != EOK) {
 		async_answer_0(icall, ENOENT);
-		goto error;
+		return;
 	}
 
 	rc = vol_part_eject_part(part);
+	if (rc != EOK) {
+		async_answer_0(icall, EIO);
+		goto error;
+	}
+
+	async_answer_0(icall, EOK);
+error:
+	vol_part_del_ref(part);
+}
+
+static void vol_part_insert_srv(vol_parts_t *parts, ipc_call_t *icall)
+{
+	service_id_t sid;
+	vol_part_t *part;
+	errno_t rc;
+
+	sid = IPC_GET_ARG1(*icall);
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_insert_srv(%zu)", sid);
+
+	rc = vol_part_find_by_id_ref(parts, sid, &part);
+	if (rc != EOK) {
+		async_answer_0(icall, ENOENT);
+		return;
+	}
+
+	rc = vol_part_insert_part(part);
 	if (rc != EOK) {
 		async_answer_0(icall, EIO);
@@ -429,4 +455,7 @@
 			vol_part_empty_srv(parts, &call);
 			break;
+		case VOL_PART_INSERT:
+			vol_part_insert_srv(parts, &call);
+			break;
 		case VOL_PART_LSUPP:
 			vol_part_get_lsupp_srv(parts, &call);
