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 fb854582a8f4e5454d8c200e7e8911900373e727..3623247e33477574a980a196fe9a1cd44f4fd275 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
@@ -115,7 +115,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
 
     editor = Editor(
       this,
-      viewModel.autoCompleteData.toLiveData(),
+      viewModel.autoCompleteData,
       viewModel.lastWord,
       findViewById(R.id.chatline),
       findViewById(R.id.send),
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 74b281b494ae585d656354cd3538a928d42a733c..cab18626f8fcdbaf3c920dd1fc08a621807398cc 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
@@ -1,6 +1,5 @@
 package de.kuschku.quasseldroid.ui.chat.input
 
-import android.arch.lifecycle.LiveData
 import android.arch.lifecycle.Observer
 import android.graphics.Typeface
 import android.support.annotation.ColorInt
@@ -19,6 +18,7 @@ import android.view.inputmethod.EditorInfo
 import butterknife.BindView
 import butterknife.ButterKnife
 import de.kuschku.libquassel.util.IrcUserUtils
+import de.kuschku.libquassel.util.helpers.value
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.settings.AppearanceSettings
 import de.kuschku.quasseldroid.settings.AutoCompleteSettings
@@ -32,12 +32,13 @@ import de.kuschku.quasseldroid.util.ui.TextDrawable
 import de.kuschku.quasseldroid.viewmodel.data.AutoCompleteItem
 import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
+import java.util.concurrent.TimeUnit
 
 class Editor(
   // Contexts
   activity: AppCompatActivity,
   // LiveData
-  private val autoCompleteData: LiveData<Pair<String, List<AutoCompleteItem>>>,
+  private val autoCompleteData: Observable<Pair<String, List<AutoCompleteItem>>>,
   lastWordContainer: BehaviorSubject<Observable<Pair<String, IntRange>>>,
   // Views
   val chatline: EditTextSelectionChange,
@@ -164,55 +165,56 @@ class Editor(
       formatHandler::autoComplete
     )
 
-    autoCompleteData.observe(activity, Observer {
-      val query = it?.first ?: ""
-      val shouldShowResults = (autoCompleteSettings.auto && query.length >= 3) ||
-                              (autoCompleteSettings.prefix && query.startsWith('@')) ||
-                              (autoCompleteSettings.prefix && query.startsWith('#'))
-      val list = if (shouldShowResults) it?.second.orEmpty() else emptyList()
-      autocompleteAdapter.submitList(list.map {
-        if (it is AutoCompleteItem.UserItem) {
-          val nickName = it.nick
-          val senderColorIndex = IrcUserUtils.senderColor(nickName)
-          val initial = nickName.trimStart('-', '_', '[', ']', '{', '}', '|', '`', '^', '.', '\\')
-            .firstOrNull()?.toUpperCase().toString()
-          val senderColor = senderColors[senderColorIndex]
-
-          fun formatNick(nick: CharSequence): CharSequence {
-            val spannableString = SpannableString(nick)
-            spannableString.setSpan(
-              ForegroundColorSpan(senderColor),
-              0,
-              nick.length,
-              SpannableString.SPAN_INCLUSIVE_EXCLUSIVE
+    autoCompleteData.debounce(300, TimeUnit.MILLISECONDS)
+      .toLiveData().observe(activity, Observer {
+        val query = it?.first ?: ""
+        val shouldShowResults = (autoCompleteSettings.auto && query.length >= 3) ||
+                                (autoCompleteSettings.prefix && query.startsWith('@')) ||
+                                (autoCompleteSettings.prefix && query.startsWith('#'))
+        val list = if (shouldShowResults) it?.second.orEmpty() else emptyList()
+        autocompleteAdapter.submitList(list.map {
+          if (it is AutoCompleteItem.UserItem) {
+            val nickName = it.nick
+            val senderColorIndex = IrcUserUtils.senderColor(nickName)
+            val initial = nickName.trimStart('-', '_', '[', ']', '{', '}', '|', '`', '^', '.', '\\')
+              .firstOrNull()?.toUpperCase().toString()
+            val senderColor = senderColors[senderColorIndex]
+
+            fun formatNick(nick: CharSequence): CharSequence {
+              val spannableString = SpannableString(nick)
+              spannableString.setSpan(
+                ForegroundColorSpan(senderColor),
+                0,
+                nick.length,
+                SpannableString.SPAN_INCLUSIVE_EXCLUSIVE
+              )
+              spannableString.setSpan(
+                StyleSpan(Typeface.BOLD),
+                0,
+                nick.length,
+                SpannableString.SPAN_INCLUSIVE_EXCLUSIVE
+              )
+              return spannableString
+            }
+
+            it.copy(
+              displayNick = formatNick(it.nick),
+              fallbackDrawable = TextDrawable.builder().buildRound(initial, senderColor),
+              modes = when (messageSettings.showPrefix) {
+                MessageSettings.ShowPrefixMode.ALL ->
+                  it.modes
+                else                               ->
+                  it.modes.substring(0, Math.min(it.modes.length, 1))
+              },
+              realname = ircFormatDeserializer.formatString(
+                activity, it.realname.toString(), messageSettings.colorizeMirc
+              )
             )
-            spannableString.setSpan(
-              StyleSpan(Typeface.BOLD),
-              0,
-              nick.length,
-              SpannableString.SPAN_INCLUSIVE_EXCLUSIVE
-            )
-            return spannableString
+          } else {
+            it
           }
-
-          it.copy(
-            displayNick = formatNick(it.nick),
-            fallbackDrawable = TextDrawable.builder().buildRound(initial, senderColor),
-            modes = when (messageSettings.showPrefix) {
-              MessageSettings.ShowPrefixMode.ALL ->
-                it.modes
-              else                               ->
-                it.modes.substring(0, Math.min(it.modes.length, 1))
-            },
-            realname = ircFormatDeserializer.formatString(
-              activity, it.realname.toString(), messageSettings.colorizeMirc
-            )
-          )
-        } else {
-          it
-        }
+        })
       })
-    })
 
     if (autoCompleteSettings.prefix || autoCompleteSettings.auto) {
       for (autoCompleteList in autoCompleteLists) {
@@ -343,8 +345,12 @@ class Editor(
           true
         }
         KeyEvent.KEYCODE_TAB          -> {
-          autoComplete(event.isShiftPressed)
-          true
+          if (!event.isAltPressed && !event.isCtrlPressed) {
+            autoComplete(event.isShiftPressed)
+            true
+          } else {
+            false
+          }
         }
         else                          -> false
       }
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
index 3964b0fc8f2625ba93eb15e3affd57d9d92746bc..cf32d8fd0c17b133c2dd2867cdc387c9211a1856 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -217,7 +217,6 @@ class QuasselViewModel : ViewModel() {
     combineLatest(session, buffer, lastWord).switchMap { (sessionOptional, id, lastWordWrapper) ->
       lastWordWrapper
         .distinctUntilChanged()
-        .debounce(300, TimeUnit.MILLISECONDS)
         .switchMap { lastWord ->
           val session = sessionOptional.orNull()
           val bufferSyncer = session?.bufferSyncer