diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue
index c39a3ed9..c3bbb597 100644
--- a/src/components/conversation/conversation.vue
+++ b/src/components/conversation/conversation.vue
@@ -13,7 +13,7 @@
       :key="status.id"
       :inlineExpanded="collapsable"
       :statusoid="status"
-      :expandable='!expanded'
+      :expandable='!isExpanded'
       :focused="focused(status.id)"
       :inConversation="isExpanded"
       :highlight="getHighlight()"
diff --git a/src/components/login_form/login_form.js b/src/components/login_form/login_form.js
index fb6dc651..dc917e47 100644
--- a/src/components/login_form/login_form.js
+++ b/src/components/login_form/login_form.js
@@ -31,15 +31,19 @@ const LoginForm = {
             username: this.user.username,
             password: this.user.password
           }
-        ).then((result) => {
+        ).then(async (result) => {
           if (result.error) {
             this.authError = result.error
             this.user.password = ''
             return
           }
           this.$store.commit('setToken', result.access_token)
-          this.$store.dispatch('loginUser', result.access_token)
-          this.$router.push({name: 'friends'})
+          try {
+            await this.$store.dispatch('loginUser', result.access_token)
+            this.$router.push({name: 'friends'})
+          } catch (e) {
+            console.log(e)
+          }
         })
       })
     },
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index 375e4751..e341212e 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -10,13 +10,6 @@ const Notifications = {
   props: [
     'noHeading'
   ],
-  created () {
-    const store = this.$store
-    const credentials = store.state.users.currentUser.credentials
-
-    const fetcherId = notificationsFetcher.startFetching({ store, credentials })
-    this.$store.commit('setNotificationFetcher', { fetcherId })
-  },
   data () {
     return {
       bottomedOut: false
diff --git a/src/components/public_and_external_timeline/public_and_external_timeline.js b/src/components/public_and_external_timeline/public_and_external_timeline.js
index d45677e0..f614c13b 100644
--- a/src/components/public_and_external_timeline/public_and_external_timeline.js
+++ b/src/components/public_and_external_timeline/public_and_external_timeline.js
@@ -7,7 +7,7 @@ const PublicAndExternalTimeline = {
     timeline () { return this.$store.state.statuses.timelines.publicAndExternal }
   },
   created () {
-    this.$store.dispatch('startFetching', { timeline: 'publicAndExternal' })
+    this.$store.dispatch('startFetchingTimeline', { timeline: 'publicAndExternal' })
   },
   destroyed () {
     this.$store.dispatch('stopFetching', 'publicAndExternal')
diff --git a/src/components/public_timeline/public_timeline.js b/src/components/public_timeline/public_timeline.js
index 64c951ac..8976a99c 100644
--- a/src/components/public_timeline/public_timeline.js
+++ b/src/components/public_timeline/public_timeline.js
@@ -7,7 +7,7 @@ const PublicTimeline = {
     timeline () { return this.$store.state.statuses.timelines.public }
   },
   created () {
-    this.$store.dispatch('startFetching', { timeline: 'public' })
+    this.$store.dispatch('startFetchingTimeline', { timeline: 'public' })
   },
   destroyed () {
     this.$store.dispatch('stopFetching', 'public')
diff --git a/src/components/tag_timeline/tag_timeline.js b/src/components/tag_timeline/tag_timeline.js
index 41b09706..458eb1c5 100644
--- a/src/components/tag_timeline/tag_timeline.js
+++ b/src/components/tag_timeline/tag_timeline.js
@@ -3,7 +3,7 @@ import Timeline from '../timeline/timeline.vue'
 const TagTimeline = {
   created () {
     this.$store.commit('clearTimeline', { timeline: 'tag' })
-    this.$store.dispatch('startFetching', { timeline: 'tag', tag: this.tag })
+    this.$store.dispatch('startFetchingTimeline', { timeline: 'tag', tag: this.tag })
   },
   components: {
     Timeline
@@ -15,7 +15,7 @@ const TagTimeline = {
   watch: {
     tag () {
       this.$store.commit('clearTimeline', { timeline: 'tag' })
-      this.$store.dispatch('startFetching', { timeline: 'tag', tag: this.tag })
+      this.$store.dispatch('startFetchingTimeline', { timeline: 'tag', tag: this.tag })
     }
   },
   destroyed () {
diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js
index 1da7d5cc..19d9a9ac 100644
--- a/src/components/timeline/timeline.js
+++ b/src/components/timeline/timeline.js
@@ -52,7 +52,7 @@ const Timeline = {
 
     window.addEventListener('scroll', this.scrollLoad)
 
-    if (this.timelineName === 'friends' && !credentials) { return false }
+    if (store.state.api.fetchers[this.timelineName]) { return false }
 
     timelineFetcher.fetchAndUpdate({
       store,
diff --git a/src/components/user_profile/user_profile.js b/src/components/user_profile/user_profile.js
index 540de955..d55d1517 100644
--- a/src/components/user_profile/user_profile.js
+++ b/src/components/user_profile/user_profile.js
@@ -91,7 +91,7 @@ const UserProfile = {
   methods: {
     startFetchFavorites () {
       if (this.isUs) {
-        this.$store.dispatch('startFetching', { timeline: 'favorites', userId: this.userId })
+        this.$store.dispatch('startFetchingTimeline', { timeline: 'favorites', userId: this.userId })
       }
     },
     fetchUserId () {
@@ -119,8 +119,8 @@ const UserProfile = {
     },
     startUp () {
       if (this.userId) {
-        this.$store.dispatch('startFetching', { timeline: 'user', userId: this.userId })
-        this.$store.dispatch('startFetching', { timeline: 'media', userId: this.userId })
+        this.$store.dispatch('startFetchingTimeline', { timeline: 'user', userId: this.userId })
+        this.$store.dispatch('startFetchingTimeline', { timeline: 'media', userId: this.userId })
         this.startFetchFavorites()
       }
     },
diff --git a/src/modules/api.js b/src/modules/api.js
index 31cb55c6..7ed3edac 100644
--- a/src/modules/api.js
+++ b/src/modules/api.js
@@ -13,11 +13,11 @@ const api = {
     setBackendInteractor (state, backendInteractor) {
       state.backendInteractor = backendInteractor
     },
-    addFetcher (state, {timeline, fetcher}) {
-      state.fetchers[timeline] = fetcher
+    addFetcher (state, { fetcherName, fetcher }) {
+      state.fetchers[fetcherName] = fetcher
     },
-    removeFetcher (state, {timeline}) {
-      delete state.fetchers[timeline]
+    removeFetcher (state, { fetcherName }) {
+      delete state.fetchers[fetcherName]
     },
     setWsToken (state, token) {
       state.wsToken = token
@@ -33,17 +33,24 @@ const api = {
     }
   },
   actions: {
-    startFetching (store, {timeline = 'friends', tag = false, userId = false}) {
+    startFetchingTimeline (store, { timeline = 'friends', tag = false, userId = false }) {
       // Don't start fetching if we already are.
       if (store.state.fetchers[timeline]) return
 
-      const fetcher = store.state.backendInteractor.startFetching({ timeline, store, userId, tag })
-      store.commit('addFetcher', { timeline, fetcher })
+      const fetcher = store.state.backendInteractor.startFetchingTimeline({ timeline, store, userId, tag })
+      store.commit('addFetcher', { fetcherName: timeline, fetcher })
     },
-    stopFetching (store, timeline) {
-      const fetcher = store.state.fetchers[timeline]
+    startFetchingNotifications (store) {
+      // Don't start fetching if we already are.
+      if (store.state.fetchers['notifications']) return
+
+      const fetcher = store.state.backendInteractor.startFetchingNotifications({ store })
+      store.commit('addFetcher', { fetcherName: 'notifications', fetcher })
+    },
+    stopFetching (store, fetcherName) {
+      const fetcher = store.state.fetchers[fetcherName]
       window.clearInterval(fetcher)
-      store.commit('removeFetcher', {timeline})
+      store.commit('removeFetcher', { fetcherName })
     },
     setWsToken (store, token) {
       store.commit('setWsToken', token)
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index 9f854ce3..98761570 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -20,20 +20,21 @@ const emptyTl = (userId = 0) => ({
   flushMarker: 0
 })
 
+const emptyNotifications = () => ({
+  desktopNotificationSilence: true,
+  maxId: 0,
+  minId: Number.POSITIVE_INFINITY,
+  data: [],
+  idStore: {},
+  loading: false,
+  error: false
+})
+
 export const defaultState = () => ({
   allStatuses: [],
   allStatusesObject: {},
   maxId: 0,
-  notifications: {
-    desktopNotificationSilence: true,
-    maxId: 0,
-    minId: Number.POSITIVE_INFINITY,
-    data: [],
-    idStore: {},
-    loading: false,
-    error: false,
-    fetcherId: null
-  },
+  notifications: emptyNotifications(),
   favorites: new Set(),
   error: false,
   timelines: {
@@ -359,9 +360,6 @@ export const mutations = {
     oldTimeline.visibleStatusesObject = {}
     each(oldTimeline.visibleStatuses, (status) => { oldTimeline.visibleStatusesObject[status.id] = status })
   },
-  setNotificationFetcher (state, { fetcherId }) {
-    state.notifications.fetcherId = fetcherId
-  },
   resetStatuses (state) {
     const emptyState = defaultState()
     Object.entries(emptyState).forEach(([key, value]) => {
@@ -371,6 +369,9 @@ export const mutations = {
   clearTimeline (state, { timeline }) {
     state.timelines[timeline] = emptyTl(state.timelines[timeline].userId)
   },
+  clearNotifications (state) {
+    state.notifications = emptyNotifications()
+  },
   setFavorited (state, { status, value }) {
     const newStatus = state.allStatusesObject[status.id]
     newStatus.favorited = value
@@ -454,12 +455,6 @@ const statuses = {
     setNotificationsSilence ({ rootState, commit }, { value }) {
       commit('setNotificationsSilence', { value })
     },
-    stopFetchingNotifications ({ rootState, commit }) {
-      if (rootState.statuses.notifications.fetcherId) {
-        window.clearInterval(rootState.statuses.notifications.fetcherId)
-      }
-      commit('setNotificationFetcher', { fetcherId: null })
-    },
     deleteStatus ({ rootState, commit }, status) {
       commit('setDeleted', { status })
       apiService.deleteStatus({ id: status.id, credentials: rootState.users.currentUser.credentials })
diff --git a/src/modules/users.js b/src/modules/users.js
index b944cf61..cd789f09 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -355,7 +355,8 @@ const users = {
       store.commit('setToken', false)
       store.dispatch('stopFetching', 'friends')
       store.commit('setBackendInteractor', backendInteractorService())
-      store.dispatch('stopFetchingNotifications')
+      store.dispatch('stopFetching', 'notifications')
+      store.commit('clearNotifications')
       store.commit('resetStatuses')
     },
     loginUser (store, accessToken) {
@@ -387,7 +388,10 @@ const users = {
               }
 
               // Start getting fresh posts.
-              store.dispatch('startFetching', { timeline: 'friends' })
+              store.dispatch('startFetchingTimeline', { timeline: 'friends' })
+
+              // Start fetching notifications
+              store.dispatch('startFetchingNotifications')
 
               // Get user mutes
               store.dispatch('fetchMutes')
diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js
index badcbb06..75bba92b 100644
--- a/src/services/backend_interactor_service/backend_interactor_service.js
+++ b/src/services/backend_interactor_service/backend_interactor_service.js
@@ -1,5 +1,6 @@
 import apiService from '../api/api.service.js'
 import timelineFetcherService from '../timeline_fetcher/timeline_fetcher.service.js'
+import notificationsFetcher from '../notifications_fetcher/notifications_fetcher.service.js'
 
 const backendInteractorService = (credentials) => {
   const fetchStatus = ({id}) => {
@@ -58,8 +59,12 @@ const backendInteractorService = (credentials) => {
     return apiService.denyUser({credentials, id})
   }
 
-  const startFetching = ({timeline, store, userId = false, tag}) => {
-    return timelineFetcherService.startFetching({timeline, store, credentials, userId, tag})
+  const startFetchingTimeline = ({ timeline, store, userId = false, tag }) => {
+    return timelineFetcherService.startFetching({ timeline, store, credentials, userId, tag })
+  }
+
+  const startFetchingNotifications = ({ store }) => {
+    return notificationsFetcher.startFetching({ store, credentials })
   }
 
   const tagUser = ({screen_name}, tag) => {
@@ -121,7 +126,8 @@ const backendInteractorService = (credentials) => {
     fetchUserRelationship,
     fetchAllFollowing,
     verifyCredentials: apiService.verifyCredentials,
-    startFetching,
+    startFetchingTimeline,
+    startFetchingNotifications,
     fetchMutes,
     muteUser,
     unmuteUser,