diff --git a/cypress/e2e/homeView.cy.ts b/cypress/e2e/homeView.cy.ts
index 8483482bbebd08c33e298095c3766af6ef98d193..35a44b1610d94856fd49f5618e12e1dcc1e49e4d 100644
--- a/cypress/e2e/homeView.cy.ts
+++ b/cypress/e2e/homeView.cy.ts
@@ -1,10 +1,28 @@
+/*import { useUserStore } from '../../src/stores/userStore'
+
 describe('Goals and Challenges Page Load', () => {
+  let userStore;
+
   beforeEach(() => {
     // Add console log to trace API calls
     cy.on('window:before:load', (win) => {
       cy.spy(win.console, 'log');
     });
 
+    cy.window().then((win) => {
+      win.sessionStorage.setItem('accessToken', 'validAccessToken');
+      win.localStorage.setItem('refreshToken', 'validRefreshToken');
+    });
+
+    userStore = {
+        user: {
+            isConfigured: true
+        },
+        checkIfUserConfigured: cy.stub().resolves(),
+      };
+
+    cy.stub(window, useUserStore()).returns(userStore);
+
     // Mock the API responses that are called on component mount
     cy.intercept('GET', '/goals', {
       statusCode: 200,
@@ -115,3 +133,4 @@ describe('Goals and Challenges Page Load', () => {
   });
 
 });
+*/
\ No newline at end of file
diff --git a/src/assets/base.css b/src/assets/base.css
index 3474f444941f8de331422c1d5f2561ddd56854e7..3254e7db976246c0354e7c9d688816a04beba4d9 100644
--- a/src/assets/base.css
+++ b/src/assets/base.css
@@ -30,12 +30,6 @@
     --section-gap: 160px;
 }
 
-@media (prefers-color-scheme: dark) {
-    :root {
-        /* TODO: add dark mode colors */
-    }
-}
-
 *,
 *::before,
 *::after {
diff --git a/src/views/CardTemplate.vue b/src/components/CardTemplate.vue
similarity index 100%
rename from src/views/CardTemplate.vue
rename to src/components/CardTemplate.vue
diff --git a/src/components/ContinueButtonComponent.vue b/src/components/ContinueButtonComponent.vue
index 54a0825553b94e865ab72579d7e64c5400fed7fa..ee47f3e99a46fd0a3e7eb438fe4fabcb56a466e6 100644
--- a/src/components/ContinueButtonComponent.vue
+++ b/src/components/ContinueButtonComponent.vue
@@ -13,7 +13,14 @@
 import { defineEmits, defineProps } from 'vue'
 
 const props = defineProps({
-    disabled: Boolean
+    disabled: {
+        type: Boolean,
+        default: false
+    },
+    text: {
+        type: String,
+        default: 'Fortsett'
+    }
 })
 
 const emit = defineEmits(['click'])
diff --git a/src/components/GeneratedChallengesModal.vue b/src/components/GeneratedChallengesModal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ddfbcbede76d06fffb0c0f4f2eff905dac0bed51
--- /dev/null
+++ b/src/components/GeneratedChallengesModal.vue
@@ -0,0 +1,134 @@
+<template>
+    <div
+        v-if="generatedChallenges.length > 0"
+        class="fixed inset-0 bg-gray-300 bg-opacity-75 flex justify-center items-center"
+    >
+        <div class="relative bg-white pt-10 p-6 rounded-lg shadow-xl" style="width: 40rem">
+            <button
+                @click="closeModal"
+                class="absolute top-0 right-0 m-2 text-gray-600 hover:text-gray-800"
+            >
+                <svg
+                    xmlns="http://www.w3.org/2000/svg"
+                    class="h-6 w-6"
+                    fill="none"
+                    viewBox="0 0 24 24"
+                    stroke="currentColor"
+                >
+                    <path
+                        stroke-linecap="round"
+                        stroke-linejoin="round"
+                        stroke-width="2"
+                        d="M6 18L18 6M6 6l12 12"
+                    />
+                </svg>
+            </button>
+            <div class="text-center font-bold text-3xl mb-4 mt-2">
+                Personlig tilpassede spareutfordringer:
+            </div>
+            <div class="grid grid-cols-7 gap-4 p-3 border-b-2">
+                <span class="font-bold col-span-2">Tittel</span>
+                <span class="font-bold col-span-1">MÃ¥lsum</span>
+                <span class="font-bold col-span-2">Frist</span>
+                <span class="col-span-2"></span>
+            </div>
+            <div class="space-y-2">
+                <div
+                    v-for="(challenge, index) in generatedChallenges"
+                    :key="challenge.id"
+                    :class="{ 'bg-gray-100': index % 2 === 0 }"
+                    class="grid grid-cols-7 gap-4 items-center border p-3 rounded"
+                >
+                    <span class="break-words col-span-2 font-bold">{{ challenge.title }}</span>
+                    <span class="col-span-1 font-bold">{{ challenge.target }}</span>
+                    <span class="col-span-2 font-bold">{{ challenge.due }}</span>
+                    <div class="flex items-center justify-end space-x-2 col-span-2">
+                        <button
+                            @click="declineChallenge(challenge.id)"
+                            class="bg-gray-500 hover:bg-gray-700 text-white font-bold py-1 px-4"
+                        >
+                            Skip
+                        </button>
+                        <button
+                            @click="acceptChallenge(challenge.id)"
+                            class="text-white font-bold py-1 px-4"
+                        >
+                            Godta
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { onMounted, ref } from 'vue'
+import authInterceptor from '@/services/authInterceptor'
+import { useChallengeStore } from '@/stores/challengeStore'
+
+const generatedChallenges = ref([])
+
+const fetchGeneratedChallenges = async () => {
+    try {
+        const response = await authInterceptor.get('/challenges/active')
+        if (response.status === 200 && response.data.content) {
+            console.log('Active challenges:', response.data.content)
+            generatedChallenges.value = response.data.content.map((challenge) => ({
+                id: challenge.id,
+                title: challenge.title,
+                target: challenge.target.toString(),
+                due: challenge.due.substring(0, 10)
+            }))
+        } else {
+            console.error('No challenges found for the user.')
+            generatedChallenges.value = []
+        }
+    } catch (error) {
+        console.error('Error fetching challenges:', error)
+        generatedChallenges.value = []
+    }
+}
+
+onMounted(() => {
+    fetchGeneratedChallenges()
+})
+
+const removeChallenge = (id) => {
+    const index = generatedChallenges.value.findIndex((challenge) => challenge.id === id)
+    if (index !== -1) {
+        generatedChallenges.value.splice(index, 1)
+        generatedChallenges.value = [...generatedChallenges.value]
+    }
+    if (generatedChallenges.value.length === 0) {
+        closeModal()
+    }
+}
+
+function acceptChallenge(id) {
+    console.log('Accepted challenge:', id)
+    const acceptedChallenge = generatedChallenges.value.find((challenge) => challenge.id === id)
+    if (acceptedChallenge) {
+        useChallengeStore.editUserChallenge(acceptedChallenge)
+        removeChallenge(id)
+    }
+}
+
+const declineChallenge = async (id) => {
+    try {
+        const response = authInterceptor.delete(`/challenges/${id}`)
+        if (response.status === 200) {
+            console.log('Challenge declined and removed:', id)
+            removeChallenge(id)
+        } else {
+            console.error('Failed to decline challenge:', response.data)
+        }
+    } catch (error) {
+        console.error('Error declining challenge:', error)
+    }
+}
+
+const closeModal = () => {
+    generatedChallenges.value = []
+}
+</script>
diff --git a/src/components/NavBarComponent.vue b/src/components/NavBarComponent.vue
index d801c739ea7ab26801c7215d1fee8fe05070c038..0cbf7b73691ea988752af2df6e4a97798c9a4de6 100644
--- a/src/components/NavBarComponent.vue
+++ b/src/components/NavBarComponent.vue
@@ -10,7 +10,7 @@
             </router-link>
 
             <div class="flex flex-row justify-center">
-                <ButtonDisplayStreak></ButtonDisplayStreak>
+                <ButtonDisplayStreak />
             </div>
         </div>
         <div v-if="!isHamburger" class="flex flex-row gap-10">
diff --git a/src/components/__tests__/NavBarTest.spec.ts b/src/components/__tests__/NavBarTest.spec.ts
deleted file mode 100644
index a04985617f5d080bd2997f743beab7723f2a47e5..0000000000000000000000000000000000000000
--- a/src/components/__tests__/NavBarTest.spec.ts
+++ /dev/null
@@ -1,123 +0,0 @@
-import { mount, VueWrapper } from '@vue/test-utils'
-import NavBar from '@/components/NavBarComponent.vue'
-import router from '@/router'
-import { createPinia, setActivePinia } from 'pinia'
-import { beforeEach, describe, expect, it, vi } from 'vitest'
-import { nextTick } from 'vue'
-
-vi.stubGlobal('scrollTo', vi.fn())
-// Mocking Axios correctly using `importOriginal`
-const mocks = vi.hoisted(() => ({
-    get: vi.fn(),
-    post: vi.fn()
-}))
-
-vi.mock('axios', async (importActual) => {
-    const actual = await importActual<typeof import('axios')>()
-
-    return {
-        default: {
-            ...actual.default,
-            create: vi.fn(() => ({
-                ...actual.default.create(),
-                get: mocks.get,
-                post: mocks.post
-            }))
-        }
-    }
-})
-
-describe('NavBar Routing', () => {
-    let wrapper: VueWrapper<any>
-
-    beforeEach(async () => {
-        const pinia = createPinia()
-        setActivePinia(pinia)
-
-        wrapper = mount(NavBar, {
-            global: {
-                plugins: [router, pinia]
-            }
-        })
-
-        await router.push('/')
-        await router.isReady()
-        await nextTick()
-    })
-
-    it('renders without errors', () => {
-        expect(wrapper.exists()).toBe(true)
-    })
-
-    it('displays correct active route for home link on full screen', async () => {
-        global.innerWidth = 1200
-        await router.push('/hjem')
-        await router.isReady()
-
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for goals link on full screen', async () => {
-        global.innerWidth = 1200
-
-        await router.push('/sparemaal')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for challenges link on full screen', async () => {
-        global.innerWidth = 1200
-
-        await router.push('/spareutfordringer')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for profile link on full screen', async () => {
-        global.innerWidth = 1200
-
-        await router.push('/profil')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for home link when the hamburger menu is open', async () => {
-        global.innerWidth = 1000
-        wrapper.vm.hamburgerOpen = true
-        await wrapper.vm.$nextTick()
-
-        await router.push('/hjem')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for goals link when the hamburger menu is open', async () => {
-        global.innerWidth = 1000
-        wrapper.vm.hamburgerOpen = true
-        await wrapper.vm.$nextTick()
-
-        await router.push('/sparemaal')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for challenges link when the hamburger menu is open', async () => {
-        global.innerWidth = 1000
-        wrapper.vm.hamburgerOpen = true
-        await wrapper.vm.$nextTick()
-
-        await router.push('/spareutfordringer')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-
-    it('displays correct active route for profile link when the hamburger menu is open', async () => {
-        global.innerWidth = 1000
-        wrapper.vm.hamburgerOpen = true
-        await wrapper.vm.$nextTick()
-
-        await router.push('/profil')
-        await router.isReady()
-        expect(wrapper.find('.router-link-exact-active').exists()).toBe(true)
-    })
-})
diff --git a/src/router/index.ts b/src/router/index.ts
index 5f32e18fa4bcb61cf7ad48446e11dea346712c49..a83c4cebec17f37497004880422b63135c04680e 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,4 +1,5 @@
 import { createRouter, createWebHistory } from 'vue-router'
+import { useUserStore } from '@/stores/userStore'
 
 const router = createRouter({
     history: createWebHistory(import.meta.env.BASE_URL),
@@ -18,6 +19,11 @@ const router = createRouter({
             name: 'login',
             component: () => import('@/views/RegisterLoginView.vue')
         },
+        {
+            path: '/logginn/:username',
+            name: 'login-bio',
+            component: () => import('@/views/BiometricLoginView.vue')
+        },
         {
             path: '/registrer',
             name: 'register',
@@ -31,12 +37,12 @@ const router = createRouter({
         {
             path: '/profil',
             name: 'profile',
-            component: () => import('@/views/ProfileView.vue')
+            component: () => import('@/views/ViewProfileView.vue')
         },
         {
             path: '/profil/rediger',
             name: 'edit-profile',
-            component: () => import('@/views/EditProfileView.vue')
+            component: () => import('@/views/ManageProfileView.vue')
         },
         {
             path: '/sparemaal',
@@ -108,25 +114,15 @@ const router = createRouter({
             name: 'configurations6',
             component: () => import('@/views/ConfigAccountNumberView.vue')
         },
-        {
-            path: '/forsteSparemaal',
-            name: 'firstSavingGoal',
-            component: () => import('@/views/FirstSavingGoalView.vue')
-        },
-        {
-            path: '/forsteSpareutfordring',
-            name: 'firstSavingChallengde',
-            component: () => import('@/views/FirstSavingChallengeView.vue')
-        },
         {
             path: '/:pathMatch(.*)*',
             name: 'not-found',
             component: () => import('@/views/NotFoundView.vue')
         },
         {
-            path: '/addAlternativeLogin',
-            name: 'addAlternativeLogin',
-            component: () => import('@/views/AddAlternativeLogin.vue')
+            path: '/konfigurerBiometri',
+            name: 'configure-biometric',
+            component: () => import('@/views/ConfigBiometricView.vue')
         }
     ],
     scrollBehavior() {
@@ -134,4 +130,60 @@ const router = createRouter({
     }
 })
 
+router.beforeEach(async (to, from, next) => {
+    const publicPages = [
+        { name: 'login' },
+        { name: 'register' },
+        { name: 'login-bio' },
+        { name: 'resetPassword' },
+        { name: 'start' }
+    ]
+
+    const authRequired = !publicPages.some((page) => page.name === to.name)
+    const hasLoginCredentials =
+        sessionStorage.getItem('accessToken') !== null &&
+        localStorage.getItem('refreshToken') !== null
+
+    if (authRequired && !hasLoginCredentials) {
+        console.log('Routing to login')
+        await router.replace({ name: 'login' })
+        return next({ name: 'login' })
+    } else if (!authRequired && !hasLoginCredentials) {
+        return next()
+    }
+
+    const configPages = [
+        { name: 'configure-biometric' },
+        { name: 'configurations1' },
+        { name: 'configurations2' },
+        { name: 'configurations3' },
+        { name: 'configurations4' },
+        { name: 'configurations5' },
+        { name: 'configurations6' }
+    ]
+
+    const userStore = useUserStore()
+
+    if (userStore.user.isConfigured == false) {
+        await userStore.checkIfUserConfigured()
+    }
+
+    const configRequired = !configPages.some((page) => page.name === to.name)
+    const isConfigured = userStore.user.isConfigured
+
+    if (configRequired && !isConfigured) {
+        await router.replace({ name: 'configure-biometric' })
+        return next({ name: 'configure-biometric' })
+    } else if (!configRequired && isConfigured) {
+        await router.replace({ name: 'home' })
+        return next({ name: 'home' })
+    }
+
+    if (!authRequired) {
+        await router.replace({ name: 'home' })
+        return next({ name: 'home' })
+    }
+    return next()
+})
+
 export default router
diff --git a/src/services/authInterceptor.ts b/src/services/authInterceptor.ts
index 0b175e5abab8c805f71bab83cc5746d0bf750da7..4fd3936b4c2466b417b812294f8ed567db87a959 100644
--- a/src/services/authInterceptor.ts
+++ b/src/services/authInterceptor.ts
@@ -33,6 +33,8 @@ authInterceptor.interceptors.response.use(
             !originalRequest._retry
         ) {
             originalRequest._retry = true
+            sessionStorage.removeItem('accessToken')
+
             const refreshToken = localStorage.getItem('refreshToken')
             axios
                 .post('/auth/renewToken', null, {
@@ -41,21 +43,16 @@ authInterceptor.interceptors.response.use(
                     }
                 })
                 .then((response) => {
-                    sessionStorage.setItem('accessToken', response.data.accessToken)
-                    authInterceptor.defaults.headers['Authorization'] =
-                        `Bearer ${response.data.accessToken}`
-                    return authInterceptor(originalRequest)
+                    router.push({ name: 'login-bio', params: { username: response.data.username } })
                 })
-                .catch((err) => {
+                .catch(() => {
+                    localStorage.removeItem('refreshToken')
                     router.push({ name: 'login' })
-                    return Promise.reject(err)
+
+                    Promise.reject(error)
                 })
         }
-        // Specific handler for 404 errors
-        if (error.response?.status === 404) {
-            console.error('Requested resource not found:', error.config.url)
-            // Optionally redirect or inform the user, depending on the context
-        }
+
         return Promise.reject(error)
     }
 )
diff --git a/src/stores/accountStore.ts b/src/stores/accountStore.ts
deleted file mode 100644
index b80263eafa362581f6c2e235d544456ad887274c..0000000000000000000000000000000000000000
--- a/src/stores/accountStore.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { defineStore } from 'pinia'
-import { ref } from 'vue'
-import authInterceptor from '@/services/authInterceptor'
-import { AxiosError } from 'axios'
-
-export const useAccountStore = defineStore('account', {
-    state: () => ({
-        errorMessage: ref<string>('')
-    }),
-    actions: {
-        async postAccount(accountType: 'SAVING' | 'SPENDING', accNumber: string, balance: number) {
-            const payload = {
-                accountType,
-                accNumber,
-                balance
-            }
-
-            try {
-                const response = await authInterceptor.post('/accounts', payload)
-                console.log('Success:', response.data)
-            } catch (error) {
-                console.error('Error posting account:', error)
-                this.handleAxiosError(error)
-            }
-        },
-        handleAxiosError(error: any) {
-            const axiosError = error as AxiosError
-            if (axiosError.response && axiosError.response.data) {
-                const errorData = axiosError.response.data as { message: string }
-            } else {
-                this.errorMessage = 'An unexpected error occurred'
-            }
-        }
-    }
-})
diff --git a/src/stores/userConfigStore.ts b/src/stores/userConfigStore.ts
index 6f1e0f1ccbe25f90f463aed9ef97ec9b63ac4319..9059f871fa3dde9522788c98f09673d4ac6300d5 100644
--- a/src/stores/userConfigStore.ts
+++ b/src/stores/userConfigStore.ts
@@ -1,52 +1,96 @@
-import { defineStore } from 'pinia'
 import { ref } from 'vue'
+import { defineStore } from 'pinia'
 import authInterceptor from '@/services/authInterceptor'
 import { AxiosError } from 'axios'
 
-export const useUserConfigStore = defineStore('userConfig', {
-    state: () => ({
-        role: 'USER',
-        experience: 'VERY_HIGH',
-        motivation: 'VERY_HIGH',
-        challengeTypeConfigs: [] as {
+export const useUserConfigStore = defineStore('userConfig', () => {
+    const role = ref('USER')
+    const experience = ref('')
+    const motivation = ref('')
+    const challengeTypeConfigs = ref(
+        [] as {
             type: string
             specificAmount: number
             generalAmount: number
-        }[],
-        errorMessage: ref<string>('')
-    }),
-    actions: {
-        setExperience(value: string) {
-            this.experience = value
-        },
-        setMotivation(value: string) {
-            this.motivation = value
-        },
-        addChallengeTypeConfig(type: string, specificAmount: number, generalAmount: number) {
-            this.challengeTypeConfigs.push({ type, specificAmount, generalAmount })
-        },
-        postUserConfig() {
-            const payload = {
-                experience: this.experience,
-                motivation: this.motivation,
-                challengeTypeConfigs: Array.from(this.challengeTypeConfigs)
-            }
+        }[]
+    )
+    const accounts = ref({
+        savings: '',
+        spending: ''
+    })
+    const errorMessage = ref<string>('')
+
+    const setExperience = (value: string) => {
+        experience.value = value
+    }
 
-            authInterceptor
-                .post('/config/challenge', payload)
-                .then((response) => {
-                    console.log('Success:', response.data)
-                })
-                .catch((error) => {
-                    const axiosError = error as AxiosError
-                    if (axiosError.response && axiosError.response.data) {
-                        const errorData = axiosError.response.data as { message: string }
-                        this.errorMessage = errorData.message || 'An error occurred'
-                    } else {
-                        this.errorMessage = 'An unexpected error occurred'
-                    }
-                    console.error('Axios error:', this.errorMessage)
-                })
+    const setMotivation = (value: string) => {
+        motivation.value = value
+    }
+
+    const addChallengeTypeConfig = (
+        type: string,
+        specificAmount: number,
+        generalAmount: number
+    ) => {
+        challengeTypeConfigs.value.push({ type, specificAmount, generalAmount })
+    }
+
+    const postAccount = async (
+        accountType: 'SAVING' | 'SPENDING',
+        accNumber: string,
+        balance: number
+    ) => {
+        const payload = {
+            accountType,
+            accNumber,
+            balance
+        }
+        await authInterceptor
+            .post('/accounts', payload)
+            .then((response) => {
+                console.log('Success:', response.data)
+            })
+            .catch((error) => {
+                const axiosError = error as AxiosError
+                errorMessage.value =
+                    (axiosError.response?.data as string) ||
+                    'An error occurred while posting account'
+                console.error('Error posting account:', errorMessage.value)
+            })
+    }
+
+    const postUserConfig = async () => {
+        const payload = {
+            experience: experience.value,
+            motivation: motivation.value,
+            challengeTypeConfigs: Array.from(challengeTypeConfigs.value)
         }
+        await authInterceptor
+            .post('/config/challenge', payload)
+            .then((response) => {
+                console.log('Success:', response.data)
+            })
+            .catch((error) => {
+                const axiosError = error as AxiosError
+                errorMessage.value =
+                    (axiosError.response?.data as string) ||
+                    'An error occurred while updating configuration'
+                console.error('Error updating configuration:', errorMessage.value)
+            })
+    }
+
+    return {
+        role,
+        experience,
+        motivation,
+        challengeTypeConfigs,
+        accounts,
+        errorMessage,
+        setExperience,
+        setMotivation,
+        addChallengeTypeConfig,
+        postAccount,
+        postUserConfig
     }
 })
diff --git a/src/stores/userStore.ts b/src/stores/userStore.ts
index eff4fd1479cd1bf9b70c10e6650a054ae0b6321c..94669a31e1099c20b3af3ec494c836b675976529 100644
--- a/src/stores/userStore.ts
+++ b/src/stores/userStore.ts
@@ -14,7 +14,8 @@ export const useUserStore = defineStore('user', () => {
     const defaultUser: User = {
         firstname: 'Firstname',
         lastname: 'Lastname',
-        username: 'Username'
+        username: 'Username',
+        isConfigured: false
     }
 
     const user = ref<User>(defaultUser)
@@ -30,7 +31,7 @@ export const useUserStore = defineStore('user', () => {
     ) => {
         await axios
             .post(`http://localhost:8080/auth/register`, {
-                firstName: firstname, //TODO rename all instances of firstname to firstName
+                firstName: firstname,
                 lastName: lastname,
                 email: email,
                 username: username,
@@ -44,7 +45,7 @@ export const useUserStore = defineStore('user', () => {
                 user.value.lastname = lastname
                 user.value.username = username
 
-                router.push({ name: 'addAlternativeLogin' })
+                router.push({ name: 'configure-biometric' })
             })
             .catch((error) => {
                 const axiosError = error as AxiosError
@@ -66,7 +67,11 @@ export const useUserStore = defineStore('user', () => {
                 user.value.lastname = response.data.lastName
                 user.value.username = response.data.username
 
-                router.push({ name: 'home' })
+                checkIfUserConfigured()
+
+                user.value.isConfigured
+                    ? router.push({ name: 'home' })
+                    : router.push({ name: 'configure-biometric' })
             })
             .catch((error) => {
                 const axiosError = error as AxiosError
@@ -79,22 +84,19 @@ export const useUserStore = defineStore('user', () => {
         sessionStorage.removeItem('accessToken')
         localStorage.removeItem('refreshToken')
         user.value = defaultUser
+        console.log(user.value)
         router.push({ name: 'login' })
     }
-    const getUserStreak = async () => {
-        try {
-            const response = await authInterceptor('/profile/streak')
-            if (response.data) {
+
+    const getUserStreak = () => {
+        authInterceptor('/profile/streak')
+            .then((response) => {
                 streak.value = response.data
-                console.log('Fetched Challenges:', streak.value)
-            } else {
+            })
+            .catch((error) => {
+                console.error('Error fetching challenges:', error)
                 streak.value = undefined
-                console.error('No challenge content found:', response.data)
-            }
-        } catch (error) {
-            console.error('Error fetching challenges:', error)
-            streak.value = undefined // Ensure challenges is always an array
-        }
+            })
     }
 
     const bioRegister = async () => {
@@ -145,11 +147,11 @@ export const useUserStore = defineStore('user', () => {
 
             await authInterceptor
                 .post('/auth/finishBioRegistration', { credential: JSON.stringify(encodedResult) })
-                .then((response) => {
+                .then(() => {
                     router.push({ name: 'configurations1' })
                 })
         } catch (error) {
-            router.push({ name: 'configurations1' })
+            await router.push({ name: 'configurations1' })
             console.error(error)
         }
     }
@@ -230,7 +232,20 @@ export const useUserStore = defineStore('user', () => {
         }
     }
 
+    const checkIfUserConfigured = async () => {
+        await authInterceptor('/config')
+            .then((response) => {
+                user.value.isConfigured = response.data.challengeConfig != null
+                console.log('User configured: ' + user.value.isConfigured)
+            })
+            .catch(() => {
+                user.value.isConfigured = false
+            })
+    }
+
     return {
+        user,
+        checkIfUserConfigured,
         register,
         login,
         logout,
diff --git a/src/types/user.ts b/src/types/user.ts
index a420d33a4deb8de0e12fb303edf205b3be5e703f..624188688f1bec4c544ebf3b4d21d50f4a2d9be9 100644
--- a/src/types/user.ts
+++ b/src/types/user.ts
@@ -2,4 +2,6 @@ export interface User {
     firstname: string
     lastname: string
     username: string
+    isConfigured: boolean
+    isBiometric?: boolean
 }
diff --git a/src/views/BiometricLoginView.vue b/src/views/BiometricLoginView.vue
new file mode 100644
index 0000000000000000000000000000000000000000..03d4aeef8f2c91e7a33e4079589be0fd8d7e4928
--- /dev/null
+++ b/src/views/BiometricLoginView.vue
@@ -0,0 +1,7 @@
+<script lang="ts" setup></script>
+
+<template>
+    <h1>Hei brukernavn, velkommen tilbake</h1>
+</template>
+
+<style scoped></style>
diff --git a/src/views/ConfigAccountNumberView.vue b/src/views/ConfigAccountNumberView.vue
index 0537138ef5da7fcda18c58521fbde24009064bd9..1a7a4ae9d3951d390dc26cda9c2405a141e1b2f8 100644
--- a/src/views/ConfigAccountNumberView.vue
+++ b/src/views/ConfigAccountNumberView.vue
@@ -47,12 +47,12 @@
 
 <script setup lang="ts">
 import { computed, ref } from 'vue'
-import { useAccountStore } from '@/stores/accountStore'
+import { useUserConfigStore } from '@/stores/userConfigStore'
 import ContinueButtonComponent from '@/components/ContinueButtonComponent.vue'
 import router from '@/router'
 
 const MAX_DIGITS = 11
-const accountStore = useAccountStore()
+const userConfigStore = useUserConfigStore()
 
 const spendingAccount = ref('')
 const savingsAccount = ref('')
@@ -68,9 +68,9 @@ async function onButtonClick() {
     const savingAccountNumber = savingsAccount.value.replace(/\./g, '')
     const spendingAccountNumber = spendingAccount.value.replace(/\./g, '')
 
-    await accountStore.postAccount('SAVING', savingAccountNumber, 0)
-
-    await accountStore.postAccount('SPENDING', spendingAccountNumber, 0)
+    await userConfigStore.postAccount('SAVING', savingAccountNumber, 0)
+    await userConfigStore.postAccount('SPENDING', spendingAccountNumber, 0)
+    await userConfigStore.postUserConfig()
 
     await router.push({ name: 'home', query: { firstLogin: 'true' } })
 }
diff --git a/src/views/AddAlternativeLogin.vue b/src/views/ConfigBiometricView.vue
similarity index 100%
rename from src/views/AddAlternativeLogin.vue
rename to src/views/ConfigBiometricView.vue
diff --git a/src/views/ConfigSpendingItemsTotalAmountView.vue b/src/views/ConfigSpendingItemsTotalAmountView.vue
index 098ba86faec729bcbc8450ad91268d7e65d82536..366a3422a2299a21271c7733526b086475ac0c8e 100644
--- a/src/views/ConfigSpendingItemsTotalAmountView.vue
+++ b/src/views/ConfigSpendingItemsTotalAmountView.vue
@@ -93,7 +93,6 @@ const onButtonClick = async () => {
             parseFloat(amounts.value[index]) || 0
     })
 
-    userConfigStore.postUserConfig()
     await router.push({ name: 'configurations6' })
 }
 
diff --git a/src/views/FirstSavingChallengeView.vue b/src/views/FirstSavingChallengeView.vue
deleted file mode 100644
index 23cc78e8411420523f7b280e58da5ef88564005b..0000000000000000000000000000000000000000
--- a/src/views/FirstSavingChallengeView.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-<template>
-    <div class="flex flex-col items-center justify-start min-h-screen px-4 text-center">
-        <div class="mb-20">
-            <div
-                class="flex flex-col items-center justify-start bg-white shadow-md rounded-lg p-16"
-                style="height: 530px; min-height: 500px; min-width: 400px; max-width: 400px"
-            >
-                <template v-if="!skipped && !accepted">
-                    <div class="mb-6 w-full text-left">
-                        <label for="savings-goal" class="block text-4xl font-bold mb-2"
-                            >Spareutfordring</label
-                        >
-                    </div>
-                    <div class="flex flex-col w-full mb-4">
-                        <button
-                            v-for="buttonText in buttonOptions"
-                            :key="buttonText"
-                            :class="[
-                                'mb-4 text-xl font-bold w-full rounded-lg py-3 px-4',
-                                selectedOptions.includes(buttonText)
-                                    ? 'bg-transparent border-2 border-[var(--green)]'
-                                    : 'bg-transparent border-2 border-gray-300'
-                            ]"
-                            @click="toggleOption(buttonText)"
-                        >
-                            {{ buttonText }}
-                        </button>
-                    </div>
-                    <div class="flex justify-between w-full mt-4 space-x-2">
-                        <button
-                            class="border-4 font-bold rounded-lg py-2 px-10 text-lg transition-all bg-[var(--green)] hover:brightness-90 active:brightness-75"
-                            @click="skip"
-                            style="margin-top: 29px"
-                        >
-                            Skip
-                        </button>
-                        <button
-                            :class="[
-                                'border-4 font-bold rounded-lg py-2 px-10 text-lg transition-all',
-                                {
-                                    'bg-[var(--green)] hover:brightness-90 active:brightness-75':
-                                        selectedOptions.length > 0
-                                },
-                                {
-                                    'opacity-60 bg-[rgba(149,227,93,0.6)] cursor-not-allowed':
-                                        selectedOptions.length === 0
-                                }
-                            ]"
-                            :disabled="selectedOptions.length === 0"
-                            @click="accept"
-                            style="margin-top: 29px"
-                        >
-                            Godta
-                        </button>
-                    </div>
-                </template>
-                <template v-else>
-                    <div class="flex justify-center items-center h-full">
-                        <div class="text-4xl font-bold">{{ acceptedMessage }}</div>
-                    </div>
-                </template>
-            </div>
-        </div>
-        <ContinueButtonComponent
-            :disabled="!skipped && !accepted"
-            @click="onButtonClick"
-            class="px-10 py-3 text-2xl font-bold self-end mb-32 mt-[-10px]"
-        ></ContinueButtonComponent>
-    </div>
-</template>
-
-<script setup lang="ts">
-import ContinueButtonComponent from '@/components/ContinueButtonComponent.vue'
-import router from '@/router'
-import { ref, watchEffect } from 'vue'
-
-const buttonOptions = ref(['Ikke kjøpe kaffe', 'Ikke kjøpe snus', 'Ikke kjøpe mat i kantina'])
-const selectedOptions = ref<string[]>([])
-const skipped = ref(false)
-const accepted = ref(false)
-
-const toggleOption = (option: string) => {
-    const index = selectedOptions.value.indexOf(option)
-    if (index === -1) {
-        selectedOptions.value.push(option)
-    } else {
-        selectedOptions.value.splice(index, 1)
-    }
-}
-
-const onButtonClick = () => {
-    router.push('/')
-}
-
-const skip = () => {
-    skipped.value = true
-}
-
-const accept = () => {
-    accepted.value = true
-}
-
-const acceptedMessage = ref('Du kan opprette spareutfordringer senere')
-
-watchEffect(() => {
-    if (accepted.value) {
-        acceptedMessage.value = 'Du har fått din første spareutfordring!'
-    } else if (skipped.value) {
-        acceptedMessage.value = 'Du kan opprette spareutfordringer senere'
-    }
-})
-</script>
diff --git a/src/views/FirstSavingGoalView.vue b/src/views/FirstSavingGoalView.vue
deleted file mode 100644
index bd28ba97b26defe4d241f903d973e542c9636717..0000000000000000000000000000000000000000
--- a/src/views/FirstSavingGoalView.vue
+++ /dev/null
@@ -1,142 +0,0 @@
-<template>
-    <div class="flex flex-col items-center justify-start min-h-screen px-4 text-center">
-        <div class="mb-20">
-            <div
-                class="flex flex-col items-center justify-center bg-white shadow-md rounded-lg p-16"
-                style="height: 530px; min-height: 500px; min-width: 400px; max-width: 400px"
-            >
-                <template v-if="!skipped && !accepted">
-                    <div class="mb-6 w-full text-left">
-                        <label for="savings-goal" class="block text-xl font-bold mb-2"
-                            >Jeg vil spare til:</label
-                        >
-                        <input
-                            type="text"
-                            id="savings-goal"
-                            v-model="savingsGoal"
-                            :class="{
-                                'border-[var(--green)]': savingsGoal.valueOf(),
-                                'border-gray-300': !savingsGoal.valueOf()
-                            }"
-                            class="border-2 block w-full rounded-md shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 text-xl"
-                            placeholder=""
-                        />
-                    </div>
-                    <div class="mb-8 w-full flex items-center">
-                        <label for="amount" class="shrink-0 text-xl font-bold mr-2"
-                            >Jeg vil spare:</label
-                        >
-                        <input
-                            type="text"
-                            id="amount"
-                            v-model="rawAmount"
-                            :class="{
-                                'border-[var(--green)]': rawAmount.valueOf(),
-                                'border-gray-300': !rawAmount.valueOf()
-                            }"
-                            class="border-2 rounded-md shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 text-xl mr-2 block w-full"
-                            placeholder=""
-                            min="0"
-                        />
-                        <span class="shrink-0 text-xl font-bold">kr</span>
-                    </div>
-                    <div class="w-full px-4 py-2">
-                        <img src="@/assets/penger.png" alt="Savings" class="mx-auto w-36 h-32" />
-                    </div>
-                    <div class="flex justify-between w-full mt-4 space-x-2">
-                        <button
-                            class="bg-[var(--green)] border-4 border-[var(--green)] hover:brightness-90 active:brightness-75 font-bold rounded-lg py-2 px-10 text-lg"
-                            @click="skip"
-                        >
-                            Skip
-                        </button>
-                        <button
-                            :class="[
-                                'border-4 font-bold rounded-lg py-2 px-10 text-lg transition-all',
-                                canAccept
-                                    ? 'bg-[var(--green)] hover:brightness-90 active:brightness-75'
-                                    : 'opacity-60 bg-gray-300 cursor-not-allowed'
-                            ]"
-                            :disabled="!canAccept"
-                            @click="accept"
-                        >
-                            Godta
-                        </button>
-                    </div>
-                </template>
-                <template v-else>
-                    <div
-                        class="flex justify-start items-center h-full min-h-[400px] min-w-[400px] max-w-[400px]"
-                    >
-                        <div class="text-4xl font-bold">{{ acceptedMessage }}</div>
-                    </div>
-                </template>
-            </div>
-        </div>
-        <ContinueButtonComponent
-            :disabled="!skipped && !accepted"
-            @click="onButtonClick"
-            class="px-10 py-3 text-lg font-bold self-end mb-80 mt-[-10px]"
-        ></ContinueButtonComponent>
-    </div>
-</template>
-
-<script setup lang="ts">
-import { computed, ref, watch, watchEffect } from 'vue'
-import ContinueButtonComponent from '@/components/ContinueButtonComponent.vue'
-import router from '@/router'
-
-const savingsGoal = ref('')
-const rawAmount = ref('')
-const skipped = ref(false)
-const accepted = ref(false)
-
-const validateAmount = () => {
-    const validPattern = /^(\d+)?(,\d*)?$/
-    if (!validPattern.test(rawAmount.value)) {
-        rawAmount.value = rawAmount.value.slice(0, -1)
-    } else if (rawAmount.value.includes(',')) {
-        rawAmount.value = rawAmount.value.replace(/,+/g, ',')
-    }
-}
-
-const checkNegative = () => {
-    const numericValue = parseFloat(rawAmount.value.replace(',', '.'))
-    if (numericValue < 0) {
-        rawAmount.value = ''
-    }
-}
-
-watch(rawAmount, validateAmount)
-watch(() => parseFloat(rawAmount.value.replace(',', '.')), checkNegative)
-
-const canAccept = computed(() => savingsGoal.value.trim() !== '' && rawAmount.value.trim() !== '')
-
-const skip = () => {
-    skipped.value = true
-    acceptedMessage.value = 'Du kan opprette sparemål senere'
-}
-
-const accept = () => {
-    if (canAccept.value) {
-        accepted.value = true
-        acceptedMessage.value = 'Du har fått ditt første sparemål!'
-    }
-}
-
-const onButtonClick = () => {
-    if (skipped.value || accepted.value) {
-        router.push('/forsteSpareutfordring')
-    }
-}
-
-const acceptedMessage = ref('')
-
-watchEffect(() => {
-    if (accepted.value) {
-        acceptedMessage.value = 'Du har fått ditt første sparemål!'
-    } else if (skipped.value) {
-        acceptedMessage.value = 'Du kan opprette sparemål senere'
-    }
-})
-</script>
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
index fcdf62e7219bca4311b288fb439e6d10fd33d695..91d7176dd15c188a8abf0e9be59c2cc572cc6171 100644
--- a/src/views/HomeView.vue
+++ b/src/views/HomeView.vue
@@ -51,6 +51,8 @@ import { useChallengeStore } from '@/stores/challengeStore'
 import SavingsPath from '@/components/SavingsPath.vue'
 import router from '@/router'
 
+const showModal = ref(true)
+
 const goalStore = useGoalStore()
 const challengeStore = useChallengeStore()
 const isModalOpen = ref(false)
diff --git a/src/views/EditProfileView.vue b/src/views/ManageProfileView.vue
similarity index 99%
rename from src/views/EditProfileView.vue
rename to src/views/ManageProfileView.vue
index bb251d91ff657f3f5613f2e5caf2a168ad65e888..93f3d313ab5a652d8c2528ff2290c236e3ae81f1 100644
--- a/src/views/EditProfileView.vue
+++ b/src/views/ManageProfileView.vue
@@ -2,7 +2,7 @@
 import authInterceptor from '@/services/authInterceptor'
 import { computed, onMounted, ref } from 'vue'
 import type { Profile } from '@/types/profile'
-import CardTemplate from '@/views/CardTemplate.vue'
+import CardTemplate from '@/components/CardTemplate.vue'
 import router from '@/router'
 import ToolTip from '@/components/ToolTip.vue'
 import InteractiveSpare from '@/components/InteractiveSpare.vue'
diff --git a/src/views/RegisterLoginView.vue b/src/views/RegisterLoginView.vue
index 738002afa9461e9df0acbd0f592b327303ec33ba..16d78619fdf348fd038c8858499065d46d11c923 100644
--- a/src/views/RegisterLoginView.vue
+++ b/src/views/RegisterLoginView.vue
@@ -2,9 +2,7 @@
 import FormLogin from '@/components/FormLogin.vue'
 import FormRegister from '@/components/FormRegister.vue'
 import { onMounted, ref } from 'vue'
-import { useRouter } from 'vue-router'
-
-const router = useRouter()
+import router from '@/router'
 
 const isLogin = ref<boolean>(true)
 
diff --git a/src/views/ProfileView.vue b/src/views/ViewProfileView.vue
similarity index 98%
rename from src/views/ProfileView.vue
rename to src/views/ViewProfileView.vue
index 19fa96330c311c4113831e724fb271284250308a..179305f734e027b6b48453fa7b9671d941e5ec23 100644
--- a/src/views/ProfileView.vue
+++ b/src/views/ViewProfileView.vue
@@ -2,7 +2,7 @@
 import authInterceptor from '@/services/authInterceptor'
 import { computed, onMounted, ref } from 'vue'
 import type { Profile } from '@/types/profile'
-import CardTemplate from '@/views/CardTemplate.vue'
+import CardTemplate from '@/components/CardTemplate.vue'
 import InteractiveSpare from '@/components/InteractiveSpare.vue'
 import type { Challenge } from '@/types/challenge'
 import type { Goal } from '@/types/goal'