diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/SettingsModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/SettingsModule.kt
index 0441232d688cfd7e71dacdcffc9d7e56ea7085ff..e2fae088eb573b4cda714437c8828d9679733bb7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/SettingsModule.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/SettingsModule.kt
@@ -5,6 +5,7 @@ import dagger.Module
 import dagger.Provides
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.settings.AppearanceSettings
+import de.kuschku.quasseldroid.settings.AutoCompleteSettings
 import de.kuschku.quasseldroid.settings.BacklogSettings
 import de.kuschku.quasseldroid.settings.ConnectionSettings
 import de.kuschku.quasseldroid.util.helper.sharedPreferences
@@ -58,10 +59,6 @@ class SettingsModule {
         context.getString(R.string.preference_colorize_mirc_key),
         AppearanceSettings.DEFAULT.colorizeMirc
       ),
-      showAutocomplete = getBoolean(
-        context.getString(R.string.preference_autocomplete_key),
-        AppearanceSettings.DEFAULT.showAutocomplete
-      ),
       showHostmask = getBoolean(
         context.getString(R.string.preference_hostmask_key),
         AppearanceSettings.DEFAULT.showHostmask
@@ -73,6 +70,28 @@ class SettingsModule {
     )
   }
 
+  @Provides
+  fun provideAutoCompleteSettings(context: Context) = context.sharedPreferences {
+    AutoCompleteSettings(
+      button = getBoolean(
+        context.getString(R.string.preference_autocomplete_button_key),
+        AutoCompleteSettings.DEFAULT.button
+      ),
+      doubleTap = getBoolean(
+        context.getString(R.string.preference_autocomplete_doubletap_key),
+        AutoCompleteSettings.DEFAULT.button
+      ),
+      auto = getBoolean(
+        context.getString(R.string.preference_autocomplete_auto_key),
+        AutoCompleteSettings.DEFAULT.button
+      ),
+      prefix = getBoolean(
+        context.getString(R.string.preference_autocomplete_prefix_key),
+        AutoCompleteSettings.DEFAULT.button
+      )
+    )
+  }
+
   @Provides
   fun provideBacklogSettings(context: Context) = context.sharedPreferences {
     BacklogSettings(
diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt
index 31b2c0e941e1192fcd5fcb0fcec7bd77c30f94ea..4589a3a95267c4f65bb25b685da48032870af3dc 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt
@@ -12,7 +12,6 @@ data class AppearanceSettings(
   val textSize: Int = 14,
   val showSeconds: Boolean = false,
   val use24hClock: Boolean = true,
-  val showAutocomplete: Boolean = true,
   val showHostmask: Boolean = false,
   val showLag: Boolean = true,
   val theme: Theme = Theme.QUASSEL_LIGHT
diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/AutoCompleteSettings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/AutoCompleteSettings.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f66f35a67ad4150bde8a666702266f29c3e1c468
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/AutoCompleteSettings.kt
@@ -0,0 +1,12 @@
+package de.kuschku.quasseldroid.settings
+
+data class AutoCompleteSettings(
+  val button: Boolean = false,
+  val doubleTap: Boolean = true,
+  val auto: Boolean = true,
+  val prefix: Boolean = true
+) {
+  companion object {
+    val DEFAULT = AutoCompleteSettings()
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
index 926e270e395041a3c658713eff5044473730e01e..2bb8a0cc7c9b6949a766a3dd1392ae4c10bc3694 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
@@ -52,10 +52,6 @@ object Settings {
         context.getString(R.string.preference_colorize_mirc_key),
         AppearanceSettings.DEFAULT.colorizeMirc
       ),
-      showAutocomplete = getBoolean(
-        context.getString(R.string.preference_autocomplete_key),
-        AppearanceSettings.DEFAULT.showAutocomplete
-      ),
       showHostmask = getBoolean(
         context.getString(R.string.preference_hostmask_key),
         AppearanceSettings.DEFAULT.showHostmask
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index cf6d3b697d776995505610b31cc8bd27e5d9d060..7f74e4e0745f74f1a7833940ac1209a5d5da9b05 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -118,6 +118,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
       findViewById(R.id.formatting_menu),
       findViewById(R.id.formatting_toolbar),
       appearanceSettings,
+      autoCompleteSettings,
       { lines ->
         viewModel.session { sessionOptional ->
           val session = sessionOptional.orNull()
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt
index 96884a00436a1fb27f2b18f534ae0f50cdbff106..aae660e5f3a3fda9939f9229496154e6c185c681 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt
@@ -7,11 +7,14 @@ import android.support.v7.widget.*
 import android.text.Editable
 import android.text.InputType
 import android.text.TextWatcher
+import android.view.GestureDetector
 import android.view.KeyEvent
 import android.view.MenuItem
+import android.view.MotionEvent
 import android.view.inputmethod.EditorInfo
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.settings.AppearanceSettings
+import de.kuschku.quasseldroid.settings.AutoCompleteSettings
 import de.kuschku.quasseldroid.ui.chat.ChatActivity
 import de.kuschku.quasseldroid.util.helper.lastWordIndices
 import de.kuschku.quasseldroid.util.helper.lineSequence
@@ -34,6 +37,7 @@ class Editor(
   formattingToolbar: Toolbar,
   // Settings
   private val appearanceSettings: AppearanceSettings,
+  private val autoCompleteSettings: AutoCompleteSettings,
   // Listeners
   private val sendCallback: (Sequence<Pair<CharSequence, String>>) -> Unit,
   private val panelStateCallback: (Boolean) -> Unit
@@ -116,7 +120,6 @@ class Editor(
 
     chatline.addTextChangedListener(textWatcher)
 
-
     val autocompleteAdapter = AutoCompleteAdapter(
       // This is still broken when mixing tab complete and UI auto complete
       formatHandler::autoComplete
@@ -124,12 +127,13 @@ class Editor(
 
     autoCompleteData.observe(activity, Observer {
       val query = it?.first ?: ""
-      val list = if (query.length >= 3) it?.second.orEmpty() else emptyList()
-
-      autocompleteAdapter.submitList(list)
+      val shouldShowResults = (autoCompleteSettings.auto && query.length >= 3) ||
+                              (autoCompleteSettings.prefix && query.startsWith('@')) ||
+                              (autoCompleteSettings.prefix && query.startsWith('#'))
+      autocompleteAdapter.submitList(if (shouldShowResults) it?.second.orEmpty() else emptyList())
     })
 
-    if (appearanceSettings.showAutocomplete) {
+    if (autoCompleteSettings.prefix || autoCompleteSettings.auto) {
       for (autoCompleteList in autoCompleteLists) {
         autoCompleteList.layoutManager = LinearLayoutManager(activity)
         autoCompleteList.itemAnimator = DefaultItemAnimator()
@@ -137,6 +141,23 @@ class Editor(
       }
     }
 
+    if (autoCompleteSettings.doubleTap) {
+      val gestureDetector = GestureDetector(
+        chatline.context, object : GestureDetector.SimpleOnGestureListener() {
+        override fun onDoubleTap(e: MotionEvent?): Boolean {
+          autoComplete()
+          return true
+        }
+
+        override fun onDoubleTapEvent(e: MotionEvent?): Boolean {
+          return true
+        }
+      })
+      chatline.setOnTouchListener { _, event ->
+        gestureDetector.onTouchEvent(event)
+      }
+    }
+
     lastWordContainer.onNext(lastWord)
 
     activity.menuInflater.inflate(formatHandler.menu, formattingMenu.menu)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt
index e1656a01e3534fc4d7b97d22da29f67191b0ff53..bce5465b27c99e74b7a82bd598064036714f10dd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/FormatHandler.kt
@@ -19,7 +19,9 @@ import de.kuschku.quasseldroid.util.helper.selection
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer
 import de.kuschku.quasseldroid.util.irc.format.spans.*
 
-class FormatHandler(private val editText: EditText) {
+class FormatHandler(
+  private val editText: EditText
+) {
   private val serializer = IrcFormatSerializer(editText.context)
   val formattedText: Sequence<String>
     get() = editText.text.lineSequence().map { serializer.toEscapeCodes(SpannableString(it)) }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt
index 4c0283e63b8b4e9d9729864dca78e06bc24d96c4..e620847e62132d54d61a16fec2b5ec7a7f733300 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt
@@ -19,6 +19,7 @@ import de.kuschku.libquassel.util.Optional
 import de.kuschku.quasseldroid.Keys
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.settings.AppearanceSettings
+import de.kuschku.quasseldroid.settings.AutoCompleteSettings
 import de.kuschku.quasseldroid.settings.ConnectionSettings
 import de.kuschku.quasseldroid.settings.Settings
 import de.kuschku.quasseldroid.ui.setup.accounts.selection.AccountSelectionActivity
@@ -70,6 +71,9 @@ abstract class ServiceBoundActivity : AppCompatActivity(),
   @Inject
   lateinit var appearanceSettings: AppearanceSettings
 
+  @Inject
+  lateinit var autoCompleteSettings: AutoCompleteSettings
+
   @Inject
   lateinit var connectionSettings: ConnectionSettings
 
diff --git a/app/src/main/res/values-de/strings_preferences.xml b/app/src/main/res/values-de/strings_preferences.xml
index e10cb54069ba5869d44656338533fd552293dac1..18dcf1f24f14fed5d6dfbb491e9f2cdf402f4f02 100644
--- a/app/src/main/res/values-de/strings_preferences.xml
+++ b/app/src/main/res/values-de/strings_preferences.xml
@@ -37,7 +37,19 @@
   <string name="preference_input_enter_entry_emoji">Emoji-Auswahl</string>
   <string name="preference_input_enter_entry_send">Senden</string>
 
-  <string name="preference_autocomplete_title">Autovervollständigungs-UI</string>
+  <string name="preference_autocomplete_title">Autovervollständigung</string>
+
+  <string name="preference_autocomplete_button_title">Autovervollständigungsknopf</string>
+  <string name="preference_autocomplete_button_summary">Zeigt einen Knopf um Namen und Chats zu vervollständigen</string>
+
+  <string name="preference_autocomplete_doubletap_title">Doppelclick-Autocomplete</string>
+  <string name="preference_autocomplete_doubletap_summary">Vervollständigt Namen und Chats automatisch, wenn auf das Eingabefeld doppelgeklickt wird</string>
+
+  <string name="preference_autocomplete_auto_title">Automatisch anzeigen</string>
+  <string name="preference_autocomplete_auto_summary">Vervollständigt Namen und Chats automatischen nach den ersten 3 Buchstaben</string>
+
+  <string name="preference_autocomplete_prefix_title">Nach Präfix anzeigen</string>
+  <string name="preference_autocomplete_prefix_summary">Vervollständigt Namen und Chats automatisch nach einem @ oder #</string>
 
   <string name="preference_hostmask_title">Hostmaske</string>
   <string name="preference_hostmask_summary">Zeigt die gesame Spitzname!Ident@Host Information an</string>
diff --git a/app/src/main/res/values/strings_preferences.xml b/app/src/main/res/values/strings_preferences.xml
index 8993c6ae33ec996949ac8a407125fdd0bda6de28..66e6c5b1eda65a4a47324db79ced2960d6f2247d 100644
--- a/app/src/main/res/values/strings_preferences.xml
+++ b/app/src/main/res/values/strings_preferences.xml
@@ -92,8 +92,23 @@
     <item>SEND</item>
   </string-array>
 
-  <string name="preference_autocomplete_key" translatable="false">autocomplete</string>
-  <string name="preference_autocomplete_title">Show AutoComplete UI</string>
+  <string name="preference_autocomplete_title">Autocomplete</string>
+
+  <string name="preference_autocomplete_button_key" translatable="false">autocomplete_button</string>
+  <string name="preference_autocomplete_button_title">Autocomplete Button</string>
+  <string name="preference_autocomplete_button_summary">Shows a button on the left of the input line that triggers tabcomplete</string>
+
+  <string name="preference_autocomplete_doubletap_key" translatable="false">autocomplete_doubletap</string>
+  <string name="preference_autocomplete_doubletap_title">Double tap to autocomplete</string>
+  <string name="preference_autocomplete_doubletap_summary">Suggest nicks and channels after doubleclicking on the input field</string>
+
+  <string name="preference_autocomplete_auto_key" translatable="false">autocomplete_auto</string>
+  <string name="preference_autocomplete_auto_title">Show automatically</string>
+  <string name="preference_autocomplete_auto_summary">Suggest nicks and channels after entering the first 3 characters</string>
+
+  <string name="preference_autocomplete_prefix_key" translatable="false">autocomplete_prefix</string>
+  <string name="preference_autocomplete_prefix_title">Show after prefix</string>
+  <string name="preference_autocomplete_prefix_summary">Suggest nicks and channels after entering @ or #</string>
 
   <string name="preference_hostmask_key" translatable="false">hostmask</string>
   <string name="preference_hostmask_title">Show Hostmask</string>
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index aa6a895532d3436eebea84f07762dacc45ce33d5..768aec53125cb908d8f226d8c39f7506b28b8058 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -59,11 +59,6 @@
       android:key="@string/preference_show_prefix_key"
       android:title="@string/preference_show_prefix_title" />
 
-    <SwitchPreference
-      android:defaultValue="true"
-      android:key="@string/preference_autocomplete_key"
-      android:title="@string/preference_autocomplete_title" />
-
     <SwitchPreference
       android:defaultValue="false"
       android:key="@string/preference_hostmask_key"
@@ -77,6 +72,33 @@
       android:title="@string/preference_show_lag_title" />
   </PreferenceCategory>
 
+  <PreferenceCategory android:title="@string/preference_autocomplete_title">
+
+    <SwitchPreference
+      android:defaultValue="false"
+      android:key="@string/preference_autocomplete_button_key"
+      android:summary="@string/preference_autocomplete_button_summary"
+      android:title="@string/preference_autocomplete_button_title" />
+
+    <SwitchPreference
+      android:defaultValue="true"
+      android:key="@string/preference_autocomplete_doubletap_key"
+      android:summary="@string/preference_autocomplete_doubletap_summary"
+      android:title="@string/preference_autocomplete_doubletap_title" />
+
+    <SwitchPreference
+      android:defaultValue="true"
+      android:key="@string/preference_autocomplete_auto_key"
+      android:summary="@string/preference_autocomplete_auto_summary"
+      android:title="@string/preference_autocomplete_auto_title" />
+
+    <SwitchPreference
+      android:defaultValue="true"
+      android:key="@string/preference_autocomplete_prefix_key"
+      android:summary="@string/preference_autocomplete_prefix_summary"
+      android:title="@string/preference_autocomplete_prefix_title" />
+  </PreferenceCategory>
+
   <PreferenceCategory android:title="@string/preference_backlog_title">
     <EditTextPreference
       android:defaultValue="150"