diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php
index ab32108ea25f9668ee2ee6ffec704d3a7b5a2ced..ebeeae10d2ca28b49a9fdf42c23813fa89ba81ce 100644
--- a/apps/files_sharing/appinfo/update.php
+++ b/apps/files_sharing/appinfo/update.php
@@ -1,73 +1,56 @@
 <?php
+
 $installedVersion = OCP\Config::getAppValue('files_sharing', 'installed_version');
-if (version_compare($installedVersion, '0.3', '<')) {
-	$update_error = false;
-	$query = OCP\DB::prepare('SELECT * FROM `*PREFIX*sharing`');
+if (version_compare($installedVersion, '0.4', '<')) {
+	$query = OCP\DB::prepare('SELECT * FROM `*PREFIX*share`');
 	$result = $query->execute();
-	$groupShares = array();
-	//we need to set up user backends, otherwise creating the shares will fail with "because user does not exist"
+	$view = new \OC\Files\View('/');
+	$users = array();
+	$shares = array();
+	//we need to set up user backends
 	OC_User::useBackend(new OC_User_Database());
 	OC_Group::useBackend(new OC_Group_Database());
 	OC_App::loadApps(array('authentication'));
-	$rootView = new \OC\Files\View('');
+	//we need to set up user backends, otherwise creating the shares will fail with "because user does not exist"
 	while ($row = $result->fetchRow()) {
-		$meta = $rootView->getFileInfo($$row['source']);
-		$itemSource = $meta['fileid'];
-		if ($itemSource != -1) {
-			$file = $meta;
-			if ($file['mimetype'] == 'httpd/unix-directory') {
-				$itemType = 'folder';
-			} else {
-				$itemType = 'file';
-			}
-			if ($row['permissions'] == 0) {
-				$permissions = OCP\PERMISSION_READ | OCP\PERMISSION_SHARE;
-			} else {
-				$permissions = OCP\PERMISSION_READ | OCP\PERMISSION_UPDATE | OCP\PERMISSION_SHARE;
-				if ($itemType == 'folder') {
-					$permissions |= OCP\PERMISSION_CREATE;
-				}
-			}
-			$pos = strrpos($row['uid_shared_with'], '@');
-			if ($pos !== false && OC_Group::groupExists(substr($row['uid_shared_with'], $pos + 1))) {
-				$shareType = OCP\Share::SHARE_TYPE_GROUP;
-				$shareWith = substr($row['uid_shared_with'], 0, $pos);
-				if (isset($groupShares[$shareWith][$itemSource])) {
-					continue;
-				} else {
-					$groupShares[$shareWith][$itemSource] = true;
-				}
-			} else if ($row['uid_shared_with'] == 'public') {
-				$shareType = OCP\Share::SHARE_TYPE_LINK;
-				$shareWith = null;
-			} else {
-				$shareType = OCP\Share::SHARE_TYPE_USER;
-				$shareWith = $row['uid_shared_with'];
-			}
-			OCP\JSON::checkUserExists($row['uid_owner']);
-			OC_User::setUserId($row['uid_owner']);
-			//we need to setup the filesystem for the user, otherwise OC_FileSystem::getRoot will fail and break
-			OC_Util::setupFS($row['uid_owner']);
-			try {
-				OCP\Share::shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions);
-			}
-			catch (Exception $e) {
-				$update_error = true;
-				OCP\Util::writeLog('files_sharing',
-					'Upgrade Routine: Skipping sharing "'.$row['source'].'" to "'.$shareWith
-					.'" (error is "'.$e->getMessage().'")',
-					OCP\Util::WARN);
-			}
-			OC_Util::tearDownFS();
+		//collect all user shares
+		if ($row['share_type'] === "0" && ($row['item_type'] === 'file' || $row['item_type'] === 'folder')) {
+			$users[] = $row['share_with'];
+			$shares[$row['id']] = $row['file_target'];
+		} else if ($row['share_type'] === "1" && ($row['item_type'] === 'file' || $row['item_type'] === 'folder')) {
+			//collect all group sharesX
+			$users = array_merge($users, \OC_group::usersInGroup($row['share_with']));
+			$shares[$row['id']] = $row['file_target'];
+		} else if ($row['share_type'] === "2") {
+			$shares[$row['id']] = $row['file_target'];
 		}
 	}
-	OC_User::setUserId(null);
-	if ($update_error) {
-		OCP\Util::writeLog('files_sharing', 'There were some problems upgrading the sharing of files', OCP\Util::ERROR);
+
+	$unique_users = array_unique($users);
+
+	if (!empty($unique_users) && !empty($shares)) {
+
+		// create folder Shared for each user
+
+		foreach ($unique_users as $user) {
+			\OC\Files\Filesystem::initMountPoints($user);
+			if (!$view->file_exists('/' . $user . '/files/Shared')) {
+				$view->mkdir('/' . $user . '/files/Shared');
+			}
+		}
+
+		$statement = "UPDATE `*PREFIX*share` SET `file_target` = CASE id ";
+		//update share table
+		$ids = implode(',', array_keys($shares));
+		foreach ($shares as $id => $target) {
+			$statement .= "WHEN " . $id . " THEN '/Shared" . $target . "' ";
+		}
+		$statement .= ' END WHERE `id` IN (' . $ids . ')';
+
+		$query = OCP\DB::prepare($statement);
+		$query->execute(array());
 	}
-	// NOTE: Let's drop the table after more testing
-// 	$query = OCP\DB::prepare('DROP TABLE `*PREFIX*sharing`');
-// 	$query->execute();
+
 }
 
 // clean up oc_share table from files which are no longer exists
diff --git a/apps/files_sharing/appinfo/version b/apps/files_sharing/appinfo/version
index 8f91d33378ed1aa457f6edb4b629f3844829658f..bd73f47072b1fe4b9914ec14a7f6d47fcc8f816a 100644
--- a/apps/files_sharing/appinfo/version
+++ b/apps/files_sharing/appinfo/version
@@ -1 +1 @@
-0.3.5.6
+0.4