diff --git a/src/api/settings.js b/src/api/settings.js
index 61c9523e0e8aac84fa5c5cbd3f2cc90e8ed75704..f07ece4d4c7c491f62d84a564cab2def4f965a66 100644
--- a/src/api/settings.js
+++ b/src/api/settings.js
@@ -1,6 +1,7 @@
 import request from '@/utils/request'
 import { getToken } from '@/utils/auth'
 import { baseName } from './utils'
+import _ from 'lodash'
 
 export async function deleteInstanceDocument(name, authHost, token) {
   return await request({
@@ -78,12 +79,13 @@ export async function fetchFrontends(authHost, token) {
 }
 
 export async function installFrontend(data, authHost, token) {
+  const filteredData = _.pickBy(data)
   return await request({
     baseURL: baseName(authHost),
     url: `/api/pleroma/admin/frontends/install`,
     method: 'post',
     headers: authHeaders(token),
-    data
+    data: filteredData
   })
 }
 
diff --git a/src/lang/en.js b/src/lang/en.js
index f193abaf31b80893e79569ffc470bdbe76ba5b32..61a66edaf2abfae16224424c45b0bd4882703a8c 100644
--- a/src/lang/en.js
+++ b/src/lang/en.js
@@ -473,8 +473,9 @@ export default {
     ref: 'Ref',
     file: 'File',
     buildUrl: 'Build URL',
-    buildDir: 'Build Directory'
-
+    buildDir: 'Build Directory',
+    frontendSuccess: 'Frontend installed successfully!',
+    frontendStartedInstallation: 'Installation started'
   },
   invites: {
     inviteTokens: 'Invite tokens',
diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js
index 05b3084e7cee6d9a800ca21879260d41c4a54abe..a36f6eda85a307c4fd1999a91203766e92f7521b 100644
--- a/src/store/modules/settings.js
+++ b/src/store/modules/settings.js
@@ -10,6 +10,8 @@ import {
   updateSettings } from '@/api/settings'
 import { formSearchObject, parseNonTuples, parseTuples, valueHasTuples, wrapUpdatedSettings } from './normalizers'
 import _ from 'lodash'
+import { Message } from 'element-ui'
+import i18n from '@/lang'
 
 const settings = {
   state: {
@@ -122,11 +124,18 @@ const settings = {
       commit('TOGGLE_TABS', false)
       commit('SET_LOADING', false)
     },
-    async InstallFrontend({ commit, getters }, { name, _ref, _file, _buildUrl, _buildDir }) {
-      const { data } = _ref
-        ? await installFrontend({ name, ref: _ref, file: _file, build_url: _buildUrl, build_dir: _buildDir }, getters.authHost, getters.token)
-        : await installFrontend({ name }, getters.authHost, getters.token)
-      commit('SET_FRONTENDS', data)
+    async InstallFrontend({ commit, getters }, { name, ref, file, buildUrl, buildDir }) {
+      try {
+        const { data } = await installFrontend({ name, ref, file, build_url: buildUrl, build_dir: buildDir }, getters.authHost, getters.token)
+        commit('SET_FRONTENDS', data)
+      } catch (_e) {
+        return
+      }
+      Message({
+        message: i18n.t('settings.frontendSuccess'),
+        type: 'success',
+        duration: 5 * 1000
+      })
     },
     async RemoveInstanceDocument({ dispatch, getters }, name) {
       await deleteInstanceDocument(name, getters.authHost, getters.token)
diff --git a/src/views/settings/components/Frontend.vue b/src/views/settings/components/Frontend.vue
index 26f1e2f0b253554d34dadfb26dde8b37df2bf3b3..f74b1e5b05eccc7068d84c01c9e395cd980ef5e1 100644
--- a/src/views/settings/components/Frontend.vue
+++ b/src/views/settings/components/Frontend.vue
@@ -45,8 +45,8 @@
             @click="toggleFrontendInput"/>
           <span class="icons-button-desc">{{ $t('settings.installAnotherFrontend') }}</span>
         </div>
-        <el-form v-if="frontendInputOpen" :model="frontendFormData" label-width="120px">
-          <el-form-item :label="$t('settings.name')" class="frontend-form-input">
+        <el-form v-if="frontendInputOpen" ref="frontendFormData" :rules="rules" :model="frontendFormData" label-width="130px">
+          <el-form-item :label="$t('settings.name')" class="frontend-form-input" prop="name">
             <el-input v-model="frontendFormData.name"/>
           </el-form-item>
           <el-form-item :label="$t('settings.ref')" class="frontend-form-input">
@@ -123,6 +123,9 @@ export default {
         file: '',
         buildUrl: '',
         buildDir: ''
+      },
+      rules: {
+        name: { required: true, message: 'Please input Name', trigger: 'blur' }
       }
     }
   },
@@ -214,10 +217,39 @@ export default {
   },
   methods: {
     installFrontend({ name }) {
-      this.$store.dispatch('InstallFrontend', { name })
+      try {
+        this.$store.dispatch('InstallFrontend', { name })
+        this.$message({
+          type: 'success',
+          message: i18n.t('settings.frontendStartedInstallation')
+        })
+      } catch (e) {
+        return
+      }
     },
     installNewFrontend() {
-
+      try {
+        this.$refs['frontendFormData'].validate((valid) => {
+          if (valid) {
+            this.$store.dispatch('InstallFrontend', this.frontendFormData)
+            this.frontendFormData = {
+              name: '',
+              ref: '',
+              file: '',
+              buildUrl: '',
+              buildDir: ''
+            }
+            this.$message({
+              type: 'success',
+              message: i18n.t('settings.frontendStartedInstallation')
+            })
+          } else {
+            return false
+          }
+        })
+      } catch (e) {
+        return
+      }
     },
     async onSubmit() {
       try {
diff --git a/src/views/settings/styles/main.scss b/src/views/settings/styles/main.scss
index e85113be5b25b8500ab3ebd80cfb33ab217621cb..2ab89f69a9c4ab8b6499b8e1c2911f7b82b801d7 100644
--- a/src/views/settings/styles/main.scss
+++ b/src/views/settings/styles/main.scss
@@ -79,7 +79,7 @@
     margin-right: 30px;
   }
   .frontend-form-input {
-    margin-top: 15px;
+    margin-top: 20px;
   }
   .frontends-button-container {
     width: 100%;