diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
index a86b1024c83b0df469b5cba2c7c6c19642ed561c..108bad6e0298faeb4aac009b8a34aaaf34e35e24 100644
--- a/app/src/main/java/de/kuschku/libquassel/BusProvider.java
+++ b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
@@ -1,10 +1,12 @@
 package de.kuschku.libquassel;
 
 import android.support.annotation.NonNull;
+import android.util.Log;
 
 import java.util.UUID;
 
 import de.greenrobot.event.EventBus;
+import de.greenrobot.event.NoSubscriberEvent;
 
 public class BusProvider {
     @NonNull
@@ -16,11 +18,18 @@ public class BusProvider {
     @NonNull
     private final String id;
 
+    private final BusHandler handleHandler = new BusHandler("QHANDLE");
+    private final BusHandler dispatchHandler = new BusHandler("QDISPATCH");
+    private final BusHandler eventHandler = new BusHandler("QEVENT");
+
     public BusProvider() {
         this.id = UUID.randomUUID().toString();
         this.handle = new EventBus();
+        this.handle.register(handleHandler);
         this.dispatch = new EventBus();
+        this.dispatch.register(dispatchHandler);
         this.event = new EventBus();
+        this.event.register(eventHandler);
     }
 
     public void handle(Object o) {
@@ -41,4 +50,16 @@ public class BusProvider {
                 "id='" + id + '\'' +
                 '}';
     }
+
+    public static class BusHandler {
+        private final String identifier;
+
+        public BusHandler(String identifier) {
+            this.identifier = identifier;
+        }
+
+        public void onEvent(NoSubscriberEvent event) {
+            Log.e(identifier, String.valueOf(event));
+        }
+    }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java
index 2ae9a6547d79d741f8c6ceab58dc695b8c8da975..b7ed184f5c2047bc7d1ef3822b2747d040420f08 100644
--- a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java
+++ b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java
@@ -181,7 +181,6 @@ public class CoreConnection {
         inputThread = new ReadThread();
         heartbeatThread = new HeartbeatThread();
         inputThread.start();
-        heartbeatThread.start();
     }
 
     public void onEventAsync(HandshakeFailedEvent event) {
@@ -261,6 +260,7 @@ public class CoreConnection {
 
                         // Mark prehandshake as read
                         hasReadPreHandshake = true;
+                        heartbeatThread.start();
 
                         // Send client data to core
                         String clientDate = new SimpleDateFormat("MMM dd yyyy HH:mm:ss", Locale.US).format(new Date());
@@ -304,7 +304,6 @@ public class CoreConnection {
 
                 while (running) {
                     Heartbeat heartbeat = new Heartbeat(DateTime.now());
-                    Log.e("heartbeat", String.valueOf(heartbeat));
                     busProvider.dispatch(heartbeat);
 
                     Thread.sleep(30 * 1000);
diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
index d94d356667f6e02ffe12625373919061a700cc36..323cea8dccba8ae604b7f24c6ff3ca06285bf36f 100644
--- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
+++ b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
@@ -121,6 +121,8 @@ public class ProtocolHandler implements IProtocolHandler {
     }
 
     public void onEvent(@NonNull SessionInit message) {
+        busProvider.dispatch(new Heartbeat(DateTime.now()));
+
         client.setState(message.SessionState);
 
         client.setConnectionStatus(ConnectionChangeEvent.Status.INITIALIZING_DATA);
@@ -148,8 +150,6 @@ public class ProtocolHandler implements IProtocolHandler {
     }
 
     public void onEventMainThread(@NonNull HeartbeatReply heartbeat) {
-        Log.e("heartbeatreply", String.valueOf(heartbeat));
-
         long roundtrip = DateTime.now().getMillis() - heartbeat.dateTime.getMillis();
         long lag = (long) (roundtrip * 0.5);
 
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java
index 88101609597b84a63b9868d4b8212a46b137b9c1..0f3e8f460377661d92b0e5cb0056d714c37b774c 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java
@@ -29,7 +29,7 @@ public class HeartbeatReplySerializer implements FunctionSerializer<HeartbeatRep
     @Override
     public List serialize(@NonNull HeartbeatReply data) {
         return Arrays.asList(
-                FunctionType.HEARTBEATREPLY.id,
+                new QVariant<>(FunctionType.HEARTBEATREPLY.id),
                 new QVariant<>(data.dateTime)
         );
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java
index 38d20cd724cc3bbdf21c21e6e6a7408cc00471e1..fe1d6b86bdae094558c197444d13145abd25b6e3 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java
@@ -9,7 +9,6 @@ import java.util.List;
 
 import de.kuschku.libquassel.functions.FunctionType;
 import de.kuschku.libquassel.functions.types.Heartbeat;
-import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertTrue;
@@ -30,8 +29,8 @@ public class HeartbeatSerializer implements FunctionSerializer<Heartbeat> {
     @Override
     public List serialize(@NonNull Heartbeat data) {
         return Arrays.asList(
-                FunctionType.HEARTBEAT.id,
-                new QVariant<>(QMetaType.Type.QDateTime, data.dateTime)
+                new QVariant<>(FunctionType.HEARTBEAT.id),
+                new QVariant<>(data.dateTime)
         );
     }
 
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 90a005a47323a66c11a484ac262f0f7d144218e7..2fd588da680f40c25f9251a9d4a36222b5af76f5 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
@@ -66,7 +66,7 @@ public class BacklogFilter implements UICallback {
     }
 
     private boolean filterItem(Message message) {
-        return client.getIgnoreListManager().matches(message) || filteredTypes.contains(message.type);
+        return (client.getIgnoreListManager() != null && client.getIgnoreListManager().matches(message)) || filteredTypes.contains(message.type);
     }
 
     public void addFilter(Message.Type type) {
diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
index 1d88e0ccd223bb3a49239015e8720f9760c726bd..fbefbdb7ce4d6794a49f4184ee3633cbd94b1acf 100644
--- a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
+++ b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
@@ -202,10 +202,10 @@ public class LegacyPeer implements RemotePeer {
                             busProvider.handle(UnpackedInitDataFunctionSerializer.get().deserialize((List<QVariant>) data.data));
                             break;
                         case HEARTBEAT:
-                            busProvider.handle(HeartbeatSerializer.get().deserialize((List<QVariant>) data));
+                            busProvider.handle(HeartbeatSerializer.get().deserialize((List<QVariant>) data.data));
                             break;
                         case HEARTBEATREPLY:
-                            busProvider.handle(HeartbeatReplySerializer.get().deserialize((List<QVariant>) data));
+                            busProvider.handle(HeartbeatReplySerializer.get().deserialize((List<QVariant>) data.data));
                             break;
                         default:
                             busProvider.sendEvent(new GeneralErrorEvent("Unknown package received: " + data));
diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java
index bcff02275303b6c540ddb46afa6ed6bf61d4fff9..838aff5b38f0ea29161ec21dfb6b57d135452882 100644
--- a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java
@@ -1,7 +1,6 @@
 package de.kuschku.libquassel.ssl;
 
 import android.support.annotation.NonNull;
-import android.util.Log;
 
 import java.security.GeneralSecurityException;
 import java.security.KeyStore;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java
index 41d02734c2a57044e287e35d37f3c8e995cf8578..f3619522ea58fecc91cdb45b41dfb5aa96414be0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java
@@ -20,7 +20,7 @@ public class ClientBackgroundThread implements Runnable {
     @NonNull
     private static final ClientData CLIENT_DATA = new ClientData(
             new ClientData.FeatureFlags(true, true),
-            new byte[]{RemotePeer.DATASTREAM, RemotePeer.LEGACY},
+            new byte[]{RemotePeer.DATASTREAM},
             "QuasselDroid-ng 0.1 | libquassel 0.2",
             RemotePeer.PROTOCOL_VERSION_LEGACY
     );
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 2f07658ca0ef5b8ff2d5641e1ea4110ae14ea088..ad7f34965530b9ee38d5d72c05a68dd59b169382 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
@@ -42,6 +42,8 @@ import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
 import com.mikepenz.materialdrawer.model.SecondaryDrawerItem;
 import com.sothree.slidinguppanel.SlidingUpPanelLayout;
 
+import org.joda.time.DateTime;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -59,6 +61,7 @@ import de.kuschku.libquassel.events.ConnectionChangeEvent;
 import de.kuschku.libquassel.events.GeneralErrorEvent;
 import de.kuschku.libquassel.events.LagChangedEvent;
 import de.kuschku.libquassel.events.UnknownCertificateEvent;
+import de.kuschku.libquassel.functions.types.Heartbeat;
 import de.kuschku.libquassel.localtypes.Buffer;
 import de.kuschku.libquassel.localtypes.ChannelBuffer;
 import de.kuschku.libquassel.localtypes.backlogmanagers.BacklogFilter;
@@ -88,38 +91,76 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 @UiThread
 public class ChatActivity extends AppCompatActivity {
-    @NonNull
-    private final Status status = new Status();
+    // Main layout
     @Bind(R.id.toolbar)
     Toolbar toolbar;
     @Bind(R.id.sliding_layout)
     SlidingUpPanelLayout slidingLayout;
-    @Bind(R.id.sliding_layout_history)
-    SlidingUpPanelLayout slidingLayoutHistory;
+
+    // Input Line
     @Bind(R.id.chatline_scroller)
     ScrollView chatlineScroller;
     @Bind(R.id.chatline)
     AppCompatEditText chatline;
     @Bind(R.id.send)
     AppCompatImageButton send;
+
+    // Input History
+    @Bind(R.id.sliding_layout_history)
+    SlidingUpPanelLayout slidingLayoutHistory;
     @Bind(R.id.msg_history)
     RecyclerView msgHistory;
-    @Bind(R.id.swipe_view)
-    SwipeRefreshLayout swipeView;
-    @Bind(R.id.messages)
-    RecyclerView messages;
+
+    // Advanced Formatter
     @Bind(R.id.formatting_menu)
     ActionMenuView formattingMenu;
     @Bind(R.id.formatting_toolbar)
     Toolbar formattingToolbar;
-    private AppContext context = new AppContext();
-    private ServiceInterface serviceInterface = new ServiceInterface();
-    private QuasselService.LocalBinder binder;
+
+    // Content view
+    @Bind(R.id.swipe_view)
+    SwipeRefreshLayout swipeView;
+    @Bind(R.id.messages)
+    RecyclerView messages;
+
     private MessageAdapter messageAdapter;
     private AccountHeader accountHeader;
     private Drawer drawerLeft;
-    private BufferViewConfigWrapper wrapper;
     private AdvancedEditor editor;
+    private BufferViewConfigWrapper wrapper;
+
+    @NonNull
+    private final Status status = new Status();
+    private static class Status extends Storable {
+        @Store
+        int bufferId = -1;
+        @Store
+        int bufferViewConfigId = -1;
+    }
+
+    private ServiceInterface serviceInterface = new ServiceInterface();
+    private class ServiceInterface {
+        private void connect(@NonNull ServerAddress address) {
+            assertNotNull(binder);
+            disconnect();
+
+            context.setProvider(new BusProvider());
+            context.getProvider().event.register(ChatActivity.this);
+            binder.startBackgroundThread(context.getProvider(), address);
+            onConnectionEstablished();
+
+            context.getProvider().handle(new Heartbeat(DateTime.parse("1980-01-01T00:00")));
+        }
+
+        private void disconnect() {
+            if (context.getProvider() != null) {
+                context.getProvider().event.unregister(ChatActivity.this);
+            }
+            context.setProvider(null);
+            context.setClient(null);
+        }
+    }
+
     private ServiceConnection serviceConnection = new ServiceConnection() {
         @UiThread
         public void onServiceConnected(@NonNull ComponentName cn, @NonNull IBinder service) {
@@ -131,9 +172,9 @@ public class ChatActivity extends AppCompatActivity {
 
                     serviceInterface.disconnect();
 
-                    backgroundThread.provider.event.register(ChatActivity.this);
-                    context.setClient(backgroundThread.handler.client);
                     context.setProvider(backgroundThread.provider);
+                    context.setClient(backgroundThread.handler.client);
+                    context.getProvider().event.register(ChatActivity.this);
                     updateBufferViewConfigs();
                     updateSubTitle();
                 }
@@ -147,20 +188,30 @@ public class ChatActivity extends AppCompatActivity {
         }
     };
 
-    private static void updateNoColor(Buffer buffer, Menu menu) {
-        boolean isNoColor = isNoColor(buffer);
-        menu.findItem(R.id.format_bold).setEnabled(!isNoColor);
-        menu.findItem(R.id.format_italic).setEnabled(!isNoColor);
-        menu.findItem(R.id.format_underline).setEnabled(!isNoColor);
-        menu.findItem(R.id.format_paint).setEnabled(!isNoColor);
-        menu.findItem(R.id.format_fill).setEnabled(!isNoColor);
-    }
+    @PreferenceWrapper(BuildConfig.APPLICATION_ID)
+    public static abstract class Settings {
+        @StringPreference("QUASSEL_LIGHT")
+        String theme;
+        @BooleanPreference(false)
+        boolean fullHostmask;
+        @IntPreference(2)
+        int textSize;
+        @BooleanPreference(true)
+        boolean mircColors;
 
-    public static boolean isNoColor(Buffer buffer) {
-        return buffer instanceof ChannelBuffer && ((ChannelBuffer) buffer).getChannel() != null &&
-                ((ChannelBuffer) buffer).getChannel().getD_ChanModes().contains("c");
+        @StringPreference("")
+        String lastHost;
+        @IntPreference(4242)
+        int lastPort;
+        @StringPreference("")
+        String lastUsername;
+        @StringPreference("")
+        String lastPassword;
     }
 
+    private AppContext context = new AppContext();
+    private QuasselService.LocalBinder binder;
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         setupContext();
@@ -186,6 +237,141 @@ public class ChatActivity extends AppCompatActivity {
         initLoader();
     }
 
+    @Override
+    protected void onPause() {
+        serviceInterface.disconnect();
+        unbindService(serviceConnection);
+        super.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Intent intent = new Intent(this, QuasselService.class);
+        bindService(intent, serviceConnection, Context.BIND_IMPORTANT);
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+    }
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+    }
+
+    @Override
+    protected void onSaveInstanceState(@NonNull Bundle outState) {
+        assertNotNull(outState);
+
+        super.onSaveInstanceState(outState);
+        status.onSaveInstanceState(outState);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
+        assertNotNull(savedInstanceState);
+
+        super.onRestoreInstanceState(savedInstanceState);
+        status.onRestoreInstanceState(savedInstanceState);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.chat, menu);
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        List<Integer> filterSettings = Arrays.asList(
+                Message.Type.Join.value,
+                Message.Type.Part.value,
+                Message.Type.Quit.value,
+                Message.Type.Nick.value,
+                Message.Type.Mode.value,
+                Message.Type.Topic.value
+        );
+        int[] filterSettingsInts = new int[filterSettings.size()];
+        for (int i = 0; i < filterSettingsInts.length; i++) {
+            filterSettingsInts[i] = filterSettings.get(i);
+        }
+
+        switch (item.getItemId()) {
+            case R.id.action_hide_events: {
+                if (context.getClient() != null) {
+                    BacklogFilter backlogFilter = context.getClient().getBacklogManager().getFilter(status.bufferId);
+                    if (backlogFilter != null) {
+                        int oldFilters = backlogFilter.getFilters();
+                        List<Integer> oldFiltersList = new ArrayList<>();
+                        for (int type : filterSettings) {
+                            if ((type & oldFilters) != 0)
+                                oldFiltersList.add(filterSettings.indexOf(type));
+                        }
+                        Integer[] selectedIndices = oldFiltersList.toArray(new Integer[oldFiltersList.size()]);
+                        new MaterialDialog.Builder(this)
+                                .items(
+                                        "Joins",
+                                        "Parts",
+                                        "Quits",
+                                        "Nick Changes",
+                                        "Mode Changes",
+                                        "Topic Changes"
+                                )
+                                .itemsIds(filterSettingsInts)
+                                .itemsCallbackMultiChoice(
+                                        selectedIndices,
+                                        (dialog, which, text) -> false
+                                )
+                                .positiveText("Select")
+                                .negativeText("Cancel")
+                                .onPositive((dialog, which) -> {
+                                    int filters = 0x00000000;
+                                    if (dialog.getSelectedIndices() != null)
+                                        for (int i : dialog.getSelectedIndices()) {
+                                            filters |= filterSettings.get(i);
+                                        }
+                                    backlogFilter.setFilters(filters);
+                                })
+                                .build()
+                                .show();
+                    }
+                }
+            }
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    private static void updateNoColor(Buffer buffer, Menu menu) {
+        boolean isNoColor = isNoColor(buffer);
+        menu.findItem(R.id.format_bold).setEnabled(!isNoColor);
+        menu.findItem(R.id.format_italic).setEnabled(!isNoColor);
+        menu.findItem(R.id.format_underline).setEnabled(!isNoColor);
+        menu.findItem(R.id.format_paint).setEnabled(!isNoColor);
+        menu.findItem(R.id.format_fill).setEnabled(!isNoColor);
+    }
+
+    public static boolean isNoColor(Buffer buffer) {
+        return buffer instanceof ChannelBuffer && ((ChannelBuffer) buffer).getChannel() != null &&
+                ((ChannelBuffer) buffer).getChannel().getD_ChanModes().contains("c");
+    }
+
     private void setupContext() {
         context.setSettings(new WrappedSettings(this));
         AppTheme theme = AppTheme.themeFromString(context.getSettings().theme.get());
@@ -331,102 +517,20 @@ public class ChatActivity extends AppCompatActivity {
                 .withSavedInstance(savedInstanceState)
                 .withProfileImagesVisible(false)
                 .withOnAccountHeaderListener((view, profile, current) -> {
-                    if (!current) {
-                        selectBufferViewConfig((int) profile.getIdentifier());
-                    }
+                    selectBufferViewConfig((int) profile.getIdentifier());
                     return true;
                 })
                 .build();
     }
 
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        getMenuInflater().inflate(R.menu.chat, menu);
-        return super.onCreateOptionsMenu(menu);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        List<Integer> filterSettings = Arrays.asList(
-                Message.Type.Join.value,
-                Message.Type.Part.value,
-                Message.Type.Quit.value,
-                Message.Type.Nick.value,
-                Message.Type.Mode.value,
-                Message.Type.Topic.value
-        );
-        int[] filterSettingsInts = new int[filterSettings.size()];
-        for (int i = 0; i < filterSettingsInts.length; i++) {
-            filterSettingsInts[i] = filterSettings.get(i);
-        }
-
-        switch (item.getItemId()) {
-            case R.id.action_hide_events: {
-                if (context.getClient() != null) {
-                    BacklogFilter backlogFilter = context.getClient().getBacklogManager().getFilter(status.bufferId);
-                    if (backlogFilter != null) {
-                        int oldFilters = backlogFilter.getFilters();
-                        List<Integer> oldFiltersList = new ArrayList<>();
-                        for (int type : filterSettings) {
-                            if ((type & oldFilters) != 0)
-                                oldFiltersList.add(filterSettings.indexOf(type));
-                        }
-                        Integer[] selectedIndices = oldFiltersList.toArray(new Integer[oldFiltersList.size()]);
-                        new MaterialDialog.Builder(this)
-                                .items(
-                                        "Joins",
-                                        "Parts",
-                                        "Quits",
-                                        "Nick Changes",
-                                        "Mode Changes",
-                                        "Topic Changes"
-                                )
-                                .itemsIds(filterSettingsInts)
-                                .itemsCallbackMultiChoice(
-                                        selectedIndices,
-                                        (dialog, which, text) -> false
-                                )
-                                .positiveText("Select")
-                                .negativeText("Cancel")
-                                .onPositive((dialog, which) -> {
-                                    int filters = 0x00000000;
-                                    if (dialog.getSelectedIndices() != null)
-                                        for (int i : dialog.getSelectedIndices()) {
-                                            filters |= filterSettings.get(i);
-                                        }
-                                    backlogFilter.setFilters(filters);
-                                })
-                                .build()
-                                .show();
-                    }
-                }
-            }
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        serviceInterface.disconnect();
-        unbindService(serviceConnection);
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        Intent intent = new Intent(this, QuasselService.class);
-        bindService(intent, serviceConnection, Context.BIND_IMPORTANT);
-    }
-
     public void setChatlineExpanded(boolean expanded) {
         int selectionStart = chatline.getSelectionStart();
         int selectionEnd = chatline.getSelectionEnd();
 
         if (expanded) {
-            chatlineScroller.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
+            chatline.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
         } else {
-            chatlineScroller.getLayoutParams().height = context.getThemeUtil().res.actionBarSize;
+            chatline.getLayoutParams().height = context.getThemeUtil().res.actionBarSize;
         }
         chatline.setSingleLine(!expanded);
 
@@ -456,22 +560,6 @@ public class ChatActivity extends AppCompatActivity {
                 .show();
     }
 
-    @Override
-    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
-        assertNotNull(savedInstanceState);
-
-        super.onRestoreInstanceState(savedInstanceState);
-        status.onRestoreInstanceState(savedInstanceState);
-    }
-
-    @Override
-    protected void onSaveInstanceState(@NonNull Bundle outState) {
-        assertNotNull(outState);
-
-        super.onSaveInstanceState(outState);
-        status.onSaveInstanceState(outState);
-    }
-
     private void selectBufferViewConfig(@IntRange(from = -1) int bufferViewConfigId) {
         status.bufferViewConfigId = bufferViewConfigId;
         accountHeader.setActiveProfile(bufferViewConfigId, false);
@@ -671,51 +759,4 @@ public class ChatActivity extends AppCompatActivity {
             toolbar.setSubtitle("");
         }
     }
-
-    @PreferenceWrapper(BuildConfig.APPLICATION_ID)
-    public static abstract class Settings {
-        @StringPreference("QUASSEL_LIGHT")
-        String theme;
-        @BooleanPreference(false)
-        boolean fullHostmask;
-        @IntPreference(2)
-        int textSize;
-        @BooleanPreference(true)
-        boolean mircColors;
-
-        @StringPreference("")
-        String lastHost;
-        @IntPreference(4242)
-        int lastPort;
-        @StringPreference("")
-        String lastUsername;
-        @StringPreference("")
-        String lastPassword;
-    }
-
-    private static class Status extends Storable {
-        @Store
-        int bufferId = -1;
-        @Store
-        int bufferViewConfigId = -1;
-    }
-
-    private class ServiceInterface {
-        private void connect(@NonNull ServerAddress address) {
-            assertNotNull(binder);
-            disconnect();
-
-            BusProvider provider = new BusProvider();
-            provider.event.register(ChatActivity.this);
-            binder.startBackgroundThread(provider, address);
-            onConnectionEstablished();
-        }
-
-        private void disconnect() {
-            if (context.getProvider() != null)
-                context.getProvider().event.unregister(this);
-            context.setProvider(null);
-            context.setClient(null);
-        }
-    }
 }