diff --git a/apps/files/lib/Command/TransferOwnership.php b/apps/files/lib/Command/TransferOwnership.php
index cad1b1b46cbe9546647f978698ca748b005cdf3c..2675a7dd1bb8b2b515235f01856499abd492c4a9 100644
--- a/apps/files/lib/Command/TransferOwnership.php
+++ b/apps/files/lib/Command/TransferOwnership.php
@@ -77,7 +77,12 @@ class TransferOwnership extends Command {
 				InputOption::VALUE_REQUIRED,
 				'selectively provide the path to transfer. For example --path="folder_name"',
 				''
-			);
+			)->addOption(
+				'move',
+				null,
+				InputOption::VALUE_NONE,
+				'move data from source user to root directory of destination user, which must be empty'
+		);
 	}
 
 	protected function execute(InputInterface $input, OutputInterface $output) {
@@ -99,7 +104,8 @@ class TransferOwnership extends Command {
 				$sourceUserObject,
 				$destinationUserObject,
 				ltrim($input->getOption('path'), '/'),
-				$output
+				$output,
+				$input->getOption('move') === true
 			);
 		} catch (TransferOwnershipException $e) {
 			$output->writeln("<error>" . $e->getMessage() . "</error>");
diff --git a/apps/files/lib/Service/OwnershipTransferService.php b/apps/files/lib/Service/OwnershipTransferService.php
index 8530edd17b17fca7af44e1edae13d611897064ce..f316216814fda38befddc20a4c3e79d61e64f177 100644
--- a/apps/files/lib/Service/OwnershipTransferService.php
+++ b/apps/files/lib/Service/OwnershipTransferService.php
@@ -71,24 +71,33 @@ class OwnershipTransferService {
 	 * @param IUser $destinationUser
 	 * @param string $path
 	 *
+	 * @param OutputInterface|null $output
+	 * @param bool $move
 	 * @throws TransferOwnershipException
+	 * @throws \OC\User\NoUserException
 	 */
 	public function transfer(IUser $sourceUser,
 							 IUser $destinationUser,
 							 string $path,
-							 ?OutputInterface $output = null): void {
+							 ?OutputInterface $output = null,
+							 bool $move = false,
+							 bool $firstLogin = false): void {
 		$output = $output ?? new NullOutput();
 		$sourceUid = $sourceUser->getUID();
 		$destinationUid = $destinationUser->getUID();
 		$sourcePath = rtrim($sourceUid . '/files/' . $path, '/');
 
 		// target user has to be ready
-		if (!$this->encryptionManager->isReadyForUser($destinationUid)) {
+		if ($destinationUser->getLastLogin() === 0 || !$this->encryptionManager->isReadyForUser($destinationUid)) {
 			throw new TransferOwnershipException("The target user is not ready to accept files. The user has at least to have logged in once.", 2);
 		}
 
-		$date = date('Y-m-d H-i-s');
-		$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
+		if ($move) {
+			$finalTarget = "$destinationUid/files/";
+		} else {
+			$date = date('Y-m-d H-i-s');
+			$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
+		}
 
 		// setup filesystem
 		Filesystem::initMountPoints($sourceUid);
@@ -99,6 +108,17 @@ class OwnershipTransferService {
 			throw new TransferOwnershipException("Unknown path provided: $path", 1);
 		}
 
+		if ($move && (
+				!$view->is_dir($finalTarget) || (
+					!$firstLogin &&
+					count($view->getDirectoryContent($finalTarget)) > 0
+				)
+			)
+		) {
+			throw new TransferOwnershipException("Destination path does not exists or is not empty", 1);
+		}
+
+
 		// analyse source folder
 		$this->analyse(
 			$sourceUid,
@@ -273,7 +293,7 @@ class OwnershipTransferService {
 				}
 			} catch (\OCP\Files\NotFoundException $e) {
 				$output->writeln('<error>Share with id ' . $share->getId() . ' points at deleted file, skipping</error>');
-			} catch (\Exception $e) {
+			} catch (\Throwable $e) {
 				$output->writeln('<error>Could not restore share with id ' . $share->getId() . ':' . $e->getTraceAsString() . '</error>');
 			}
 			$progress->advance();