diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d302ff0a128d57a68124d2cb0cf9c90212063e97..37c9e1ded60d636729fe151333a1557219cb0a5b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -58,17 +58,18 @@ test_flake8:
 
 # ----------------------------- Frontend subsection -------------------------- #
 .test_template_frontend: &test_definition_frontend
-  image: node:carbon
+  image: crbanman/nightwatch
+  when: manual
   before_script:
     - cd frontend/
 
 test_frontend:
   <<: *test_definition_frontend
-  when: manual
+#  when: manual
   stage: test
   script:
     - yarn install
-    - yarn test --single-run
+    - yarn test:e2e
   cache:
     key: "$CI_JOB_NAME"
     paths:
diff --git a/frontend/nightwatch.json b/frontend/nightwatch.json
index 261fbe74a916b532b1294fb209f0009d5a4789c3..333b96e583a946f42104f107337df4cee4546a3b 100644
--- a/frontend/nightwatch.json
+++ b/frontend/nightwatch.json
@@ -1,10 +1,5 @@
 {
   "globals_path": "nightwatch_globals",
-  "selenium": {
-    "cli_args": {
-      "webdriver.gecko.driver": "/usr/bin/geckodriver"
-    }
-  },
   "test_settings": {
     "chrome": {
       "desiredCapabilities": {
diff --git a/frontend/src/components/feedback_list/FeedbackSearchOptions.vue b/frontend/src/components/feedback_list/FeedbackSearchOptions.vue
index 439e9bae7a99fe27b4c338cc8f7bbfaffdb6ac38..e93d3d7b0bc2e9eed3199bf6cfcbec4a81c58466 100644
--- a/frontend/src/components/feedback_list/FeedbackSearchOptions.vue
+++ b/frontend/src/components/feedback_list/FeedbackSearchOptions.vue
@@ -67,7 +67,7 @@ import {FeedbackSearchOptions as SearchOptions} from '@/store/modules/feedback_l
 import {mapStateToComputedGetterSetter} from '@/util/helpers'
 import {Authentication} from '@/store/modules/authentication'
 import { actions } from '@/store/actions'
-import { getters } from '@/store/getters';
+import { getters } from '@/store/getters'
 
 @Component
 export default class FeedbackSearchOptions extends Vue {
@@ -80,12 +80,12 @@ export default class FeedbackSearchOptions extends Vue {
     return this.tutors.map(tutor => tutor.username)
   }
 
-  get showFinal () { return SearchOptions.state.showFinal}
-  get searchOtherUserComments () { return SearchOptions.state.searchOtherUserComments}
-  get caseSensitive () { return SearchOptions.state.caseSensitive}
-  get useRegex () { return SearchOptions.state.useRegex}
-  get filterByTutors () { return SearchOptions.state.filterByTutors}
-  get filterByStage () { return SearchOptions.state.filterByStage}
+  get showFinal () { return SearchOptions.state.showFinal }
+  get searchOtherUserComments () { return SearchOptions.state.searchOtherUserComments }
+  get caseSensitive () { return SearchOptions.state.caseSensitive }
+  get useRegex () { return SearchOptions.state.useRegex }
+  get filterByTutors () { return SearchOptions.state.filterByTutors }
+  get filterByStage () { return SearchOptions.state.filterByStage }
 
   set showFinal (val) {
     SearchOptions.SET_SHOW_FINAL(val)
diff --git a/frontend/src/components/student/ExamInformation.vue b/frontend/src/components/student/ExamInformation.vue
index a2656442904a862395c6a903f533d33d7859c982..ac0e01485d6c27a006ba323a9a8b0ab2530a2d3b 100644
--- a/frontend/src/components/student/ExamInformation.vue
+++ b/frontend/src/components/student/ExamInformation.vue
@@ -22,7 +22,7 @@
 
 <script lang="ts">
 import {Vue, Component, Prop} from 'vue-property-decorator'
-import { Exam } from '@/models';
+import { Exam } from '@/models'
 
 @Component
 export default class ExamInformation extends Vue {
diff --git a/frontend/src/components/student_list/StudentList.vue b/frontend/src/components/student_list/StudentList.vue
index 3ef8a6ef7a48383fbbc54565f0e2205a7713f84a..bf14a68425e228a3df4a25bfd90644d898a9b29d 100644
--- a/frontend/src/components/student_list/StudentList.vue
+++ b/frontend/src/components/student_list/StudentList.vue
@@ -109,7 +109,7 @@ import {mapActions, mapState} from 'vuex'
 import StudentListMenu from '@/components/student_list/StudentListMenu'
 import StudentListReverseMapper from '@/components/student_list/StudentListReverseMapper'
 import { changeActiveForUser } from '@/api'
-import { getters } from '@/store/getters';
+import { getters } from '@/store/getters'
 
 export default {
   components: {
diff --git a/frontend/src/pages/student/StudentLayout.vue b/frontend/src/pages/student/StudentLayout.vue
index b3c5d83aec100b5f0c2781451fdd049396768f6b..6c8ff0d49dc8b4fd2cc62d6328e21d3c20b67b32 100644
--- a/frontend/src/pages/student/StudentLayout.vue
+++ b/frontend/src/pages/student/StudentLayout.vue
@@ -44,7 +44,7 @@
 import {UI} from '@/store/modules/ui'
 import BaseLayout from '@/components/BaseLayout'
 import ExamInformation from '@/components/student/ExamInformation'
-import { StudentPage } from '@/store/modules/student-page';
+import { StudentPage } from '@/store/modules/student-page'
 export default {
   components: {BaseLayout, ExamInformation},
   name: 'student-layout',
@@ -60,10 +60,10 @@ export default {
     }
   },
   computed: {
-    moduleReference () { return StudentPage.state.exam.moduleReference},
-    submissions () { return StudentPage.state.submissionsForList},
-    exam () { return StudentPage.state.exam},
-    visited () { return StudentPage.state.visited},
+    moduleReference () { return StudentPage.state.exam.moduleReference },
+    submissions () { return StudentPage.state.submissionsForList },
+    exam () { return StudentPage.state.exam },
+    visited () { return StudentPage.state.visited },
 
     mini () { return UI.state.mini },
 
diff --git a/frontend/src/pages/student/StudentPage.vue b/frontend/src/pages/student/StudentPage.vue
index ea4cbbb7f62084fb47f4597e46b04f9b17c01c76..13729b0a7a62770471369d39d11ccd533f860b2c 100644
--- a/frontend/src/pages/student/StudentPage.vue
+++ b/frontend/src/pages/student/StudentPage.vue
@@ -16,7 +16,7 @@ import {mapState} from 'vuex'
 import StudentLayout from './StudentLayout.vue'
 import SubmissionList from '@/components/student/SubmissionList.vue'
 import ExamInformation from '@/components/student/ExamInformation.vue'
-import { StudentPage } from '@/store/modules/student-page';
+import { StudentPage } from '@/store/modules/student-page'
 
 export default {
   components: {
@@ -32,10 +32,10 @@ export default {
     }
   },
   computed: {
-    studentName () { return StudentPage.state.studentName},
-    exam () { return StudentPage.state.exam},
-    submissions () { return StudentPage.state.submissionsForList},
-    loaded () { return StudentPage.state.loaded}
+    studentName () { return StudentPage.state.studentName },
+    exam () { return StudentPage.state.exam },
+    submissions () { return StudentPage.state.submissionsForList },
+    loaded () { return StudentPage.state.loaded }
   }
 }
 </script>
diff --git a/frontend/src/pages/student/StudentSubmissionPage.vue b/frontend/src/pages/student/StudentSubmissionPage.vue
index 5cfc681b9577fa1ac19a349e45698ef44bba2a4b..a15579dbab33f8e4402724ab13a0675e900cfcb3 100644
--- a/frontend/src/pages/student/StudentSubmissionPage.vue
+++ b/frontend/src/pages/student/StudentSubmissionPage.vue
@@ -82,8 +82,8 @@ export default {
     },
     submission () { return SubmissionNotes.submission },
     showFeedback: function (state) { return SubmissionNotes.state.ui.showFeedback },
-    submissionType () { return StudentPage.state.submissionData[this.id].type},
-    feedback () { return StudentPage.state.submissionData[this.$route.params.id].feedback}
+    submissionType () { return StudentPage.state.submissionData[this.id].type },
+    feedback () { return StudentPage.state.submissionData[this.$route.params.id].feedback }
   },
   methods: {
     onRouteMountOrUpdate (routeId) {
diff --git a/frontend/src/store/modules/feedback_list/feedback-search-options.ts b/frontend/src/store/modules/feedback_list/feedback-search-options.ts
index b93895a5d4d55fb5b3fdc57c70e9f8feae5607cf..57389646659d149110947f0beff26e1cb5db871e 100644
--- a/frontend/src/store/modules/feedback_list/feedback-search-options.ts
+++ b/frontend/src/store/modules/feedback_list/feedback-search-options.ts
@@ -1,7 +1,7 @@
 import {Module} from 'vuex'
 import {RootState} from '@/store/store'
 import { getStoreBuilder } from 'vuex-typex'
-import { Subscription } from '@/models';
+import { Subscription } from '@/models'
 
 export const namespace = 'feedbackSearchOptions'
 
diff --git a/frontend/src/store/modules/student-page.ts b/frontend/src/store/modules/student-page.ts
index cfe030b33d2871a9568791f4f960ea0c8d2647b7..3dfc6294b605d8766eb43544fda42ab7cb54324a 100644
--- a/frontend/src/store/modules/student-page.ts
+++ b/frontend/src/store/modules/student-page.ts
@@ -2,7 +2,7 @@ import {fetchStudentSelfData, fetchStudentSubmissions} from '@/api'
 import {Exam, Submission, SubmissionList} from '@/models'
 import {RootState} from '@/store/store'
 import {Module} from 'vuex'
-import { getStoreBuilder } from 'vuex-typex';
+import { getStoreBuilder } from 'vuex-typex'
 
 export interface StudentPageState {
   studentName: string
diff --git a/frontend/vue.config.js b/frontend/vue.config.js
index d321253997a1fc75cc8b2ed0b9aabd624ded3303..b6e65a96dbd66e91658033eb70dff4a20bc94650 100644
--- a/frontend/vue.config.js
+++ b/frontend/vue.config.js
@@ -8,11 +8,9 @@ module.exports = {
     allowedHosts: ['localhost'],
     host: 'localhost'
   },
-  configureWebpack: {
-    resolve: {
-      alias: {
-        '@': `${projectRoot}/src`
-      }
-    }
+  configureWebpack: config => {
+    config.resolve.alias['@'] = `${projectRoot}/src`
+    // keep_fnames ist set to true because vuex-typex is dependant on the function names
+    config.optimization.minimizer[0].options.uglifyOptions.keep_fnames = true
   }
 }