diff --git a/core/src/components/login/LoginForm.vue b/core/src/components/login/LoginForm.vue
index 113fe82191366285fccc3bfb6323995c83dff563..5adf5be0eaef4d9c7a2ae6a5a6a4f06aa600ed5f 100644
--- a/core/src/components/login/LoginForm.vue
+++ b/core/src/components/login/LoginForm.vue
@@ -23,7 +23,7 @@
 	<form ref="loginForm"
 		method="post"
 		name="login"
-		:action="OC.generateUrl('login')"
+		:action="loginActionUrl"
 		@submit="submit">
 		<fieldset>
 			<div v-if="apacheAuthFailed"
@@ -47,7 +47,7 @@
 				class="hidden">
 				<img class="float-spinner"
 					alt=""
-					:src="OC.imagePath('core', 'loading-dark.gif')">
+					:src="loadingIcon">
 				<span id="messageText" />
 				<!-- the following div ensures that the spinner is always inside the #message div -->
 				<div style="clear: both;" />
@@ -82,7 +82,7 @@
 				<label for="password"
 					class="infield">{{ t('Password') }}</label>
 				<a href="#" class="toggle-password" @click.stop.prevent="togglePassword">
-					<img :src="OC.imagePath('core', 'actions/toggle.svg')">
+					<img :src="toggleIcon">
 				</a>
 			</p>
 
@@ -126,6 +126,10 @@
 <script>
 import jstz from 'jstimezonedetect'
 import LoginButton from './LoginButton'
+import {
+	generateUrl,
+	imagePath,
+} from '@nextcloud/router'
 
 export default {
 	name: 'LoginForm',
@@ -185,6 +189,15 @@ export default {
 		userDisabled() {
 			return this.errors.indexOf('userdisabled') !== -1
 		},
+		toggleIcon() {
+			return imagePath('core', 'actions/toggle.svg')
+		},
+		loadingIcon() {
+			return imagePath('core', 'loading-dark.gif')
+		},
+		loginActionUrl() {
+			return generateUrl('login')
+		},
 	},
 	mounted() {
 		if (this.username === '') {