diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php
index e2780e98935235dfb866950362c6aceda8555b48..cc1f7d9ffdf5bd1d55b48d65ee74f98f337b6270 100644
--- a/apps/files_sharing/lib/helper.php
+++ b/apps/files_sharing/lib/helper.php
@@ -145,4 +145,35 @@ class Helper {
 
 		return $result;
 	}
+
+	public static function getUidAndFilename($filename) {
+		$uid = \OC\Files\Filesystem::getOwner($filename);
+		\OC\Files\Filesystem::initMountPoints($uid);
+		if ( $uid != \OCP\User::getUser() ) {
+			$info = \OC\Files\Filesystem::getFileInfo($filename);
+			$ownerView = new \OC\Files\View('/'.$uid.'/files');
+			$filename = $ownerView->getPath($info['fileid']);
+		}
+		return array($uid, $filename);
+	}
+
+	/**
+	 * @brief Format a path to be relative to the /user/files/ directory
+	 * @param string $path the absolute path
+	 * @return string e.g. turns '/admin/files/test.txt' into 'test.txt'
+	 */
+	public static function stripUserFilesPath($path) {
+		$trimmed = ltrim($path, '/');
+		$split = explode('/', $trimmed);
+
+		// it is not a file relative to data/user/files
+		if (count($split) < 3 || $split[1] !== 'files') {
+			return false;
+		}
+
+		$sliced = array_slice($split, 2);
+		$relPath = implode('/', $sliced);
+
+		return $relPath;
+	}
 }
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index b8a799f720d022aaef30dc94fe24d2e45583d90c..5e478d5ead8557435df085bcb7632c887a3d4df4 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -362,6 +362,9 @@ class Shared extends \OC\Files\Storage\Common {
 	public function rename($path1, $path2) {
 
 		$sourceMountPoint = \OC\Files\Filesystem::getMountPoint($path1);
+		$targetMountPoint = \OC\Files\Filesystem::getMountPoint($path2);
+		$relPath1 = \OCA\Files_Sharing\Helper::stripUserFilesPath($path1);
+		$relPath2 = \OCA\Files_Sharing\Helper::stripUserFilesPath($path2);
 
 		// if we renamed the mount point we need to adjust the file_target in the
 		// database
@@ -369,21 +372,19 @@ class Shared extends \OC\Files\Storage\Common {
 			return $this->renameMountPoint($path1, $path2);
 		}
 
-		// Renaming/moving is only allowed within shared folders
-		$oldSource = $this->getSourcePath($path1);
-		if ($oldSource) {
-			$newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2);
-			// Within the same folder, we only need UPDATE permissions
-			if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) {
-				list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource);
-				list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource);
-				return $storage->rename($oldInternalPath, $newInternalPath);
+
+		if (	// Within the same mount point, we only need UPDATE permissions
+				($sourceMountPoint === $targetMountPoint && $this->isUpdatable($sourceMountPoint)) ||
 				// otherwise DELETE and CREATE permissions required
-			} elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) {
-				$rootView = new \OC\Files\View('');
-				return $rootView->rename($oldSource, $newSource);
-			}
+				($this->isDeletable($path1) && $this->isCreatable(dirname($path2)))) {
+
+			list($user1, $path1) = \OCA\Files_Sharing\Helper::getUidAndFilename($relPath1);
+			$targetFilename = basename($relPath2);
+			list($user2, $path2) = \OCA\Files_Sharing\Helper::getUidAndFilename(dirname($relPath2));
+			$rootView = new \OC\Files\View('');
+			return $rootView->rename('/' . $user1 . '/files/' . $path1, '/' . $user2 . '/files/' . $path2 . '/' . $targetFilename);
 		}
+
 		return false;
 	}
 
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index a61d58aaf2406c640a20a65c69c93a9258cf441d..58dfc73dcf327c3031ff32bd30248d95b25d8ba0 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -410,16 +410,16 @@ class View {
 				// if source and target are on the same storage we can call the rename operation from the
 				// storage. If it is a "Shared" file/folder we call always the rename operation of the
 				// shared storage to handle mount point renaming, etc correctly
-				if ($mp1 == $mp2) {
+				if ($storage1 instanceof \OC\Files\Storage\Shared) {
 					if ($storage1) {
-						$result = $storage1->rename($internalPath1, $internalPath2);
+						$result = $storage1->rename($absolutePath1, $absolutePath2);
 						\OC_FileProxy::runPostProxies('rename', $absolutePath1, $absolutePath2);
 					} else {
 						$result = false;
 					}
-				} elseif ($storage1 instanceof \OC\Files\Storage\Shared) {
+				} elseif ($mp1 == $mp2) {
 					if ($storage1) {
-						$result = $storage1->rename($absolutePath1, $absolutePath2);
+						$result = $storage1->rename($internalPath1, $internalPath2);
 						\OC_FileProxy::runPostProxies('rename', $absolutePath1, $absolutePath2);
 					} else {
 						$result = false;