diff --git a/CHANGELOG.md b/CHANGELOG.md
index 734a5ed5a86d7547de592a213d44c845109649da..bb2b750ddde0f39ec3d8d8bb9914ae1e133c530b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - remove fetching initial data for configuring server settings
 - Actions in users module (ActivateUsers, AddRight, DeactivateUsers, DeleteRight, DeleteUsers) now accept an array of users instead of one user
 - Leave dropdown menu open after clicking an action
+- Move current try/catch error handling from view files to module, add it where necessary
 
 ### Added
 
diff --git a/src/lang/en.js b/src/lang/en.js
index 8575144aa6cbed6b5413ac7878d75faf37c7c7fd..6e6a892ee611e6d579aad765f254213b70ea5a14 100644
--- a/src/lang/en.js
+++ b/src/lang/en.js
@@ -365,7 +365,13 @@ export default {
     deletePack: 'Delete pack',
     downloadSharedPack: 'Download shared pack to current instance',
     downloadAsOptional: 'Download as (optional)',
-    downloadPackArchive: 'Download pack archive'
+    downloadPackArchive: 'Download pack archive',
+    successfullyDownloaded: 'Successfully downloaded',
+    successfullyImported: 'Successfully imported',
+    nowNewPacksToImport: 'No new packs to import',
+    successfullyUpdated: 'Successfully updated',
+    metadatLowerCase: 'metadata',
+    files: 'files'
   },
   invites: {
     inviteTokens: 'Invite tokens',
diff --git a/src/store/modules/emojiPacks.js b/src/store/modules/emojiPacks.js
index 6a14e406a9d4647d358b7ffc9e916f0b9a7b8f2e..c118b71f79e6923116a69a6a5e37941367e66e5d 100644
--- a/src/store/modules/emojiPacks.js
+++ b/src/store/modules/emojiPacks.js
@@ -8,7 +8,7 @@ import {
   savePackMetadata,
   importFromFS,
   updatePackFile } from '@/api/emojiPacks'
-
+import i18n from '@/lang'
 import { Message } from 'element-ui'
 
 import Vue from 'vue'
@@ -44,34 +44,30 @@ const packs = {
     }
   },
   actions: {
-    async SetLocalEmojiPacks({ commit, getters, state }) {
-      const { data } = await listPacks(getters.authHost)
-      commit('SET_LOCAL_PACKS', data)
+    async CreatePack({ getters }, { name }) {
+      await createPack(getters.authHost, getters.token, name)
     },
-    async SetRemoteEmojiPacks({ commit, getters, state }, { remoteInstance }) {
-      const { data } = await listRemotePacks(getters.authHost, getters.token, remoteInstance)
-
-      commit('SET_REMOTE_PACKS', data)
+    async DeletePack({ getters }, { name }) {
+      await deletePack(getters.authHost, getters.token, name)
     },
-    async DownloadFrom({ commit, getters, state }, { instanceAddress, packName, as }) {
+    async DownloadFrom({ getters }, { instanceAddress, packName, as }) {
       const result = await downloadFrom(getters.authHost, instanceAddress, packName, as, getters.token)
 
       if (result.data === 'ok') {
         Message({
-          message: `Successfully downloaded ${packName}`,
+          message: `${i18n.t('settings.successfullyDownloaded')} ${packName}`,
           type: 'success',
           duration: 5 * 1000
         })
       }
     },
-    async ReloadEmoji({ commit, getters, state }) {
-      await reloadEmoji(getters.authHost, getters.token)
-    },
-    async ImportFromFS({ commit, getters, state }) {
+    async ImportFromFS({ getters }) {
       const result = await importFromFS(getters.authHost, getters.token)
 
       if (result.status === 200) {
-        const message = result.data.length > 0 ? `Successfully imported ${result.data}` : 'No new packs to import'
+        const message = result.data.length > 0
+          ? `${i18n.t('settings.successfullyImported')} ${result.data}`
+          : i18n.t('settings.nowNewPacksToImport')
 
         Message({
           message,
@@ -80,17 +76,9 @@ const packs = {
         })
       }
     },
-    async DeletePack({ commit, getters, state }, { name }) {
-      await deletePack(getters.authHost, getters.token, name)
-    },
-    async CreatePack({ commit, getters, state }, { name }) {
-      await createPack(getters.authHost, getters.token, name)
-    },
-
-    async UpdateLocalPackVal({ commit, getters, state }, args) {
-      commit('UPDATE_LOCAL_PACK_VAL', args)
+    async ReloadEmoji({ getters }) {
+      await reloadEmoji(getters.authHost, getters.token)
     },
-
     async SavePackMetadata({ commit, getters, state }, { packName }) {
       const result =
         await savePackMetadata(
@@ -102,7 +90,7 @@ const packs = {
 
       if (result.status === 200) {
         Message({
-          message: `Successfully updated ${packName} metadata`,
+          message: `${i18n.t('settings.successfullyUpdated')} ${packName} ${i18n.t('settings.metadatLowerCase')}`,
           type: 'success',
           duration: 5 * 1000
         })
@@ -110,21 +98,32 @@ const packs = {
         commit('UPDATE_LOCAL_PACK_PACK', { name: packName, pack: result.data })
       }
     },
+    async SetLocalEmojiPacks({ commit, getters }) {
+      const { data } = await listPacks(getters.authHost)
+      commit('SET_LOCAL_PACKS', data)
+    },
+    async SetRemoteEmojiPacks({ commit, getters }, { remoteInstance }) {
+      const { data } = await listRemotePacks(getters.authHost, getters.token, remoteInstance)
 
-    async UpdateAndSavePackFile({ commit, getters, state }, args) {
+      commit('SET_REMOTE_PACKS', data)
+    },
+    async UpdateAndSavePackFile({ commit, getters }, args) {
       const result = await updatePackFile(getters.authHost, getters.token, args)
 
       if (result.status === 200) {
         const { packName } = args
 
         Message({
-          message: `Successfully updated ${packName} files`,
+          message: `${i18n.t('settings.successfullyUpdated')} ${packName} ${i18n.t('settings.metadatLowerCase')}`,
           type: 'success',
           duration: 5 * 1000
         })
 
         commit('UPDATE_LOCAL_PACK_FILES', { name: packName, files: result.data })
       }
+    },
+    async UpdateLocalPackVal({ commit }, args) {
+      commit('UPDATE_LOCAL_PACK_VAL', args)
     }
   }
 }
diff --git a/src/store/modules/invites.js b/src/store/modules/invites.js
index bdf43ce3ba63553c7a2d9d0602dd093332568d70..730b25d122dad49796bf137c254f56e9dcf73f7c 100644
--- a/src/store/modules/invites.js
+++ b/src/store/modules/invites.js
@@ -1,4 +1,6 @@
 import { generateInviteToken, inviteViaEmail, listInviteTokens, revokeToken } from '@/api/invites'
+import { Message } from 'element-ui'
+import i18n from '@/lang'
 
 const invites = {
   state: {
@@ -25,18 +27,35 @@ const invites = {
       commit('SET_LOADING', false)
     },
     async GenerateInviteToken({ commit, dispatch, getters }, { maxUse, expiresAt }) {
-      const { data } = await generateInviteToken(maxUse, expiresAt, getters.authHost, getters.token)
-      commit('SET_NEW_TOKEN', { token: data.token, maxUse: data.max_use, expiresAt: data.expires_at })
+      try {
+        const { data } = await generateInviteToken(maxUse, expiresAt, getters.authHost, getters.token)
+        commit('SET_NEW_TOKEN', { token: data.token, maxUse: data.max_use, expiresAt: data.expires_at })
+      } catch (_e) {
+        return
+      }
       dispatch('FetchInviteTokens')
     },
     async InviteUserViaEmail({ commit, dispatch, getters }, { email, name }) {
-      await inviteViaEmail(email, name, getters.authHost, getters.token)
+      try {
+        await inviteViaEmail(email, name, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      }
+      Message({
+        message: i18n.t('invites.emailSent'),
+        type: 'success',
+        duration: 5 * 1000
+      })
     },
     RemoveNewToken({ commit }) {
       commit('SET_NEW_TOKEN', {})
     },
     async RevokeToken({ commit, dispatch, getters }, token) {
-      await revokeToken(token, getters.authHost, getters.token)
+      try {
+        await revokeToken(token, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      }
       dispatch('FetchInviteTokens')
     }
   }
diff --git a/src/store/modules/relays.js b/src/store/modules/relays.js
index 6353569e2ebc5eac98e2d8df0b9a5319e149e726..3a0d15cc0e8e49359b937eb9e23dd8fa8852d25f 100644
--- a/src/store/modules/relays.js
+++ b/src/store/modules/relays.js
@@ -28,15 +28,27 @@ const relays = {
       commit('SET_RELAYS', response.data.relays)
       commit('SET_LOADING', false)
     },
-    async AddRelay({ commit, getters }, relay) {
+    async AddRelay({ commit, dispatch, getters }, relay) {
       commit('ADD_RELAY', relay)
 
-      await addRelay(relay, getters.authHost, getters.token)
+      try {
+        await addRelay(relay, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      } finally {
+        dispatch('FetchRelays')
+      }
     },
-    async DeleteRelay({ commit, getters }, relay) {
+    async DeleteRelay({ commit, dispatch, getters }, relay) {
       commit('DELETE_RELAY', relay)
 
-      await deleteRelay(relay, getters.authHost, getters.token)
+      try {
+        await deleteRelay(relay, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      } finally {
+        dispatch('FetchRelays')
+      }
     }
   }
 }
diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js
index bb6bd8c13587d72fb0604feb09275a321122269f..9c3a2c792ee94719edc0d2cd9e647ecc05e219e3 100644
--- a/src/store/modules/settings.js
+++ b/src/store/modules/settings.js
@@ -1,5 +1,7 @@
+import i18n from '@/lang'
 import { fetchSettings, updateSettings, uploadMedia } from '@/api/settings'
 import { filterIgnored, parseTuples, valueHasTuples, wrapConfig } from './normalizers'
+import { Message } from 'element-ui'
 
 const settings = {
   state: {
@@ -124,10 +126,17 @@ const settings = {
     async SubmitChanges({ getters, commit, state }, data) {
       const filteredSettings = filterIgnored(state.settings, state.ignoredIfNotEnabled)
       const configs = data || wrapConfig(filteredSettings)
-      const response = await updateSettings(configs, getters.authHost, getters.token)
-      if (data) {
+      try {
+        const response = await updateSettings(configs, getters.authHost, getters.token)
         commit('SET_SETTINGS', response.data.configs)
+      } catch (_e) {
+        return
       }
+      Message({
+        message: i18n.t('settings.success'),
+        type: 'success',
+        duration: 5 * 1000
+      })
     },
     UpdateSettings({ commit }, { tab, data }) {
       commit('UPDATE_SETTINGS', { tab, data })
diff --git a/src/store/modules/users.js b/src/store/modules/users.js
index ae5ed146ae674ec4be3d379bfd91558ffe87008a..0290b8881fcdbeda0236c9f53057eb6c44e2bcd7 100644
--- a/src/store/modules/users.js
+++ b/src/store/modules/users.js
@@ -1,3 +1,5 @@
+import { Message } from 'element-ui'
+import i18n from '@/lang'
 import {
   activateUsers,
   addRight,
@@ -78,8 +80,14 @@ const users = {
       commit('SWAP_USERS', updatedUsers)
 
       const usersNicknames = users.map(user => user.nickname)
-      await activateUsers(usersNicknames, getters.authHost, getters.token)
-      dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      try {
+        await activateUsers(usersNicknames, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      } finally {
+        dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      }
+      dispatch('SuccessMessage')
     },
     async AddRight({ commit, dispatch, getters, state }, { users, right }) {
       const updatedUsers = users.map(user => {
@@ -88,8 +96,14 @@ const users = {
       commit('SWAP_USERS', updatedUsers)
 
       const usersNicknames = users.map(user => user.nickname)
-      await addRight(usersNicknames, right, getters.authHost, getters.token)
-      dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      try {
+        await addRight(usersNicknames, right, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      } finally {
+        dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      }
+      dispatch('SuccessMessage')
     },
     async AddTag({ commit, dispatch, getters, state }, { users, tag }) {
       const updatedUsers = users.map(user => {
@@ -98,16 +112,28 @@ const users = {
       commit('SWAP_USERS', updatedUsers)
 
       const nicknames = users.map(user => user.nickname)
-      await tagUser(nicknames, [tag], getters.authHost, getters.token)
-      dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      try {
+        await tagUser(nicknames, [tag], getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      } finally {
+        dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      }
+      dispatch('SuccessMessage')
     },
     async ClearFilters({ commit, dispatch, state }) {
       commit('CLEAR_USERS_FILTERS')
       dispatch('SearchUsers', { query: state.searchQuery, page: 1 })
     },
     async CreateNewAccount({ dispatch, getters, state }, { nickname, email, password }) {
-      await createNewAccount(nickname, email, password, getters.authHost, getters.token)
-      dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      try {
+        await createNewAccount(nickname, email, password, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      } finally {
+        dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      }
+      dispatch('SuccessMessage')
     },
     async DeactivateUsers({ commit, dispatch, getters, state }, users) {
       const updatedUsers = users.map(user => {
@@ -116,8 +142,14 @@ const users = {
       commit('SWAP_USERS', updatedUsers)
 
       const usersNicknames = users.map(user => user.nickname)
-      await deactivateUsers(usersNicknames, getters.authHost, getters.token)
-      dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      try {
+        await deactivateUsers(usersNicknames, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      } finally {
+        dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      }
+      dispatch('SuccessMessage')
     },
     async DeleteRight({ commit, dispatch, getters, state }, { users, right }) {
       const updatedUsers = users.map(user => {
@@ -126,19 +158,26 @@ const users = {
       commit('SWAP_USERS', updatedUsers)
 
       const usersNicknames = users.map(user => user.nickname)
-      await deleteRight(usersNicknames, right, getters.authHost, getters.token)
-      dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      try {
+        await deleteRight(usersNicknames, right, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      } finally {
+        dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      }
+      dispatch('SuccessMessage')
     },
-    async DeleteUsers({ commit, getters, state }, users) {
+    async DeleteUsers({ commit, dispatch, getters, state }, users) {
+      const usersNicknames = users.map(user => user.nickname)
+      try {
+        await deleteUsers(usersNicknames, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      }
       const deletedUsersIds = users.map(deletedUser => deletedUser.id)
       const updatedUsers = state.fetchedUsers.filter(user => !deletedUsersIds.includes(user.id))
       commit('SET_USERS', updatedUsers)
-
-      const usersNicknames = users.map(user => user.nickname)
-      await deleteUsers(usersNicknames, getters.authHost, getters.token)
-    },
-    async RequirePasswordReset({ getters }, user) {
-      await requirePasswordReset(user.nickname, getters.authHost, getters.token)
+      dispatch('SuccessMessage')
     },
     async FetchUsers({ commit, dispatch, getters, state }, { page }) {
       commit('SET_LOADING', true)
@@ -161,8 +200,22 @@ const users = {
       commit('SWAP_USERS', updatedUsers)
 
       const nicknames = users.map(user => user.nickname)
-      await untagUser(nicknames, [tag], getters.authHost, getters.token)
-      dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      try {
+        await untagUser(nicknames, [tag], getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      } finally {
+        dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })
+      }
+      dispatch('SuccessMessage')
+    },
+    async RequirePasswordReset({ dispatch, getters }, user) {
+      try {
+        await requirePasswordReset(user.nickname, getters.authHost, getters.token)
+      } catch (_e) {
+        return
+      }
+      dispatch('SuccessMessage')
     },
     async SearchUsers({ commit, dispatch, state, getters }, { query, page }) {
       if (query.length === 0) {
@@ -178,6 +231,13 @@ const users = {
         loadUsers(commit, page, response.data)
       }
     },
+    SuccessMessage() {
+      return Message({
+        message: i18n.t('users.completed'),
+        type: 'success',
+        duration: 5 * 1000
+      })
+    },
     async ToggleUsersFilter({ commit, dispatch, state }, filters) {
       const defaultFilters = {
         local: false,
diff --git a/src/views/invites/index.vue b/src/views/invites/index.vue
index 783e897a6dea80660ce49f0e54f2a19e1baacd10..e8ca75fdea66aa9d81f277c9d02212e65cba7ea7 100644
--- a/src/views/invites/index.vue
+++ b/src/views/invites/index.vue
@@ -192,17 +192,8 @@ export default {
     async inviteUserViaEmail() {
       this.$refs['inviteUserForm'].validate(async(valid) => {
         if (valid) {
-          try {
-            await this.$store.dispatch('InviteUserViaEmail', this.$data.inviteUserForm)
-          } catch (_e) {
-            return
-          } finally {
-            this.closeDialogWindow()
-          }
-          this.$message({
-            type: 'success',
-            message: this.$t('invites.emailSent')
-          })
+          await this.$store.dispatch('InviteUserViaEmail', this.$data.inviteUserForm)
+          this.closeDialogWindow()
         } else {
           this.$message({
             type: 'error',
diff --git a/src/views/settings/components/ActivityPub.vue b/src/views/settings/components/ActivityPub.vue
index 903e34fe9ef7a0bcc5faab731a26bf5338cdacb4..2067be0ae918ffe2ce959dc0904eaae8e4512df3 100644
--- a/src/views/settings/components/ActivityPub.vue
+++ b/src/views/settings/components/ActivityPub.vue
@@ -37,7 +37,6 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import i18n from '@/lang'
 
 export default {
   name: 'ActivityPub',
@@ -57,16 +56,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Authentication.vue b/src/views/settings/components/Authentication.vue
index a20843276a796409b5db6c6b23b2cff866e7b743..da458d5c05cda313952a54c25532447d30c30277 100644
--- a/src/views/settings/components/Authentication.vue
+++ b/src/views/settings/components/Authentication.vue
@@ -232,7 +232,6 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import i18n from '@/lang'
 
 export default {
   name: 'Authentication',
@@ -259,16 +258,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/AutoLinker.vue b/src/views/settings/components/AutoLinker.vue
index e84f3394b72ba77f16f0ca9e0d72452a36cd8edd..0b151467becdbbf0d2cecb3f6ba8f82006479a23 100644
--- a/src/views/settings/components/AutoLinker.vue
+++ b/src/views/settings/components/AutoLinker.vue
@@ -52,7 +52,6 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import i18n from '@/lang'
 
 export default {
   name: 'AutoLinker',
@@ -107,16 +106,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Captcha.vue b/src/views/settings/components/Captcha.vue
index 4bff5c0bfa733588d05cc571a22c17339449d93a..bdd7ec9183e381ad103fe2e22e22b82c8fc1869a 100644
--- a/src/views/settings/components/Captcha.vue
+++ b/src/views/settings/components/Captcha.vue
@@ -33,7 +33,6 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import i18n from '@/lang'
 
 export default {
   name: 'Captcha',
@@ -53,16 +52,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Database.vue b/src/views/settings/components/Database.vue
index ab9d42a84bcc70ef45c8483e8511fcbe70255cb1..c0748f895118bdcc28bdd7e6d322be16edbd28f0 100644
--- a/src/views/settings/components/Database.vue
+++ b/src/views/settings/components/Database.vue
@@ -135,7 +135,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 
 export default {
@@ -157,16 +156,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Endpoint.vue b/src/views/settings/components/Endpoint.vue
index aa1f661a3b39bd051ece01bb85a5e86ff315c24f..4cfd5bde713a6c00d50b4f0f53df12021d3ca340 100644
--- a/src/views/settings/components/Endpoint.vue
+++ b/src/views/settings/components/Endpoint.vue
@@ -172,7 +172,6 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import i18n from '@/lang'
 import { options } from './options'
 import AceEditor from 'vue2-ace-editor'
 import 'brace/mode/elixir'
@@ -246,16 +245,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Esshd.vue b/src/views/settings/components/Esshd.vue
index 512ca7a4abc25a9ec1132669685f5d660200a3b8..ded2cec80d0d329e7f0dd77d94771d8014b93185 100644
--- a/src/views/settings/components/Esshd.vue
+++ b/src/views/settings/components/Esshd.vue
@@ -55,7 +55,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 
 export default {
@@ -82,16 +81,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Frontend.vue b/src/views/settings/components/Frontend.vue
index eac9b478da60a6f43012be67d2e26e1ee59f88a2..6282384bcfe708f0b3fd0a2624d6c361d6597749 100644
--- a/src/views/settings/components/Frontend.vue
+++ b/src/views/settings/components/Frontend.vue
@@ -318,7 +318,6 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import i18n from '@/lang'
 import { options } from './options'
 
 export default {
@@ -419,16 +418,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Gopher.vue b/src/views/settings/components/Gopher.vue
index b4f0b2d4149df380bd274763c8ed75b498bd1f1b..a173ba9613fddb2f654bb475b071487404d8a61f 100644
--- a/src/views/settings/components/Gopher.vue
+++ b/src/views/settings/components/Gopher.vue
@@ -23,7 +23,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 
 export default {
@@ -43,16 +42,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Http.vue b/src/views/settings/components/Http.vue
index 08e8da7c641ee57806633481e7736ca1a8c1c941..f6c6631157a552029128f71e04f11e9fa0d1fb0c 100644
--- a/src/views/settings/components/Http.vue
+++ b/src/views/settings/components/Http.vue
@@ -129,7 +129,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 
 export default {
@@ -161,16 +160,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Instance.vue b/src/views/settings/components/Instance.vue
index 05539e1366653def9263ad779b226dafeb93d756..feab359700d88efddceee82ef3a4a89654135556 100644
--- a/src/views/settings/components/Instance.vue
+++ b/src/views/settings/components/Instance.vue
@@ -337,7 +337,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 import { options } from './options'
 
@@ -396,16 +395,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/JobQueue.vue b/src/views/settings/components/JobQueue.vue
index f18cc853adccf38411dc08a47ef049d72fc7c125..a8fe0c77de67bf530beba887f21ee2862099d67a 100644
--- a/src/views/settings/components/JobQueue.vue
+++ b/src/views/settings/components/JobQueue.vue
@@ -51,7 +51,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 
 export default {
@@ -72,16 +71,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Logger.vue b/src/views/settings/components/Logger.vue
index a58c286ccf7b545357d41d77ddde87c78a427e3c..6be523f587931c1fac8c59274b5fcd28f0f7bade 100644
--- a/src/views/settings/components/Logger.vue
+++ b/src/views/settings/components/Logger.vue
@@ -173,7 +173,6 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import i18n from '@/lang'
 import { options } from './options'
 
 export default {
@@ -212,16 +211,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/MRF.vue b/src/views/settings/components/MRF.vue
index 043f3b7dda8f8edc8a391ffb7c41eb60c40ee249..fd581e97d69eecb73353360a8449506210862dee 100644
--- a/src/views/settings/components/MRF.vue
+++ b/src/views/settings/components/MRF.vue
@@ -145,7 +145,6 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import i18n from '@/lang'
 import { options } from './options'
 
 export default {
@@ -257,16 +256,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Mailer.vue b/src/views/settings/components/Mailer.vue
index 8797981588c92c81ecf9ef3138dcf2b85525845c..fde1149205b9f150c542bf7b16bae13cb7b274b3 100644
--- a/src/views/settings/components/Mailer.vue
+++ b/src/views/settings/components/Mailer.vue
@@ -202,7 +202,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 import { options } from './options'
 import AceEditor from 'vue2-ace-editor'
@@ -249,16 +248,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/MediaProxy.vue b/src/views/settings/components/MediaProxy.vue
index 0c0a73a8293483e90fabf3062d4dfacfaa6c6692..86d7a2353e0378556f92858d7ba1eb409bc5a438 100644
--- a/src/views/settings/components/MediaProxy.vue
+++ b/src/views/settings/components/MediaProxy.vue
@@ -75,7 +75,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 import { options } from './options'
 
@@ -126,16 +125,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Metadata.vue b/src/views/settings/components/Metadata.vue
index 2f63ddd052a889ab82e4b53cacaadf6481e10e32..7631fe2e6b45ba75de761a04de1c65d7ef6fd017 100644
--- a/src/views/settings/components/Metadata.vue
+++ b/src/views/settings/components/Metadata.vue
@@ -52,7 +52,6 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import i18n from '@/lang'
 
 export default {
   name: 'Metadata',
@@ -72,16 +71,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Other.vue b/src/views/settings/components/Other.vue
index 99ab16ff48c7e227df1f0f3540c5477f86599cd2..c285309b5084462001053adec9d1e69734516bfc 100644
--- a/src/views/settings/components/Other.vue
+++ b/src/views/settings/components/Other.vue
@@ -30,7 +30,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 
 export default {
@@ -65,16 +64,8 @@ export default {
       }, {})
       this.updateSetting(updatedValue, 'types', 'value')
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     },
     parseMimeTypes(value, inputType, index) {
       const updatedValue = this.mimeTypes.reduce((acc, el, i) => {
diff --git a/src/views/settings/components/RateLimiters.vue b/src/views/settings/components/RateLimiters.vue
index 491ad51bd3065ea6866790e9d036004bef211175..943d977460e4340b77ad58c36380bb974d90b25e 100644
--- a/src/views/settings/components/RateLimiters.vue
+++ b/src/views/settings/components/RateLimiters.vue
@@ -223,7 +223,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 
 export default {
@@ -379,16 +378,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/Relays.vue b/src/views/settings/components/Relays.vue
index ef9264b4acc10db9535cba900f26b9de82bc97a4..18db6f5ba4bea8c7ab7a027e9df11041e97efc97 100644
--- a/src/views/settings/components/Relays.vue
+++ b/src/views/settings/components/Relays.vue
@@ -52,22 +52,10 @@ export default {
   },
   methods: {
     followRelay() {
-      try {
-        this.$store.dispatch('AddRelay', this.newRelay)
-      } catch (_e) {
-        return
-      } finally {
-        this.$store.dispatch('FetchRelays')
-      }
+      this.$store.dispatch('AddRelay', this.newRelay)
     },
     deleteRelay(relay) {
-      try {
-        this.$store.dispatch('DeleteRelay', relay)
-      } catch (_e) {
-        return
-      } finally {
-        this.$store.dispatch('FetchRelays')
-      }
+      this.$store.dispatch('DeleteRelay', relay)
     }
   }
 }
diff --git a/src/views/settings/components/Upload.vue b/src/views/settings/components/Upload.vue
index 776c9ed6a5b09b284cb922e6914836e588fc28f8..f9cffe33a8fcf1a4782d90c0b28fb5cce1e6fd88 100644
--- a/src/views/settings/components/Upload.vue
+++ b/src/views/settings/components/Upload.vue
@@ -144,7 +144,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 import { options } from './options'
 
@@ -207,16 +206,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/settings/components/WebPush.vue b/src/views/settings/components/WebPush.vue
index 7dbe87ea7f8c66c87a3f9943dffabe189aee1b6a..4e5a45b7fff5073d56d682398f2ec204f204af9b 100644
--- a/src/views/settings/components/WebPush.vue
+++ b/src/views/settings/components/WebPush.vue
@@ -21,7 +21,6 @@
 </template>
 
 <script>
-import i18n from '@/lang'
 import { mapGetters } from 'vuex'
 
 export default {
@@ -41,16 +40,8 @@ export default {
     updateSetting(value, tab, input) {
       this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
     },
-    async onSubmit() {
-      try {
-        await this.$store.dispatch('SubmitChanges')
-      } catch (e) {
-        return
-      }
-      this.$message({
-        type: 'success',
-        message: i18n.t('settings.success')
-      })
+    onSubmit() {
+      this.$store.dispatch('SubmitChanges')
     }
   }
 }
diff --git a/src/views/users/components/MultipleUsersMenu.vue b/src/views/users/components/MultipleUsersMenu.vue
index 53f778b8855d56d4620026345138bc1c7402d202..f3be52cf859a6de49a569ff7dcc0336c41f34144 100644
--- a/src/views/users/components/MultipleUsersMenu.vue
+++ b/src/views/users/components/MultipleUsersMenu.vue
@@ -151,16 +151,7 @@ export default {
   methods: {
     mappers() {
       const applyAction = async(users, dispatchAction) => {
-        try {
-          await dispatchAction(users)
-        } catch (err) {
-          console.log(err)
-          return
-        }
-        this.$message({
-          type: 'success',
-          message: this.$t('users.completed')
-        })
+        await dispatchAction(users)
         this.$emit('apply-action')
       }
       return {
@@ -215,7 +206,9 @@ export default {
           applyAction(filtered, removeTagFn)
         },
         requirePasswordReset: () => {
-          this.selectedUsers.map(user => this.$store.dispatch('RequirePasswordReset', user))
+          const filtered = this.selectedUsers.filter(user => user.local)
+          filtered.map(user => this.$store.dispatch('RequirePasswordReset', user))
+          this.$emit('apply-action')
         }
       }
     },
diff --git a/src/views/users/index.vue b/src/views/users/index.vue
index 9e5928465226623354402a7624096fcad7bb28b7..4e67ee70fc5caa681ddd5be45afed256d526e631 100644
--- a/src/views/users/index.vue
+++ b/src/views/users/index.vue
@@ -245,17 +245,8 @@ export default {
       this.$refs.usersTable.clearSelection()
     },
     async createNewAccount(accountData) {
-      try {
-        await this.$store.dispatch('CreateNewAccount', accountData)
-      } catch (_e) {
-        return
-      } finally {
-        this.createAccountDialogOpen = false
-      }
-      this.$message({
-        type: 'success',
-        message: this.$t('users.accountCreated')
-      })
+      await this.$store.dispatch('CreateNewAccount', accountData)
+      this.createAccountDialogOpen = false
     },
     getFirstLetter(str) {
       return str.charAt(0).toUpperCase()