diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java
index 8890efa051ec1f9541488e20b5f8861444814e66..370099559148321b941ca112eba5da04bb7190c3 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java
@@ -81,7 +81,7 @@ public class BacklogFilter implements UICallback {
 
     private void updateRemove() {
         for (Message message : unfiltered) {
-            if (filterItem(message)) {
+            if (filterItem(message) && filtered.contains(message)) {
                 String simpleName = getClass().getSimpleName();
                 Log.e(simpleName, "Filtered: "+message);
                 filtered.remove(message);
@@ -91,7 +91,7 @@ public class BacklogFilter implements UICallback {
 
     private void updateAdd() {
         for (Message message : unfiltered) {
-            if (!filterItem(message)) {
+            if (!filterItem(message) && !filtered.contains(message)) {
                 String simpleName = getClass().getSimpleName();
                 Log.e(simpleName, "Unfiltered: "+message);
                 filtered.add(message);
diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
index b8cea4b7b5431d912e396698c69484b9d458f046..ed1322d3fa4879a780ee57e02b3cf1b72925e4bf 100644
--- a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
+++ b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
@@ -119,8 +119,6 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull SyncFunction func) {
-        assertNotNull(func);
-
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<SyncFunction>get(),
@@ -129,9 +127,6 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull RpcCallFunction func) {
-        assertNotNull(func);
-
-        Log.e("TEST", String.valueOf(func));
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<RpcCallFunction>get(),
@@ -140,8 +135,6 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull InitRequestFunction func) {
-        assertNotNull(func);
-
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<InitRequestFunction>get(),
@@ -150,8 +143,6 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull InitDataFunction func) {
-        assertNotNull(func);
-
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<InitDataFunction>get(),
@@ -160,8 +151,6 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull Heartbeat func) {
-        assertNotNull(func);
-
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<InitDataFunction>get(),
@@ -170,8 +159,6 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull HeartbeatReply func) {
-        assertNotNull(func);
-
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<InitDataFunction>get(),
@@ -180,8 +167,6 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull HandshakeFunction func) {
-        assertNotNull(func);
-
         assertNotNull(connection.getOutputExecutor());
         Map<String, QVariant> variantMap = MessageTypeRegistry.toVariantMap(func.data).data;
         assertNotNull(variantMap);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java
index f7fb9ed33c172fbf470b21d58119a65ec4c10877..51072a4efd5f0bb26de4682eb578824ebdc6e2e8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java
@@ -20,8 +20,12 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.Toolbar;
 import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 
+import com.afollestad.materialdialogs.DialogAction;
 import com.afollestad.materialdialogs.MaterialDialog;
 import com.google.common.base.Splitter;
 import com.mikepenz.fastadapter.FastAdapter;
@@ -33,6 +37,7 @@ import com.mikepenz.materialdrawer.Drawer;
 import com.mikepenz.materialdrawer.DrawerBuilder;
 import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
 import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
+import com.mikepenz.materialdrawer.model.SecondaryDrawerItem;
 import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 import com.mikepenz.materialdrawer.model.interfaces.IProfile;
 import com.sothree.slidinguppanel.SlidingUpPanelLayout;
@@ -92,6 +97,7 @@ public class ChatActivity extends AppCompatActivity {
     SwipeRefreshLayout swipeView;
     @Bind(R.id.messages)
     RecyclerView messages;
+    private boolean tr = true;
 
 
     @PreferenceWrapper(BuildConfig.APPLICATION_ID)
@@ -130,20 +136,19 @@ public class ChatActivity extends AppCompatActivity {
 
         private void disconnect() {
             if (binder != null) binder.stopBackgroundThread();
-            if (backgroundThread != null) backgroundThread.provider.event.unregister(this);
-            backgroundThread = null;
+            if (context.getProvider() != null) context.getProvider().event.unregister(this);
+            context.setProvider(null);
+            context.setClient(null);
         }
     }
 
     private QuasselService.LocalBinder binder;
-    private ClientBackgroundThread backgroundThread;
 
     private MessageAdapter messageAdapter;
 
     private AccountHeader accountHeader;
     private Drawer drawerLeft;
     private BufferViewConfigWrapper wrapper;
-    private CharSequence subtitle;
 
     private ServiceConnection serviceConnection = new ServiceConnection() {
         @UiThread
@@ -166,7 +171,7 @@ public class ChatActivity extends AppCompatActivity {
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         context.setSettings(new WrappedSettings(this));
-        AppTheme theme = AppTheme.QUASSEL;
+        AppTheme theme = AppTheme.themeFromString(context.getSettings().theme.get());
         setTheme(theme.themeId);
         context.setThemeUtil(new ThemeUtil(this, theme));
 
@@ -199,11 +204,18 @@ public class ChatActivity extends AppCompatActivity {
                 .withTranslucentStatusBar(true)
                 .build();
         drawerLeft.addStickyFooterItem(new PrimaryDrawerItem().withIcon(R.drawable.ic_server_light).withName("(Re-)Connect").withIdentifier(-1));
+        drawerLeft.addStickyFooterItem(new SecondaryDrawerItem().withName("Settings").withIdentifier(-2));
         drawerLeft.setOnDrawerItemClickListener((view, position, drawerItem) -> {
             long identifier = drawerItem.getIdentifier();
+            Log.e("DEBUG", "IDENT: "+identifier);
+            Log.e("DEBUG", "IDENT: "+(identifier==-1));
+            Log.e("DEBUG", "IDENT: "+(identifier==-2));
             if (identifier == -1) {
                 showConnectDialog();
                 return false;
+            } else if (identifier == -2) {
+                showThemeDialog();
+                return false;
             } else {
                 if (((IExpandable) drawerItem).getSubItems() != null) {
                     drawerLeft.getAdapter().toggleExpandable(position);
@@ -224,6 +236,7 @@ public class ChatActivity extends AppCompatActivity {
         msgHistory.setLayoutManager(new LinearLayoutManager(this));
         msgHistory.setItemAnimator(new DefaultItemAnimator());
 
+        swipeView.setColorSchemeColors(context.getThemeUtil().colors.colorPrimary);
         swipeView.setOnRefreshListener(() -> {
             assertNotNull(context.getClient());
             context.getClient().getBacklogManager().requestMoreBacklog(status.bufferId, 20);
@@ -232,6 +245,29 @@ public class ChatActivity extends AppCompatActivity {
         send.setOnClickListener(view -> sendInput());
     }
 
+    public void showThemeDialog() {
+        String[] strings = new String[AppTheme.values().length];
+        int startIndex = -1;
+        for (int i = 0; i < strings.length; i++) {
+            AppTheme theme = AppTheme.values()[i];
+            strings[i] = theme.name();
+            if (theme.name().equals(context.getSettings().theme.get())) startIndex = i;
+        }
+
+        new MaterialDialog.Builder(this)
+                .items(strings)
+                .positiveText("Select Theme")
+                .neutralText("Cancel")
+                .itemsCallbackSingleChoice(startIndex, (dialog, itemView, which, text) -> {
+                    context.getSettings().theme.set(strings[dialog.getSelectedIndex()]);
+                    recreate();
+                    return true;
+                })
+                .buttonRippleColor(context.getThemeUtil().colors.colorAccent)
+                .build()
+                .show();
+    }
+
     @Override
     protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
         assertNotNull(savedInstanceState);
@@ -253,10 +289,12 @@ public class ChatActivity extends AppCompatActivity {
 
         serviceInterface.disconnect();
 
-        this.backgroundThread = backgroundThread;
         backgroundThread.provider.event.register(this);
+        context.setClient(backgroundThread.handler.client);
+        context.setProvider(backgroundThread.provider);
         selectBuffer(status.bufferId);
         selectBufferViewConfig(status.bufferViewConfigId);
+        updateSubTitle();
     }
 
     private void selectBufferViewConfig(@IntRange(from = -1) int bufferViewConfigId) {
@@ -301,9 +339,8 @@ public class ChatActivity extends AppCompatActivity {
 
     private void onConnectionEstablished() {
         assertNotNull(binder);
-        this.backgroundThread = binder.getBackgroundThread();
-        assertNotNull(this.backgroundThread);
-        context.setClient(this.backgroundThread.handler.client);
+        assertNotNull(binder.getBackgroundThread());
+        context.setClient(binder.getBackgroundThread().handler.client);
         assertNotNull(context.getClient());
     }
 
@@ -314,10 +351,11 @@ public class ChatActivity extends AppCompatActivity {
 
         CharSequence text = chatline.getText();
         context.getClient().sendInput(buffer.getInfo(), text.toString());
+        chatline.setText("");
     }
 
     public void onEventMainThread(ConnectionChangeEvent event) {
-        setSubtitle(event.status.name());
+        updateSubTitle();
 
         switch (event.status) {
             case HANDSHAKE:
@@ -425,16 +463,11 @@ public class ChatActivity extends AppCompatActivity {
         updateSubTitle();
     }
 
-    protected void setSubtitle(CharSequence subtitle) {
-        this.subtitle = subtitle;
-        updateSubTitle();
-    }
-
     private void updateSubTitle() {
         if (context.getClient() != null) {
-            toolbar.setSubtitle(SpanFormatter.format("Lag: %.2f, %s", context.getClient().getLag() / 1000.0F, subtitle));
+            toolbar.setSubtitle(SpanFormatter.format("Lag: %.2f, %s", context.getClient().getLag() / 1000.0F, context.getClient().getConnectionStatus()));
         } else {
-            toolbar.setSubtitle(subtitle);
+            toolbar.setSubtitle("");
         }
     }
 }