diff --git a/apps/files/js/dist/personal-settings.js b/apps/files/js/dist/personal-settings.js
index 1e30ef09dabfa073f3641d1c606ffb274805a1c4..042ab81916ed71c5c4bac3bd856989a4f2287586 100644
Binary files a/apps/files/js/dist/personal-settings.js and b/apps/files/js/dist/personal-settings.js differ
diff --git a/apps/files/js/dist/personal-settings.js.map b/apps/files/js/dist/personal-settings.js.map
index db99c781316e05023efb5a741e5a1552045cba62..17486dbcec79b1e66b0564737827b4e160a08815 100644
Binary files a/apps/files/js/dist/personal-settings.js.map and b/apps/files/js/dist/personal-settings.js.map differ
diff --git a/apps/files/js/dist/sidebar.js b/apps/files/js/dist/sidebar.js
index c1704dab68058548ac36cc2127ce29cf26fe54f9..402c4003317527ca5919406d476281beb6f39156 100644
Binary files a/apps/files/js/dist/sidebar.js and b/apps/files/js/dist/sidebar.js differ
diff --git a/apps/files/js/dist/sidebar.js.map b/apps/files/js/dist/sidebar.js.map
index 937b255821537ce5ae440328c96bfd5508809cc0..b8d37c152bc4661ef2a2fbbaed6cc9bde12b7db5 100644
Binary files a/apps/files/js/dist/sidebar.js.map and b/apps/files/js/dist/sidebar.js.map differ
diff --git a/apps/files/src/components/TransferOwnershipDialogue.vue b/apps/files/src/components/TransferOwnershipDialogue.vue
index 01873536913205c77a2d607211ed8c2bffbb0d1a..8889d908716f5e4dd7e9b8e1f249322a204b3c5e 100644
--- a/apps/files/src/components/TransferOwnershipDialogue.vue
+++ b/apps/files/src/components/TransferOwnershipDialogue.vue
@@ -42,7 +42,20 @@
 					<div class="step-header">
 						{{ t('files', 'Target user') }}
 					</div>
-					<input id="files-transfer-user" v-model="uid" type="text">
+					<Multiselect
+						v-model="selectedUser"
+						:options="formatedUserSuggestions"
+						:multiple="false"
+						:searchable="true"
+						:placeholder="t('core', 'Target user …')"
+						:preselect-first="true"
+						:preserve-search="true"
+						:loading="loadingUsers"
+						track-by="user"
+						label="displayName"
+						:clear-on-select="false"
+						:user-select="true"
+						@search-change="findUserDebounced" />
 				</li>
 				<li>
 					<input type="submit"
@@ -58,8 +71,11 @@
 
 <script>
 import axios from '@nextcloud/axios'
+import debounce from 'debounce'
 import { generateOcsUrl } from '@nextcloud/router'
 import { getFilePickerBuilder } from '@nextcloud/dialogs'
+import { Multiselect } from 'nextcloud-vue/dist/Components/Multiselect'
+import Vue from 'vue'
 
 import logger from '../logger'
 
@@ -72,19 +88,37 @@ const picker = getFilePickerBuilder(t('files', 'Select directory to transfer'))
 
 export default {
 	name: 'TransferOwnershipDialogue',
+	components: {
+		Multiselect
+	},
 	data() {
 		return {
 			directory: undefined,
 			directoryPickerError: undefined,
 			submitError: undefined,
-			uid: ''
+			loadingUsers: false,
+			selectedUser: null,
+			userSuggestions: {}
 		}
 	},
 	computed: {
 		canSubmit() {
-			return !!this.directory && !!this.uid
+			return !!this.directory && !!this.selectedUser
+		},
+		formatedUserSuggestions() {
+			return Object.keys(this.userSuggestions).map((uid) => {
+				const user = this.userSuggestions[uid]
+				return {
+					user: user.uid,
+					displayName: user.displayName,
+					icon: 'icon-user'
+				}
+			})
 		}
 	},
+	created() {
+		this.findUserDebounced = debounce(this.findUser, 300)
+	},
 	methods: {
 		start() {
 			this.directoryPickerError = undefined
@@ -105,6 +139,41 @@ export default {
 					this.directoryPickerError = error.message || t('files', 'Unknown error')
 				})
 		},
+		async findUser(query) {
+			this.query = query.trim()
+
+			if (query.length < 3) {
+				return
+			}
+
+			this.loadingUsers = true
+			try {
+				const response = await axios.get(generateOcsUrl('apps/files_sharing/api/v1') + 'sharees', {
+					params: {
+						format: 'json',
+						itemType: 'file',
+						search: query,
+						perPage: 20,
+						lookup: false
+					}
+				})
+
+				if (response.data.ocs.meta.statuscode !== 100) {
+					logger.error('Error fetching suggestions', { response })
+				}
+
+				response.data.ocs.data.users.forEach(user => {
+					Vue.set(this.userSuggestions, user.value.shareWith, {
+						uid: user.value.shareWith,
+						displayName: user.label
+					})
+				})
+			} catch (error) {
+				logger.error('could not fetch users', { error })
+			} finally {
+				this.loadingUsers = false
+			}
+		},
 		submit() {
 			if (!this.canSubmit) {
 				logger.warn('ignoring form submit')
@@ -113,7 +182,7 @@ export default {
 			this.submitError = undefined
 			const data = {
 				path: this.directory,
-				recipient: this.uid
+				recipient: this.selectedUser.user
 			}
 			logger.debug('submit transfer ownership form', data)
 
@@ -125,7 +194,7 @@ export default {
 					logger.info('Transfer ownership request sent', { data })
 
 					this.directory = undefined
-					this.recipient = undefined
+					this.selectedUser = null
 					OCP.Toast.success(t('files', 'Ownership transfer request sent'))
 				})
 				.catch(error => {