diff --git a/src/views/settings/components/AutoLinker.vue b/src/views/settings/components/AutoLinker.vue
index ca88daf2283ed7157a38e68a498a51919cfd02dc..138c6646f6255ef8a33cab2c66601960b23fdc53 100644
--- a/src/views/settings/components/AutoLinker.vue
+++ b/src/views/settings/components/AutoLinker.vue
@@ -1,49 +1,6 @@
 <template>
-  <el-form v-if="!loading" ref="autoLinker" :model="autoLinker" :label-width="labelWidth">
-    <el-form-item label="Class">
-      <el-switch :value="booleanClass" @change="processTwoTypeValue($event, 'auto_linker', 'opts', 'class')"/>
-      <p v-if="!booleanClass" class="expl">Specify the class to be added to the generated link. False to clear.</p>
-    </el-form-item>
-    <el-form-item v-if="booleanClass">
-      <el-input :value="getStringValue('class')" @input="processTwoTypeValue($event, 'auto_linker', 'opts', 'class')"/>
-      <p class="expl">Specify the class to be added to the generated link. False to clear.</p>
-    </el-form-item>
-    <el-form-item label="Rel">
-      <el-switch :value="booleanRel" @change="processTwoTypeValue($event, 'auto_linker', 'opts', 'rel')"/>
-      <p v-if="!booleanRel" class="expl">Override the rel attribute. False to clear</p>
-    </el-form-item>
-    <el-form-item v-if="booleanRel">
-      <el-input :value="getStringValue('rel')" @input="processTwoTypeValue($event, 'auto_linker', 'opts', 'rel')"/>
-      <p class="expl">Override the rel attribute. False to clear</p>
-    </el-form-item>
-    <el-form-item label="New window">
-      <el-switch :value="autoLinker.opts.new_window" @change="processNestedData($event, 'auto_linker', 'opts', 'new_window')"/>
-      <p class="expl">Set to false to remove <span class="code">target='_blank'</span> attribute</p>
-    </el-form-item>
-    <el-form-item label="Scheme">
-      <el-switch :value="autoLinker.opts.scheme" @change="processNestedData($event, 'auto_linker', 'opts', 'scheme')"/>
-      <p class="expl">Set to true to link urls with schema <span class="code">http://google.com</span></p>
-    </el-form-item>
-    <el-form-item label="Truncate">
-      <el-switch :value="booleanTruncate" @change="processTwoTypeValue($event, 'auto_linker', 'opts', 'truncate')"/>
-      <p v-if="!booleanTruncate" class="expl">Set to a number to truncate urls longer then the number.
-      Truncated urls will end in <span class="code">..</span></p>
-    </el-form-item>
-    <el-form-item v-if="booleanTruncate">
-      <el-input-number :value="getStringValue('truncate')" :step="1" :min="0" size="large" @change="processTwoTypeValue($event, 'auto_linker', 'opts', 'truncate')"/>
-      <p class="expl">Specify the class to be added to the generated link. False to clear.</p>
-    </el-form-item>
-    <el-form-item label="Strip prefix">
-      <el-switch :value="autoLinker.opts.strip_prefix" @change="processNestedData($event, 'auto_linker', 'opts', 'strip_prefix')"/>
-      <p class="expl">Strip the scheme prefix</p>
-    </el-form-item>
-    <el-form-item label="Extra">
-      <el-switch :value="autoLinker.opts.extra" @change="processNestedData($event, 'auto_linker', 'opts', 'extra')"/>
-      <p class="expl">Link urls with rarely used schemes (magnet, ipfs, irc, etc.)</p>
-    </el-form-item>
-    <el-form-item label="Validate TLD">
-      <el-switch :value="autoLinker.opts.validate_tld" @change="processNestedData($event, 'auto_linker', 'opts', 'validate_tld')"/>
-    </el-form-item>
+  <el-form v-if="!loading" ref="autoLinker" :model="autoLinkerData" :label-width="labelWidth">
+    <setting :setting-group="autoLinker" :data="autoLinkerData"/>
     <el-form-item>
       <el-button type="primary" @click="onSubmit">Submit</el-button>
     </el-form-item>
@@ -53,13 +10,21 @@
 <script>
 import { mapGetters } from 'vuex'
 import i18n from '@/lang'
+import Setting from './Setting'
 
 export default {
   name: 'AutoLinker',
+  components: { Setting },
   computed: {
     ...mapGetters([
-      'autoLinker'
+      'settings'
     ]),
+    autoLinker() {
+      return this.settings.description.find(setting => setting.key === ':opts')
+    },
+    autoLinkerData() {
+      return this.settings.settings.auto_linker[':opts']
+    },
     isMobile() {
       return this.$store.state.app.device === 'mobile'
     },
@@ -67,46 +32,10 @@ export default {
       return this.isMobile ? '100px' : '240px'
     },
     loading() {
-      return this.$store.state.settings.loading
-    },
-    booleanClass() {
-      return this.getBooleanValue('class')
-    },
-    booleanRel() {
-      return this.getBooleanValue('rel')
-    },
-    booleanTruncate() {
-      return this.getBooleanValue('truncate')
+      return this.settings.loading
     }
   },
   methods: {
-    getBooleanValue(name) {
-      const value = this.autoLinker.opts[name]
-      return typeof value === 'string' || typeof value === 'number'
-    },
-    getNumValue(name) {
-      const value = this.autoLinker.opts[name]
-      return value || 0
-    },
-    getStringValue(name) {
-      const value = this.autoLinker.opts[name]
-      return value || ''
-    },
-    processTwoTypeValue(value, tab, inputName, childName) {
-      if (value === true) {
-        const data = childName === 'truncate' ? 0 : ''
-        this.processNestedData(data, tab, inputName, childName)
-      } else {
-        this.processNestedData(value, tab, inputName, childName)
-      }
-    },
-    processNestedData(value, tab, inputName, childName) {
-      const updatedValue = { ...this.$store.state.settings.settings[tab][inputName], ...{ [childName]: value }}
-      this.updateSetting(updatedValue, tab, inputName)
-    },
-    updateSetting(value, tab, input) {
-      this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
-    },
     async onSubmit() {
       try {
         await this.$store.dispatch('SubmitChanges')
diff --git a/src/views/settings/components/Inputs.vue b/src/views/settings/components/Inputs.vue
index ed3b540c359fdcdb7663631bbd12da54344bf508..f2d6f7c4695b3379880ef0390b1c64dc60dc070d 100644
--- a/src/views/settings/components/Inputs.vue
+++ b/src/views/settings/components/Inputs.vue
@@ -148,6 +148,14 @@
         class="value-input"
         @input="updateSetting($event, settingGroup.key, setting.key)"/>
     </div>
+    <div v-if="settingGroup.group === ':auto_linker' && (setting.key === ':class' || setting.key === ':rel')">
+      <el-switch :value="autoLinkerBooleanValue(setting.key)" @change="processAutoLinker($event, 'auto_linker', 'opts', 'class')"/>
+      <el-input v-if="autoLinkerBooleanValue(setting.key)" :value="autoLinkerStringValue(setting.key)" @input="processAutoLinker($event, settingGroup.key, ':opts', setting.key)"/>
+    </div>
+    <div v-if="settingGroup.group === ':auto_linker' && (setting.key === ':truncate')">
+      <el-switch :value="autoLinkerBooleanValue(setting.key)" @change="processAutoLinker($event, 'auto_linker', 'opts', 'class')"/>
+      <el-input-number v-if="autoLinkerBooleanValue(setting.key)" :value="autoLinkerIntegerValue(setting.key)" @input="processAutoLinker($event, settingGroup.key, ':opts', setting.key)"/>
+    </div>
     <p class="expl">{{ setting.description }}</p>
   </el-form-item>
 </template>
@@ -246,6 +254,18 @@ export default {
       }, {})
       this.updateSetting({ ...updatedValue, '': [] }, this.settingGroup.key, this.setting.key)
     },
+    autoLinkerBooleanValue(key) {
+      const value = this.data[this.setting.key]
+      return typeof value === 'string' || typeof value === 'number'
+    },
+    autoLinkerIntegerValue(key) {
+      const value = this.data[this.setting.key]
+      return value || 0
+    },
+    autoLinkerStringValue(key) {
+      const value = this.data[this.setting.key]
+      return value || ''
+    },
     deleteEditableKeywordRow(index) {
       const filteredValues = this.editableKeywordData(this.data).filter((el, i) => index !== i)
       const updatedValue = filteredValues.reduce((acc, el, i) => {
@@ -295,6 +315,8 @@ export default {
         this.updateSetting(valueToSend, 'rate_limit', input)
       }
     },
+    processAutoLinker(value, tab, inputName, childName) {
+    },
     processNestedData(value, tab, inputName, childName) {
       const updatedValue = { ...this.$store.state.settings.settings[tab][inputName], ...{ [childName]: value }}
       this.updateSetting(updatedValue, tab, inputName)