Index: uspace/app/vol/vol.c
===================================================================
--- uspace/app/vol/vol.c	(revision 1bb43d57766a1e12206e990eb06601d692228dba)
+++ uspace/app/vol/vol.c	(revision c5429fedb8216659204bbbdba42d7f5a845e4dda)
@@ -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:
