Index: uspace/app/fdisk/fdisk.c
===================================================================
--- uspace/app/fdisk/fdisk.c	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/app/fdisk/fdisk.c	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -65,4 +65,6 @@
 	/** Create logical partition */
 	devac_create_log_part,
+	/** Modify partition */
+	devac_modify_part,
 	/** Delete partition */
 	devac_delete_part,
@@ -70,4 +72,12 @@
 	devac_exit
 } devac_t;
+
+/** Partition property to modify */
+typedef enum {
+	/** Modify mount point */
+	pm_mountp,
+	/** Cancel */
+	pm_cancel
+} pmprop_t;
 
 /** Confirm user selection. */
@@ -507,31 +517,4 @@
 	}
 
-	/* Ask for mount point */
-	tinput = tinput_new();
-	if (tinput == NULL) {
-		rc = ENOMEM;
-		goto error;
-	}
-
-	rc = tinput_set_prompt(tinput, "?> ");
-	if (rc != EOK)
-		goto error;
-
-	while (true) {
-		printf("Enter mount point for new partition (Auto, None or /path).\n");
-		rc = tinput_read_i(tinput, "Auto", &mountp);
-		if (rc != EOK)
-			goto error;
-
-		rc = vol_mountp_validate(mountp);
-		if (rc == EOK)
-			break;
-
-		free(mountp);
-		mountp = NULL;
-	}
-
-	tinput_destroy(tinput);
-	tinput = NULL;
 
 	fdisk_pspec_init(&pspec);
@@ -560,7 +543,14 @@
 }
 
-static errno_t fdsk_delete_part(fdisk_dev_t *dev)
+/** Add an option to choice for each partition.
+ *
+ * @param dev Fdisk device
+ * @param choice Choice to add optionts to
+ *
+ * @return EOK on sucess or error code
+ */
+static errno_t fdsk_add_part_choices(fdisk_dev_t *dev,
+    nchoice_t *choice)
 {
-	nchoice_t *choice = NULL;
 	fdisk_part_t *part;
 	fdisk_part_info_t pinfo;
@@ -570,21 +560,5 @@
 	char *sdesc = NULL;
 	const char *label;
-	bool confirm;
-	void *sel;
 	errno_t rc;
-
-	rc = nchoice_create(&choice);
-	if (rc != EOK) {
-		assert(rc == ENOMEM);
-		printf("Out of memory.\n");
-		goto error;
-	}
-
-	rc = nchoice_set_prompt(choice, "Select partition to delete");
-	if (rc != EOK) {
-		assert(rc == ENOMEM);
-		printf("Out of memory.\n");
-		goto error;
-	}
 
 	part = fdisk_part_first(dev);
@@ -656,42 +630,4 @@
 	}
 
-	rc = nchoice_add(choice, "Cancel", NULL, 0);
-	if (rc != EOK) {
-		assert(rc == ENOMEM);
-		printf("Out of memory.\n");
-		goto error;
-	}
-
-	rc = nchoice_get(choice, &sel);
-	if (rc == ENOENT)
-		return EOK;
-	if (rc != EOK) {
-		printf("Error getting user selection.\n");
-		goto error;
-	}
-
-
-	nchoice_destroy(choice);
-	choice = NULL;
-
-	if (sel == NULL)
-		return EOK;
-
-	rc = fdsk_confirm("Warning. Any data in partition will be lost. "
-	    "Really delete partition?", &confirm);
-	if (rc != EOK) {
-		printf("Error getting user confirmation.\n");
-		goto error;
-	}
-
-	if (!confirm)
-		return EOK;
-
-	rc = fdisk_part_destroy((fdisk_part_t *)sel);
-	if (rc != EOK) {
-		printf("Error deleting partition.\n");
-		return rc;
-	}
-
 	return EOK;
 error:
@@ -701,4 +637,237 @@
 	free(sdesc);
 
+	return rc;
+}
+
+/** Modify partition mount point.
+ *
+ * Run the interaction to modify a partition mount point
+ *
+ * @part Fdisk partition
+ * @return EOK on success or error code
+ */
+static errno_t fdsk_modify_mountp(fdisk_part_t *part)
+{
+	tinput_t *tinput = NULL;
+	errno_t rc;
+	char *mountp = NULL;
+
+	/* Ask for mount point */
+	tinput = tinput_new();
+	if (tinput == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	rc = tinput_set_prompt(tinput, "?> ");
+	if (rc != EOK)
+		goto error;
+
+	while (true) {
+		printf("Enter mount point for new partition (Auto, None or /path).\n");
+		rc = tinput_read_i(tinput, "Auto", &mountp);
+		if (rc != EOK)
+			goto error;
+
+		rc = vol_mountp_validate(mountp);
+		if (rc == EOK)
+			break;
+
+		free(mountp);
+		mountp = NULL;
+	}
+
+	rc = fdisk_part_set_mountp(part, mountp);
+	if (rc != EOK)
+		goto error;
+
+	free(mountp);
+
+	tinput_destroy(tinput);
+	tinput = NULL;
+	return EOK;
+error:
+	if (mountp != NULL)
+		free(mountp);
+	if (tinput != NULL)
+		tinput_destroy(tinput);
+	return rc;
+}
+
+/** Modify partition.
+ *
+ * Run the interaction to modify a partition.
+ *
+ * @param dev Fdisk device
+ * @return EOK on success or error code
+ */
+static errno_t fdsk_modify_part(fdisk_dev_t *dev)
+{
+	nchoice_t *choice = NULL;
+	fdisk_part_t *part;
+	void *sel;
+	errno_t rc;
+
+	rc = nchoice_create(&choice);
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = nchoice_set_prompt(choice, "Select partition to modify");
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = fdsk_add_part_choices(dev, choice);
+	if (rc != EOK)
+		goto error;
+
+	rc = nchoice_add(choice, "Cancel", NULL, 0);
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = nchoice_get(choice, &sel);
+	if (rc == ENOENT)
+		return EOK;
+	if (rc != EOK) {
+		printf("Error getting user selection.\n");
+		goto error;
+	}
+
+	nchoice_destroy(choice);
+	choice = NULL;
+
+	if (sel == NULL)
+		return EOK;
+
+	part = (fdisk_part_t *)sel;
+
+	rc = nchoice_create(&choice);
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = nchoice_set_prompt(choice, "Select property to modify");
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = nchoice_add(choice, "Mount point", (void *)pm_mountp, 0);
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = nchoice_add(choice, "Cancel", (void *)pm_cancel, 0);
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = nchoice_get(choice, &sel);
+	if (rc == ENOENT)
+		return EOK;
+	if (rc != EOK) {
+		printf("Error getting user selection.\n");
+		goto error;
+	}
+
+	nchoice_destroy(choice);
+	choice = NULL;
+
+	switch ((pmprop_t)sel) {
+	case pm_mountp:
+		rc = fdsk_modify_mountp(part);
+		break;
+	case pm_cancel:
+		rc = EOK;
+		break;
+	}
+
+	return rc;
+error:
+	if (choice != NULL)
+		nchoice_destroy(choice);
+	return rc;
+}
+
+static errno_t fdsk_delete_part(fdisk_dev_t *dev)
+{
+	nchoice_t *choice = NULL;
+	bool confirm;
+	void *sel;
+	errno_t rc;
+
+	rc = nchoice_create(&choice);
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = nchoice_set_prompt(choice, "Select partition to delete");
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = fdsk_add_part_choices(dev, choice);
+	if (rc != EOK)
+		goto error;
+
+	rc = nchoice_add(choice, "Cancel", NULL, 0);
+	if (rc != EOK) {
+		assert(rc == ENOMEM);
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = nchoice_get(choice, &sel);
+	if (rc == ENOENT)
+		return EOK;
+	if (rc != EOK) {
+		printf("Error getting user selection.\n");
+		goto error;
+	}
+
+
+	nchoice_destroy(choice);
+	choice = NULL;
+
+	if (sel == NULL)
+		return EOK;
+
+	rc = fdsk_confirm("Warning. Any data in partition will be lost. "
+	    "Really delete partition?", &confirm);
+	if (rc != EOK) {
+		printf("Error getting user confirmation.\n");
+		goto error;
+	}
+
+	if (!confirm)
+		return EOK;
+
+	rc = fdisk_part_destroy((fdisk_part_t *)sel);
+	if (rc != EOK) {
+		printf("Error deleting partition.\n");
+		return rc;
+	}
+
+	return EOK;
+error:
 	if (choice != NULL)
 		nchoice_destroy(choice);
@@ -989,4 +1158,14 @@
 	}
 
+	if ((linfo.flags & lf_can_modify_part) != 0) {
+		rc = nchoice_add(choice, "Modify partition",
+		    (void *)devac_modify_part, 0);
+		if (rc != EOK) {
+			assert(rc == ENOMEM);
+			printf("Out of memory.\n");
+			goto error;
+		}
+	}
+
 	if ((linfo.flags & lf_can_delete_part) != 0) {
 		rc = nchoice_add(choice, "Delete partition",
@@ -1061,4 +1240,7 @@
 		(void) fdsk_create_part(dev, lpk_logical);
 		break;
+	case devac_modify_part:
+		(void) fdsk_modify_part(dev);
+		break;
 	case devac_delete_part:
 		(void) fdsk_delete_part(dev);
Index: uspace/lib/c/generic/vol.c
===================================================================
--- uspace/lib/c/generic/vol.c	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/lib/c/generic/vol.c	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -338,4 +338,39 @@
 }
 
+/** Set mount point for partition.
+ *
+ * @param vol Volume service
+ * @param sid Partition service ID
+ * @param mountp Mount point
+ *
+ * @return EOK on success or an error code
+ */
+errno_t vol_part_set_mountp(vol_t *vol, service_id_t sid,
+    const char *mountp)
+{
+	async_exch_t *exch;
+	ipc_call_t answer;
+	errno_t retval;
+
+	exch = async_exchange_begin(vol->sess);
+	aid_t req = async_send_1(exch, VOL_PART_SET_MOUNTP, sid,
+	    &answer);
+
+	retval = async_data_write_start(exch, mountp, str_size(mountp));
+	if (retval != EOK) {
+		async_exchange_end(exch);
+		async_forget(req);
+		return retval;
+	}
+
+	async_exchange_end(exch);
+	async_wait_for(req, &retval);
+
+	if (retval != EOK)
+		return retval;
+
+	return EOK;
+}
+
 /** Format file system type as string.
  *
Index: uspace/lib/c/include/ipc/vol.h
===================================================================
--- uspace/lib/c/include/ipc/vol.h	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/lib/c/include/ipc/vol.h	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -46,5 +46,6 @@
 	VOL_PART_EMPTY,
 	VOL_PART_LSUPP,
-	VOL_PART_MKFS
+	VOL_PART_MKFS,
+	VOL_PART_SET_MOUNTP
 } vol_request_t;
 
Index: uspace/lib/c/include/types/label.h
===================================================================
--- uspace/lib/c/include/types/label.h	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/lib/c/include/types/label.h	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -86,5 +86,7 @@
 	lf_can_create_log = 0x10,
 	/** Currently it is possible to delete a partition */
-	lf_can_delete_part = 0x20
+	lf_can_delete_part = 0x20,
+	/** Currently it is possible to modify a partition */
+	lf_can_modify_part = 0x40
 } label_flags_t;
 
Index: uspace/lib/c/include/vol.h
===================================================================
--- uspace/lib/c/include/vol.h	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/lib/c/include/vol.h	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -53,4 +53,5 @@
 extern errno_t vol_part_mkfs(vol_t *, service_id_t, vol_fstype_t, const char *,
     const char *);
+extern errno_t vol_part_set_mountp(vol_t *, service_id_t, const char *);
 
 extern errno_t vol_fstype_format(vol_fstype_t, char **);
Index: uspace/lib/fdisk/include/fdisk.h
===================================================================
--- uspace/lib/fdisk/include/fdisk.h	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/lib/fdisk/include/fdisk.h	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -71,4 +71,5 @@
     fdisk_part_t **);
 extern errno_t fdisk_part_destroy(fdisk_part_t *);
+extern errno_t fdisk_part_set_mountp(fdisk_part_t *, const char *);
 extern void fdisk_pspec_init(fdisk_part_spec_t *);
 
Index: uspace/lib/fdisk/src/fdisk.c
===================================================================
--- uspace/lib/fdisk/src/fdisk.c	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/lib/fdisk/src/fdisk.c	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -820,4 +820,17 @@
 }
 
+/** Set partition mount point.
+ *
+ * @param part Fdisk partition
+ * @param mountp Mount point
+ *
+ * @return EOK on success or error code
+ */
+errno_t fdisk_part_set_mountp(fdisk_part_t *part, const char *mountp)
+{
+	return vol_part_set_mountp(part->dev->fdisk->vol,
+	    part->svc_id, mountp);
+}
+
 void fdisk_pspec_init(fdisk_part_spec_t *pspec)
 {
Index: uspace/lib/label/src/gpt.c
===================================================================
--- uspace/lib/label/src/gpt.c	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/lib/label/src/gpt.c	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -580,4 +580,9 @@
 }
 
+static bool gpt_can_modify_part(label_t *label)
+{
+	return list_count(&label->parts) > 0;
+}
+
 static errno_t gpt_get_info(label_t *label, label_info_t *linfo)
 {
@@ -589,4 +594,6 @@
 	if (gpt_can_delete_part(label))
 		linfo->flags = linfo->flags | lf_can_delete_part;
+	if (gpt_can_modify_part(label))
+		linfo->flags = linfo->flags | lf_can_modify_part;
 	linfo->ablock0 = label->ablock0;
 	linfo->anblocks = label->anblocks;
Index: uspace/lib/label/src/mbr.c
===================================================================
--- uspace/lib/label/src/mbr.c	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/lib/label/src/mbr.c	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -428,4 +428,10 @@
 }
 
+static bool mbr_can_modify_part(label_t *label)
+{
+	return list_count(&label->parts) > 0;
+}
+
+
 static errno_t mbr_get_info(label_t *label, label_info_t *linfo)
 {
@@ -448,4 +454,7 @@
 	if (mbr_can_delete_part(label))
 		linfo->flags |= lf_can_delete_part;
+	/* Can modify partition */
+	if (mbr_can_modify_part(label))
+		linfo->flags |= lf_can_modify_part;
 
 	linfo->ablock0 = label->ablock0;
Index: uspace/lib/label/test/label.c
===================================================================
--- uspace/lib/label/test/label.c	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/lib/label/test/label.c	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -357,5 +357,6 @@
 	PCUT_ASSERT_INT_EQUALS(lt_mbr, linfo.ltype);
 	PCUT_ASSERT_INT_EQUALS(lf_ext_supp | lf_can_create_pri |
-	    lf_can_create_ext | lf_can_delete_part, linfo.flags);
+	    lf_can_create_ext | lf_can_delete_part | lf_can_modify_part,
+	    linfo.flags);
 
 	part = label_part_first(label);
@@ -443,5 +444,6 @@
 	PCUT_ASSERT_INT_EQUALS(lt_mbr, linfo.ltype);
 	PCUT_ASSERT_INT_EQUALS(lf_ext_supp | lf_can_create_pri |
-	    lf_can_create_log | lf_can_delete_part, linfo.flags);
+	    lf_can_create_log | lf_can_delete_part | lf_can_modify_part,
+	    linfo.flags);
 
 	epart = label_part_first(label);
@@ -586,5 +588,5 @@
 	PCUT_ASSERT_INT_EQUALS(lt_gpt, linfo.ltype);
 	PCUT_ASSERT_INT_EQUALS(lf_can_create_pri | lf_ptype_uuid |
-	    lf_can_delete_part, linfo.flags);
+	    lf_can_delete_part | lf_can_modify_part, linfo.flags);
 
 	part = label_part_first(label);
Index: uspace/srv/volsrv/part.c
===================================================================
--- uspace/srv/volsrv/part.c	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/srv/volsrv/part.c	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -679,4 +679,34 @@
 }
 
+/** Set partition mount point.
+ *
+ * Set the partition mount point, (un-, re-)mounting the partition as necessary.
+ *
+ * @param part Partition
+ * @param mountp
+ *
+ * @return EOK on success or error code
+ */
+errno_t vol_part_set_mountp_part(vol_part_t *part, const char *mountp)
+{
+	errno_t rc;
+
+	if (part->cur_mp != NULL) {
+		rc = vol_part_eject_part(part);
+		if (rc != EOK)
+			return rc;
+	}
+
+	rc = vol_part_mountp_set(part, mountp);
+	if (rc != EOK)
+		return rc;
+
+	rc = vol_part_mount(part);
+	if (rc != EOK)
+		return rc;
+
+	return EOK;
+}
+
 errno_t vol_part_get_info(vol_part_t *part, vol_part_info_t *pinfo)
 {
Index: uspace/srv/volsrv/part.h
===================================================================
--- uspace/srv/volsrv/part.h	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/srv/volsrv/part.h	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -57,4 +57,5 @@
 extern errno_t vol_part_mkfs_part(vol_part_t *, vol_fstype_t, const char *,
     const char *);
+extern errno_t vol_part_set_mountp_part(vol_part_t *, const char *);
 extern errno_t vol_part_get_info(vol_part_t *, vol_part_info_t *);
 
Index: uspace/srv/volsrv/volsrv.c
===================================================================
--- uspace/srv/volsrv/volsrv.c	(revision bec18a999fe8f0a0d11e4e8b663b60185763e1c7)
+++ uspace/srv/volsrv/volsrv.c	(revision 2d78d88c1a4dd5482f60bb59e70d0111398cbbce)
@@ -285,5 +285,4 @@
 }
 
-
 static void vol_part_mkfs_srv(vol_parts_t *parts, ipc_call_t *icall)
 {
@@ -291,6 +290,6 @@
 	vol_part_t *part;
 	vol_fstype_t fstype;
-	char *label;
-	char *mountp;
+	char *label = NULL;
+	char *mountp = NULL;
 	errno_t rc;
 
@@ -304,5 +303,5 @@
 	if (rc != EOK) {
 		async_answer_0(icall, rc);
-		return;
+		goto error;
 	}
 
@@ -315,7 +314,6 @@
 	    0, NULL);
 	if (rc != EOK) {
-		free(label);
-		async_answer_0(icall, rc);
-		return;
+		async_answer_0(icall, rc);
+		goto error;
 	}
 
@@ -327,12 +325,61 @@
 	rc = vol_part_find_by_id_ref(parts, sid, &part);
 	if (rc != EOK) {
+		async_answer_0(icall, ENOENT);
+		goto error;
+	}
+
+	rc = vol_part_mkfs_part(part, fstype, label, mountp);
+	if (rc != EOK) {
+		async_answer_0(icall, rc);
+		vol_part_del_ref(part);
+		goto error;
+	}
+
+	free(label);
+	free(mountp);
+	async_answer_0(icall, EOK);
+
+	return;
+error:
+	if (label != NULL)
 		free(label);
+	if (mountp != NULL)
+		free(mountp);
+}
+
+static void vol_part_set_mountp_srv(vol_parts_t *parts,
+    ipc_call_t *icall)
+{
+	service_id_t sid;
+	vol_part_t *part;
+	char *mountp;
+	errno_t rc;
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_set_mountp_srv()");
+
+	sid = IPC_GET_ARG1(*icall);
+
+	rc = async_data_write_accept((void **)&mountp, true, 0,
+	    VOL_MOUNTP_MAXLEN, 0, NULL);
+	if (rc != EOK) {
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	if (mountp != NULL) {
+		log_msg(LOG_DEFAULT, LVL_NOTE,
+		    "vol_part_set_mountp_srv: mountp='%s'", mountp);
+	}
+
+	rc = vol_part_find_by_id_ref(parts, sid, &part);
+	if (rc != EOK) {
+		free(mountp);
 		async_answer_0(icall, ENOENT);
 		return;
 	}
 
-	rc = vol_part_mkfs_part(part, fstype, label, mountp);
-	if (rc != EOK) {
-		free(label);
+	rc = vol_part_set_mountp_part(part, mountp);
+	if (rc != EOK) {
+		free(mountp);
 		async_answer_0(icall, rc);
 		vol_part_del_ref(part);
@@ -340,5 +387,5 @@
 	}
 
-	free(label);
+	free(mountp);
 	async_answer_0(icall, EOK);
 }
@@ -386,4 +433,7 @@
 			vol_part_mkfs_srv(parts, &call);
 			break;
+		case VOL_PART_SET_MOUNTP:
+			vol_part_set_mountp_srv(parts, &call);
+			break;
 		default:
 			async_answer_0(&call, EINVAL);
