diff --git a/src/modules/instance.js b/src/modules/instance.js
index 7d602aa1..15280e82 100644
--- a/src/modules/instance.js
+++ b/src/modules/instance.js
@@ -35,7 +35,9 @@ const defaultState = {
   // Nasty stuff
   pleromaBackend: true,
   emoji: [],
+  emojiFetched: false,
   customEmoji: [],
+  customEmojiFetched: false,
   restrictedNicknames: [],
   postFormats: [],
 
@@ -86,9 +88,68 @@ const instance = {
           break
       }
     },
+    async getStaticEmoji ({ commit }) {
+      try {
+        const res = await window.fetch('/static/emoji.json')
+        if (res.ok) {
+          const values = await res.json()
+          const emoji = Object.keys(values).map((key) => {
+            return {
+              displayText: key,
+              imageUrl: false,
+              replacement: values[key]
+            }
+          }).sort((a, b) => a.displayText - b.displayText)
+          commit('setInstanceOption', { name: 'emoji', value: emoji })
+        } else {
+          throw (res)
+        }
+      } catch (e) {
+        console.warn("Can't load static emoji")
+        console.warn(e)
+      }
+    },
+
+    async getCustomEmoji ({ commit, state }) {
+      try {
+        const res = await window.fetch('/api/pleroma/emoji.json')
+        if (res.ok) {
+          const result = await res.json()
+          const values = Array.isArray(result) ? Object.assign({}, ...result) : result
+          const emoji = Object.entries(values).map(([key, value]) => {
+            const imageUrl = value.image_url
+            return {
+              displayText: key,
+              imageUrl: imageUrl ? state.server + imageUrl : value,
+              tags: imageUrl ? value.tags.sort((a, b) => a > b ? 1 : 0) : ['utf'],
+              replacement: `:${key}: `
+            }
+            // Technically could use tags but those are kinda useless right now,
+            // should have been "pack" field, that would be more useful
+          }).sort((a, b) => a.displayText.toLowerCase() > b.displayText.toLowerCase() ? 1 : 0)
+          commit('setInstanceOption', { name: 'customEmoji', value: emoji })
+        } else {
+          throw (res)
+        }
+      } catch (e) {
+        console.warn("Can't load custom emojis")
+        console.warn(e)
+      }
+    },
+
     setTheme ({ commit }, themeName) {
       commit('setInstanceOption', { name: 'theme', value: themeName })
       return setPreset(themeName, commit)
+    },
+    fetchEmoji ({ dispatch, state }) {
+      if (!state.customEmojiFetched) {
+        state.customEmojiFetched = true
+        dispatch('getCustomEmoji')
+      }
+      if (!state.emojiFetched) {
+        state.emojiFetched = true
+        dispatch('getStaticEmoji')
+      }
     }
   }
 }
diff --git a/src/modules/users.js b/src/modules/users.js
index fed948e4..0b2f8a9e 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -60,56 +60,6 @@ const unmuteUser = (store, id) => {
     .then((relationship) => store.commit('updateUserRelationship', [relationship]))
 }
 
-const getStaticEmoji = async (store) => {
-  try {
-    const res = await window.fetch('/static/emoji.json')
-    if (res.ok) {
-      const values = await res.json()
-      const emoji = Object.keys(values).map((key) => {
-        return {
-          displayText: key,
-          imageUrl: false,
-          replacement: values[key]
-        }
-      }).sort((a, b) => a.displayText - b.displayText)
-      store.dispatch('setInstanceOption', { name: 'emoji', value: emoji })
-    } else {
-      throw (res)
-    }
-  } catch (e) {
-    console.warn("Can't load static emoji")
-    console.warn(e)
-  }
-}
-
-// This is also used to indicate if we have a 'pleroma backend' or not.
-// Somewhat weird, should probably be somewhere else.
-const getCustomEmoji = async (store) => {
-  try {
-    const res = await window.fetch('/api/pleroma/emoji.json')
-    if (res.ok) {
-      const result = await res.json()
-      const values = Array.isArray(result) ? Object.assign({}, ...result) : result
-      const emoji = Object.entries(values).map(([key, value]) => {
-        const imageUrl = value.image_url
-        return {
-          displayText: key,
-          imageUrl: imageUrl ? store.rootState.instance.server + imageUrl : value,
-          tags: imageUrl ? value.tags.sort((a, b) => a > b ? 1 : 0) : ['utf'],
-          replacement: `:${key}: `
-        }
-        // Technically could use tags but those are kinda useless right now, should have been "pack" field, that would be more useful
-      }).sort((a, b) => a.displayText.toLowerCase() > b.displayText.toLowerCase() ? 1 : 0)
-      store.dispatch('setInstanceOption', { name: 'customEmoji', value: emoji })
-    } else {
-      throw (res)
-    }
-  } catch (e) {
-    console.warn("Can't load custom emojis")
-    console.warn(e)
-  }
-}
-
 export const mutations = {
   setMuted (state, { user: { id }, muted }) {
     const user = state.usersObject[id]
@@ -484,8 +434,7 @@ const users = {
               commit('setCurrentUser', user)
               commit('addNewUsers', [user])
 
-              getCustomEmoji(store)
-              getStaticEmoji(store)
+              store.dispatch('fetchEmoji')
 
               getNotificationPermission()
                 .then(permission => commit('setNotificationPermission', permission))