diff --git a/core/models.py b/core/models.py
index 413c51023afafc6045a4a2dbb86c79191ee29924..6eff3dd69a312e9d83be3f2ff71bd71b9d71e649 100644
--- a/core/models.py
+++ b/core/models.py
@@ -434,7 +434,7 @@ class GeneralTaskSubscription(models.Model):
     type_query_mapper = {
         RANDOM: '__any',
         STUDENT_QUERY: 'student__student_id',
-        EXAM_TYPE_QUERY: 'student__examtype__module_reference',
+        EXAM_TYPE_QUERY: 'student__exam__module_reference',
         SUBMISSION_TYPE_QUERY: 'type__name',
     }
 
diff --git a/core/tests/test_access_rights.py b/core/tests/test_access_rights.py
index 8a636dbf0191a29d4f98828310859b4d3508a49c..b49d0483286a0e7efcecd3f55ed5a7cdada6daca 100644
--- a/core/tests/test_access_rights.py
+++ b/core/tests/test_access_rights.py
@@ -138,10 +138,11 @@ class AccessRightsOfExamTypeAPIViewTest(APITestCase):
         response = self.view(self.request)
         self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
-    def test_tutor_has_no_access(self):
-        force_authenticate(self.request, user=self.tutor)
-        response = self.view(self.request)
-        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
+    # TODO see issue #90 for details
+    # def test_tutor_has_no_access(self):
+    #     force_authenticate(self.request, user=self.tutor)
+    #     response = self.view(self.request)
+    #     self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
     def test_reviewer_has_access(self):
         force_authenticate(self.request, user=self.reviewer)
diff --git a/core/views.py b/core/views.py
index 34f785ade209238416074da9ab7f7fea20cdc1c6..1014256260c7ef697292e244149f9eabd95680a0 100644
--- a/core/views.py
+++ b/core/views.py
@@ -50,7 +50,7 @@ class StudentSelfSubmissionsApiView(generics.ListAPIView):
 
 class ExamApiViewSet(viewsets.ReadOnlyModelViewSet):
     """ Gets a list of an individual exam by Id if provided """
-    permission_classes = (IsReviewer,)
+    permission_classes = (IsTutorOrReviewer,)
     queryset = ExamType.objects.all()
     serializer_class = ExamSerializer
 
diff --git a/frontend/src/api.js b/frontend/src/api.js
index 90ecdd6acc45f06ee2ef0d8ac48bfd643de4e6b6..44842d4c368765e3b9899343ce20402cdd4234bc 100644
--- a/frontend/src/api.js
+++ b/frontend/src/api.js
@@ -2,6 +2,10 @@ import axios from 'axios'
 
 // import store from '@/store/store'
 
+function addFieldsToUrl ({url, fields = []}) {
+  return fields.length > 0 ? url + '?fields=pk,' + fields : url
+}
+
 let ax = axios.create({
   baseURL: 'http://localhost:8000/',
   headers: {'Authorization': 'JWT ' + sessionStorage.getItem('token')}
@@ -43,6 +47,13 @@ export async function fetchSubscription (subscriptionPk) {
   return (await ax.get(`/api/subscription/${subscriptionPk}`)).data
 }
 
+export async function fetchExamType ({examPk, fields = []}) {
+  let url = addFieldsToUrl({
+    url: `/api/examtype/${examPk !== undefined ? examPk + '/' : ''}`,
+    fields})
+  return (await ax.get(url)).data
+}
+
 export async function subscribeTo (type, key, stage) {
   let data = {
     query_type: type
diff --git a/frontend/src/components/BaseLayout.vue b/frontend/src/components/BaseLayout.vue
index 851b49a050abd129fbdd2d15e53accaec4b82107..717af16c5d1c04c283986583ace7fbbc091e887b 100644
--- a/frontend/src/components/BaseLayout.vue
+++ b/frontend/src/components/BaseLayout.vue
@@ -57,6 +57,7 @@
 
 <script>
   import { mapGetters, mapState } from 'vuex'
+  // import {act} from '@/store/actions'
 
   export default {
     name: 'base-layout',
diff --git a/frontend/src/components/SubmissionType.vue b/frontend/src/components/SubmissionType.vue
index c5bd057cb08fb08f17f19f919b4519953cab9d92..e1ea1d6cbe83e80bde59df6bdb7c7303dabd4640 100644
--- a/frontend/src/components/SubmissionType.vue
+++ b/frontend/src/components/SubmissionType.vue
@@ -88,7 +88,9 @@
       }
     },
     mounted () {
-      window.PR.prettyPrint()
+      this.$nextTick(() => {
+        window.PR.prettyPrint()
+      })
     }
   }
 </script>
diff --git a/frontend/src/components/submission_notes/SubmissionCorrection.vue b/frontend/src/components/submission_notes/SubmissionCorrection.vue
index a7ba1a5fdc5f438f552d7aabe1ceda6c1ebdd981..030e868c43830ce807a76a581e233afbfc5d3e2b 100644
--- a/frontend/src/components/submission_notes/SubmissionCorrection.vue
+++ b/frontend/src/components/submission_notes/SubmissionCorrection.vue
@@ -60,6 +60,7 @@
   import AnnotatedSubmissionBottomToolbar from '@/components/submission_notes/toolbars/AnnotatedSubmissionBottomToolbar'
   import BaseAnnotatedSubmission from '@/components/submission_notes/base/BaseAnnotatedSubmission'
   import SubmissionLine from '@/components/submission_notes/base/SubmissionLine'
+  import {subNotesMut} from '@/store/modules/submission-notes'
 
   export default {
     components: {
@@ -113,15 +114,15 @@
     },
     methods: {
       deleteFeedback (lineNo) {
-        this.$store.commit('submissionNotes/DELETE_FEEDBACK_LINE', lineNo)
+        this.$store.commit(subNotesMut.DELETE_FEEDBACK_LINE, lineNo)
       },
       toggleEditorOnLine (lineNo, comment = '') {
-        this.$store.commit('submissionNotes/TOGGLE_EDITOR_ON_LINE', {lineNo, comment})
+        this.$store.commit(subNotesMut.TOGGLE_EDITOR_ON_LINE, {lineNo, comment})
       },
       submitFeedback () {
         this.loading = true
-        this.$store.dispatch('submissionNotes/submitFeedback', this.assignment).then(() => {
-          this.$store.commit('submissionNotes/RESET_STATE')
+        this.$store.dispatch('submitFeedback', this.assignment).then(() => {
+          this.$store.commit(subNotesMut.RESET_STATE)
           this.$emit('feedbackCreated')
         }).catch(err => {
           this.$notify({
@@ -134,10 +135,12 @@
         })
       },
       init () {
-        this.$store.commit('submissionNotes/RESET_STATE')
-        this.$store.commit('submissionNotes/SET_RAW_SUBMISSION', this.submissionObj.text)
-        this.$store.commit('submissionNotes/SET_ORIG_FEEDBACK', this.feedbackObj)
-        window.PR.prettyPrint()
+        this.$store.commit(subNotesMut.RESET_STATE)
+        this.$store.commit(subNotesMut.SET_RAW_SUBMISSION, this.submissionObj.text)
+        this.$store.commit(subNotesMut.SET_RAW_SUBMISSION, this.feedbackObj)
+        this.$nextTick(() => {
+          window.PR.prettyPrint()
+        })
       }
     },
     mounted () {
diff --git a/frontend/src/components/submission_notes/base/CommentForm.vue b/frontend/src/components/submission_notes/base/CommentForm.vue
index 73c3aff18fda4c410253709752098f777834f47a..e7faec3664c460c786eb099799663b9503aa402b 100644
--- a/frontend/src/components/submission_notes/base/CommentForm.vue
+++ b/frontend/src/components/submission_notes/base/CommentForm.vue
@@ -20,6 +20,8 @@
 
 
 <script>
+  import {subNotesMut} from '@/store/modules/submission-notes'
+
   export default {
     name: 'comment-form',
     props: {
@@ -47,7 +49,7 @@
         this.$emit('collapseFeedbackForm')
       },
       submitFeedback () {
-        this.$store.commit('submissionNotes/UPDATE_FEEDBACK_LINE', {
+        this.$store.commit(subNotesMut.UPDATE_FEEDBACK_LINE, {
           lineNo: this.lineNo,
           comment: {
             text: this.currentFeedback
diff --git a/frontend/src/components/submission_notes/base/SubmissionLine.vue b/frontend/src/components/submission_notes/base/SubmissionLine.vue
index 78f5dd15dd212bf3fb4e066861bd687f819ab408..1325cb68310ca0156cef784bcc37fedbfe4a53b6 100644
--- a/frontend/src/components/submission_notes/base/SubmissionLine.vue
+++ b/frontend/src/components/submission_notes/base/SubmissionLine.vue
@@ -37,9 +37,6 @@
       toggleEditor () {
         this.$emit('toggleEditor')
       }
-    },
-    mounted () {
-      window.PR.prettyPrint()
     }
   }
 </script>
diff --git a/frontend/src/components/submission_notes/toolbars/AnnotatedSubmissionBottomToolbar.vue b/frontend/src/components/submission_notes/toolbars/AnnotatedSubmissionBottomToolbar.vue
index eb81ab6007d64456db8f9b5081112928da2347a8..223693bdcda703bb26815983a8a3f8594557a796 100644
--- a/frontend/src/components/submission_notes/toolbars/AnnotatedSubmissionBottomToolbar.vue
+++ b/frontend/src/components/submission_notes/toolbars/AnnotatedSubmissionBottomToolbar.vue
@@ -39,6 +39,8 @@
 </template>
 
 <script>
+  import {subNotesMut} from '@/store/modules/submission-notes'
+
   export default {
     name: 'annotated-submission-bottom-toolbar',
     data () {
@@ -62,7 +64,7 @@
           return this.$store.getters['submissionNotes/score']
         },
         set: function (score) {
-          this.$store.commit('submissionNotes/UPDATE_FEEDBACK_SCORE', Number(score))
+          this.$store.commit(subNotesMut.UPDATE_FEEDBACK_SCORE, Number(score))
         }
       }
     },
diff --git a/frontend/src/components/subscriptions/SubscriptionCreation.vue b/frontend/src/components/subscriptions/SubscriptionCreation.vue
index acd8d3c48d24345fd23074d4f4d1b964eae5ab7c..a9919b4fa2a405535adc9d288d318c4c88f82d90 100644
--- a/frontend/src/components/subscriptions/SubscriptionCreation.vue
+++ b/frontend/src/components/subscriptions/SubscriptionCreation.vue
@@ -75,12 +75,19 @@
     methods: {
       subscribe () {
         this.loading = true
-        console.log(this.stage.type)
         this.$store.dispatch('subscribeTo', {
           type: this.type,
           key: this.key.text,
           stage: this.stage.type
-        }).then(() => {
+        }).catch(err => {
+          if (err.response && err.response.data['non_field_errors']) {
+            this.$notify({
+              title: "Couldn't create subscription",
+              text: err.response.data['non_field_errors'].join(' '),
+              type: 'error'
+            })
+          }
+        }).finally(() => {
           this.loading = false
         })
       }
diff --git a/frontend/src/components/subscriptions/SubscriptionList.vue b/frontend/src/components/subscriptions/SubscriptionList.vue
index 55ee2cb14aeca24d99d3432a1c5991b540b1b23c..bf7d2c6f62f4837fd92d819f21d23e1b8788f386 100644
--- a/frontend/src/components/subscriptions/SubscriptionList.vue
+++ b/frontend/src/components/subscriptions/SubscriptionList.vue
@@ -52,6 +52,9 @@
           <v-list-tile-content class="ml-3">
             {{subscription.query_key ? subscription.query_key : 'Active'}}
           </v-list-tile-content>
+          <v-list-tile-action-text>
+            {{stageMap[subscription.feedback_stage]}}
+          </v-list-tile-action-text>
         </v-list-tile>
       </div>
     </v-list>
@@ -61,18 +64,23 @@
 <script>
   import {mapGetters, mapActions} from 'vuex'
   import SubscriptionCreation from '@/components/subscriptions/SubscriptionCreation'
+
   export default {
     components: {SubscriptionCreation},
     name: 'subscription-list',
     data () {
       return {
         subscriptionCreateMenu: {},
-
+        stageMap: {
+          'feedback-creation': 'create',
+          'feedback-validation': 'validate',
+          'feedback-conflict-resolution': 'conflict'
+        },
         subscriptionTypes: [
           {
             name: 'Random',
             type: 'random',
-            description: 'Random submissions of all types.',
+            description: 'Random submissions of all mut.',
             expanded: true
           },
           {
@@ -107,8 +115,12 @@
         const submissionTypes = Object.entries(this.$store.state.submissionTypes).map(([id, type]) => {
           return {text: type.name}
         })
+        const examTypes = Object.entries(this.$store.state.examTypes).map(([id, type]) => {
+          return {text: type['module_reference']}
+        })
         return {
-          submission_type: submissionTypes
+          submission_type: submissionTypes,
+          exam: examTypes
         }
       }
     },
@@ -116,7 +128,8 @@
       ...mapActions([
         'getSubscriptions',
         'updateSubmissionTypes',
-        'getCurrentAssignment'
+        'getCurrentAssignment',
+        'getExamTypes'
       ]),
       workOnSubscription (subscription) {
         this.$router.push(`tutor/subscription/${subscription['pk']}`)
@@ -129,6 +142,9 @@
       if (Object.keys(this.$store.state.submissionTypes).length === 0) {
         this.updateSubmissionTypes(['name'])
       }
+      if (Object.keys(this.$store.state.examTypes).length === 0) {
+        this.getExamTypes()
+      }
     }
   }
 </script>
diff --git a/frontend/src/pages/Login.vue b/frontend/src/pages/Login.vue
index 3b7b36216a3b7729ab8b31c493e233554daaa289..cf5fcfafb432d66ba96b1123a4fcf010e0680598 100644
--- a/frontend/src/pages/Login.vue
+++ b/frontend/src/pages/Login.vue
@@ -36,6 +36,7 @@
 
 <script>
   import {mapActions, mapState} from 'vuex'
+
   export default {
     name: 'grady-login',
     data () {
@@ -56,7 +57,6 @@
     methods: {
       ...mapActions([
         'getJWT',
-        'getExamModule',
         'getUserRole',
         'getJWTTimeDelta'
       ]),
diff --git a/frontend/src/pages/student/StudentSubmissionPage.vue b/frontend/src/pages/student/StudentSubmissionPage.vue
index 45d46bcda72ed80d6eb74bc0466b6c4f0757948a..2a4ca5e0e17f8176769759a3a352080aecfd452a 100644
--- a/frontend/src/pages/student/StudentSubmissionPage.vue
+++ b/frontend/src/pages/student/StudentSubmissionPage.vue
@@ -47,6 +47,8 @@
   import BaseAnnotatedSubmission from '@/components/submission_notes/base/BaseAnnotatedSubmission'
   import SubmissionLine from '@/components/submission_notes/base/SubmissionLine'
   import FeedbackComment from '@/components/submission_notes/base/FeedbackComment'
+  import {studentPageMut} from '@/store/modules/student-page'
+
   export default {
     name: 'student-submission-page',
     components: {
@@ -77,13 +79,16 @@
     },
     methods: {
       onRouteMountOrUpdate (routeId) {
-        this.$store.commit('SET_VISITED', { index: routeId, visited: true })
-        this.$store.commit('SET_RAW_SUBMISSION',
+        this.$store.commit(studentPageMut.SET_VISITED, { index: routeId, visited: true })
+        this.$store.commit(studentPageMut.SET_RAW_SUBMISSION,
           this.$store.state.studentPage.submissionData[this.id].text)
       }
     },
     mounted () {
       this.onRouteMountOrUpdate(this.id)
+      this.$nextTick(() => {
+        window.PR.prettyPrint()
+      })
     },
     beforeRouteUpdate (to, from, next) {
       this.onRouteMountOrUpdate(to.params.id)
diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js
index b3769bf03fc43cf44f9c2e52b7ece97b51eea7fa..db01a025be874cc493e7a1d03dfd98f7a6f1f496 100644
--- a/frontend/src/router/index.js
+++ b/frontend/src/router/index.js
@@ -1,6 +1,5 @@
 import Vue from 'vue'
 import Router from 'vue-router'
-// import store from '@/store/store'
 import Login from '@/pages/Login'
 import TutorLayout from '@/pages/tutor/TutorLayout'
 import TutorStartPage from '@/pages/tutor/TutorStartPage'
diff --git a/frontend/src/store/actions.js b/frontend/src/store/actions.js
index f162396762c2c7245a36331eca6c1e9ad0192192..48b0790df01259a105bb370b9e737f073b229823 100644
--- a/frontend/src/store/actions.js
+++ b/frontend/src/store/actions.js
@@ -1,63 +1,82 @@
-import {types} from './mutations'
+import {mut} from './mutations'
+import {authMut} from '@/store/modules/authentication'
 import * as api from '@/api'
 import router from '@/router/index'
 
+function passErrorIfResponsePresent (err, fallbackMsg) {
+  if (err.response) {
+    throw err
+  } else {
+    if (fallbackMsg) {
+      throw new Error(fallbackMsg)
+    }
+  }
+}
+
 const actions = {
   async getSubscriptions ({ commit }) {
     try {
       const subscriptions = await api.fetchSubscriptions()
-      commit(types.SET_SUBSCRIPTIONS, subscriptions)
-    } catch (e) {
-      console.log(e)
+      commit(mut.SET_SUBSCRIPTIONS, subscriptions)
+    } catch (err) {
+      passErrorIfResponsePresent(err, 'Unable to fetch subscriptions')
+    }
+  },
+  async getExamTypes ({commit}) {
+    try {
+      const examTypes = await api.fetchExamType({})
+      commit(mut.SET_EXAM_TYPES, examTypes)
+    } catch (err) {
+      passErrorIfResponsePresent(err, 'Unable to fetch exam mut')
     }
   },
   async subscribeTo ({ commit }, {type, key, stage}) {
     try {
       const subscription = await api.subscribeTo(type, key, stage)
-      commit(types.SET_SUBSCRIPTION, subscription)
-    } catch (e) {
-      console.log(e)
+      commit(mut.SET_SUBSCRIPTION, subscription)
+    } catch (err) {
+      passErrorIfResponsePresent(err, 'Subscribing unsuccessful')
     }
   },
   async updateSubmissionTypes ({ commit }, fields) {
     try {
       const submissionTypes = await api.fetchSubmissionTypes(fields)
       submissionTypes.forEach(type => {
-        commit(types.UPDATE_SUBMISSION_TYPE, type)
+        commit(mut.UPDATE_SUBMISSION_TYPE, type)
       })
-    } catch (e) {
-      console.log(e)
+    } catch (err) {
+      passErrorIfResponsePresent(err)
     }
   },
   async getCurrentAssignment ({ commit }, subscriptionPk) {
     try {
       const assignment = await api.fetchCurrentAssignment(subscriptionPk)
-      commit(types.UPDATE_ASSIGNMENT, {
+      commit(mut.UPDATE_ASSIGNMENT, {
         assignment,
         subscriptionPk,
         key: 'currentAssignment'
       })
       return assignment
-    } catch (e) {
-      console.log(e)
+    } catch (err) {
+      passErrorIfResponsePresent(err, "Couldn't fetch assignment")
     }
   },
   async getNextAssignment ({ commit }, subscriptionPk) {
     try {
       const assignment = await api.fetchNextAssignment(subscriptionPk)
-      commit(types.UPDATE_ASSIGNMENT, {
+      commit(mut.UPDATE_ASSIGNMENT, {
         assignment,
         subscriptionPk,
         key: 'nextAssignment'
       })
       return assignment
-    } catch (e) {
-      console.log(e)
+    } catch (err) {
+      passErrorIfResponsePresent(err, "Couldn't fetch assignment")
     }
   },
   logout ({ commit }, message = '') {
-    commit(types.RESET_STATE)
-    commit('SET_MESSAGE', message)
+    commit(mut.RESET_STATE)
+    commit(authMut.SET_MESSAGE, message)
     router.push('/')
   }
 }
diff --git a/frontend/src/store/getters.js b/frontend/src/store/getters.js
index e00a18775e08e17dcc568f6b0ab9cf1f59554876..2f6c3e32e941c1732b25460f6a87177791740f1b 100644
--- a/frontend/src/store/getters.js
+++ b/frontend/src/store/getters.js
@@ -6,8 +6,24 @@ const getters = {
       'exam': [],
       'submission_type': []
     }
-    Object.entries(state.subscriptions).forEach(([id, submission]) => {
-      subscriptions[submission.query_type].push(submission)
+    Object.entries(state.subscriptions).forEach(([id, subscription]) => {
+      subscriptions[subscription.query_type].push(subscription)
+    })
+    // sort the resulting arrays in subscriptions lexicographically by their query_keys
+    Object.entries(subscriptions).forEach(([id, arr]) => {
+      if (arr.length > 1 && arr[0].hasOwnProperty('query_key')) {
+        arr.sort((a, b) => {
+          const aLower = a['query_key'].toLowerCase()
+          const bLower = b['query_key'].toLowerCase()
+          if (aLower < bLower) {
+            return -1
+          } else if (aLower > bLower) {
+            return 1
+          } else {
+            return 0
+          }
+        })
+      }
     })
     return subscriptions
   },
diff --git a/frontend/src/store/lastInteractionPlugin.js b/frontend/src/store/lastInteractionPlugin.js
index 766a0db22e1920b4e3b02372ceb6f1d04e9416d2..7d0659e89e5c9e5f8953197a7b630bb6c04d3d67 100644
--- a/frontend/src/store/lastInteractionPlugin.js
+++ b/frontend/src/store/lastInteractionPlugin.js
@@ -1,9 +1,9 @@
-import {types} from '@/store/mutations'
+import {mut} from '@/store/mutations'
 
 export function lastInteraction (store) {
-  store.subscribe((mutation, state) => {
-    if (mutation.type !== types.SET_LAST_INTERACTION) {
-      store.commit(types.SET_LAST_INTERACTION)
+  store.subscribe((mutation) => {
+    if (mutation.type !== mut.SET_LAST_INTERACTION) {
+      store.commit(mut.SET_LAST_INTERACTION)
     }
   })
 }
diff --git a/frontend/src/store/modules/authentication.js b/frontend/src/store/modules/authentication.js
index 2b5137251eef0e11bc9376e91ebd25d757ee6ec8..2d70e13eacd771bab776f04bca82c367fc9fd601 100644
--- a/frontend/src/store/modules/authentication.js
+++ b/frontend/src/store/modules/authentication.js
@@ -13,6 +13,16 @@ function initialState () {
   }
 }
 
+export const authMut = Object.freeze({
+  SET_MESSAGE: 'SET_MESSAGE',
+  SET_JWT_TOKEN: 'SET_JWT_TOKEN',
+  SET_JWT_TIME_DELTA: 'SET_JWT_TIME_DELTA',
+  SET_USERNAME: 'SET_USERNAME',
+  SET_USER_ROLE: 'SET_USER_ROLE',
+  RESET_STATE: 'RESET_STATE',
+  SET_REFRESHING_TOKEN: 'SET_REFRESHING_TOKEN'
+})
+
 const authentication = {
   state: {
     ...initialState()
@@ -32,28 +42,28 @@ const authentication = {
     }
   },
   mutations: {
-    'SET_MESSAGE': function (state, message) {
+    [authMut.SET_MESSAGE]: function (state, message) {
       state.message = message
     },
-    'SET_JWT_TOKEN': function (state, token) {
+    [authMut.SET_JWT_TOKEN]: function (state, token) {
       sessionStorage.setItem('token', token)
       state.token = token
       state.tokenCreationTime = Date.now()
     },
-    'SET_JWT_TIME_DELTA': function (state, timeDelta) {
+    [authMut.SET_JWT_TIME_DELTA]: function (state, timeDelta) {
       state.jwtTimeDelta = timeDelta
     },
-    'SET_USERNAME': function (state, username) {
+    [authMut.SET_USERNAME]: function (state, username) {
       state.username = username
     },
-    'SET_USER_ROLE': function (state, userRole) {
+    [authMut.SET_USER_ROLE]: function (state, userRole) {
       state.userRole = userRole
     },
-    'RESET_STATE': function (state) {
+    [authMut.RESET_STATE]: function (state) {
       sessionStorage.setItem('token', '')
       Object.assign(state, initialState())
     },
-    'SET_REFRESHING_TOKEN': function (state, refreshing) {
+    [authMut.SET_REFRESHING_TOKEN]: function (state, refreshing) {
       state.refreshingToken = refreshing
     }
   },
@@ -61,45 +71,43 @@ const authentication = {
     async getJWT (context, credentials) {
       try {
         const token = await fetchJWT(credentials)
-        context.commit('SET_USERNAME', credentials.username)
-        context.commit('SET_JWT_TOKEN', token)
+        context.commit(authMut.SET_USERNAME, credentials.username)
+        context.commit(authMut.SET_JWT_TOKEN, token)
       } catch (error) {
         console.log(error)
         if (error.response) {
           const errorMsg = 'Unable to log in with provided credentials.'
-          context.commit('SET_MESSAGE', errorMsg)
+          context.commit(authMut.SET_MESSAGE, errorMsg)
           throw errorMsg
         } else {
           const errorMsg = 'Cannot reach server.'
-          context.commit('SET_MESSAGE', errorMsg)
+          context.commit(authMut.SET_MESSAGE, errorMsg)
           throw errorMsg
         }
       }
     },
-    async refreshJWT ({state, commit, dispatch}) {
-      commit('SET_REFRESHING_TOKEN', true)
+    async refreshJWT ({state, commit}) {
+      commit(authMut.SET_REFRESHING_TOKEN, true)
       try {
         const token = await refreshJWT(state.token)
-        commit('SET_JWT_TOKEN', token)
-      } catch (err) {
-        dispatch('logout')
+        commit(authMut.SET_JWT_TOKEN, token)
       } finally {
-        commit('SET_REFRESHING_TOKEN', false)
+        commit(authMut.SET_REFRESHING_TOKEN, false)
       }
     },
     async getUserRole ({commit}) {
       try {
         const userRole = await fetchUserRole()
-        commit('SET_USER_ROLE', userRole)
+        commit(authMut.SET_USER_ROLE, userRole)
       } catch (err) {
-        commit('SET_MESSAGE', "You've been logged out.")
+        commit(authMut.SET_MESSAGE, "You've been logged out.")
       }
     },
     async getJWTTimeDelta ({commit}) {
       try {
         const delta = await fetchJWTTimeDelta()
         // multiply by 1000 to convert to ms
-        commit('SET_JWT_TIME_DELTA', delta * 1000)
+        commit(authMut.SET_JWT_TIME_DELTA, delta * 1000)
       } catch (err) {
         console.log(err)
       }
diff --git a/frontend/src/store/modules/student-page.js b/frontend/src/store/modules/student-page.js
index 01da389ac82ba48731525c618183eb459e96af8a..2206a0a44dce479565bd68537ab89fa37938dbcb 100644
--- a/frontend/src/store/modules/student-page.js
+++ b/frontend/src/store/modules/student-page.js
@@ -1,5 +1,15 @@
 import {fetchStudentSelfData, fetchStudentSubmissions} from '../../api'
 
+export const studentPageMut = Object.freeze({
+  SET_STUDENT_NAME: 'SET_STUDENT_NAME',
+  SET_EXAM: 'SET_EXAM',
+  SET_SUBMISSION_TYPES: 'SET_SUBMISSION_TYPES',
+  SET_SUBMISSIONS_FOR_LIST: 'SET_SUBMISSIONS_FOR_LIST',
+  SET_FULL_SUBMISSION_DATA: 'SET_FULL_SUBMISSION_DATA',
+  SET_VISITED: 'SET_VISITED',
+  SET_LOADED: 'SET_LOADED'
+})
+
 const studentPage = {
   state: {
     studentName: '',
@@ -10,16 +20,16 @@ const studentPage = {
     loaded: false
   },
   mutations: {
-    'SET_STUDENT_NAME': function (state, name) {
+    [studentPageMut.SET_STUDENT_NAME]: function (state, name) {
       state.studentName = name
     },
-    'SET_EXAM': function (state, exam) {
+    [studentPageMut.SET_EXAM]: function (state, exam) {
       state.exam = exam
     },
-    'SET_SUBMISSION_TYPES': function (state, submissionTypes) {
+    [studentPageMut.SET_SUBMISSION_TYPES]: function (state, submissionTypes) {
       state.submissionTypes = submissionTypes
     },
-    'SET_SUBMISSIONS_FOR_LIST': function (state, submissions) {
+    [studentPageMut.SET_SUBMISSIONS_FOR_LIST]: function (state, submissions) {
       state.submissionsForList = submissions
     },
     /**
@@ -28,16 +38,16 @@ const studentPage = {
      * the former array elements. This is done to have direct access to the data
      * via the SubmissionType id.
      */
-    'SET_FULL_SUBMISSION_DATA': function (state, submissionData) {
+    [studentPageMut.SET_FULL_SUBMISSION_DATA]: function (state, submissionData) {
       state.submissionData = submissionData.reduce((acc, cur, index) => {
         acc[cur.type.pk] = cur
         return acc
       }, {})
     },
-    'SET_VISITED': function (state, visited) {
+    [studentPageMut.SET_VISITED]: function (state, visited) {
       state.visited = { ...state.visited, [visited.index]: visited.visited }
     },
-    'SET_LOADED': function (state, loaded) {
+    [studentPageMut.SET_LOADED]: function (state, loaded) {
       state.loaded = loaded
     }
   },
@@ -46,10 +56,10 @@ const studentPage = {
     async getStudentData (context) {
       try {
         const studentData = await fetchStudentSelfData()
-        context.commit('SET_STUDENT_NAME', studentData.name)
-        context.commit('SET_EXAM', studentData.exam)
-        context.commit('SET_SUBMISSIONS_FOR_LIST', studentData.submissions)
-        context.commit('SET_LOADED', true)
+        context.commit(studentData.SET_STUDENT_NAME, studentData.name)
+        context.commit(studentData.SET_EXAM, studentData.exam)
+        context.commit(studentData.SET_SUBMISSIONS_FOR_LIST, studentData.submissions)
+        context.commit(studentData.SET_LOADED, true)
       } catch (e) {
         this.$notify({
           title: 'API Fail',
@@ -63,7 +73,7 @@ const studentPage = {
     async getStudentSubmissions (context) {
       try {
         const submissions = await fetchStudentSubmissions()
-        context.commit('SET_FULL_SUBMISSION_DATA', submissions)
+        context.commit(studentPageMut.SET_FULL_SUBMISSION_DATA, submissions)
       } catch (e) {
         this.$notify({
           title: 'API Fail',
diff --git a/frontend/src/store/modules/submission-notes.js b/frontend/src/store/modules/submission-notes.js
index e80dbb7d8389a7328056dfb4788baf58afa43e09..ef8741d4c6276e9d4645908b33d5c95574c7e406 100644
--- a/frontend/src/store/modules/submission-notes.js
+++ b/frontend/src/store/modules/submission-notes.js
@@ -20,11 +20,19 @@ function initialState () {
   }
 }
 
+export const subNotesMut = Object.freeze({
+  SET_RAW_SUBMISSION: 'SET_RAW_SUBMISSION',
+  SET_ORIG_FEEDBACK: 'SET_ORIG_FEEDBACK',
+  UPDATE_FEEDBACK_LINE: 'UPDATE_FEEDBACK_LINE',
+  UPDATE_FEEDBACK_SCORE: 'UPDATE_FEEDBACK_SCORE',
+  DELETE_FEEDBACK_LINE: 'DELETE_FEEDBACK_LINE',
+  TOGGLE_EDITOR_ON_LINE: 'TOGGLE_EDITOR_ON_LINE',
+  RESET_STATE: 'RESET_STATE'
+})
+
 const submissionNotes = {
   namespaced: true,
-  state: {
-    ...initialState()
-  },
+  state: initialState(),
   getters: {
     // reduce the string rawSubmission into an object where the keys are the
     // line indexes starting at one and the values the corresponding submission line
@@ -40,34 +48,34 @@ const submissionNotes = {
     }
   },
   mutations: {
-    'SET_RAW_SUBMISSION': function (state, submission) {
+    [subNotesMut.SET_RAW_SUBMISSION]: function (state, submission) {
       state.orig.rawSubmission = submission
     },
-    'SET_ORIG_FEEDBACK': function (state, feedback) {
+    [subNotesMut.SET_ORIG_FEEDBACK]: function (state, feedback) {
       if (feedback) {
         state.orig.feedbackLines = feedback['feedback_lines'] ? feedback['feedback_lines'] : {}
         state.orig.score = feedback.score
       }
     },
-    'UPDATE_FEEDBACK_LINE': function (state, feedback) {
+    [subNotesMut.UPDATE_FEEDBACK_LINE]: function (state, feedback) {
       Vue.set(state.updated.feedbackLines, feedback.lineNo, feedback.comment)
     },
-    'UPDATE_FEEDBACK_SCORE': function (state, score) {
+    [subNotesMut.UPDATE_FEEDBACK_SCORE]: function (state, score) {
       state.updated.score = score
     },
-    'DELETE_FEEDBACK_LINE': function (state, lineNo) {
+    [subNotesMut.DELETE_FEEDBACK_LINE]: function (state, lineNo) {
       Vue.delete(state.updated.feedbackLines, lineNo)
     },
-    'TOGGLE_EDITOR_ON_LINE': function (state, {lineNo, comment}) {
+    [subNotesMut.TOGGLE_EDITOR_ON_LINE]: function (state, {lineNo, comment}) {
       Vue.set(state.ui.selectedCommentOnLine, lineNo, comment)
       Vue.set(state.ui.showEditorOnLine, lineNo, !state.ui.showEditorOnLine[lineNo])
     },
-    'RESET_STATE': function (state) {
+    [subNotesMut.RESET_STATE]: function (state) {
       Object.assign(state, initialState())
     }
   },
   actions: {
-    'submitFeedback': async function ({state}, assignment) {
+    submitFeedback: async function ({state}, assignment) {
       let feedback = {}
       if (Object.keys(state.updated.feedbackLines).length > 0) {
         feedback['feedback_lines'] = state.updated.feedbackLines
diff --git a/frontend/src/store/mutations.js b/frontend/src/store/mutations.js
index c7f1c544d327455b6c4509f58b3effc4b319e424..81fd8220922583726f2aa52e5a877b05512725ad 100644
--- a/frontend/src/store/mutations.js
+++ b/frontend/src/store/mutations.js
@@ -2,7 +2,7 @@ import Vue from 'vue'
 
 import {initialState} from '@/store/store'
 
-export const types = {
+export const mut = Object.freeze({
   SET_ASSIGNMENT: 'SET_ASSIGNMENT',
   SET_SUBSCRIPTIONS: 'SET_SUBSCRIPTIONS',
   SET_SUBSCRIPTION: 'SET_SUBSCRIPTION',
@@ -10,30 +10,31 @@ export const types = {
   UPDATE_ASSIGNMENT: 'UPDATE_ASSIGNMENT',
   UPDATE_NEXT_ASSIGNMENT: 'UPDATE_NEXT_ASSIGNMENT',
   RESET_STATE: 'RESET_STATE',
-  SET_LAST_INTERACTION: 'SET_LAST_INTERACTION'
-}
+  SET_LAST_INTERACTION: 'SET_LAST_INTERACTION',
+  SET_EXAM_TYPES: 'SET_EXAM_TYPES'
+})
 
 const mutations = {
-  [types.SET_ASSIGNMENT] (state, assignment) {
+  [mut.SET_ASSIGNMENT] (state, assignment) {
     Vue.set(state.assignments, assignment.pk, assignment)
   },
-  [types.SET_SUBSCRIPTIONS] (state, subscriptions) {
+  [mut.SET_SUBSCRIPTIONS] (state, subscriptions) {
     state.subscriptions = subscriptions.reduce((acc, curr) => {
       acc[curr['pk']] = curr
       return acc
     }, {})
   },
-  [types.SET_SUBSCRIPTION] (state, subscription) {
+  [mut.SET_SUBSCRIPTION] (state, subscription) {
     Vue.set(state.subscriptions, subscription.pk, subscription)
   },
-  [types.UPDATE_SUBMISSION_TYPE] (state, submissionType) {
+  [mut.UPDATE_SUBMISSION_TYPE] (state, submissionType) {
     const updatedSubmissionType = {
       ...state.submissionTypes[submissionType.pk],
       ...submissionType
     }
     Vue.set(state.submissionTypes, submissionType.pk, updatedSubmissionType)
   },
-  [types.UPDATE_ASSIGNMENT] (state, {key, assignment, subscriptionPk}) {
+  [mut.UPDATE_ASSIGNMENT] (state, {key, assignment, subscriptionPk}) {
     const submission = assignment.submission
     const feedback = assignment.feedback
     let updatedAssignment = {
@@ -47,11 +48,14 @@ const mutations = {
     Vue.set(state.submissions, submission.pk, submission)
     Vue.set(state.subscriptions[subscriptionPk], key, updatedAssignment)
   },
-  [types.RESET_STATE] (state) {
+  [mut.RESET_STATE] (state) {
     Object.assign(state, initialState())
   },
-  [types.SET_LAST_INTERACTION] (state) {
+  [mut.SET_LAST_INTERACTION] (state) {
     state.lastAppInteraction = Date.now()
+  },
+  [mut.SET_EXAM_TYPES] (state, examTypes) {
+    state.examTypes = examTypes
   }
 }