From a211edfe0c03a9fedf2b15accdba1cbb8541aada Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 8 Sep 2016 19:02:23 +0200
Subject: [PATCH] Improved performance and UI again (just closed some memory
 leaks, reduced memory usage, etc)

---
 app/build.gradle                              |   2 +-
 app/src/main/AndroidManifest.xml              |  34 +++---
 .../de/kuschku/libquassel/BusProvider.java    |  16 +--
 .../de/kuschku/libquassel/CoreConnection.java |   3 +-
 .../de/kuschku/libquassel/QuasselClient.java  |  12 ++
 .../de/kuschku/libquassel/client/Client.java  |  20 ++--
 .../libquassel/client/IdentityManager.java    |   5 -
 .../libquassel/client/NetworkManager.java     |  10 ++
 .../libquassel/localtypes/BacklogFilter.java  | 101 ++++++++--------
 .../localtypes/NotificationManager.java       |  92 ---------------
 .../backlogstorage/BacklogStorage.java        |   2 +
 .../backlogstorage/HybridBacklogStorage.java  | 109 +++++++++---------
 .../localtypes/buffers/ChannelBuffer.java     |   3 +-
 .../localtypes/buffers/QueryBuffer.java       |   3 +-
 .../localtypes/buffers/StatusBuffer.java      |   2 +-
 .../kuschku/libquassel/message/Message.java   |  17 ++-
 .../primitives/QMetaTypeRegistry.java         |   8 +-
 .../serializers/UserTypeSerializer.java       |   2 -
 .../libquassel/primitives/types/QVariant.java |   3 +-
 .../syncables/types/SyncableObject.java       |   1 +
 .../types/abstracts/ABacklogManager.java      |   6 +-
 .../syncables/types/impl/BacklogManager.java  |   6 +-
 .../syncables/types/impl/BufferSyncer.java    |  52 +++++++--
 .../types/impl/BufferViewConfig.java          |   2 +-
 .../types/impl/BufferViewManager.java         |  10 +-
 .../syncables/types/impl/IrcChannel.java      |  24 ++--
 .../syncables/types/impl/IrcUser.java         |  31 ++---
 .../syncables/types/impl/Network.java         |   2 +-
 .../types/interfaces/QBufferSyncer.java       |   7 ++
 .../quasseldroid_ng/QuasselDroidNG.java       |   8 +-
 .../service/QuasselService.java               |   4 +-
 .../quasseldroid_ng/ui/LoginActivity.java     |   2 +-
 .../quasseldroid_ng/ui/ViewIntBinder.java     |   2 +-
 .../chat/BufferViewConfigSpinnerAdapter.java  |  12 +-
 .../quasseldroid_ng/ui/chat/MainActivity.java |  35 +++---
 .../ui/chat/chatview/ChatMessageRenderer.java |  45 ++++----
 .../ui/chat/chatview/MessageAdapter.java      |  31 +++--
 .../ui/chat/drawer/ActionModeHandler.java     |   4 +-
 .../chat/drawer/BufferViewConfigAdapter.java  |  14 +--
 .../ui/chat/drawer/BufferViewHolder.java      |   8 +-
 .../ui/chat/drawer/NetworkItem.java           |   8 +-
 .../ui/chat/fragment/ChatFragment.java        |  25 ++--
 .../ui/chat/util/SlidingPanelHandler.java     |  13 ++-
 .../chatlist/ChatListCreateActivity.java      |   4 +-
 .../chatlist/ChatListEditActivity.java        |  12 +-
 .../chatlist/ChatListListActivity.java        |  26 ++---
 .../chatlist/MinimumActivityAdapter.java      |   4 +-
 .../identity/IdentityCreateActivity.java      |  14 +--
 .../identity/IdentityEditActivity.java        |  12 +-
 .../identity/IdentityListActivity.java        |  26 ++---
 .../identity/IdentitySpinnerAdapter.java      |   3 +-
 .../nick/IdentityNickListActivity.java        |   4 +-
 .../network/FakeNetworksWrapper.java          |   8 +-
 .../network/NetworkCreateActivity.java        |  17 +--
 .../network/NetworkEditActivity.java          |  28 ++---
 .../network/NetworkListActivity.java          |  26 ++---
 .../network/NetworkSpinnerAdapter.java        |   2 +-
 .../server/NetworkServerEditActivity.java     |   2 +-
 .../server/NetworkServerListActivity.java     |   7 +-
 .../quasseldroid_ng/ui/settings/Settings.java |   2 +
 .../ui/settings/SettingsActivity.java         |   4 +-
 .../quasseldroid_ng/ui/setup/AccountItem.java |  12 +-
 .../ui/setup/AccountSelectActivity.java       |   2 +-
 .../ui/setup/AccountSetupActivity.java        |   2 +-
 .../ui/setup/CoreSetupActivity.java           |   2 +-
 .../ui/setup/CreateAccountItem.java           |   4 +-
 .../ui/setup/StorageBackendItem.java          |  10 +-
 .../setup/slides/AccountSetupCoreSlide.java   |  10 +-
 .../setup/slides/AccountSetupNameSlide.java   |   6 +-
 .../setup/slides/AccountSetupUserSlide.java   |  10 +-
 .../setup/slides/CoreBackendSetupSlide.java   |  15 +--
 .../ui/setup/slides/SlideFragment.java        |   2 +-
 .../quasseldroid_ng/ui/theme/AppContext.java  |   2 +-
 .../MeaningfulConnectionErrorProvider.java    |  42 -------
 .../kuschku/util/accounts/AccountManager.java |   2 +-
 .../SQLiteBufferMetaDataManager.java          |   2 +-
 .../de/kuschku/util/irc/IrcCaseMapper.java    |   4 +-
 .../irc/chanmodes/IrcModeProviderFactory.java |   2 +-
 .../chanmodes/impl/BewareIrcModeProvider.java |   2 +-
 .../impl/CharybdisIrcModeProvider.java        |   2 +-
 .../chanmodes/impl/DalIrcModeProvider.java    |   2 +-
 .../chanmodes/impl/DancerIrcModeProvider.java |   2 +-
 .../irc/chanmodes/impl/FqIrcModeProvider.java |   2 +-
 .../chanmodes/impl/HybridIrcModeProvider.java |   2 +-
 .../impl/HyperionIrcModeProvider.java         |   2 +-
 .../impl/InspireIrcModeProvider.java          |   2 +-
 .../chanmodes/impl/NeoIrcModeProvider.java    |   2 +-
 .../impl/NightstarIrcModeProvider.java        |   2 +-
 .../chanmodes/impl/RfcIrcModeProvider.java    |   2 +-
 .../chanmodes/impl/ShadowIrcModeProvider.java |   2 +-
 .../chanmodes/impl/SolidIrcModeProvider.java  |   2 +-
 .../impl/UndernetIrcModeProvider.java         |   2 +-
 .../chanmodes/impl/UnrealIrcModeProvider.java |   2 +-
 .../wrappers/MultiGeneralCallback.java        |   1 +
 .../AbstractPreferenceElement.java            |   6 +-
 .../util/servicebound/BoundActivity.java      |  13 ++-
 .../util/servicebound/BoundFragment.java      |  26 +++--
 .../util/ui/DividerItemDecoration.java        |  72 ++++++++++++
 .../java/de/kuschku/util/ui/MenuTint.java     |  68 +++++------
 .../kuschku/util/ui/ObservableTextBinder.java |   2 +-
 .../StorageBackendParcelable.java             |   2 +-
 .../preferences/MaterialListPreference.java   |   2 +-
 .../ui/preferences/SeekBarPreference.java     |  18 +--
 app/src/main/res/anim/slide_in_right.xml      |  28 -----
 app/src/main/res/anim/slide_out_left.xml      |  29 -----
 .../color/selectable_button_background.xml    |  31 -----
 .../layout-sw600dp-land/activity_setup.xml    |   7 +-
 .../res/layout-sw600dp/activity_setup.xml     |   7 +-
 app/src/main/res/layout-sw600dp/slide.xml     |  75 ++++++------
 .../res/layout/activity_accountchooser.xml    |  27 -----
 .../res/layout/activity_channel_detail.xml    |   6 +-
 app/src/main/res/layout/activity_chat.xml     |  47 --------
 .../res/layout/activity_chatlist_edit.xml     |  18 +--
 .../res/layout/activity_identity_edit.xml     |  24 ++--
 .../main/res/layout/activity_network_edit.xml |  36 +++---
 .../layout/activity_networkserver_edit.xml    |  20 ++--
 .../main/res/layout/activity_nick_list.xml    |  64 ----------
 app/src/main/res/layout/activity_setup.xml    |   7 +-
 app/src/main/res/layout/dialog_address.xml    |  53 ---------
 app/src/main/res/layout/fragment_chat.xml     |   2 +-
 app/src/main/res/layout/fragment_loading.xml  |  57 +++++----
 .../main/res/layout/slide_account_name.xml    |   7 +-
 .../main/res/layout/slide_account_user.xml    |   6 +-
 ....xml => widget_chatmessage_markerline.xml} |   5 +-
 .../res/layout/widget_core_account_add.xml    |   4 +-
 .../main/res/layout/widget_drawer_network.xml |  54 ++++-----
 app/src/main/res/layout/widget_slider.xml     |  30 ++---
 app/src/main/res/menu/chat.xml                |   4 +-
 app/src/main/res/menu/confirm.xml             |   2 +-
 app/src/main/res/menu/confirm_delete.xml      |   4 +-
 app/src/main/res/values-w720dp/bools.xml      |  25 ----
 app/src/main/res/values/bools.xml             |  25 ----
 app/src/main/res/values/dimens.xml            |   2 -
 app/src/main/res/values/preferences.xml       |  16 +--
 app/src/main/res/values/strings.xml           |  86 +++++++++++++-
 app/src/main/res/values/styles.xml            |   2 +
 136 files changed, 926 insertions(+), 1250 deletions(-)
 delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java
 delete mode 100644 app/src/main/java/de/kuschku/util/MeaningfulConnectionErrorProvider.java
 create mode 100644 app/src/main/java/de/kuschku/util/ui/DividerItemDecoration.java
 delete mode 100644 app/src/main/res/anim/slide_in_right.xml
 delete mode 100644 app/src/main/res/anim/slide_out_left.xml
 delete mode 100644 app/src/main/res/color/selectable_button_background.xml
 delete mode 100644 app/src/main/res/layout/activity_accountchooser.xml
 delete mode 100644 app/src/main/res/layout/activity_chat.xml
 delete mode 100644 app/src/main/res/layout/activity_nick_list.xml
 delete mode 100644 app/src/main/res/layout/dialog_address.xml
 rename app/src/main/res/layout/{slide_core_select_backend.xml => widget_chatmessage_markerline.xml} (92%)
 delete mode 100644 app/src/main/res/values-w720dp/bools.xml
 delete mode 100644 app/src/main/res/values/bools.xml

diff --git a/app/build.gradle b/app/build.gradle
index c8f0f071a..38fd8549e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -148,7 +148,7 @@ dependencies {
     compile 'com.google.guava:guava:19.0'
     compile 'org.greenrobot:eventbus:3.0.0'
 
-    compile 'joda-time:joda-time:2.9.1'
+    compile 'net.danlew:android.joda:2.9.4.1'
     compile 'org.joda:joda-convert:1.8'
 
     // UI Libs
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 30f732755..ea203c828 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -55,119 +55,119 @@
 
         <activity
             android:name=".ui.chat.ChannelDetailActivity"
-            android:label="Channel Details"
+            android:label="@string/channeldetails"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.chat.MainActivity"
             android:theme="@style/AppTheme.Light" />
 
         <activity
             android:name=".ui.coresettings.chatlist.ChatListListActivity"
-            android:label="Edit Chat Lists"
+            android:label="@string/editchatlists"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.chat.MainActivity"
             android:theme="@style/AppTheme.Light" />
 
         <activity
             android:name=".ui.coresettings.chatlist.ChatListEditActivity"
-            android:label="Edit Chat List"
+            android:label="@string/editchatlist"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.coresettings.chatlist.ChatListListActivity"
             android:theme="@style/AppTheme.Light" />
 
         <activity
             android:name=".ui.coresettings.chatlist.ChatListCreateActivity"
-            android:label="Create Chat List"
+            android:label="@string/createchatlist"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.coresettings.chatlist.ChatListListActivity"
             android:theme="@style/AppTheme.Light" />
 
         <activity
             android:name=".ui.coresettings.network.NetworkListActivity"
-            android:label="Edit Networks"
+            android:label="@string/editnetworks"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.chat.MainActivity"
             android:theme="@style/AppTheme.Light" />
 
         <activity
             android:name=".ui.coresettings.network.NetworkEditActivity"
-            android:label="Edit Network"
+            android:label="@string/editnetwork"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.coresettings.network.NetworkListActivity"
             android:theme="@style/AppTheme.Light" />
 
         <activity
             android:name=".ui.coresettings.network.NetworkCreateActivity"
-            android:label="Create Network"
+            android:label="@string/createnetwork"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.coresettings.network.NetworkListActivity"
             android:theme="@style/AppTheme.Light" />
 
         <activity
             android:name=".ui.coresettings.network.server.NetworkServerListActivity"
-            android:label="Edit NetworkServers"
+            android:label="@string/editnetworkservers"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.coresettings.network.NetworkEditActivity"
             android:theme="@style/AppTheme.Light"/>
 
         <activity
             android:name=".ui.coresettings.identity.IdentityListActivity"
-            android:label="Edit Identities"
+            android:label="@string/editidentities"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.chat.MainActivity"
             android:theme="@style/AppTheme.Light"/>
 
         <activity
             android:name=".ui.coresettings.identity.IdentityEditActivity"
-            android:label="Edit Identity"
+            android:label="@string/editidentity"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.coresettings.identity.IdentityListActivity"
             android:theme="@style/AppTheme.Light"/>
 
         <activity
             android:name=".ui.coresettings.identity.IdentityCreateActivity"
-            android:label="Create Identity"
+            android:label="@string/createidentity"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.coresettings.identity.IdentityListActivity"
             android:theme="@style/AppTheme.Light"/>
 
         <activity
             android:name=".ui.coresettings.identity.nick.IdentityNickListActivity"
-            android:label="Edit Nicks"
+            android:label="@string/editnicks"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.coresettings.identity.IdentityEditActivity"
             android:theme="@style/AppTheme.Light"/>
 
         <activity
             android:name=".ui.coresettings.network.server.NetworkServerEditActivity"
-            android:label="Edit NetworkServer"
+            android:label="@string/editnetworkserver"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.coresettings.network.server.NetworkServerListActivity"
             android:theme="@style/AppTheme.Light"/>
 
         <activity
             android:name=".ui.setup.AccountSetupActivity"
-            android:label="Account Setup"
+            android:label="@string/accountsetup"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.setup.AccountSelectActivity"
             android:theme="@style/SetupTheme" />
 
         <activity
             android:name=".ui.setup.AccountSelectActivity"
-            android:label="Account Selection"
+            android:label="@string/accountselection"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.LoginActivity"
             android:theme="@style/SetupTheme" />
 
         <activity
             android:name=".ui.setup.CoreSetupActivity"
-            android:label="Core Setup"
+            android:label="@string/coresetup"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.chat.MainActivity"
             android:theme="@style/SetupTheme" />
 
         <activity
             android:name=".ui.settings.SettingsActivity"
-            android:label="Settings"
+            android:label="@string/settings"
             android:launchMode="singleTask"
             android:parentActivityName=".ui.chat.MainActivity"
             android:theme="@style/AppTheme.Light" />
diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
index 7f3eeb4a0..944cd7ccc 100644
--- a/app/src/main/java/de/kuschku/libquassel/BusProvider.java
+++ b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
@@ -35,29 +35,25 @@ import de.kuschku.libquassel.events.BacklogReceivedEvent;
 import de.kuschku.libquassel.events.LagChangedEvent;
 
 public class BusProvider {
-    @NonNull
-    public final EventBus handle;
-    @NonNull
-    public final EventBus dispatch;
-    @NonNull
-    public final EventBus event;
     @NonNull
     private final String id;
-
     @NonNull
-    private final BusHandler handleHandler = new BusHandler("QHANDLE");
+    public EventBus handle;
     @NonNull
-    private final BusHandler dispatchHandler = new BusHandler("QDISPATCH");
+    public EventBus dispatch;
     @NonNull
-    private final BusHandler eventHandler = new BusHandler("QEVENT");
+    public EventBus event;
 
     public BusProvider() {
         this.id = UUID.randomUUID().toString();
         this.handle = new EventBus();
+        BusHandler handleHandler = new BusHandler("QHANDLE");
         this.handle.register(handleHandler);
         this.dispatch = new EventBus();
+        BusHandler dispatchHandler = new BusHandler("QDISPATCH");
         this.dispatch.register(dispatchHandler);
         this.event = new EventBus();
+        BusHandler eventHandler = new BusHandler("QEVENT");
         this.event.register(eventHandler);
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java
index 081b643b9..eead77323 100644
--- a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java
+++ b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java
@@ -339,13 +339,14 @@ public class CoreConnection {
 
                     Thread.sleep(30 * 1000);
                 }
-            } catch (InterruptedException e) {
+            } catch (InterruptedException ignored) {
             }
         }
 
         @Override
         public void end() {
             running = false;
+            this.interrupt();
         }
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/QuasselClient.java b/app/src/main/java/de/kuschku/libquassel/QuasselClient.java
index 318c46da0..7a40061d6 100644
--- a/app/src/main/java/de/kuschku/libquassel/QuasselClient.java
+++ b/app/src/main/java/de/kuschku/libquassel/QuasselClient.java
@@ -27,6 +27,7 @@ import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.client.ClientData;
 import de.kuschku.libquassel.localtypes.backlogstorage.BacklogStorage;
 import de.kuschku.libquassel.ssl.CertificateManager;
+import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.util.accounts.ServerAddress;
 import de.kuschku.util.buffermetadata.BufferMetaDataManager;
 
@@ -65,5 +66,16 @@ public class QuasselClient {
 
     public void disconnect() {
         this.connection.close();
+        this.client.networkManager().networks().clear();
+        for (int bufferId : this.client.bufferManager().bufferIds()) {
+            this.client.backlogStorage().markBufferUnused(bufferId);
+        }
+        this.client.bufferManager().bufferIds().clear();
+        this.client.bufferManager().buffers().clear();
+        for (QBufferViewConfig config : client.bufferViewManager().bufferViewConfigs()) {
+            config.networkList().clear();
+        }
+        client.bufferViewManager().bufferViewConfigs().clear();
+        client.bufferViewManager().bufferViewConfigMap().clear();
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/client/Client.java b/app/src/main/java/de/kuschku/libquassel/client/Client.java
index 1bc37157d..1da25b58c 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/Client.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/Client.java
@@ -40,7 +40,6 @@ import de.kuschku.libquassel.events.PasswordChangeEvent;
 import de.kuschku.libquassel.events.StatusMessageEvent;
 import de.kuschku.libquassel.functions.types.InitRequestFunction;
 import de.kuschku.libquassel.functions.types.SyncFunction;
-import de.kuschku.libquassel.localtypes.NotificationManager;
 import de.kuschku.libquassel.localtypes.backlogstorage.BacklogStorage;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.objects.types.CoreStatus;
@@ -72,13 +71,13 @@ public class Client extends AClient {
     private final IdentityManager identityManager;
     @NonNull
     private final BacklogStorage backlogStorage;
-    @NonNull
-    private final NotificationManager notificationManager;
     private final List<String> initRequests = new LinkedList<>();
     @NonNull
     private final QBacklogManager backlogManager;
     private final Map<String, List<SyncFunction>> bufferedSyncs = new HashMap<>();
     private final Map<Integer, Pair<QBufferViewConfig, Integer>> bufferedBuffers = new HashMap<>();
+    private final BufferMetaDataManager metaDataManager;
+    private final String coreId;
     private int initRequestMax = 0;
     private QBufferViewManager bufferViewManager;
     // local
@@ -90,8 +89,6 @@ public class Client extends AClient {
     private CoreInfo coreInfo;
     private long latency;
     private ConnectionChangeEvent.Status connectionStatus;
-    private BufferMetaDataManager metaDataManager;
-    private String coreId;
     private int r = 1;
 
     public Client(@NonNull BusProvider provider, @NonNull BacklogStorage backlogStorage, @NonNull BufferMetaDataManager metaDataManager, String coreId) {
@@ -99,12 +96,11 @@ public class Client extends AClient {
         this.provider = provider;
         this.networkManager = new NetworkManager(this);
         this.bufferManager = new BufferManager(this);
-        this.identityManager = new IdentityManager(this);
+        this.identityManager = new IdentityManager();
         this.backlogStorage = backlogStorage;
         backlogStorage.setClient(this);
         this.backlogManager = new BacklogManager(this, backlogStorage);
         this.backlogManager.init("", provider, this);
-        this.notificationManager = new NotificationManager(this);
         this.initialized = true;
         this.metaDataManager = metaDataManager;
     }
@@ -199,7 +195,10 @@ public class Client extends AClient {
         if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) {
             bufferManager().doBacklogInit(20);
         } else if (connectionStatus == ConnectionChangeEvent.Status.CONNECTED) {
-            // FIXME: Init buffer activity state and highlightss
+            for (int bufferId : bufferManager().bufferIds()) {
+                metaDataManager().hiddendata(coreId(), bufferId);
+            }
+            // FIXME: Init buffer activity state and highlights
         }
     }
 
@@ -409,11 +408,6 @@ public class Client extends AClient {
         return latency;
     }
 
-    @NonNull
-    public NotificationManager notificationManager() {
-        return notificationManager;
-    }
-
     public void setBufferSyncer(QBufferSyncer bufferSyncer) {
         this.bufferSyncer = bufferSyncer;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java b/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java
index d64ddf136..8d7ab9483 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java
@@ -57,11 +57,6 @@ public class IdentityManager {
             return item1.id() == item2.id();
         }
     });
-    private final Client client;
-
-    public IdentityManager(Client client) {
-        this.client = client;
-    }
 
     public void createIdentity(@NonNull QIdentity identity) {
         identities.put(identity.id(), identity);
diff --git a/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java b/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java
index fe93036a7..4a2343884 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java
@@ -29,7 +29,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Observable;
 
+import de.kuschku.libquassel.events.ConnectionChangeEvent;
 import de.kuschku.libquassel.syncables.types.impl.Network;
+import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
@@ -101,6 +103,11 @@ public class NetworkManager extends Observable {
             list.remove(qNetwork);
         networks.put(network.networkId(), network);
         list.add(network);
+
+        if (client.connectionStatus() == ConnectionChangeEvent.Status.CONNECTED)
+            for (QBufferViewConfig config : client.bufferViewManager().bufferViewConfigs()) {
+                config.updateNetworks();
+            }
     }
 
     public QNetwork network(@IntRange(from = 0) int networkId) {
@@ -112,6 +119,9 @@ public class NetworkManager extends Observable {
         if (qNetwork != null)
             list.remove(qNetwork);
         networks.remove(network);
+        for (QBufferViewConfig config : client.bufferViewManager().bufferViewConfigs()) {
+            config.updateNetworks();
+        }
     }
 
 
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
index 9779d45b0..a2f3b8c10 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
@@ -28,12 +28,11 @@ import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
-import java.util.HashSet;
-import java.util.Set;
-
 import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.message.Message;
+import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
+import de.kuschku.util.observables.callbacks.ElementCallback;
 import de.kuschku.util.observables.callbacks.UICallback;
 import de.kuschku.util.observables.lists.ObservableComparableSortedList;
 
@@ -48,22 +47,64 @@ public class BacklogFilter implements UICallback {
     @NonNull
     private final ObservableComparableSortedList<Message> filtered;
 
-    @NonNull
-    private final Set<Message.Type> filteredTypes = new HashSet<>();
     private final EventBus bus = new EventBus();
     @Nullable
     private CharSequence searchQuery;
 
+    private Message markerlineMessage;
+
     public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableComparableSortedList<Message> unfiltered, @NonNull ObservableComparableSortedList<Message> filtered) {
         this.client = client;
         this.bufferId = bufferId;
         this.unfiltered = unfiltered;
         this.filtered = filtered;
         this.bus.register(this);
-        setFiltersInternal(client.metaDataManager().hiddendata(client.coreId(), bufferId));
+        client.bufferSyncer().getFilteredTypes(bufferId).addCallback(new ElementCallback<Message.Type>() {
+            @Override
+            public void notifyItemInserted(Message.Type element) {
+                bus.post(new UpdateRemoveEvent());
+            }
+
+            @Override
+            public void notifyItemRemoved(Message.Type element) {
+                bus.post(new UpdateAddEvent());
+            }
+
+            @Override
+            public void notifyItemChanged(Message.Type element) {
+
+            }
+        });
         updateDayChangeMessages();
     }
 
+    private Message createMarkerlineMessage(int id) {
+        return Message.create(
+                id,
+                null,
+                Message.Type.Markerline,
+                new Message.Flags((byte) 0x00),
+                BufferInfo.create(
+                        bufferId,
+                        -1,
+                        BufferInfo.Type.INVALID,
+                        -1,
+                        null
+                ),
+                null,
+                null
+        );
+    }
+
+    public void setMarkerlineMessage(int id) {
+        /*
+        Message markerlineMessage = this.markerlineMessage;
+        bus.post(new MessageRemoveEvent(markerlineMessage));
+        this.markerlineMessage = createMarkerlineMessage(id);
+        bus.post(new MessageInsertEvent(this.markerlineMessage));
+        */
+    }
+
     @Override
     public void notifyItemInserted(int position) {
         Message message = unfiltered.get(position);
@@ -131,21 +172,11 @@ public class BacklogFilter implements UICallback {
         QNetwork network = client.networkManager().network(client.bufferManager().buffer(message.bufferInfo.id).getInfo().networkId);
         assertNotNull(network);
         boolean ignored = client.ignoreListManager() != null && client.ignoreListManager().matches(message, network);
-        boolean filtered = filteredTypes.contains(message.type);
+        boolean filtered = client.bufferSyncer().getFilteredTypes(bufferId).contains(message.type);
         boolean isSearching = searchQuery != null && searchQuery.length() != 0;
         return ignored || filtered || (isSearching && !message.content.contains(searchQuery));
     }
 
-    public void addFilter(Message.Type type) {
-        filteredTypes.add(type);
-        bus.post(new UpdateRemoveEvent());
-    }
-
-    public void removeFilter(Message.Type type) {
-        filteredTypes.remove(type);
-        bus.post(new UpdateAddEvent());
-    }
-
     public void update() {
         bus.post(new UpdateAddEvent());
         bus.post(new UpdateRemoveEvent());
@@ -182,16 +213,11 @@ public class BacklogFilter implements UICallback {
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onEventMainThread(@NonNull MessageInsertEvent event) {
         filtered.add(event.msg);
-        client.bufferSyncer().addActivity(event.msg);
-        if (event.msg.type != Message.Type.DayChange)
-            updateDayChangeMessages();
     }
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onEventMainThread(@NonNull MessageRemoveEvent event) {
         filtered.remove(event.msg);
-        if (event.msg.type != Message.Type.DayChange)
-            updateDayChangeMessages();
     }
 
     @Override
@@ -230,37 +256,6 @@ public class BacklogFilter implements UICallback {
         }
     }
 
-    public int getFilters() {
-        int filters = 0x00000000;
-        for (Message.Type type : filteredTypes) {
-            filters |= type.value;
-        }
-        return filters;
-    }
-
-    public void setFilters(int filters) {
-        setFiltersInternal(filters);
-        client.metaDataManager().setHiddendata(client.coreId(), bufferId, filters);
-        int after = client.metaDataManager().hiddendata(client.coreId(), bufferId);
-    }
-
-    private void setFiltersInternal(int filters) {
-        Set<Message.Type> removed = new HashSet<>();
-        for (Message.Type type : filteredTypes) {
-            if ((filters & type.value) == 0)
-                removed.add(type);
-        }
-        for (Message.Type type : removed) {
-            removeFilter(type);
-        }
-
-        for (Message.Type type : Message.Type.values()) {
-            if ((filters & type.value) != 0) {
-                addFilter(type);
-            }
-        }
-    }
-
     private class MessageInsertEvent {
         public final Message msg;
 
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java b/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java
deleted file mode 100644
index ff0e7e0d4..000000000
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * QuasselDroid - Quassel client for Android
- * Copyright (C) 2016 Janne Koschinski
- * Copyright (C) 2016 Ken Børge Viktil
- * Copyright (C) 2016 Magnus Fjell
- * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation, either version 3 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package de.kuschku.libquassel.localtypes;
-
-import android.support.annotation.NonNull;
-import android.util.SparseArray;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import de.kuschku.libquassel.client.Client;
-import de.kuschku.libquassel.message.Message;
-import de.kuschku.util.observables.lists.ObservableComparableSortedList;
-
-public class NotificationManager {
-    @NonNull
-    private final SparseArray<ObservableComparableSortedList<Message>> notifications = new SparseArray<>();
-    @NonNull
-    private final List<HighlightRule> highlights = new ArrayList<>();
-    @NonNull
-    private final Client client;
-
-    public NotificationManager(@NonNull Client client) {
-        this.client = client;
-    }
-
-    @NonNull
-    public ObservableComparableSortedList<Message> getNotifications(int bufferid) {
-        if (notifications.get(bufferid) == null)
-            notifications.put(bufferid, new ObservableComparableSortedList<>(Message.class));
-
-        return notifications.get(bufferid);
-    }
-
-    public void init(int id) {
-        notifications.put(id, new ObservableComparableSortedList<>(Message.class));
-    }
-
-    public void receiveMessage(@NonNull Message message) {
-        if (checkMessage(message)) {
-            getNotifications(message.bufferInfo.id).add(message);
-        }
-    }
-
-    public boolean checkMessage(@NonNull Message message) {
-        return false;
-    }
-
-    public void receiveMessages(@NonNull List<Message> messages) {
-        for (Message message : messages) {
-            receiveMessage(message);
-        }
-    }
-
-    private class HighlightRule {
-        public final Pattern rule;
-        public final Pattern channelRule;
-        public final boolean invertChannelRule;
-        public final boolean caseSensitive;
-
-        public HighlightRule(@NonNull String rule, @NonNull String channelRule, boolean invertChannelRule, boolean caseSensitive) {
-            this.rule = rule.isEmpty() ? Pattern.compile(".*") : Pattern.compile(rule);
-            this.channelRule = channelRule.isEmpty() ? Pattern.compile(".*") : Pattern.compile(channelRule);
-            this.invertChannelRule = invertChannelRule;
-            this.caseSensitive = caseSensitive;
-        }
-
-        public boolean matches(@NonNull String message, @NonNull String channelName) {
-            return (invertChannelRule ^ channelRule.matcher(channelName).matches() && rule.matcher(message).matches());
-        }
-    }
-}
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java
index 32418578b..d215a841f 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java
@@ -59,4 +59,6 @@ public interface BacklogStorage {
     void clear(@IntRange(from = 0) int bufferid);
 
     Set<BacklogFilter> getFilters();
+
+    void setMarkerLine(@IntRange(from = 0) int buffer, int msgId);
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java
index c85e01f8c..61612c57e 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java
@@ -28,8 +28,6 @@ import android.util.SparseArray;
 
 import com.raizlabs.android.dbflow.config.FlowManager;
 import com.raizlabs.android.dbflow.sql.language.SQLite;
-import com.raizlabs.android.dbflow.structure.database.DatabaseWrapper;
-import com.raizlabs.android.dbflow.structure.database.transaction.ITransaction;
 
 import java.util.HashSet;
 import java.util.List;
@@ -86,40 +84,34 @@ public class HybridBacklogStorage implements BacklogStorage {
 
     @Override
     public void insertMessages(@IntRange(from = 0) int bufferId, @NonNull Message... messages) {
-        ensureExisting(bufferId);
-        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(new ITransaction() {
-            @Override
-            public void execute(DatabaseWrapper databaseWrapper) {
-                for (Message message : messages) {
-                    client.unbufferBuffer(message.bufferInfo);
-                    synchronized (backlogs) {
-                        if (backlogs.get(bufferId) != null)
-                            backlogs.get(bufferId).add(message);
-                        message.save();
-                        message.bufferInfo.save();
-                    }
-                    updateLatest(message);
+        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(databaseWrapper -> {
+            for (Message message : messages) {
+                client.unbufferBuffer(message.bufferInfo);
+                synchronized (backlogs) {
+                    if (backlogs.get(bufferId) != null)
+                        backlogs.get(bufferId).add(message);
+                    client.bufferSyncer().addActivity(message);
+                    message.save();
+                    message.bufferInfo.save();
                 }
+                updateLatest(message);
             }
         });
     }
 
     @Override
     public void insertMessages(@IntRange(from = 0) int bufferId, List<Message> messages) {
-        ensureExisting(bufferId);
-        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(new ITransaction() {
-            @Override
-            public void execute(DatabaseWrapper databaseWrapper) {
-                for (Message message : messages) {
-                    client.unbufferBuffer(message.bufferInfo);
-                    synchronized (backlogs) {
-                        if (backlogs.get(bufferId) != null)
-                            backlogs.get(bufferId).add(message);
-                        message.save();
-                        message.bufferInfo.save();
-                    }
-                    updateLatest(message);
+        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(databaseWrapper -> {
+            for (Message message : messages) {
+                client.unbufferBuffer(message.bufferInfo);
+                synchronized (backlogs) {
+                    if (backlogs.get(bufferId) != null)
+                        backlogs.get(bufferId).add(message);
+                    client.bufferSyncer().addActivity(message);
+                    message.save();
+                    message.bufferInfo.save();
                 }
+                updateLatest(message);
             }
         });
     }
@@ -132,38 +124,34 @@ public class HybridBacklogStorage implements BacklogStorage {
 
     @Override
     public void insertMessages(@NonNull Message... messages) {
-        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(new ITransaction() {
-            @Override
-            public void execute(DatabaseWrapper databaseWrapper) {
-                for (Message message : messages) {
-                    client.unbufferBuffer(message.bufferInfo);
-                    synchronized (backlogs) {
-                        if (backlogs.get(message.bufferInfo.id) != null)
-                            backlogs.get(message.bufferInfo.id).add(message);
-                        message.save();
-                        message.bufferInfo.save();
-                    }
-                    updateLatest(message);
+        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(databaseWrapper -> {
+            for (Message message : messages) {
+                client.unbufferBuffer(message.bufferInfo);
+                synchronized (backlogs) {
+                    if (backlogs.get(message.bufferInfo.id) != null)
+                        backlogs.get(message.bufferInfo.id).add(message);
+                    client.bufferSyncer().addActivity(message);
+                    message.save();
+                    message.bufferInfo.save();
                 }
+                updateLatest(message);
             }
         });
     }
 
     @Override
     public void insertMessages(List<Message> messages) {
-        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(new ITransaction() {
-            @Override
-            public void execute(DatabaseWrapper databaseWrapper) {
-                for (Message message : messages) {
-                    client.unbufferBuffer(message.bufferInfo);
-                    synchronized (backlogs) {
-                        if (backlogs.get(message.bufferInfo.id) != null)
-                            backlogs.get(message.bufferInfo.id).add(message);
-                        message.save();
-                        message.bufferInfo.save();
-                    }
-                    updateLatest(message);
+        FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(databaseWrapper -> {
+            for (Message message : messages) {
+                client.unbufferBuffer(message.bufferInfo);
+                synchronized (backlogs) {
+                    if (backlogs.get(message.bufferInfo.id) != null)
+                        backlogs.get(message.bufferInfo.id).add(message);
+                    client.bufferSyncer().addActivity(message);
+                    message.save();
+                    message.bufferInfo.save();
                 }
+                updateLatest(message);
             }
         });
     }
@@ -200,12 +188,29 @@ public class HybridBacklogStorage implements BacklogStorage {
         return filterSet;
     }
 
+    @Override
+    public void setMarkerLine(@IntRange(from = 0) int buffer, int msgId) {
+        BacklogFilter filter = filters.get(buffer);
+        if (filter != null) {
+            Log.w("DEBUG", "Setting markerline for open buffer");
+            filter.setMarkerlineMessage(msgId);
+        } else {
+            Log.w("DEBUG", "Buffer not open");
+        }
+    }
+
     private void ensureExisting(@IntRange(from = -1) int bufferId) {
         assertNotNull(client);
         if (backlogs.get(bufferId) == null) {
             ObservableComparableSortedList<Message> messages = new ObservableComparableSortedList<>(Message.class, true);
             ObservableComparableSortedList<Message> filteredMessages = new ObservableComparableSortedList<>(Message.class, true);
             BacklogFilter backlogFilter = new BacklogFilter(client, bufferId, messages, filteredMessages);
+            if (client.bufferSyncer() != null) {
+                backlogFilter.setMarkerlineMessage(client.bufferSyncer().markerLine(bufferId));
+                Log.w("DEBUG", "Setting markerline for newly opened buffer");
+            } else {
+                Log.w("DEBUG", "BufferSyncer is null!");
+            }
             messages.addCallback(backlogFilter);
             synchronized (backlogs) {
                 List<Message> messageList = SQLite.select().from(Message.class).where(Message_Table.bufferInfo_id.eq(bufferId)).queryList();
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
index f90033596..162909106 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
@@ -32,11 +32,10 @@ import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
 public class ChannelBuffer implements Buffer {
     @NonNull
     private final Client client;
+    private final ObservableField<BufferInfo.BufferStatus> status = new ObservableField<>();
     @NonNull
     private BufferInfo info;
 
-    private ObservableField<BufferInfo.BufferStatus> status = new ObservableField<>();
-
     public ChannelBuffer(@NonNull BufferInfo info, @NonNull Client client) {
         this.info = info;
         this.client = client;
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
index a87f00a1f..5b3fc8d9a 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
@@ -32,11 +32,10 @@ import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
 public class QueryBuffer implements Buffer {
     @NonNull
     private final Client client;
+    private final ObservableField<BufferInfo.BufferStatus> status = new ObservableField<>();
     @NonNull
     private BufferInfo info;
 
-    private ObservableField<BufferInfo.BufferStatus> status = new ObservableField<>();
-
     public QueryBuffer(@NonNull BufferInfo info, @NonNull Client client) {
         this.info = info;
         this.client = client;
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
index bf87ac64d..fd3158ee5 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
@@ -32,9 +32,9 @@ import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 public class StatusBuffer implements Buffer {
     @NonNull
     private final Client client;
+    private final ObservableField<BufferInfo.BufferStatus> status = new ObservableField<>();
     @NonNull
     private BufferInfo info;
-    private ObservableField<BufferInfo.BufferStatus> status = new ObservableField<>();
 
     public StatusBuffer(@NonNull BufferInfo info, @NonNull Client client) {
         this.info = info;
diff --git a/app/src/main/java/de/kuschku/libquassel/message/Message.java b/app/src/main/java/de/kuschku/libquassel/message/Message.java
index 99bd029dc..eb795a5b9 100644
--- a/app/src/main/java/de/kuschku/libquassel/message/Message.java
+++ b/app/src/main/java/de/kuschku/libquassel/message/Message.java
@@ -122,10 +122,18 @@ public class Message extends BaseModel implements ContentComparable<Message> {
 
     @Override
     public int compareTo(@NonNull Message another) {
-        if (this.type != Type.DayChange && another.type != Type.DayChange)
-            return this.id - another.id;
-        else
+        if (this.type == Type.DayChange || another.type == Type.DayChange) {
             return this.time.compareTo(another.time);
+        } else if (this.id == another.id) {
+            if (this.type == Type.Markerline)
+                return 1;
+            else if (another.type == Type.Markerline)
+                return -1;
+            else
+                return 0;
+        } else {
+            return this.id - another.id;
+        }
     }
 
     public enum Type {
@@ -146,7 +154,8 @@ public class Message extends BaseModel implements ContentComparable<Message> {
         Topic(0x04000),
         NetsplitJoin(0x08000),
         NetsplitQuit(0x10000),
-        Invite(0x20000);
+        Invite(0x20000),
+        Markerline(0x40000);
 
         public final int value;
 
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
index 953283f6f..b6fe16f83 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
@@ -256,9 +256,11 @@ public class QMetaTypeRegistry {
         return result;
     }
 
-    @NonNull
-    public static <T> QMetaType<T> getTypeByObject(@NonNull T type) {
-        if (type instanceof Void) return getMetaTypeByType(QMetaType.Type.Void);
+    @Nullable
+    public static <T> QMetaType<T> getTypeByObject(@Nullable T type) {
+        if (type == null)
+            return null;
+        else if (type instanceof Void) return getMetaTypeByType(QMetaType.Type.Void);
         else if (type instanceof Boolean)
             return getMetaTypeByType(QMetaType.Type.Bool);
         else if (type instanceof Integer)
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java
index 018faf12f..3a55c3c24 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java
@@ -37,11 +37,9 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
 public class UserTypeSerializer<T> implements PrimitiveSerializer<T> {
     @NonNull
     private final ObjectSerializer<T> objectSerializer;
-    private final String type;
 
     public UserTypeSerializer(@NonNull ObjectSerializer<T> objectSerializer, String type) {
         this.objectSerializer = objectSerializer;
-        this.type = type;
     }
 
     @Override
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/types/QVariant.java b/app/src/main/java/de/kuschku/libquassel/primitives/types/QVariant.java
index 3e3e1df20..b4de80848 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/types/QVariant.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/types/QVariant.java
@@ -35,9 +35,10 @@ import de.kuschku.libquassel.syncables.types.interfaces.QSyncableObject;
 public class QVariant<T> {
     @Nullable
     public final T data;
-    @NonNull
+    @Nullable
     public final QMetaType<T> type;
 
+    @SuppressWarnings("unchecked")
     public QVariant(@NonNull T data) {
         if (data instanceof Set) {
             this.data = (T) new ArrayList((Set) data);
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java
index ca3142bd7..1f3b3f625 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java
@@ -139,6 +139,7 @@ public abstract class SyncableObject<T> extends GeneralObservable<T> implements
         this.initialized = true;
     }
 
+    @SuppressWarnings("unchecked")
     public void _update() {
         notifyChanged((T) this);
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java
index 6474e4b3d..5a7e91dc0 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java
@@ -21,6 +21,8 @@
 
 package de.kuschku.libquassel.syncables.types.abstracts;
 
+import android.support.annotation.NonNull;
+
 import java.util.List;
 
 import de.kuschku.libquassel.message.Message;
@@ -38,7 +40,7 @@ public abstract class ABacklogManager extends SyncableObject<QBacklogManager> im
     }
 
     @Override
-    public void receiveBacklog(int id, int first, int last, int limit, int additional, List<Message> messages) {
+    public void receiveBacklog(int id, int first, int last, int limit, int additional, @NonNull List<Message> messages) {
         _receiveBacklog(id, first, last, limit, additional, messages);
         sync("receiveBacklog", new String[]{"BufferId", "MsgId", "MsgId", intName, intName}, new Object[]{id, first, last, limit, additional, messages});
     }
@@ -50,7 +52,7 @@ public abstract class ABacklogManager extends SyncableObject<QBacklogManager> im
     }
 
     @Override
-    public void receiveBacklogAll(int first, int last, int limit, int additional, List<Message> messages) {
+    public void receiveBacklogAll(int first, int last, int limit, int additional, @NonNull List<Message> messages) {
         _receiveBacklogAll(first, last, limit, additional, messages);
         sync("receiveBacklogAll", new String[]{"MsgId", "MsgId", intName, intName}, new Object[]{first, last, limit, additional, messages});
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java
index e96bcb9ea..fa128a1a7 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java
@@ -41,7 +41,6 @@ import de.kuschku.libquassel.localtypes.BacklogFilter;
 import de.kuschku.libquassel.localtypes.backlogstorage.BacklogStorage;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.message.Message_Table;
-import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.abstracts.ABacklogManager;
 import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager;
@@ -136,10 +135,9 @@ public class BacklogManager extends ABacklogManager {
         assertNotNull(provider);
 
         Set<Integer> buffers = new HashSet<>();
+        storage.insertMessages(messages);
         for (Message message : messages) {
-            BufferInfo bufferInfo = message.bufferInfo;
-            storage.insertMessages(bufferInfo.id, message);
-            buffers.add(bufferInfo.id);
+            buffers.add(message.bufferInfo.id);
         }
         for (int id : buffers) {
             provider.sendEvent(new BacklogReceivedEvent(id));
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java
index c3068527e..915c6df82 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java
@@ -26,6 +26,7 @@ import android.support.annotation.NonNull;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import de.kuschku.libquassel.BusProvider;
@@ -38,6 +39,7 @@ import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferSyncer;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.util.observables.lists.ObservableComparableSortedList;
+import de.kuschku.util.observables.lists.ObservableSet;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -50,6 +52,8 @@ public class BufferSyncer extends ABufferSyncer {
     private SparseIntArray lastSeenMsgs = new SparseIntArray();
     @NonNull
     private SparseIntArray markerLines = new SparseIntArray();
+    @NonNull
+    private Map<Integer, ObservableSet<Message.Type>> filters = new HashMap<>();
 
     public BufferSyncer(@NonNull Map<Integer, Integer> lastSeenMsgs, @NonNull Map<Integer, Integer> markerLines) {
         assertNotNull(lastSeenMsgs);
@@ -99,9 +103,10 @@ public class BufferSyncer extends ABufferSyncer {
         if (msgId < 0)
             return;
 
-        int oldLastSeenMsg = markerLine(buffer);
-        if (oldLastSeenMsg < msgId) {
+        int oldMarkerline = markerLine(buffer);
+        if (oldMarkerline < msgId) {
             markerLines.put(buffer, msgId);
+            client.backlogStorage().setMarkerLine(buffer, msgId);
         }
         _update();
     }
@@ -128,8 +133,9 @@ public class BufferSyncer extends ABufferSyncer {
         for (QBufferViewConfig config : client.bufferViewManager().bufferViewConfigs()) {
             config.deleteBuffer(buffer);
         }
-        markerLines.removeAt(markerLines.indexOfKey(buffer));
-        lastSeenMsgs.removeAt(lastSeenMsgs.indexOfKey(buffer));
+        this.filters.remove(buffer);
+        markerLines.delete(buffer);
+        lastSeenMsgs.delete(buffer);
         client.bufferManager().removeBuffer(buffer);
         _update();
     }
@@ -237,9 +243,11 @@ public class BufferSyncer extends ABufferSyncer {
     }
 
     public void addActivity(@NonNull Message message) {
-        int lastSeenMsg = lastSeenMsg(message.bufferInfo.id);
-        if (message.id > lastSeenMsg) {
-            addActivity(message.bufferInfo.id, message.type);
+        int bufferId = message.bufferInfo.id;
+        int lastSeenMsg = lastSeenMsg(bufferId);
+        boolean filtered = getFilteredTypes(bufferId).contains(message.type);
+        if (!filtered && message.id > lastSeenMsg) {
+            addActivity(bufferId, message.type);
         }
     }
 
@@ -252,4 +260,34 @@ public class BufferSyncer extends ABufferSyncer {
     public SparseIntArray markerLines() {
         return markerLines;
     }
+
+    @Override
+    public ObservableSet<Message.Type> getFilteredTypes(int bufferId) {
+        if (!this.filters.containsKey(bufferId)) {
+            this.filters.put(bufferId, new ObservableSet<>());
+            setFilters(bufferId, client.metaDataManager().hiddendata(client.coreId(), bufferId));
+        }
+        return this.filters.get(bufferId);
+    }
+
+    @Override
+    public int getFilters(int bufferId) {
+        int filters = 0x00000000;
+        for (Message.Type type : getFilteredTypes(bufferId)) {
+            filters |= type.value;
+        }
+        return filters;
+    }
+
+    @Override
+    public void setFilters(int bufferId, int filters) {
+        client.metaDataManager().setHiddendata(client.coreId(), bufferId, filters);
+        for (Message.Type type : Message.Type.values()) {
+            if ((filters & type.value) != 0) {
+                getFilteredTypes(bufferId).add(type);
+            } else {
+                getFilteredTypes(bufferId).remove(type);
+            }
+        }
+    }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java
index ad89470fb..260db1f7f 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java
@@ -449,7 +449,7 @@ public class BufferViewConfig extends ABufferViewConfig {
     public void deleteBuffer(int bufferId) {
         visibleBufferIds.remove(bufferId);
         allBufferIds.remove(bufferId);
-        buffers.remove(buffers.indexOf(bufferId));
+        buffers.remove((Integer) bufferId);
         temporarilyRemovedBuffers.remove(bufferId);
         removedBuffers.remove(bufferId);
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java
index aa7f95970..b210b665a 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java
@@ -42,8 +42,7 @@ public class BufferViewManager extends ABufferViewManager {
     @NonNull
     final
     Set<Integer> cachedIds = new HashSet<>();
-    Map<Integer, QBufferViewConfig> bufferViewConfigs = new HashMap<>();
-    ObservableSortedList<QBufferViewConfig> list = new ObservableSortedList<>(QBufferViewConfig.class, new ObservableSortedList.ItemComparator<QBufferViewConfig>() {
+    final ObservableSortedList<QBufferViewConfig> list = new ObservableSortedList<>(QBufferViewConfig.class, new ObservableSortedList.ItemComparator<QBufferViewConfig>() {
         @Override
         public int compare(QBufferViewConfig o1, QBufferViewConfig o2) {
             return o1.bufferViewName().compareTo(o2.bufferViewName());
@@ -59,10 +58,8 @@ public class BufferViewManager extends ABufferViewManager {
             return item1.bufferViewId() == item2.bufferViewId();
         }
     });
-
-    private GeneralCallback<QBufferViewConfig> observer = config -> {
-        list.notifyItemChanged(list.indexOf(config));
-    };
+    private final GeneralCallback<QBufferViewConfig> observer = config -> list.notifyItemChanged(list.indexOf(config));
+    Map<Integer, QBufferViewConfig> bufferViewConfigs = new HashMap<>();
 
     public BufferViewManager(@NonNull List<Integer> bufferViewIds) {
         cachedIds.addAll(bufferViewIds);
@@ -86,6 +83,7 @@ public class BufferViewManager extends ABufferViewManager {
                 list.remove(before);
 
             bufferViewConfigs.put(config.bufferViewId(), config);
+            config.init(String.valueOf(config.bufferViewId()), provider, client);
             list.add(config);
             config.addObserver(observer);
             _update();
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
index 255e542ca..2c8398e0f 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
@@ -26,6 +26,7 @@ import android.support.annotation.Nullable;
 
 import com.google.common.base.Joiner;
 
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -52,22 +53,22 @@ import de.kuschku.util.observables.lists.ObservableSet;
 import static de.kuschku.util.AndroidAssert.assertEquals;
 
 public class IrcChannel extends AIrcChannel {
-    private final String name;
     @NonNull
-    private final Map<String, Set<Character>> userModes = new HashMap<>();
-    private final ObservableSet<String> users = new ObservableSet<>();
+    public final Map<Character, List<String>> A_channelModes = new HashMap<>();
     @NonNull
-    public Map<Character, List<String>> A_channelModes = new HashMap<>();
+    public final Map<Character, String> B_channelModes = new HashMap<>();
     @NonNull
-    public Map<Character, String> B_channelModes = new HashMap<>();
+    public final Map<Character, String> C_channelModes = new HashMap<>();
+    private final String name;
     @NonNull
-    public Map<Character, String> C_channelModes = new HashMap<>();
+    private final Map<String, Set<Character>> userModes = new HashMap<>();
+    private final ObservableSet<String> users = new ObservableSet<>();
     @NonNull
     public Set<Character> D_channelModes = new HashSet<>();
     private String topic;
     private String password;
     private boolean encrypted;
-    private QNetwork network;
+    private WeakReference<QNetwork> network = new WeakReference<>(null);
     private String codecForEncoding;
     private String codecForDecoding;
     // Because we don’t have networks at the beginning yet
@@ -130,7 +131,7 @@ public class IrcChannel extends AIrcChannel {
 
     @Override
     public QNetwork network() {
-        return network;
+        return network.get();
     }
 
     @NonNull
@@ -431,7 +432,7 @@ public class IrcChannel extends AIrcChannel {
     @Override
     public void init(QNetwork network, Client client) {
         this.client = client;
-        this.network = network;
+        this.network = new WeakReference<>(network);
 
 
         /* TODO: Use just the nick in userModes and users instead – that should make sync things a lot easier */
@@ -468,7 +469,10 @@ public class IrcChannel extends AIrcChannel {
         cachedUserModes = null;
         cachedChanModes = null;
 
-        this.network._addIrcChannel(this);
+
+        QNetwork qNetwork = this.network.get();
+        if (qNetwork != null)
+            qNetwork._addIrcChannel(this);
         _update();
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java
index 26e66fb45..9c3840c4d 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java
@@ -27,6 +27,7 @@ import android.util.SparseArray;
 
 import org.joda.time.DateTime;
 
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -53,7 +54,7 @@ public class IrcUser extends AIrcUser {
     @NonNull
     private final SparseArray<DateTime> lastSpokenTo = new SparseArray<>();
     private final List<String> cachedChannels;
-    private final Set<QIrcChannel> channels = new HashSet<>();
+    private final Set<String> channels = new HashSet<>();
     private String user;
     private String host;
     private String nick;
@@ -69,7 +70,7 @@ public class IrcUser extends AIrcUser {
     private String whoisServiceReply;
     private String suserHost;
     private boolean encrypted;
-    private QNetwork network;
+    private WeakReference<QNetwork> network = new WeakReference<>(null);
     private Set<Character> userModes;
 
     public IrcUser(String server, String ircOperator, boolean away, int lastAwayMessage, DateTime idleTime, String whoisServiceReply, String suserHost, String nick, String realName, String account, String awayMessage, DateTime loginTime, boolean encrypted, List<String> channels, String host, String userModes, String user) {
@@ -212,7 +213,7 @@ public class IrcUser extends AIrcUser {
 
     @Override
     public QNetwork network() {
-        return network;
+        return network.get();
     }
 
     @NonNull
@@ -225,8 +226,8 @@ public class IrcUser extends AIrcUser {
     @Override
     public List<String> channels() {
         List<String> chanList = new ArrayList<>(channels.size());
-        for (QIrcChannel channel : channels) {
-            chanList.add(channel.name());
+        for (String channel : channels) {
+            chanList.add(channel);
         }
         return chanList;
     }
@@ -379,8 +380,8 @@ public class IrcUser extends AIrcUser {
 
     @Override
     public void _joinChannel(@NonNull QIrcChannel channel, boolean skip_channel_join) {
-        if (!channels.contains(channel)) {
-            channels.add(channel);
+        if (!channels.contains(channel.name())) {
+            channels.add(channel.name());
             if (!skip_channel_join)
                 channel._joinIrcUser(this);
         }
@@ -421,12 +422,15 @@ public class IrcUser extends AIrcUser {
 
     @Override
     public void _quit() {
-        List<QIrcChannel> channels = new ArrayList<>(this.channels);
+        List<String> channels = new ArrayList<>(this.channels);
         this.channels.clear();
-        for (QIrcChannel channel : channels) {
-            channel._part(this);
+        QNetwork network = network();
+        if (network != null) {
+            for (String channel : channels) {
+                network.ircChannel(channel)._part(this);
+            }
+            network._removeIrcUser(this);
         }
-        network()._removeIrcUser(this);
         _update();
     }
 
@@ -450,12 +454,13 @@ public class IrcUser extends AIrcUser {
 
     @Override
     public void init(QNetwork network, Client client) {
-        this.network = network;
+        this.network = new WeakReference<>(network);
         this.client = client;
 
         if (cachedChannels != null)
             for (String channelName : cachedChannels) {
-                channels.add(network().newIrcChannel(channelName));
+                network().newIrcChannel(channelName);
+                channels.add(channelName);
             }
         _update();
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java
index 65173f84d..2083fa977 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java
@@ -80,7 +80,7 @@ public class Network extends ANetwork implements Observer {
                    String myNick, NetworkInfo networkInfo) {
         this.channels = new HashMap<>(channels);
         this.nicks = new HashMap<>(nicks);
-        this.supports = supports;
+        this.supports = new HashMap<>(supports);
         this.connectionState = ConnectionState.of(connectionState);
         this.currentServer = currentServer;
         this.isConnected = isConnected;
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java
index 3868be202..2cba3c903 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java
@@ -26,6 +26,7 @@ import android.util.SparseIntArray;
 
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.syncables.Synced;
+import de.kuschku.util.observables.lists.ObservableSet;
 
 public interface QBufferSyncer extends QObservable<QBufferSyncer> {
     int lastSeenMsg(int buffer);
@@ -111,4 +112,10 @@ public interface QBufferSyncer extends QObservable<QBufferSyncer> {
     SparseIntArray lastSeenMsgs();
 
     SparseIntArray markerLines();
+
+    ObservableSet<Message.Type> getFilteredTypes(int bufferId);
+
+    void setFilters(int bufferId, int filters);
+
+    int getFilters(int bufferId);
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java
index 75e2e59f8..846928d1b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java
@@ -27,6 +27,8 @@ import android.content.Context;
 import com.raizlabs.android.dbflow.config.FlowConfig;
 import com.raizlabs.android.dbflow.config.FlowManager;
 
+import net.danlew.android.joda.JodaTimeAndroid;
+
 import org.acra.ACRA;
 import org.acra.ReportField;
 import org.acra.ReportingInteractionMode;
@@ -63,9 +65,11 @@ public class QuasselDroidNG extends Application {
 
         ACRA.init(this);
 
-        applicationContext = getApplicationContext();
-
         FlowManager.init(new FlowConfig.Builder(this).build());
         FlowManager.getDatabase(ConnectedDatabase.class).getWritableDatabase();
+
+        JodaTimeAndroid.init(this);
+
+        applicationContext = getApplicationContext();
     }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java
index 54ebdc7f3..e86420ffe 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java
@@ -38,12 +38,10 @@ import de.kuschku.util.backports.Consumer;
 public class QuasselService extends Service {
     @NonNull
     private final IBinder binder = new LocalBinder();
-
+    private final Set<Consumer<ClientBackgroundThread>> consumers = new HashSet<>();
     @Nullable
     private ClientBackgroundThread bgThread;
 
-    private Set<Consumer<ClientBackgroundThread>> consumers = new HashSet<>();
-
     @Override
     public IBinder onBind(Intent intent) {
         return binder;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/LoginActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/LoginActivity.java
index 3091ec2b6..18a00057c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/LoginActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/LoginActivity.java
@@ -38,7 +38,7 @@ public class LoginActivity extends AppCompatActivity {
         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
     }
 
-    private AppContext context = new AppContext();
+    private final AppContext context = new AppContext();
 
     private boolean firstStart = true;
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java
index 55771c399..34c679c3e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java
@@ -33,7 +33,7 @@ import java.util.Set;
 
 public class ViewIntBinder {
     private final ObservableInt field;
-    private Set<Observable.OnPropertyChangedCallback> callbacks = new HashSet<>();
+    private final Set<Observable.OnPropertyChangedCallback> callbacks = new HashSet<>();
 
     public ViewIntBinder(ObservableInt field) {
         this.field = field;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java
index dfe270e47..85fe0971c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java
@@ -37,19 +37,15 @@ import java.util.Set;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager;
 import de.kuschku.quasseldroid_ng.R;
-import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 import de.kuschku.util.observables.callbacks.GeneralCallback;
 
-public class BufferViewConfigSpinnerAdapter implements ThemedSpinnerAdapter, GeneralCallback {
-    private final AppContext context;
+public class BufferViewConfigSpinnerAdapter implements ThemedSpinnerAdapter, GeneralCallback<QBufferViewManager> {
     private final QBufferViewManager bufferViewManager;
+    private final Set<DataSetObserver> observers = new HashSet<>();
     @Nullable
     private Resources.Theme theme;
 
-    private Set<DataSetObserver> observers = new HashSet<>();
-
-    public BufferViewConfigSpinnerAdapter(AppContext context, QBufferViewManager bufferViewManager) {
-        this.context = context;
+    public BufferViewConfigSpinnerAdapter(QBufferViewManager bufferViewManager) {
         this.bufferViewManager = bufferViewManager;
         this.bufferViewManager.addObserver(this);
     }
@@ -136,7 +132,7 @@ public class BufferViewConfigSpinnerAdapter implements ThemedSpinnerAdapter, Gen
     }
 
     @Override
-    public void notifyChanged(Object o) {
+    public void notifyChanged(QBufferViewManager o) {
         for (DataSetObserver observer : observers) {
             observer.onChanged();
         }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java
index bb18a24a7..376f7b640 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java
@@ -68,7 +68,6 @@ import de.kuschku.libquassel.events.GeneralErrorEvent;
 import de.kuschku.libquassel.events.LoginRequireEvent;
 import de.kuschku.libquassel.events.UnknownCertificateEvent;
 import de.kuschku.libquassel.functions.types.HandshakeFunction;
-import de.kuschku.libquassel.localtypes.BacklogFilter;
 import de.kuschku.libquassel.localtypes.buffers.Buffer;
 import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer;
 import de.kuschku.libquassel.localtypes.buffers.QueryBuffer;
@@ -104,33 +103,27 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 public class MainActivity extends BoundActivity {
     public static final int REQUEST_CODE_CORESETUP = 1;
+    /**
+     * This object encapsulates the current status of the activity – opened bufferview, for example
+     */
+    private final Status status = new Status();
     /**
      * Host layout for content fragment, for example showing a loader or the chat
      */
     @Bind(R.id.chatList)
     RecyclerView chatList;
-
     @Bind(R.id.chatListSpinner)
     AppCompatSpinner chatListSpinner;
-
     @Bind(R.id.chatListToolbar)
     Toolbar chatListToolbar;
-
     @Nullable
     @Bind(R.id.drawer_layout)
     DrawerLayout drawerLayout;
-
     /**
      * Main ActionBar
      */
     @Bind(R.id.toolbar)
     Toolbar toolbar;
-
-    /**
-     * This object encapsulates the current status of the activity – opened bufferview, for example
-     */
-    private Status status = new Status();
-
     private AccountManager manager;
 
     private ToolbarWrapper toolbarWrapper;
@@ -255,12 +248,22 @@ public class MainActivity extends BoundActivity {
                 .debounce(400, TimeUnit.MILLISECONDS)
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(charSequence -> {
-                    if (context.client() != null)
+                    if (context.client() != null && context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED)
                         context.client().backlogStorage().getFilter(context.client().backlogManager().open()).setQuery(charSequence);
                 });
         return super.onCreateOptionsMenu(menu);
     }
 
+    @Override
+    protected void onDestroy() {
+        chatListAdapter.selectConfig(-1);
+        toolbarWrapper.setOnClickListener(null);
+        chatListAdapter.setBufferClickListener(null);
+        chatListSpinner.setOnItemSelectedListener(null);
+        chatListToolbar.setOnMenuItemClickListener(null);
+        super.onDestroy();
+    }
+
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
@@ -417,7 +420,7 @@ public class MainActivity extends BoundActivity {
 
         context.client().backlogManager().open(status.bufferId);
         if (context.client().bufferViewManager() != null) {
-            chatListSpinner.setAdapter(new BufferViewConfigSpinnerAdapter(context, context.client().bufferViewManager()));
+            chatListSpinner.setAdapter(new BufferViewConfigSpinnerAdapter(context.client().bufferViewManager()));
             chatListSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                 @Override
                 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
@@ -451,8 +454,8 @@ public class MainActivity extends BoundActivity {
                 filterSettingsInts[i] = filterSettings.get(i);
             }
 
-            BacklogFilter backlogFilter = context.client().backlogManager().filter(context.client().backlogManager().open());
-            int oldFilters = backlogFilter.getFilters();
+            int bufferId = context.client().backlogManager().open();
+            int oldFilters = context.client().bufferSyncer().getFilters(bufferId);
             List<Integer> oldFiltersList = new ArrayList<>();
             for (int type : filterSettings) {
                 if ((type & oldFilters) != 0)
@@ -486,7 +489,7 @@ public class MainActivity extends BoundActivity {
                                 else if (settingsid == Message.Type.Join.value)
                                     filters |= Message.Type.NetsplitJoin.value;
                             }
-                        backlogFilter.setFilters(filters);
+                        context.client().bufferSyncer().setFilters(bufferId, filters);
                     })
                     .negativeColor(context.themeUtil().res.colorForeground)
                     .backgroundColor(context.themeUtil().res.colorBackgroundCard)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java
index 8a58e12f5..028db19ee 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java
@@ -21,7 +21,6 @@
 
 package de.kuschku.quasseldroid_ng.ui.chat.chatview;
 
-import android.support.annotation.ColorInt;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.UiThread;
@@ -215,62 +214,82 @@ public class ChatMessageRenderer {
     }
 
     public void onBind(@NonNull MessageViewHolder holder, @NonNull Message message) {
-        holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
         switch (message.type) {
             case Plain:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindPlain(holder, message);
                 break;
             case Notice:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindNotice(holder, message);
                 break;
             case Action:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindAction(holder, message);
                 break;
             case Nick:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindNick(holder, message);
                 break;
             case Mode:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindMode(holder, message);
                 break;
             case Join:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindJoin(holder, message);
                 break;
             case Part:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindPart(holder, message);
                 break;
             case Quit:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindQuit(holder, message);
                 break;
             case Kick:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindKick(holder, message);
                 break;
             case Kill:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindKill(holder, message);
                 break;
             case Server:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindServer(holder, message);
                 break;
             case Info:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindInfo(holder, message);
                 break;
             case Error:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindError(holder, message);
                 break;
             case DayChange:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindDayChange(holder, message);
                 break;
             case Topic:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindTopic(holder, message);
                 break;
             case NetsplitJoin:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindNetsplitJoin(holder, message);
                 break;
             case NetsplitQuit:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindNetsplitQuit(holder, message);
                 break;
             case Invite:
+                holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time));
                 onBindInvite(holder, message);
                 break;
+            case Markerline:
+                holder.itemView.setBackgroundResource(R.color.md_red_700);
+                break;
         }
     }
 
@@ -299,28 +318,10 @@ public class ChatMessageRenderer {
             case NetsplitQuit:
             case Invite:
                 return R.layout.widget_chatmessage_server;
+            case Markerline:
+                return R.layout.widget_chatmessage_markerline;
             case Error:
                 return R.layout.widget_chatmessage_error;
         }
     }
-
-    private static class MessageStyleContainer {
-        public final
-        @ColorInt
-        int textColor;
-        public final int fontstyle;
-        public final
-        @ColorInt
-        int timeColor;
-        public final
-        @ColorInt
-        int bgColor;
-
-        public MessageStyleContainer(int textColor, int fontstyle, int timeColor, int bgColor) {
-            this.textColor = textColor;
-            this.fontstyle = fontstyle;
-            this.timeColor = timeColor;
-            this.bgColor = bgColor;
-        }
-    }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java
index dd692cde0..af4909d0f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java
@@ -35,15 +35,12 @@ import de.kuschku.util.observables.AutoScroller;
 import de.kuschku.util.observables.callbacks.UICallback;
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.observables.lists.IObservableList;
-import de.kuschku.util.observables.lists.ObservableComparableSortedList;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 @UiThread
 public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
-    @NonNull
-    private static final ObservableSortedList<Message> emptyList = new ObservableComparableSortedList<>(Message.class);
     @NonNull
     private final ChatMessageRenderer renderer;
     @NonNull
@@ -51,9 +48,9 @@ public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
     @NonNull
     private final UICallback callback;
     @NonNull
-    private IObservableList<UICallback, Message> messageList = emptyList();
-    @NonNull
-    private AppContext context;
+    private final AppContext context;
+    @Nullable
+    private IObservableList<UICallback, Message> messageList = null;
 
     public MessageAdapter(@NonNull Context ctx, @NonNull AppContext context, @Nullable AutoScroller scroller) {
         this.context = context;
@@ -62,15 +59,12 @@ public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
         this.callback = new AdapterUICallbackWrapper(this, scroller);
     }
 
-    @NonNull
-    public static ObservableSortedList<Message> emptyList() {
-        return emptyList;
-    }
-
-    public void setMessageList(@NonNull ObservableSortedList<Message> messageList) {
-        this.messageList.removeCallback(callback);
+    public void setMessageList(@Nullable ObservableSortedList<Message> messageList) {
+        if (this.messageList != null)
+            this.messageList.removeCallback(callback);
         this.messageList = messageList;
-        this.messageList.addCallback(callback);
+        if (this.messageList != null)
+            this.messageList.addCallback(callback);
         notifyDataSetChanged();
     }
 
@@ -100,10 +94,15 @@ public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
 
     @Override
     public int getItemCount() {
-        return messageList.size();
+        return messageList != null ? messageList.size() : 0;
     }
 
     public Message getItem(int position) {
-        return messageList.get(position);
+        return messageList != null ? messageList.get(position) : null;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return getItem(position).id;
     }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/ActionModeHandler.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/ActionModeHandler.java
index 7a790a1b2..a6db50475 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/ActionModeHandler.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/ActionModeHandler.java
@@ -37,8 +37,8 @@ import de.kuschku.quasseldroid_ng.R;
 public class ActionModeHandler implements MaterialCab.Callback {
     private final AppCompatActivity activity;
     private final MaterialCab cab;
-    private Set<Buffer> selectedChildren = new HashSet<>();
-    private Set<NetworkItem> selectedParents = new HashSet<>();
+    private final Set<Buffer> selectedChildren = new HashSet<>();
+    private final Set<NetworkItem> selectedParents = new HashSet<>();
     private Menu actionModeMenu;
 
     public ActionModeHandler(AppCompatActivity activity, @IdRes int stub) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java
index 30e9041a1..444821be6 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java
@@ -51,13 +51,9 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi
     private final ObservableSortedList<NetworkItem> items;
     private final Map<QNetwork, NetworkItem> itemMap = new WeakHashMap<>();
     private final Map<Integer, BufferViewHolder> bufferViewHolderMap = new WeakHashMap<>();
+    private final ObservableField<Boolean> showAll = new ObservableField<>(false);
     private QBufferViewConfig config;
-    private WeakReference<RecyclerView> recyclerView = new WeakReference<>(null);
-    private int open;
-    private OnBufferClickListener bufferClickListener;
-    private ObservableField<Boolean> showAll = new ObservableField<>(false);
-
-    private ElementCallback<QNetwork> callback = new ElementCallback<QNetwork>() {
+    private final ElementCallback<QNetwork> callback = new ElementCallback<QNetwork>() {
         @Override
         public void notifyItemInserted(QNetwork network) {
             NetworkItem networkItem = new NetworkItem(context, config, network, BufferViewConfigAdapter.this);
@@ -76,7 +72,9 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi
                 items.notifyItemChanged(items.indexOf(itemMap.get(network)));
         }
     };
-
+    private WeakReference<RecyclerView> recyclerView = new WeakReference<>(null);
+    private int open;
+    private OnBufferClickListener bufferClickListener;
     private ActionModeHandler actionModeHandler;
 
     private BufferViewConfigAdapter(AppContext context, ObservableSortedList<NetworkItem> items) {
@@ -247,8 +245,6 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi
         if (config != null)
             config.networkList().removeCallback(callback);
         config = newconfig;
-        if (config != null)
-            config.updateNetworks();
         items.clear();
         itemMap.clear();
         if (config != null) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java
index 2a342af27..30c84c57a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java
@@ -54,6 +54,8 @@ import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 
 public class BufferViewHolder extends ChildViewHolder {
 
+    private final AppContext context;
+    private final StateListDrawable background;
     public int id;
     @Bind(R.id.material_drawer_icon)
     ImageView icon;
@@ -67,11 +69,7 @@ public class BufferViewHolder extends ChildViewHolder {
     TextView description;
     private ObservableField<BufferInfo.BufferStatus> status;
     private Observable.OnPropertyChangedCallback callback;
-    private AppContext context;
     private ViewIntBinder viewIntBinder;
-
-    private StateListDrawable background;
-
     private boolean selected = false;
     private boolean checked = false;
 
@@ -124,7 +122,7 @@ public class BufferViewHolder extends ChildViewHolder {
     @NonNull
     private Function<Integer, Integer> colorFromActivityStatus(Buffer buffer) {
         return activities -> {
-            int filters = context.client().backlogManager().filter(buffer.getInfo().id).getFilters();
+            int filters = context.client().bufferSyncer().getFilters(buffer.getInfo().id);
             activities = activities & ~filters;
             if (0 != ((activities & Message.Type.Plain.value) | (activities & Message.Type.Notice.value) | (activities & Message.Type.Action.value)))
                 return context.themeUtil().res.colorTintMessage;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java
index 451d91655..88e7a4db3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java
@@ -22,7 +22,6 @@
 package de.kuschku.quasseldroid_ng.ui.chat.drawer;
 
 import android.databinding.Observable;
-import android.util.Log;
 
 import com.bignerdranch.expandablerecyclerview.Model.ParentListItem;
 
@@ -43,7 +42,6 @@ public class NetworkItem implements ParentListItem {
     private final AppContext context;
     private final QBufferViewConfig config;
     private final QNetwork network;
-    private final BufferViewConfigAdapter bufferViewConfigAdapter;
     private final ObservableSortedList<Buffer> buffers = new ObservableSortedList<>(Buffer.class, new ObservableSortedList.ItemComparator<Buffer>() {
         @Override
         public int compare(Buffer o1, Buffer o2) {
@@ -77,7 +75,7 @@ public class NetworkItem implements ParentListItem {
             return item1.getInfo().id == item2.getInfo().id;
         }
     });
-    private ElementCallback<Integer> callback = new ElementCallback<Integer>() {
+    private final ElementCallback<Integer> callback = new ElementCallback<Integer>() {
         @Override
         public void notifyItemInserted(Integer element) {
             Buffer buffer = context.client().bufferManager().buffer(element);
@@ -108,7 +106,6 @@ public class NetworkItem implements ParentListItem {
         this.context = context;
         this.config = config;
         this.network = network;
-        this.bufferViewConfigAdapter = bufferViewConfigAdapter;
         bufferViewConfigAdapter.showAll().addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
             @Override
             public void onPropertyChanged(Observable sender, int propertyId) {
@@ -119,9 +116,6 @@ public class NetworkItem implements ParentListItem {
         this.buffers.addCallback(new UICallback() {
             @Override
             public void notifyItemInserted(int position) {
-                Log.d("DEBUG", "Added item at " + position);
-                Log.d("DEBUG", String.valueOf(getChildItemList()));
-
                 bufferViewConfigAdapter.notifyChildItemInserted(NetworkItem.this, position);
             }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java
index 29d9e7401..2eac770c6 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java
@@ -41,6 +41,7 @@ import butterknife.ButterKnife;
 import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.events.BacklogReceivedEvent;
 import de.kuschku.libquassel.events.BufferChangeEvent;
+import de.kuschku.libquassel.events.ConnectionChangeEvent;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager;
 import de.kuschku.quasseldroid_ng.R;
@@ -67,11 +68,11 @@ public class ChatFragment extends BoundFragment {
     FloatingActionButton scrollDown;
 
     private MessageAdapter messageAdapter;
-    private LinearLayoutManager layoutManager;
     private SlidingPanelHandler slidingPanelHandler;
     private boolean loading = false;
 
     private int recyclerViewMeasuredHeight = 0;
+    private RecyclerView.OnScrollListener listener;
 
     @Nullable
     @Override
@@ -83,12 +84,11 @@ public class ChatFragment extends BoundFragment {
         assertNotNull(messages);
 
         messages.setItemAnimator(new DefaultItemAnimator());
-        layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, true);
-        messages.setLayoutManager(layoutManager);
+        messages.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, true));
         messageAdapter = new MessageAdapter(getActivity(), context, new AutoScroller(messages));
         messages.setAdapter(messageAdapter);
 
-        messages.addOnScrollListener(new RecyclerView.OnScrollListener() {
+        listener = new RecyclerView.OnScrollListener() {
             @Override
             public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                 if (!loading && !recyclerView.canScrollVertically(-1)) {
@@ -108,7 +108,8 @@ public class ChatFragment extends BoundFragment {
                 boolean smartVisibility = scrollDown.getVisibility() == View.VISIBLE || isMoreThanOneScreenFromBottom;
                 scrollDown.setVisibility((canScrollDown && isScrollingDown && smartVisibility) ? View.VISIBLE : View.GONE);
             }
-        });
+        };
+        messages.addOnScrollListener(listener);
 
         scrollDown.setOnClickListener(view1 -> messages.smoothScrollToPosition(0));
 
@@ -120,12 +121,11 @@ public class ChatFragment extends BoundFragment {
         setMarkerline();
 
         Client client = context.client();
-        if (client != null) {
+        if (client != null && client.connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) {
             QBacklogManager backlogManager = client.backlogManager();
             int id = backlogManager.open();
             ObservableComparableSortedList<Message> messageList = backlogManager.filtered(id);
             messageAdapter.setMessageList(messageList);
-            // Load markerline
         }
     }
 
@@ -135,7 +135,18 @@ public class ChatFragment extends BoundFragment {
         super.onPause();
     }
 
+    @Override
+    public void onDestroy() {
+        messageAdapter.setMessageList(null);
+        messages.removeOnScrollListener(listener);
+        scrollDown.setOnClickListener(null);
+        slidingPanelHandler.onDestroy();
+        super.onDestroy();
+    }
+
     private void setMarkerline() {
+        //int lastVisibleMessageId;
+        //context.client().bufferSyncer().setMarkerLine(context.client().backlogManager().open(), lastVisibleMessageId);
     }
 
     @Override
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java
index fe9a0158e..167c308d6 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java
@@ -54,13 +54,11 @@ import de.kuschku.util.ui.MenuTint;
 import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 public class SlidingPanelHandler {
+    // Main Sliding Layout
+    final SlidingUpPanelLayout slidingLayout;
     private final Activity activity;
     private final AppContext context;
     private final AdvancedEditor editor;
-
-    // Main Sliding Layout
-    SlidingUpPanelLayout slidingLayout;
-
     // Input History
     @Bind(R.id.sliding_layout_history)
     SlidingUpPanelLayout slidingLayoutHistory;
@@ -276,4 +274,11 @@ public class SlidingPanelHandler {
             return false;
         }
     }
+
+    public void onDestroy() {
+        chatline.setOnKeyListener(null);
+        send.setOnClickListener(null);
+        slidingLayout.setPanelSlideListener(null);
+        formattingMenu.setOnMenuItemClickListener(null);
+    }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java
index 5c4476bce..d3a1bd65f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java
@@ -75,7 +75,6 @@ public class ChatListCreateActivity extends BoundActivity {
     Spinner minimumActivity;
 
     private QBufferViewManager bufferViewManager;
-    private NetworkSpinnerAdapter networkSpinnerAdapter;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -84,8 +83,7 @@ public class ChatListCreateActivity extends BoundActivity {
         setContentView(R.layout.activity_chatlist_edit);
         ButterKnife.bind(this);
 
-        networkSpinnerAdapter = new NetworkSpinnerAdapter(this);
-        network.setAdapter(networkSpinnerAdapter);
+        network.setAdapter(new NetworkSpinnerAdapter(this));
 
         minimumActivity.setAdapter(new MinimumActivityAdapter(context));
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListEditActivity.java
index c959371bf..e7a98fa7e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListEditActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListEditActivity.java
@@ -115,9 +115,9 @@ public class ChatListEditActivity extends BoundActivity {
     public void onBackPressed() {
         if (hasChanged()) {
             new MaterialDialog.Builder(this)
-                    .content("You have made changes, do you wish to save them?")
-                    .positiveText("Yes")
-                    .negativeText("No")
+                    .content(R.string.youhavemadechangesdoyouwishtosavethem)
+                    .positiveText(R.string.yes)
+                    .negativeText(R.string.no)
                     .positiveColor(context.themeUtil().res.colorAccent)
                     .negativeColor(context.themeUtil().res.colorForeground)
                     .onPositive((dialog, which) -> {
@@ -136,9 +136,9 @@ public class ChatListEditActivity extends BoundActivity {
         switch (item.getItemId()) {
             case R.id.action_delete: {
                 new MaterialDialog.Builder(this)
-                        .content(String.format("Are you sure you want to delete \"%s\"?", config.bufferViewName()))
-                        .positiveText("Yes")
-                        .negativeText("No")
+                        .content(getString(R.string.areyousureyouwanttodelete, config.bufferViewName()))
+                        .positiveText(R.string.yes)
+                        .negativeText(R.string.no)
                         .positiveColor(context.themeUtil().res.colorAccent)
                         .negativeColor(context.themeUtil().res.colorForeground)
                         .onPositive((dialog, which) -> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListListActivity.java
index 73723f657..5551746d7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListListActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListListActivity.java
@@ -41,28 +41,25 @@ import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager;
 import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.servicebound.BoundActivity;
+import de.kuschku.util.ui.DividerItemDecoration;
 
 public class ChatListListActivity extends BoundActivity {
 
+    final OnQBufferViewConfigClickListener clickListener = config -> {
+        if (config != null) {
+            Intent intent = new Intent(this, ChatListEditActivity.class);
+            intent.putExtra("id", config.bufferViewId());
+            startActivity(intent);
+        }
+    };
     QBufferViewManager manager;
-
     @Bind(R.id.list)
     RecyclerView list;
-
     @Bind(R.id.add)
     FloatingActionButton add;
-
     @Bind(R.id.toolbar)
     Toolbar toolbar;
-
     ChatListAdapter adapter;
-    OnQBufferViewConfigClickListener clickListener = config -> {
-        if (config != null) {
-            Intent intent = new Intent(this, ChatListEditActivity.class);
-            intent.putExtra("id", config.bufferViewId());
-            startActivity(intent);
-        }
-    };
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -74,10 +71,9 @@ public class ChatListListActivity extends BoundActivity {
         list.setItemAnimator(new DefaultItemAnimator());
         adapter = new ChatListAdapter();
         list.setAdapter(adapter);
+        list.addItemDecoration(new DividerItemDecoration(this));
 
-        add.setOnClickListener(view -> {
-            startActivity(new Intent(this, ChatListCreateActivity.class));
-        });
+        add.setOnClickListener(view -> startActivity(new Intent(this, ChatListCreateActivity.class)));
 
         setSupportActionBar(toolbar);
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@@ -100,8 +96,8 @@ public class ChatListListActivity extends BoundActivity {
     }
 
     private class ChatListAdapter extends RecyclerView.Adapter<ChatListViewHolder> {
+        final AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this);
         QBufferViewManager manager;
-        AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this);
 
         public void setManager(QBufferViewManager manager) {
             if (this.manager != null)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/MinimumActivityAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/MinimumActivityAdapter.java
index e0d86acf3..d24225b4a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/MinimumActivityAdapter.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/MinimumActivityAdapter.java
@@ -36,13 +36,13 @@ import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 
 class MinimumActivityAdapter implements SpinnerAdapter {
-    List<QBufferViewConfig.MinimumActivity> list = Arrays.asList(
+    final List<QBufferViewConfig.MinimumActivity> list = Arrays.asList(
             QBufferViewConfig.MinimumActivity.NONE,
             QBufferViewConfig.MinimumActivity.OTHER,
             QBufferViewConfig.MinimumActivity.MESSAGE,
             QBufferViewConfig.MinimumActivity.HIGHLIGHT
     );
-    private AppContext context;
+    private final AppContext context;
 
     public MinimumActivityAdapter(AppContext context) {
         this.context = context;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityCreateActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityCreateActivity.java
index 4c329fb24..aaeef76c6 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityCreateActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityCreateActivity.java
@@ -47,44 +47,32 @@ import de.kuschku.util.ui.AnimationHelper;
 
 public class IdentityCreateActivity extends BoundActivity {
 
+    private final QIdentity identity = Identity.createDefault();
     @Bind(R.id.toolbar)
     Toolbar toolbar;
-
     @Bind(R.id.identityName)
     EditText identityName;
-
     @Bind(R.id.realName)
     EditText realName;
-
     @Bind(R.id.ident)
     EditText ident;
-
     @Bind(R.id.nicks)
     Button nicks;
-
     @Bind(R.id.kickReason)
     EditText kickReason;
-
     @Bind(R.id.partReason)
     EditText partReason;
-
     @Bind(R.id.quitReason)
     EditText quitReason;
-
     @Bind(R.id.awayReason)
     EditText awayReason;
-
     @Bind(R.id.useAwayOnDetach)
     SwitchCompat useAwayOnDetach;
-
     @Bind(R.id.groupAwayOnDetach)
     ViewGroup groupAwayOnDetach;
-
     @Bind(R.id.awayOnDetachReason)
     EditText awayOnDetachReason;
-
     private ArrayList<String> nickList;
-    private QIdentity identity = Identity.createDefault();
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityEditActivity.java
index 467ca0827..4f7c39ccd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityEditActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityEditActivity.java
@@ -149,9 +149,9 @@ public class IdentityEditActivity extends BoundActivity {
     public void onBackPressed() {
         if (hasChanged(build())) {
             new MaterialDialog.Builder(this)
-                    .content("You have made changes, do you wish to save them?")
-                    .positiveText("Yes")
-                    .negativeText("No")
+                    .content(R.string.youhavemadechangesdoyouwishtosavethem)
+                    .positiveText(R.string.yes)
+                    .negativeText(R.string.no)
                     .positiveColor(context.themeUtil().res.colorAccent)
                     .negativeColor(context.themeUtil().res.colorForeground)
                     .onPositive((dialog, which) -> {
@@ -170,9 +170,9 @@ public class IdentityEditActivity extends BoundActivity {
         switch (item.getItemId()) {
             case R.id.action_delete: {
                 new MaterialDialog.Builder(this)
-                        .content(String.format("Are you sure you want to delete \"%s\"?", identity.identityName()))
-                        .positiveText("Yes")
-                        .negativeText("No")
+                        .content(getString(R.string.areyousureyouwanttodelete, identity.identityName()))
+                        .positiveText(R.string.yes)
+                        .negativeText(R.string.no)
                         .positiveColor(context.themeUtil().res.colorAccent)
                         .negativeColor(context.themeUtil().res.colorForeground)
                         .onPositive((dialog, which) -> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityListActivity.java
index 6cd15a9ac..6042a3e86 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityListActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityListActivity.java
@@ -41,28 +41,25 @@ import de.kuschku.libquassel.syncables.types.interfaces.QIdentity;
 import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.servicebound.BoundActivity;
+import de.kuschku.util.ui.DividerItemDecoration;
 
 public class IdentityListActivity extends BoundActivity {
 
+    final OnQIdentityClickListener clickListener = identity -> {
+        if (identity != null) {
+            Intent intent = new Intent(this, IdentityEditActivity.class);
+            intent.putExtra("id", identity.id());
+            startActivity(intent);
+        }
+    };
     IdentityManager manager;
-
     @Bind(R.id.list)
     RecyclerView list;
-
     @Bind(R.id.add)
     FloatingActionButton add;
-
     @Bind(R.id.toolbar)
     Toolbar toolbar;
-
     IdentityAdapter adapter;
-    OnQIdentityClickListener clickListener = identity -> {
-        if (identity != null) {
-            Intent intent = new Intent(this, IdentityEditActivity.class);
-            intent.putExtra("id", identity.id());
-            startActivity(intent);
-        }
-    };
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -72,12 +69,11 @@ public class IdentityListActivity extends BoundActivity {
 
         list.setLayoutManager(new LinearLayoutManager(this));
         list.setItemAnimator(new DefaultItemAnimator());
+        list.addItemDecoration(new DividerItemDecoration(this));
         adapter = new IdentityAdapter();
         list.setAdapter(adapter);
 
-        add.setOnClickListener(view -> {
-            startActivity(new Intent(this, IdentityCreateActivity.class));
-        });
+        add.setOnClickListener(view -> startActivity(new Intent(this, IdentityCreateActivity.class)));
 
         setSupportActionBar(toolbar);
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@@ -100,8 +96,8 @@ public class IdentityListActivity extends BoundActivity {
     }
 
     private class IdentityAdapter extends RecyclerView.Adapter<IdentityViewHolder> {
+        final AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this);
         IdentityManager manager;
-        AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this);
 
         public void setManager(IdentityManager manager) {
             if (this.manager != null)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentitySpinnerAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentitySpinnerAdapter.java
index b55873b3f..fc1721c0f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentitySpinnerAdapter.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentitySpinnerAdapter.java
@@ -42,12 +42,11 @@ import de.kuschku.util.observables.callbacks.UICallback;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
 public class IdentitySpinnerAdapter implements ThemedSpinnerAdapter, GeneralCallback {
+    private final Set<DataSetObserver> observers = new HashSet<>();
     private ObservableSortedList<QIdentity> identities;
     @Nullable
     private Resources.Theme theme;
 
-    private Set<DataSetObserver> observers = new HashSet<>();
-
     public void setIdentityManager(IdentityManager identityManager) {
         if (identityManager != null) {
             this.identities = identityManager.identities();
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickListActivity.java
index 031130854..92df9f1bc 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickListActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickListActivity.java
@@ -44,6 +44,7 @@ import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.SimpleIt
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.observables.lists.ObservableList;
 import de.kuschku.util.servicebound.BoundActivity;
+import de.kuschku.util.ui.DividerItemDecoration;
 
 public class IdentityNickListActivity extends BoundActivity implements OnStartDragListener {
 
@@ -59,7 +60,7 @@ public class IdentityNickListActivity extends BoundActivity implements OnStartDr
     IdentityNickAdapter adapter;
     ItemTouchHelper itemTouchHelper;
     ObservableList<String> nicks;
-    OnIdentityNickClickListener clickListener = nick -> {
+    final OnIdentityNickClickListener clickListener = nick -> {
         MaterialDialog dialog = new MaterialDialog.Builder(this)
                 .input("", nick, false, (dialog1, input) -> {
 
@@ -99,6 +100,7 @@ public class IdentityNickListActivity extends BoundActivity implements OnStartDr
         list.setAdapter(adapter);
         list.setHasFixedSize(true);
         list.setLayoutManager(new LinearLayoutManager(this));
+        list.addItemDecoration(new DividerItemDecoration(this));
         adapter.setOnItemClickListener(clickListener);
 
         ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/FakeNetworksWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/FakeNetworksWrapper.java
index 3001c4ebf..bf010533e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/FakeNetworksWrapper.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/FakeNetworksWrapper.java
@@ -32,10 +32,9 @@ import de.kuschku.util.observables.callbacks.UICallback;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
 public class FakeNetworksWrapper {
-    private ObservableSortedList<QNetwork> base;
-    private QNetwork fakeNetwork;
-    private Set<DataSetObserver> observers = new HashSet<>();
-    private UICallback callback = new UICallback() {
+    private final QNetwork fakeNetwork;
+    private final Set<DataSetObserver> observers = new HashSet<>();
+    private final UICallback callback = new UICallback() {
         @Override
         public void notifyItemInserted(int position) {
             notifyChanged();
@@ -71,6 +70,7 @@ public class FakeNetworksWrapper {
             notifyChanged();
         }
     };
+    private ObservableSortedList<QNetwork> base;
 
     public FakeNetworksWrapper(Context context) {
         this.fakeNetwork = new AllNetworksItem(context);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java
index cb56db012..db46e4114 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java
@@ -27,7 +27,6 @@ import android.os.Parcelable;
 import android.support.annotation.Nullable;
 import android.support.v7.widget.SwitchCompat;
 import android.support.v7.widget.Toolbar;
-import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.ViewGroup;
@@ -37,7 +36,6 @@ import android.widget.CompoundButton;
 import android.widget.EditText;
 import android.widget.Spinner;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -58,23 +56,17 @@ public class NetworkCreateActivity extends BoundActivity {
 
     private static final int REQUEST_SERVER_LIST = 1;
     private static final int REQUEST_PERFORM = 2;
-
+    final IdentitySpinnerAdapter spinnerAdapter = new IdentitySpinnerAdapter();
     @Bind(R.id.toolbar)
     Toolbar toolbar;
-
-
     @Bind(R.id.networkName)
     EditText networkName;
-
     @Bind(R.id.identity)
     Spinner identity;
-
     @Bind(R.id.rejoinChannels)
     CheckBox rejoinChannels;
-
     @Bind(R.id.servers)
     Button servers;
-
     @Bind(R.id.useCustomCodecs)
     SwitchCompat useCustomCodecs;
     @Bind(R.id.groupCustomCodecs)
@@ -85,7 +77,6 @@ public class NetworkCreateActivity extends BoundActivity {
     EditText codecForEncoding;
     @Bind(R.id.codecForDecoding)
     EditText codecForDecoding;
-
     @Bind(R.id.useAutoIdentify)
     SwitchCompat useAutoIdentify;
     @Bind(R.id.groupAutoIdentify)
@@ -94,7 +85,6 @@ public class NetworkCreateActivity extends BoundActivity {
     EditText autoIdentifyService;
     @Bind(R.id.autoIdentifyPassword)
     EditText autoIdentifyPassword;
-
     @Bind(R.id.useSasl)
     SwitchCompat useSasl;
     @Bind(R.id.groupSasl)
@@ -103,7 +93,6 @@ public class NetworkCreateActivity extends BoundActivity {
     EditText saslAccount;
     @Bind(R.id.saslPassword)
     EditText saslPassword;
-
     @Bind(R.id.useAutoReconnect)
     SwitchCompat useAutoReconnect;
     @Bind(R.id.groupAutoReconnect)
@@ -114,10 +103,7 @@ public class NetworkCreateActivity extends BoundActivity {
     EditText autoReconnectRetries;
     @Bind(R.id.unlimitedAutoReconnectRetries)
     CheckBox unlimitedAutoReconnectRetries;
-
     int id;
-    IdentitySpinnerAdapter spinnerAdapter = new IdentitySpinnerAdapter();
-
     private List<NetworkServer> serverList = null;
 
     @Override
@@ -181,7 +167,6 @@ public class NetworkCreateActivity extends BoundActivity {
                 } break;
                 case REQUEST_SERVER_LIST: {
                     Parcelable[] servers = data.getParcelableArrayExtra("servers");
-                    Log.d("DEBUG", Arrays.toString(servers));
                     if (servers != null) {
                         serverList = NetworkServerSerializeHelper.deserialize(servers);
                     }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java
index 563bb1ff3..3f81a5d27 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java
@@ -27,7 +27,6 @@ import android.os.Parcelable;
 import android.support.annotation.Nullable;
 import android.support.v7.widget.SwitchCompat;
 import android.support.v7.widget.Toolbar;
-import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.ViewGroup;
@@ -39,7 +38,6 @@ import android.widget.Spinner;
 
 import com.afollestad.materialdialogs.MaterialDialog;
 
-import java.util.Arrays;
 import java.util.List;
 
 import butterknife.Bind;
@@ -61,23 +59,17 @@ public class NetworkEditActivity extends BoundActivity {
 
     private static final int REQUEST_SERVER_LIST = 1;
     private static final int REQUEST_PERFORM = 2;
-
+    final IdentitySpinnerAdapter spinnerAdapter = new IdentitySpinnerAdapter();
     @Bind(R.id.toolbar)
     Toolbar toolbar;
-
-
     @Bind(R.id.networkName)
     EditText networkName;
-
     @Bind(R.id.identity)
     Spinner identity;
-
     @Bind(R.id.rejoinChannels)
     CheckBox rejoinChannels;
-
     @Bind(R.id.servers)
     Button servers;
-
     @Bind(R.id.useCustomCodecs)
     SwitchCompat useCustomCodecs;
     @Bind(R.id.groupCustomCodecs)
@@ -88,7 +80,6 @@ public class NetworkEditActivity extends BoundActivity {
     EditText codecForEncoding;
     @Bind(R.id.codecForDecoding)
     EditText codecForDecoding;
-
     @Bind(R.id.useAutoIdentify)
     SwitchCompat useAutoIdentify;
     @Bind(R.id.groupAutoIdentify)
@@ -97,7 +88,6 @@ public class NetworkEditActivity extends BoundActivity {
     EditText autoIdentifyService;
     @Bind(R.id.autoIdentifyPassword)
     EditText autoIdentifyPassword;
-
     @Bind(R.id.useSasl)
     SwitchCompat useSasl;
     @Bind(R.id.groupSasl)
@@ -106,7 +96,6 @@ public class NetworkEditActivity extends BoundActivity {
     EditText saslAccount;
     @Bind(R.id.saslPassword)
     EditText saslPassword;
-
     @Bind(R.id.useAutoReconnect)
     SwitchCompat useAutoReconnect;
     @Bind(R.id.groupAutoReconnect)
@@ -117,9 +106,7 @@ public class NetworkEditActivity extends BoundActivity {
     EditText autoReconnectRetries;
     @Bind(R.id.unlimitedAutoReconnectRetries)
     CheckBox unlimitedAutoReconnectRetries;
-
     int id;
-    IdentitySpinnerAdapter spinnerAdapter = new IdentitySpinnerAdapter();
     private QNetwork network;
 
     private List<NetworkServer> serverList = null;
@@ -176,7 +163,6 @@ public class NetworkEditActivity extends BoundActivity {
                 break;
                 case REQUEST_SERVER_LIST: {
                     Parcelable[] servers = data.getParcelableArrayExtra("servers");
-                    Log.d("DEBUG", Arrays.toString(servers));
                     if (servers != null) {
                         serverList = NetworkServerSerializeHelper.deserialize(servers);
                     }
@@ -238,9 +224,9 @@ public class NetworkEditActivity extends BoundActivity {
     public void onBackPressed() {
         if (hasChanged(build())) {
             new MaterialDialog.Builder(this)
-                    .content("You have made changes, do you wish to save them?")
-                    .positiveText("Yes")
-                    .negativeText("No")
+                    .content(R.string.youhavemadechangesdoyouwishtosavethem)
+                    .positiveText(R.string.yes)
+                    .negativeText(R.string.no)
                     .positiveColor(context.themeUtil().res.colorAccent)
                     .negativeColor(context.themeUtil().res.colorForeground)
                     .onPositive((dialog, which) -> {
@@ -259,9 +245,9 @@ public class NetworkEditActivity extends BoundActivity {
         switch (item.getItemId()) {
             case R.id.action_delete: {
                 new MaterialDialog.Builder(this)
-                        .content(String.format("Are you sure you want to delete \"%s\"?", network.networkName()))
-                        .positiveText("Yes")
-                        .negativeText("No")
+                        .content(getString(R.string.areyousureyouwanttodelete, network.networkName()))
+                        .positiveText(R.string.yes)
+                        .negativeText(R.string.no)
                         .positiveColor(context.themeUtil().res.colorAccent)
                         .negativeColor(context.themeUtil().res.colorForeground)
                         .onPositive((dialog, which) -> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java
index de5251792..2fd7bda3c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java
@@ -41,28 +41,25 @@ import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.servicebound.BoundActivity;
+import de.kuschku.util.ui.DividerItemDecoration;
 
 public class NetworkListActivity extends BoundActivity {
 
+    final OnQNetworkClickListener clickListener = network -> {
+        if (network != null) {
+            Intent intent = new Intent(this, NetworkEditActivity.class);
+            intent.putExtra("id", network.networkId());
+            startActivity(intent);
+        }
+    };
     NetworkManager manager;
-
     @Bind(R.id.list)
     RecyclerView list;
-
     @Bind(R.id.add)
     FloatingActionButton add;
-
     @Bind(R.id.toolbar)
     Toolbar toolbar;
-
     NetworkAdapter adapter;
-    OnQNetworkClickListener clickListener = network -> {
-        if (network != null) {
-            Intent intent = new Intent(this, NetworkEditActivity.class);
-            intent.putExtra("id", network.networkId());
-            startActivity(intent);
-        }
-    };
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -74,10 +71,9 @@ public class NetworkListActivity extends BoundActivity {
         list.setItemAnimator(new DefaultItemAnimator());
         adapter = new NetworkAdapter();
         list.setAdapter(adapter);
+        list.addItemDecoration(new DividerItemDecoration(this));
 
-        add.setOnClickListener(view -> {
-            startActivity(new Intent(this, NetworkCreateActivity.class));
-        });
+        add.setOnClickListener(view -> startActivity(new Intent(this, NetworkCreateActivity.class)));
 
         setSupportActionBar(toolbar);
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@@ -100,8 +96,8 @@ public class NetworkListActivity extends BoundActivity {
     }
 
     private class NetworkAdapter extends RecyclerView.Adapter<NetworkViewHolder> {
+        final AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this);
         NetworkManager manager;
-        AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this);
 
         public void setManager(NetworkManager manager) {
             if (this.manager != null)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkSpinnerAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkSpinnerAdapter.java
index 591fea390..5ad2ef240 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkSpinnerAdapter.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkSpinnerAdapter.java
@@ -37,9 +37,9 @@ import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 import de.kuschku.quasseldroid_ng.R;
 
 public class NetworkSpinnerAdapter implements ThemedSpinnerAdapter {
+    private final FakeNetworksWrapper wrapper;
     @Nullable
     private Resources.Theme theme;
-    private FakeNetworksWrapper wrapper;
 
     public NetworkSpinnerAdapter(Context context) {
         wrapper = new FakeNetworksWrapper(context);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerEditActivity.java
index eb2e7846f..d3f7800a0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerEditActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerEditActivity.java
@@ -190,7 +190,7 @@ public class NetworkServerEditActivity extends BoundActivity {
     }
 
     private class ProxyTypeAdapter implements SpinnerAdapter {
-        List<NetworkServer.ProxyType> list = Arrays.asList(
+        final List<NetworkServer.ProxyType> list = Arrays.asList(
                 NetworkServer.ProxyType.Socks5Proxy,
                 NetworkServer.ProxyType.HttpProxy
         );
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerListActivity.java
index 1de6ee000..79722cd81 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerListActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerListActivity.java
@@ -30,7 +30,6 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.Toolbar;
 import android.support.v7.widget.helper.ItemTouchHelper;
-import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 
@@ -44,6 +43,7 @@ import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.SimpleIt
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.observables.lists.ObservableList;
 import de.kuschku.util.servicebound.BoundActivity;
+import de.kuschku.util.ui.DividerItemDecoration;
 
 public class NetworkServerListActivity extends BoundActivity implements OnStartDragListener {
 
@@ -59,7 +59,7 @@ public class NetworkServerListActivity extends BoundActivity implements OnStartD
     NetworkServerAdapter adapter;
     ItemTouchHelper itemTouchHelper;
     ObservableList<NetworkServer> servers;
-    OnNetworkServerClickListener clickListener = server -> {
+    final OnNetworkServerClickListener clickListener = server -> {
         if (server != null) {
             Intent intent1 = new Intent(this, NetworkServerEditActivity.class);
             intent1.putExtra("server", NetworkServerSerializeHelper.serialize(server));
@@ -87,6 +87,7 @@ public class NetworkServerListActivity extends BoundActivity implements OnStartD
         list.setAdapter(adapter);
         list.setHasFixedSize(true);
         list.setLayoutManager(new LinearLayoutManager(this));
+        list.addItemDecoration(new DividerItemDecoration(this));
         adapter.setOnItemClickListener(clickListener);
 
         ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter);
@@ -127,9 +128,7 @@ public class NetworkServerListActivity extends BoundActivity implements OnStartD
         Bundle bundle;
         if (resultCode == RESULT_OK && data != null && (bundle = data.getBundleExtra("server")) != null) {
             NetworkServer server = NetworkServerSerializeHelper.deserialize(bundle);
-            Log.d("DEBUG", server.toString());
             int id = data.getIntExtra("id", -1);
-            Log.d("DEBUG", String.valueOf(id));
             if (id == -1) {
                 servers.add(server);
             } else {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.java
index d4257e0c4..d2dc408c0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.java
@@ -41,6 +41,8 @@ public class Settings {
     public final IntPreference preferenceFontSize;
 
 
+    @SuppressWarnings("FieldCanBeLocal")
+    // THIS FIELD CAN NOT BE LOCAL, OR IT WILL NOT WORK
     private final SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener;
 
     public Settings(PreferenceStrings prefs, SharedPreferences pref) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.java
index 132908a90..597e228b8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.java
@@ -36,7 +36,7 @@ import de.kuschku.quasseldroid_ng.ui.theme.AppTheme;
 
 public class SettingsActivity extends AppCompatActivity {
 
-    AppContext context = new AppContext();
+    final AppContext context = new AppContext();
 
     @Bind(R.id.toolbar)
     Toolbar toolbar;
@@ -83,7 +83,7 @@ public class SettingsActivity extends AppCompatActivity {
     }
 
     public static class AppearanceFragment extends PreferenceFragment {
-        AppContext context = new AppContext();
+        final AppContext context = new AppContext();
 
         @Override
         public void onCreate(Bundle savedInstanceState) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java
index 9e26fdac6..14ab0fc12 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java
@@ -97,7 +97,7 @@ public class AccountItem extends AbstractDrawerItem<AccountItem, AccountItem.Vie
     }
 
     @Override
-    public ViewHolderFactory getFactory() {
+    public ViewHolderFactory<ViewHolder> getFactory() {
         return new ItemFactory();
     }
 
@@ -157,11 +157,11 @@ public class AccountItem extends AbstractDrawerItem<AccountItem, AccountItem.Vie
     }
 
     protected static class ViewHolder extends RecyclerView.ViewHolder {
-        private View view;
-        private AppCompatRadioButton select;
-        private TextView name;
-        private TextView description;
-        private AppCompatImageButton delete;
+        private final View view;
+        private final AppCompatRadioButton select;
+        private final TextView name;
+        private final TextView description;
+        private final AppCompatImageButton delete;
 
         private ViewHolder(View view) {
             super(view);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSelectActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSelectActivity.java
index 3985ebbbf..850bf5a5d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSelectActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSelectActivity.java
@@ -77,7 +77,7 @@ public class AccountSelectActivity extends AppCompatActivity {
     }
 
     private class SlidePagerAdapter extends FragmentPagerAdapter {
-        private SlideFragment item = new AccountSelectSlide();
+        private final SlideFragment item = new AccountSelectSlide();
 
         public SlidePagerAdapter(FragmentManager fm) {
             super(fm);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java
index 7834a184d..d5ee9b0e3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java
@@ -149,7 +149,7 @@ public class AccountSetupActivity extends AppCompatActivity implements ValidUpda
     }
 
     private class SlidePagerAdapter extends FragmentPagerAdapter {
-        List<SlideFragment> list = new ArrayList<>();
+        final List<SlideFragment> list = new ArrayList<>();
 
         public SlidePagerAdapter(FragmentManager fm) {
             super(fm);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CoreSetupActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CoreSetupActivity.java
index 58675d57d..c459aa991 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CoreSetupActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CoreSetupActivity.java
@@ -145,7 +145,7 @@ public class CoreSetupActivity extends AppCompatActivity implements ValidUpdateC
     }
 
     private class SlidePagerAdapter extends FragmentPagerAdapter {
-        List<SlideFragment> list = new ArrayList<>();
+        final List<SlideFragment> list = new ArrayList<>();
 
         public SlidePagerAdapter(FragmentManager fm) {
             super(fm);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java
index 9d1f05e82..25a8c58ec 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java
@@ -63,7 +63,7 @@ public class CreateAccountItem extends AbstractDrawerItem<CreateAccountItem, Cre
     }
 
     @Override
-    public ViewHolderFactory getFactory() {
+    public ViewHolderFactory<ViewHolder> getFactory() {
         return new ItemFactory();
     }
 
@@ -115,7 +115,7 @@ public class CreateAccountItem extends AbstractDrawerItem<CreateAccountItem, Cre
     }
 
     protected static class ViewHolder extends RecyclerView.ViewHolder {
-        private View view;
+        private final View view;
 
         private ViewHolder(View view) {
             super(view);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/StorageBackendItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/StorageBackendItem.java
index 0bbe03c3f..0d1928f28 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/StorageBackendItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/StorageBackendItem.java
@@ -94,7 +94,7 @@ public class StorageBackendItem extends AbstractDrawerItem<StorageBackendItem, S
     }
 
     @Override
-    public ViewHolderFactory getFactory() {
+    public ViewHolderFactory<ViewHolder> getFactory() {
         return new ItemFactory();
     }
 
@@ -150,10 +150,10 @@ public class StorageBackendItem extends AbstractDrawerItem<StorageBackendItem, S
     }
 
     protected static class ViewHolder extends RecyclerView.ViewHolder {
-        private View view;
-        private AppCompatRadioButton select;
-        private TextView name;
-        private TextView description;
+        private final View view;
+        private final AppCompatRadioButton select;
+        private final TextView name;
+        private final TextView description;
 
         private ViewHolder(View view) {
             super(view);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupCoreSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupCoreSlide.java
index 2809fac09..4be29e2cf 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupCoreSlide.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupCoreSlide.java
@@ -36,11 +36,7 @@ import butterknife.ButterKnife;
 import de.kuschku.quasseldroid_ng.R;
 
 public class AccountSetupCoreSlide extends SlideFragment {
-    @Bind(R.id.host)
-    TextInputEditText hostField;
-    @Bind(R.id.port)
-    TextInputEditText portField;
-    TextWatcher watcher = new TextWatcher() {
+    final TextWatcher watcher = new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         }
@@ -54,6 +50,10 @@ public class AccountSetupCoreSlide extends SlideFragment {
         public void afterTextChanged(Editable s) {
         }
     };
+    @Bind(R.id.host)
+    TextInputEditText hostField;
+    @Bind(R.id.port)
+    TextInputEditText portField;
 
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupNameSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupNameSlide.java
index 4cd770a66..617df7a87 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupNameSlide.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupNameSlide.java
@@ -36,9 +36,7 @@ import butterknife.ButterKnife;
 import de.kuschku.quasseldroid_ng.R;
 
 public class AccountSetupNameSlide extends SlideFragment {
-    @Bind(R.id.name)
-    TextInputEditText nameField;
-    TextWatcher watcher = new TextWatcher() {
+    final TextWatcher watcher = new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         }
@@ -52,6 +50,8 @@ public class AccountSetupNameSlide extends SlideFragment {
         public void afterTextChanged(Editable s) {
         }
     };
+    @Bind(R.id.name)
+    TextInputEditText nameField;
 
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupUserSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupUserSlide.java
index 29305bc83..b84884bba 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupUserSlide.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupUserSlide.java
@@ -36,11 +36,7 @@ import butterknife.ButterKnife;
 import de.kuschku.quasseldroid_ng.R;
 
 public class AccountSetupUserSlide extends SlideFragment {
-    @Bind(R.id.user)
-    TextInputEditText userField;
-    @Bind(R.id.pass)
-    TextInputEditText passField;
-    TextWatcher watcher = new TextWatcher() {
+    final TextWatcher watcher = new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         }
@@ -54,6 +50,10 @@ public class AccountSetupUserSlide extends SlideFragment {
             updateValidity();
         }
     };
+    @Bind(R.id.user)
+    TextInputEditText userField;
+    @Bind(R.id.pass)
+    TextInputEditText passField;
 
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java
index 68ab29647..907f64207 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java
@@ -45,10 +45,7 @@ import butterknife.ButterKnife;
 import de.kuschku.quasseldroid_ng.R;
 
 public class CoreBackendSetupSlide extends SlideFragment {
-    @Bind(R.id.container)
-    LinearLayout container;
-    Bundle storageBackend;
-    TextWatcher watcher = new TextWatcher() {
+    final TextWatcher watcher = new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         }
@@ -62,8 +59,11 @@ public class CoreBackendSetupSlide extends SlideFragment {
         public void afterTextChanged(Editable s) {
         }
     };
-    private Map<String, InputItemWrapper> items = new HashMap<>();
-    private Map<String, Bundle> storageBackends = new HashMap<>();
+    private final Map<String, InputItemWrapper> items = new HashMap<>();
+    private final Map<String, Bundle> storageBackends = new HashMap<>();
+    @Bind(R.id.container)
+    LinearLayout container;
+    Bundle storageBackend;
 
     @Override
     public void setArguments(Bundle args) {
@@ -155,6 +155,7 @@ public class CoreBackendSetupSlide extends SlideFragment {
         return R.string.slideAccountcoreDescription;
     }
 
+    @SuppressWarnings("unchecked")
     private <T> InputItemWrapper<T> getInputItemWrapper(String key, String type, T defValue) {
         InputItemWrapper result;
         switch (type) {
@@ -246,11 +247,11 @@ public class CoreBackendSetupSlide extends SlideFragment {
     class NumberInputItem implements InputItemWrapper<Number> {
         private final String key;
         private final Number defValue;
+        private final String type;
         @Bind(R.id.inputLayout)
         TextInputLayout inputLayout;
         @Bind(R.id.editText)
         TextInputEditText editText;
-        private String type;
         private View view;
 
         public NumberInputItem(String key, Number defValue, String type) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/SlideFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/SlideFragment.java
index 62d1bd3f2..1aee8a6fc 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/SlideFragment.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/SlideFragment.java
@@ -37,7 +37,7 @@ import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.quasseldroid_ng.ui.setup.ValidUpdateCallback;
 
 public abstract class SlideFragment extends Fragment {
-    private Set<ValidUpdateCallback> callbacks = new HashSet<>();
+    private final Set<ValidUpdateCallback> callbacks = new HashSet<>();
 
     public abstract Bundle getData(Bundle in);
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java
index caf05dff0..2e701bf8e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java
@@ -32,13 +32,13 @@ import de.kuschku.util.irc.format.IrcFormatSerializer;
 import de.kuschku.util.observables.lists.ObservableSet;
 
 public class AppContext {
+    private final ObservableSet<QBufferViewConfig.DisplayType> bufferDisplayTypes = new ObservableSet<>();
     private ThemeUtil themeUtil;
     private Settings settings;
     private Client client;
     private BusProvider provider;
     private IrcFormatDeserializer deserializer;
     private IrcFormatSerializer serializer;
-    private ObservableSet<QBufferViewConfig.DisplayType> bufferDisplayTypes = new ObservableSet<>();
 
     public ThemeUtil themeUtil() {
         return themeUtil;
diff --git a/app/src/main/java/de/kuschku/util/MeaningfulConnectionErrorProvider.java b/app/src/main/java/de/kuschku/util/MeaningfulConnectionErrorProvider.java
deleted file mode 100644
index 2d0cfdc03..000000000
--- a/app/src/main/java/de/kuschku/util/MeaningfulConnectionErrorProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * QuasselDroid - Quassel client for Android
- * Copyright (C) 2016 Janne Koschinski
- * Copyright (C) 2016 Ken Børge Viktil
- * Copyright (C) 2016 Magnus Fjell
- * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation, either version 3 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package de.kuschku.util;
-
-import java.net.ConnectException;
-
-import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
-
-public class MeaningfulConnectionErrorProvider {
-    private final AppContext context;
-
-    public MeaningfulConnectionErrorProvider(AppContext context) {
-        this.context = context;
-    }
-
-    public String provide(Exception exception) {
-        return null;
-    }
-
-    public String provide(ConnectException exception) {
-        return null;
-    }
-}
diff --git a/app/src/main/java/de/kuschku/util/accounts/AccountManager.java b/app/src/main/java/de/kuschku/util/accounts/AccountManager.java
index 99d0a9c6d..e6126f4eb 100644
--- a/app/src/main/java/de/kuschku/util/accounts/AccountManager.java
+++ b/app/src/main/java/de/kuschku/util/accounts/AccountManager.java
@@ -27,7 +27,7 @@ import java.util.Set;
 import java.util.UUID;
 
 public class AccountManager {
-    AccountManagerHelper helper;
+    final AccountManagerHelper helper;
 
     public AccountManager(Context context) {
         helper = new AccountManagerHelper(context);
diff --git a/app/src/main/java/de/kuschku/util/buffermetadata/SQLiteBufferMetaDataManager.java b/app/src/main/java/de/kuschku/util/buffermetadata/SQLiteBufferMetaDataManager.java
index 280d7aea2..ebd265295 100644
--- a/app/src/main/java/de/kuschku/util/buffermetadata/SQLiteBufferMetaDataManager.java
+++ b/app/src/main/java/de/kuschku/util/buffermetadata/SQLiteBufferMetaDataManager.java
@@ -24,7 +24,7 @@ package de.kuschku.util.buffermetadata;
 import android.content.Context;
 
 public class SQLiteBufferMetaDataManager implements BufferMetaDataManager {
-    private BufferMetaDataHelper helper;
+    private final BufferMetaDataHelper helper;
 
     public SQLiteBufferMetaDataManager(Context context) {
         helper = new BufferMetaDataHelper(context);
diff --git a/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java b/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java
index a692f8ccb..f487dd22f 100644
--- a/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java
+++ b/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java
@@ -26,6 +26,8 @@ import android.support.annotation.Nullable;
 
 import java.util.Locale;
 
+import de.kuschku.util.backports.Objects;
+
 public class IrcCaseMapper {
     private IrcCaseMapper() {
 
@@ -47,7 +49,7 @@ public class IrcCaseMapper {
 
     public static boolean equalsIgnoreCase(@Nullable String a, @Nullable String b) {
         if (a == null || b == null)
-            return (a == b);
+            return (Objects.equals(a, b));
         else
             return toLowerCase(a).equals(toLowerCase(b)) || toUpperCase(a).equals(toUpperCase(b));
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java
index 620d766b1..70a613206 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java
@@ -39,7 +39,7 @@ import de.kuschku.util.irc.chanmodes.impl.SolidIrcModeProvider;
 import de.kuschku.util.irc.chanmodes.impl.UnrealIrcModeProvider;
 
 public class IrcModeProviderFactory {
-    private static List<IrcModeProvider> servers = Arrays.asList(
+    private static final List<IrcModeProvider> servers = Arrays.asList(
             new CharybdisIrcModeProvider(),
             new DalIrcModeProvider(),
             new DancerIrcModeProvider(),
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java
index a4492474d..bcd9a8f1b 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java
@@ -45,7 +45,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class BewareIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'C', 'c', 'i', 'k', 'l', 'm', 'n', 'p', 's', 't'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java
index c53b03208..fee25f5c3 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java
@@ -58,7 +58,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class CharybdisIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'A', 'C', 'F', 'O', 'P', 'Q', 'S', 'T', 'c', 'f', 'g', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'z'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java
index 34a7798c1..20bcb0f0f 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java
@@ -51,7 +51,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class DalIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'A', 'M', 'O', 'R', 'S', 'c', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java
index 37c0014c1..d4ab60753 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java
@@ -49,7 +49,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class DancerIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'J', 'P', 'Q', 'R', 'c', 'g', 'i', 'k', 'l', 'm', 'n', 'r', 's', 'z'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java
index 26bd28773..8f67ed5c5 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java
@@ -50,7 +50,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class FqIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'M', 'O', 'R', 'S', 'c', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java
index b444f42f5..13354aa50 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java
@@ -49,7 +49,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class HybridIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'M', 'O', 'R', 'S', 'c', 'i', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java
index 630b8331b..e4dffc37c 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java
@@ -47,7 +47,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class HyperionIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'Q', 'R', 'c', 'g', 'i', 'k', 'l', 'm', 'n', 'r', 's', 'z'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java
index b1e81b465..15a33499e 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java
@@ -64,7 +64,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class InspireIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'A', 'B', 'C', 'D', 'G', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'c', 'f', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'u', 'z'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java
index 0ed1d4584..1048d3e99 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java
@@ -51,7 +51,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class NeoIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'M', 'N', 'O', 'P', 'Q', 'R', 'V', 'i', 'k', 'l', 'm', 'n', 'r', 's', 't', 'z'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java
index 648ecfdb7..0d97b55a9 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java
@@ -45,7 +45,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class NightstarIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'C', 'i', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java
index 01bf730b2..99cff9cda 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java
@@ -43,7 +43,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class RfcIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'p', 's', 'i', 't', 'n', 'm', 'l', 'k'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java
index a03b7b1bc..871708455 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java
@@ -62,7 +62,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class ShadowIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'A', 'C', 'D', 'E', 'F', 'G', 'J', 'K', 'O', 'P', 'Q', 'S', 'T', 'c', 'd', 'g', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'z'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java
index 92bc806c7..39b90fe6f 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java
@@ -59,7 +59,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class SolidIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'B', 'C', 'G', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'c', 'f', 'i', 'k', 'l', 'm', 'n', 'p', 's', 't', 'u', 'z'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java
index 3f378790a..d9d96d9a9 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java
@@ -43,7 +43,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class UndernetIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'i', 'k', 'l', 'm', 'n', 'p', 's', 't'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java
index 184716b97..cf2007761 100644
--- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java
+++ b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java
@@ -61,7 +61,7 @@ import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED;
 
 public class UnrealIrcModeProvider extends AbstractIrcModeProvider {
 
-    protected Set<Character> supportedModes = new HashSet<>(Arrays.asList(
+    protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList(
             'C', 'F', 'G', 'K', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'V', 'Z', 'c', 'f', 'i', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'z'
     ));
 
diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java
index 40a2b5ada..e8e420fcd 100644
--- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java
+++ b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java
@@ -39,6 +39,7 @@ public class MultiGeneralCallback<T> implements IObservable<GeneralCallback<T>>,
         this.callbacks = new HashSet<>(multiGeneralCallbacks);
     }
 
+    @SafeVarargs
     @NonNull
     public static <U> MultiGeneralCallback<U> of(MultiGeneralCallback<U>... callbacks) {
         return new MultiGeneralCallback<>(Arrays.asList(callbacks));
diff --git a/app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java b/app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java
index 8e4035bf6..3553577e8 100644
--- a/app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java
+++ b/app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java
@@ -27,11 +27,11 @@ import java.util.HashSet;
 import java.util.Set;
 
 public abstract class AbstractPreferenceElement<T> implements PreferenceElement<T>, OnChangeListener<T> {
+    protected final SharedPreferences pref;
+    protected final String key;
+    protected final T defValue;
     private final Set<OnChangeListener<T>> listeners = new HashSet<>();
-    protected SharedPreferences pref;
     protected SharedPreferences.Editor edit;
-    protected String key;
-    protected T defValue;
 
     public AbstractPreferenceElement(SharedPreferences pref, String key, T defValue) {
         this.pref = pref;
diff --git a/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java b/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java
index 10180761b..e9ee18ee2 100644
--- a/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java
+++ b/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java
@@ -44,6 +44,7 @@ import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 import de.kuschku.quasseldroid_ng.ui.theme.AppTheme;
 import de.kuschku.util.accounts.Account;
 import de.kuschku.util.annotationbind.AutoBinder;
+import de.kuschku.util.backports.Consumer;
 import de.kuschku.util.ui.MenuTint;
 
 public abstract class BoundActivity extends AppCompatActivity {
@@ -51,16 +52,15 @@ public abstract class BoundActivity extends AppCompatActivity {
         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
     }
 
-    protected AppContext context = new AppContext();
+    protected final AppContext context = new AppContext();
     protected QuasselService.LocalBinder binder;
-    @StyleRes
-    private int themeId;
-    private ServiceConnection connection = new ServiceConnection() {
+    private Consumer<ClientBackgroundThread> consumer = BoundActivity.this::onConnectToThread;
+    private final ServiceConnection connection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
             if (service instanceof QuasselService.LocalBinder) {
                 binder = (QuasselService.LocalBinder) service;
-                binder.addCallback(BoundActivity.this::onConnectToThread);
+                binder.addCallback(consumer);
                 onConnectToThread(binder.getBackgroundThread());
             }
         }
@@ -71,6 +71,8 @@ public abstract class BoundActivity extends AppCompatActivity {
             onConnectToThread(null);
         }
     };
+    @StyleRes
+    private int themeId;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -94,6 +96,7 @@ public abstract class BoundActivity extends AppCompatActivity {
     @Override
     protected void onStop() {
         super.onStop();
+        binder.removeCallback(consumer);
         setProvider(null);
         ServiceHelper.disconnect(this, connection);
     }
diff --git a/app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java b/app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java
index 59b298f7e..27b072d94 100644
--- a/app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java
+++ b/app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java
@@ -34,16 +34,19 @@ import de.kuschku.quasseldroid_ng.service.QuasselService;
 import de.kuschku.quasseldroid_ng.ui.chat.util.ServiceHelper;
 import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 import de.kuschku.util.accounts.Account;
+import de.kuschku.util.backports.Consumer;
 
 public abstract class BoundFragment extends Fragment {
-    protected AppContext context = new AppContext();
+    protected final AppContext context = new AppContext();
     private QuasselService.LocalBinder binder;
-    private ServiceConnection connection = new ServiceConnection() {
+    private Consumer<ClientBackgroundThread> consumer;
+    private final ServiceConnection connection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
             if (service instanceof QuasselService.LocalBinder) {
                 binder = (QuasselService.LocalBinder) service;
-                binder.addCallback(BoundFragment.this::onConnectToThread);
+                consumer = BoundFragment.this::onConnectToThread;
+                binder.addCallback(consumer);
                 onConnectToThread(binder.getBackgroundThread());
             }
         }
@@ -63,22 +66,23 @@ public abstract class BoundFragment extends Fragment {
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
+    public void onStart() {
+        super.onStart();
         ServiceHelper.connectToService(getContext(), connection);
     }
 
-    @Override
-    public void onPause() {
-        super.onPause();
-        ServiceHelper.disconnect(getContext(), connection);
-    }
-
     protected void connectToServer(Account account) {
         BusProvider provider = new BusProvider();
         binder.startBackgroundThread(provider, account);
     }
 
+    @Override
+    public void onStop() {
+        super.onStop();
+        binder.removeCallback(consumer);
+        ServiceHelper.disconnect(getContext(), connection);
+    }
+
     protected void onConnectToThread(@Nullable ClientBackgroundThread thread) {
         if (thread == null) {
             context.withClient(null);
diff --git a/app/src/main/java/de/kuschku/util/ui/DividerItemDecoration.java b/app/src/main/java/de/kuschku/util/ui/DividerItemDecoration.java
new file mode 100644
index 000000000..d5843ab2b
--- /dev/null
+++ b/app/src/main/java/de/kuschku/util/ui/DividerItemDecoration.java
@@ -0,0 +1,72 @@
+/*
+ * QuasselDroid - Quassel client for Android
+ * Copyright (C) 2016 Janne Koschinski
+ * Copyright (C) 2016 Ken Børge Viktil
+ * Copyright (C) 2016 Magnus Fjell
+ * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package de.kuschku.util.ui;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+public class DividerItemDecoration extends RecyclerView.ItemDecoration {
+
+    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
+
+    private Drawable mDivider;
+
+    /**
+     * Default divider will be used
+     */
+    public DividerItemDecoration(Context context) {
+        final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
+        mDivider = styledAttributes.getDrawable(0);
+        styledAttributes.recycle();
+    }
+
+    /**
+     * Custom divider will be used
+     */
+    public DividerItemDecoration(Context context, int resId) {
+        mDivider = ContextCompat.getDrawable(context, resId);
+    }
+
+    @Override
+    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
+        int left = parent.getPaddingLeft();
+        int right = parent.getWidth() - parent.getPaddingRight();
+
+        int childCount = parent.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            View child = parent.getChildAt(i);
+
+            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
+
+            int top = child.getBottom() + params.bottomMargin;
+            int bottom = top + mDivider.getIntrinsicHeight();
+
+            mDivider.setBounds(left, top, right, bottom);
+            mDivider.draw(c);
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/util/ui/MenuTint.java b/app/src/main/java/de/kuschku/util/ui/MenuTint.java
index dd524c779..b0251eb33 100644
--- a/app/src/main/java/de/kuschku/util/ui/MenuTint.java
+++ b/app/src/main/java/de/kuschku/util/ui/MenuTint.java
@@ -299,27 +299,23 @@ public class MenuTint {
         }
 
         // We must wait for the view to be created to set a color filter on the drawables.
-        actionBarView.post(new Runnable() {
-
-            @Override
-            public void run() {
-                for (int i = 0, size = menu.size(); i < size; i++) {
-                    MenuItem menuItem = menu.getItem(i);
-                    if (isInOverflow(menuItem)) {
-                        colorMenuItem(menuItem, subMenuIconColor, subMenuIconAlpha);
-                    }
-                    if (menuItem.hasSubMenu()) {
-                        SubMenu subMenu = menuItem.getSubMenu();
-                        for (int j = 0; j < subMenu.size(); j++) {
-                            colorMenuItem(subMenu.getItem(j), subMenuIconColor, subMenuIconAlpha);
-                        }
-                    }
+        actionBarView.post(() -> {
+            for (int i = 0, size = menu.size(); i < size; i++) {
+                MenuItem menuItem = menu.getItem(i);
+                if (isInOverflow(menuItem)) {
+                    colorMenuItem(menuItem, subMenuIconColor, subMenuIconAlpha);
                 }
-                if (menuItemIconColor != null || menuItemIconAlpha != null) {
-                    overflowButton = findOverflowMenuButton(activity, actionBarView);
-                    colorOverflowMenuItem(overflowButton);
+                if (menuItem.hasSubMenu()) {
+                    SubMenu subMenu = menuItem.getSubMenu();
+                    for (int j = 0; j < subMenu.size(); j++) {
+                        colorMenuItem(subMenu.getItem(j), subMenuIconColor, subMenuIconAlpha);
+                    }
                 }
             }
+            if (menuItemIconColor != null || menuItemIconAlpha != null) {
+                overflowButton = findOverflowMenuButton(activity, actionBarView);
+                colorOverflowMenuItem(overflowButton);
+            }
         });
     }
 
@@ -343,29 +339,24 @@ public class MenuTint {
             return;
         }
 
-        actionBarView.post(new Runnable() {
-
-            @Override
-            public void run() {
-                for (int i = 0, size = menu.size(); i < size; i++) {
-                    MenuItem menuItem = menu.getItem(i);
-                    if (isInOverflow(menuItem)) {
-                        colorMenuItem(menuItem, subMenuIconColor, subMenuIconAlpha);
-                    } else {
-                        colorMenuItem(menu.getItem(i), menuItemIconColor, menuItemIconAlpha);
-                    }
-                    if (menuItem.hasSubMenu()) {
-                        SubMenu subMenu = menuItem.getSubMenu();
-                        for (int j = 0; j < subMenu.size(); j++) {
-                            colorMenuItem(subMenu.getItem(j), subMenuIconColor, subMenuIconAlpha);
-                        }
-                    }
+        actionBarView.post(() -> {
+            for (int i = 0, size = menu.size(); i < size; i++) {
+                MenuItem menuItem = menu.getItem(i);
+                if (isInOverflow(menuItem)) {
+                    colorMenuItem(menuItem, subMenuIconColor, subMenuIconAlpha);
+                } else {
+                    colorMenuItem(menu.getItem(i), menuItemIconColor, menuItemIconAlpha);
                 }
-                if (menuItemIconColor != null || menuItemIconAlpha != null) {
-                    colorOverflowMenuItem(overflowButton);
+                if (menuItem.hasSubMenu()) {
+                    SubMenu subMenu = menuItem.getSubMenu();
+                    for (int j = 0; j < subMenu.size(); j++) {
+                        colorMenuItem(subMenu.getItem(j), subMenuIconColor, subMenuIconAlpha);
+                    }
                 }
             }
-
+            if (menuItemIconColor != null || menuItemIconAlpha != null) {
+                colorOverflowMenuItem(overflowButton);
+            }
         });
     }
 
@@ -381,6 +372,7 @@ public class MenuTint {
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                     overflow.setImageAlpha(menuItemIconAlpha);
                 } else {
+                    //noinspection deprecation
                     overflow.setAlpha(menuItemIconAlpha);
                 }
             }
diff --git a/app/src/main/java/de/kuschku/util/ui/ObservableTextBinder.java b/app/src/main/java/de/kuschku/util/ui/ObservableTextBinder.java
index 688db48ab..f0900ba67 100644
--- a/app/src/main/java/de/kuschku/util/ui/ObservableTextBinder.java
+++ b/app/src/main/java/de/kuschku/util/ui/ObservableTextBinder.java
@@ -26,7 +26,7 @@ import android.databinding.ObservableField;
 import android.widget.TextView;
 
 public class ObservableTextBinder {
-    private ObservableField<CharSequence> text;
+    private final ObservableField<CharSequence> text;
     private TextView view;
 
     public ObservableTextBinder(ObservableField<CharSequence> text) {
diff --git a/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java b/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java
index 0dd959171..95fe1c1cd 100644
--- a/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java
+++ b/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java
@@ -67,7 +67,7 @@ public class StorageBackendParcelable extends StorageBackend implements Parcelab
                         default:
                             throw new IllegalArgumentException("Can’t serialize type " + type.name());
                     }
-                } catch (IOException e) {
+                } catch (IOException ignored) {
                 }
             }
 
diff --git a/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListPreference.java b/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListPreference.java
index eda511cd0..1396c604e 100644
--- a/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListPreference.java
+++ b/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListPreference.java
@@ -215,7 +215,7 @@ public class MaterialListPreference extends ListPreference {
         public SavedState(Parcel source) {
             super(source);
             isDialogShowing = source.readInt() == 1;
-            dialogBundle = source.readBundle();
+            dialogBundle = source.readBundle(getClass().getClassLoader());
         }
 
         public SavedState(Parcelable superState) {
diff --git a/app/src/main/java/de/kuschku/util/ui/preferences/SeekBarPreference.java b/app/src/main/java/de/kuschku/util/ui/preferences/SeekBarPreference.java
index 90a6911a4..c2d2bc662 100644
--- a/app/src/main/java/de/kuschku/util/ui/preferences/SeekBarPreference.java
+++ b/app/src/main/java/de/kuschku/util/ui/preferences/SeekBarPreference.java
@@ -46,8 +46,6 @@ public class SeekBarPreference extends Preference implements OnSeekBarChangeList
     private int mMinValue = 0;
     private int mInterval = 1;
     private int mCurrentValue;
-    private String mUnitsLeft = "";
-    private String mUnitsRight = "";
     private AppCompatSeekBar mSeekBar;
 
     private TextView mStatusText;
@@ -75,10 +73,6 @@ public class SeekBarPreference extends Preference implements OnSeekBarChangeList
         mMaxValue = attrs.getAttributeIntValue(ANDROIDNS, "max", 100);
         mMinValue = attrs.getAttributeIntValue(APPLICATIONNS, "min", 0);
 
-        mUnitsLeft = getAttributeStringValue(attrs, APPLICATIONNS, "unitsLeft", "");
-        String units = getAttributeStringValue(attrs, APPLICATIONNS, "units", "");
-        mUnitsRight = getAttributeStringValue(attrs, APPLICATIONNS, "unitsRight", units);
-
         try {
             String newInterval = attrs.getAttributeValue(APPLICATIONNS, "interval");
             if (newInterval != null)
@@ -89,14 +83,6 @@ public class SeekBarPreference extends Preference implements OnSeekBarChangeList
 
     }
 
-    private String getAttributeStringValue(AttributeSet attrs, String namespace, String name, String defaultValue) {
-        String value = attrs.getAttributeValue(namespace, name);
-        if (value == null)
-            value = defaultValue;
-
-        return value;
-    }
-
     @Override
     protected View onCreateView(ViewGroup parent) {
         View view = super.onCreateView(parent);
@@ -178,9 +164,7 @@ public class SeekBarPreference extends Preference implements OnSeekBarChangeList
 
     @Override
     protected Object onGetDefaultValue(TypedArray ta, int index) {
-
-        int defaultValue = ta.getInt(index, DEFAULT_VALUE);
-        return defaultValue;
+        return ta.getInt(index, DEFAULT_VALUE);
 
     }
 
diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml
deleted file mode 100644
index b5751ba8a..000000000
--- a/app/src/main/res/anim/slide_in_right.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ QuasselDroid - Quassel client for Android
-  ~ Copyright (C) 2016 Janne Koschinski
-  ~ Copyright (C) 2016 Ken Børge Viktil
-  ~ Copyright (C) 2016 Magnus Fjell
-  ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
-  ~
-  ~ This program is free software: you can redistribute it and/or modify it
-  ~ under the terms of the GNU General Public License as published by the Free
-  ~ Software Foundation, either version 3 of the License, or (at your option)
-  ~ any later version.
-  ~
-  ~ This program is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU General Public License along
-  ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <translate android:fromXDelta="50%p" android:toXDelta="0"
-        android:duration="@android:integer/config_mediumAnimTime"/>
-    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
diff --git a/app/src/main/res/anim/slide_out_left.xml b/app/src/main/res/anim/slide_out_left.xml
deleted file mode 100644
index 3d7278e5f..000000000
--- a/app/src/main/res/anim/slide_out_left.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ QuasselDroid - Quassel client for Android
-  ~ Copyright (C) 2016 Janne Koschinski
-  ~ Copyright (C) 2016 Ken Børge Viktil
-  ~ Copyright (C) 2016 Magnus Fjell
-  ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
-  ~
-  ~ This program is free software: you can redistribute it and/or modify it
-  ~ under the terms of the GNU General Public License as published by the Free
-  ~ Software Foundation, either version 3 of the License, or (at your option)
-  ~ any later version.
-  ~
-  ~ This program is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU General Public License along
-  ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <translate android:fromXDelta="0" android:toXDelta="-50%p"
-        android:duration="@android:integer/config_mediumAnimTime"/>
-    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
-
diff --git a/app/src/main/res/color/selectable_button_background.xml b/app/src/main/res/color/selectable_button_background.xml
deleted file mode 100644
index b14317e10..000000000
--- a/app/src/main/res/color/selectable_button_background.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ QuasselDroid - Quassel client for Android
-  ~ Copyright (C) 2016 Janne Koschinski
-  ~ Copyright (C) 2016 Ken Børge Viktil
-  ~ Copyright (C) 2016 Magnus Fjell
-  ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
-  ~
-  ~ This program is free software: you can redistribute it and/or modify it
-  ~ under the terms of the GNU General Public License as published by the Free
-  ~ Software Foundation, either version 3 of the License, or (at your option)
-  ~ any later version.
-  ~
-  ~ This program is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU General Public License along
-  ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:color="#8A777777" />
-    <item android:state_focused="true"  android:state_enabled="false"                              android:color="#8A777777" />
-    <item android:state_focused="true"                                android:state_pressed="true" android:color="#8A333333" />
-    <item android:state_focused="false"                               android:state_pressed="true" android:color="#83333333" />
-    <item android:state_focused="true"                                                             android:color="#8A333333" />
-    <item                                                                                          android:color="#8A000000" />
-</selector>
diff --git a/app/src/main/res/layout-sw600dp-land/activity_setup.xml b/app/src/main/res/layout-sw600dp-land/activity_setup.xml
index aaa939798..6dd588f46 100644
--- a/app/src/main/res/layout-sw600dp-land/activity_setup.xml
+++ b/app/src/main/res/layout-sw600dp-land/activity_setup.xml
@@ -20,12 +20,11 @@
   ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
   -->
 
-<FrameLayout
+<merge
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="?attr/colorPrimary">
+    android:layout_height="match_parent">
 
     <android.support.v4.view.ViewPager
         android:id="@+id/view_pager"
@@ -47,4 +46,4 @@
         app:pressedTranslationZ="0dip"
         app:srcCompat="@drawable/ic_arrow_right"/>
 
-</FrameLayout>
+</merge>
diff --git a/app/src/main/res/layout-sw600dp/activity_setup.xml b/app/src/main/res/layout-sw600dp/activity_setup.xml
index af75da8fd..b24493cf5 100644
--- a/app/src/main/res/layout-sw600dp/activity_setup.xml
+++ b/app/src/main/res/layout-sw600dp/activity_setup.xml
@@ -20,12 +20,11 @@
   ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
   -->
 
-<FrameLayout
+<merge
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="?attr/colorPrimary">
+    android:layout_height="match_parent">
 
     <android.support.v4.view.ViewPager
         android:id="@+id/view_pager"
@@ -54,4 +53,4 @@
 
     </FrameLayout>
 
-</FrameLayout>
+</merge>
diff --git a/app/src/main/res/layout-sw600dp/slide.xml b/app/src/main/res/layout-sw600dp/slide.xml
index a20bf7a99..d68fea055 100644
--- a/app/src/main/res/layout-sw600dp/slide.xml
+++ b/app/src/main/res/layout-sw600dp/slide.xml
@@ -20,60 +20,55 @@
   ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
   -->
 
-<FrameLayout
+
+<ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="wrap_content"
+    android:layout_gravity="bottom">
 
-    <ScrollView
-        android:layout_width="match_parent"
+    <LinearLayout
+        android:layout_width="400dp"
         android:layout_height="wrap_content"
-        android:layout_gravity="bottom">
+        android:layout_gravity="center_horizontal"
+        android:orientation="vertical">
 
         <LinearLayout
-            android:layout_width="400dp"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_gravity="center_horizontal"
-            android:orientation="vertical">
+            android:layout_marginTop="64dp"
+            android:orientation="vertical"
+            android:padding="32dp">
 
-            <LinearLayout
+            <TextView
+                xmlns:android="http://schemas.android.com/apk/res/android"
+                android:id="@+id/title"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="64dp"
-                android:orientation="vertical"
-                android:padding="32dp">
-
-                <TextView
-                    xmlns:android="http://schemas.android.com/apk/res/android"
-                    android:id="@+id/title"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginBottom="32dp"
-                    android:text="@string/slideAccountcoreTitle"
-                    android:textColor="@android:color/white"
-                    android:textSize="28sp"
-                    android:textStyle="bold" />
-
-                <TextView
-                    xmlns:android="http://schemas.android.com/apk/res/android"
-                    android:id="@+id/description"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/slideAccountcoreDescription"
-                    android:textColor="@android:color/white"
-                    android:textSize="16sp" />
+                android:layout_marginBottom="32dp"
+                android:text="@string/slideAccountcoreTitle"
+                android:textColor="@android:color/white"
+                android:textSize="28sp"
+                android:textStyle="bold"/>
 
-            </LinearLayout>
-
-            <android.support.v7.widget.CardView
-                android:id="@+id/content_host"
+            <TextView
+                xmlns:android="http://schemas.android.com/apk/res/android"
+                android:id="@+id/description"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:background="@color/md_light_cards"
-                android:minHeight="400dp" />
+                android:text="@string/slideAccountcoreDescription"
+                android:textColor="@android:color/white"
+                android:textSize="16sp"/>
 
         </LinearLayout>
 
-    </ScrollView>
+        <android.support.v7.widget.CardView
+            android:id="@+id/content_host"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/md_light_cards"
+            android:minHeight="400dp"/>
+
+    </LinearLayout>
 
-</FrameLayout>
+</ScrollView>
diff --git a/app/src/main/res/layout/activity_accountchooser.xml b/app/src/main/res/layout/activity_accountchooser.xml
deleted file mode 100644
index d47d053c3..000000000
--- a/app/src/main/res/layout/activity_accountchooser.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ QuasselDroid - Quassel client for Android
-  ~ Copyright (C) 2016 Janne Koschinski
-  ~ Copyright (C) 2016 Ken Børge Viktil
-  ~ Copyright (C) 2016 Magnus Fjell
-  ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
-  ~
-  ~ This program is free software: you can redistribute it and/or modify it
-  ~ under the terms of the GNU General Public License as published by the Free
-  ~ Software Foundation, either version 3 of the License, or (at your option)
-  ~ any later version.
-  ~
-  ~ This program is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU General Public License along
-  ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical" android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-</LinearLayout>
diff --git a/app/src/main/res/layout/activity_channel_detail.xml b/app/src/main/res/layout/activity_channel_detail.xml
index a6d7d64a8..564f036e3 100644
--- a/app/src/main/res/layout/activity_channel_detail.xml
+++ b/app/src/main/res/layout/activity_channel_detail.xml
@@ -52,7 +52,7 @@
                 android:layout_marginLeft="16dp"
                 android:layout_marginRight="16dp"
                 android:gravity="fill_vertical"
-                android:text="Topic"
+                android:text="@string/topic"
                 android:textColor="?attr/colorAccent" />
 
             <TextView
@@ -72,7 +72,7 @@
                 android:layout_gravity="end"
                 android:layout_marginLeft="16dp"
                 android:layout_marginRight="16dp"
-                android:text="Edit Topic" />
+                android:text="@string/edit_topic"/>
 
             <View
                 android:layout_width="match_parent"
@@ -87,7 +87,7 @@
                 android:layout_marginLeft="16dp"
                 android:layout_marginRight="16dp"
                 android:gravity="fill_vertical"
-                android:text="Channel Modes"
+                android:text="@string/channel_modes"
                 android:textColor="?attr/colorAccent" />
 
             <LinearLayout
diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml
deleted file mode 100644
index 50b28109b..000000000
--- a/app/src/main/res/layout/activity_chat.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ QuasselDroid - Quassel client for Android
-  ~ Copyright (C) 2016 Janne Koschinski
-  ~ Copyright (C) 2016 Ken Børge Viktil
-  ~ Copyright (C) 2016 Magnus Fjell
-  ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
-  ~
-  ~ This program is free software: you can redistribute it and/or modify it
-  ~ under the terms of the GNU General Public License as published by the Free
-  ~ Software Foundation, either version 3 of the License, or (at your option)
-  ~ any later version.
-  ~
-  ~ This program is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU General Public License along
-  ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <include layout="@layout/widget_actionbar" />
-
-    <com.sothree.slidinguppanel.SlidingUpPanelLayout
-        android:id="@+id/sliding_layout"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:gravity="bottom"
-        android:orientation="vertical"
-        app:umanoPanelHeight="?attr/actionBarSize"
-        app:umanoScrollableView="@+id/chatline_scroller"
-        app:umanoShadowHeight="4dp">
-
-        <include layout="@layout/fragment_chat" />
-
-        <include layout="@layout/widget_slider" />
-
-    </com.sothree.slidinguppanel.SlidingUpPanelLayout>
-
-</LinearLayout>
diff --git a/app/src/main/res/layout/activity_chatlist_edit.xml b/app/src/main/res/layout/activity_chatlist_edit.xml
index 6609355e6..177edc335 100644
--- a/app/src/main/res/layout/activity_chatlist_edit.xml
+++ b/app/src/main/res/layout/activity_chatlist_edit.xml
@@ -59,7 +59,7 @@
                     android:id="@+id/name"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="Name"/>
+                    android:hint="@string/name"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -76,7 +76,7 @@
                     android:paddingBottom="8dp"
                     android:paddingLeft="3dp"
                     android:paddingRight="3dp"
-                    android:text="Network"
+                    android:text="@string/network"
                     android:textSize="12sp"/>
 
                 <android.support.v7.widget.AppCompatSpinner
@@ -94,37 +94,37 @@
                 android:id="@+id/showChannels"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="Show channels"/>
+                android:text="@string/show_channels"/>
 
             <android.support.v7.widget.AppCompatCheckBox
                 android:id="@+id/showQueries"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="Show Queries"/>
+                android:text="@string/show_queries"/>
 
             <android.support.v7.widget.AppCompatCheckBox
                 android:id="@+id/hideInactiveChats"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="Hide inactive chats"/>
+                android:text="@string/hide_inactive_chats"/>
 
             <android.support.v7.widget.AppCompatCheckBox
                 android:id="@+id/hideInactiveNetworks"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="Hide inactive networks"/>
+                android:text="@string/hide_inactive_networks"/>
 
             <android.support.v7.widget.AppCompatCheckBox
                 android:id="@+id/addAutomatically"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="Add new chats automatically"/>
+                android:text="@string/add_new_chats_automatically"/>
 
             <android.support.v7.widget.AppCompatCheckBox
                 android:id="@+id/sortAlphabetically"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="Sort alphabetically"/>
+                android:text="@string/sort_alphabetically"/>
 
             <LinearLayout
                 android:layout_width="match_parent"
@@ -139,7 +139,7 @@
                     android:paddingBottom="8dp"
                     android:paddingLeft="3dp"
                     android:paddingRight="3dp"
-                    android:text="Minimum Activity"
+                    android:text="@string/minimum_activity"
                     android:textSize="12sp"/>
 
                 <android.support.v7.widget.AppCompatSpinner
diff --git a/app/src/main/res/layout/activity_identity_edit.xml b/app/src/main/res/layout/activity_identity_edit.xml
index 47c030253..d98656b63 100644
--- a/app/src/main/res/layout/activity_identity_edit.xml
+++ b/app/src/main/res/layout/activity_identity_edit.xml
@@ -58,7 +58,7 @@
                     android:id="@+id/identityName"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="identityName"/>
+                    android:hint="@string/identityname"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -70,7 +70,7 @@
                     android:id="@+id/realName"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="realName"/>
+                    android:hint="@string/realname"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -82,7 +82,7 @@
                     android:id="@+id/ident"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="ident"/>
+                    android:hint="@string/ident"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -94,7 +94,7 @@
                     android:id="@+id/nicks"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="Edit Nicks"/>
+                    android:text="@string/edit_nicks"/>
 
             </android.support.v7.widget.ButtonBarLayout>
 
@@ -102,7 +102,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="48dp"
                 android:gravity="center_vertical"
-                android:text="Messages"
+                android:text="@string/messages"
                 android:textColor="?attr/colorAccent"
                 android:textSize="14sp"/>
 
@@ -114,7 +114,7 @@
                     android:id="@+id/kickReason"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="kickReason"/>
+                    android:hint="@string/kickreason"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -126,7 +126,7 @@
                     android:id="@+id/partReason"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="partReason"/>
+                    android:hint="@string/partreason"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -138,7 +138,7 @@
                     android:id="@+id/quitReason"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="quitReason"/>
+                    android:hint="@string/quitreason"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -146,7 +146,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="48dp"
                 android:gravity="center_vertical"
-                android:text="Away"
+                android:text="@string/away"
                 android:textColor="?attr/colorAccent"
                 android:textSize="14sp"/>
 
@@ -158,7 +158,7 @@
                     android:id="@+id/awayReason"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="awayReason"/>
+                    android:hint="@string/awayreason"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -168,7 +168,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="48dp"
                 android:gravity="center_vertical"
-                android:text="Away on Detach"
+                android:text="@string/away_on_detach"
                 android:textColor="?attr/colorAccent"
                 android:textSize="14sp"/>
 
@@ -186,7 +186,7 @@
                         android:id="@+id/awayOnDetachReason"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="awayOnDetachReason"/>
+                        android:hint="@string/awayondetachreason"/>
 
                 </android.support.design.widget.TextInputLayout>
 
diff --git a/app/src/main/res/layout/activity_network_edit.xml b/app/src/main/res/layout/activity_network_edit.xml
index 3b18b1c7d..4ca553564 100644
--- a/app/src/main/res/layout/activity_network_edit.xml
+++ b/app/src/main/res/layout/activity_network_edit.xml
@@ -59,7 +59,7 @@
                     android:id="@+id/networkName"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="networkName"/>
+                    android:hint="@string/networkname"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -76,7 +76,7 @@
                     android:layout_marginBottom="8dp"
                     android:paddingLeft="3dp"
                     android:paddingRight="3dp"
-                    android:text="identity"
+                    android:text="@string/identity"
                     android:textSize="12sp"/>
 
                 <android.support.v7.widget.AppCompatSpinner
@@ -94,7 +94,7 @@
                 android:id="@+id/rejoinChannels"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="rejoinChannels"/>
+                android:text="@string/rejoinchannels"/>
 
             <android.support.v7.widget.ButtonBarLayout
                 android:layout_width="match_parent"
@@ -104,7 +104,7 @@
                     android:id="@+id/servers"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="Edit Servers"/>
+                    android:text="@string/edit_servers"/>
 
             </android.support.v7.widget.ButtonBarLayout>
 
@@ -114,7 +114,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="48dp"
                 android:gravity="center_vertical"
-                android:text="Custom Codecs"
+                android:text="@string/custom_codecs"
                 android:textColor="?attr/colorAccent"
                 android:textSize="14sp"/>
 
@@ -133,7 +133,7 @@
                         android:id="@+id/codecForServer"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="codecForServer"/>
+                        android:hint="@string/codecforserver"/>
 
                 </android.support.design.widget.TextInputLayout>
 
@@ -145,7 +145,7 @@
                         android:id="@+id/codecForEncoding"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="codecForEncoding"/>
+                        android:hint="@string/codecforencoding"/>
 
                 </android.support.design.widget.TextInputLayout>
 
@@ -157,7 +157,7 @@
                         android:id="@+id/codecForDecoding"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="codecForDecoding"/>
+                        android:hint="@string/codecfordecoding"/>
 
                 </android.support.design.widget.TextInputLayout>
 
@@ -169,7 +169,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="48dp"
                 android:gravity="center_vertical"
-                android:text="Auto Identify"
+                android:text="@string/auto_identify"
                 android:textColor="?attr/colorAccent"
                 android:textSize="14sp"/>
 
@@ -188,7 +188,7 @@
                         android:id="@+id/autoIdentifyService"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="autoIdentifyService"/>
+                        android:hint="@string/autoidentifyservice"/>
 
                 </android.support.design.widget.TextInputLayout>
 
@@ -200,7 +200,7 @@
                         android:id="@+id/autoIdentifyPassword"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="autoIdentifyPassword"/>
+                        android:hint="@string/autoidentifypassword"/>
 
                 </android.support.design.widget.TextInputLayout>
 
@@ -212,7 +212,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="48dp"
                 android:gravity="center_vertical"
-                android:text="SASL"
+                android:text="@string/sasl"
                 android:textColor="?attr/colorAccent"
                 android:textSize="14sp"/>
 
@@ -230,7 +230,7 @@
                         android:id="@+id/saslAccount"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="saslAccount"/>
+                        android:hint="@string/saslaccount"/>
 
                 </android.support.design.widget.TextInputLayout>
 
@@ -242,7 +242,7 @@
                         android:id="@+id/saslPassword"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="saslPassword"/>
+                        android:hint="@string/saslpassword"/>
 
                 </android.support.design.widget.TextInputLayout>
             </LinearLayout>
@@ -253,7 +253,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="48dp"
                 android:gravity="center_vertical"
-                android:text="Auto Reconnect"
+                android:text="@string/auto_reconnect"
                 android:textColor="?attr/colorAccent"
                 android:textSize="14sp"/>
 
@@ -271,7 +271,7 @@
                         android:id="@+id/autoReconnectInterval"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="autoReconnectInterval"
+                        android:hint="@string/autoreconnectinterval"
                         android:inputType="number"/>
 
                 </android.support.design.widget.TextInputLayout>
@@ -280,7 +280,7 @@
                     android:id="@+id/unlimitedAutoReconnectRetries"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:text="unlimitedAutoReconnectRetries"/>
+                    android:text="@string/unlimitedautoreconnectretries"/>
 
                 <android.support.design.widget.TextInputLayout
                     android:layout_width="match_parent"
@@ -290,7 +290,7 @@
                         android:id="@+id/autoReconnectRetries"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="autoReconnectRetries"
+                        android:hint="@string/autoreconnectretries"
                         android:inputType="number"/>
 
                 </android.support.design.widget.TextInputLayout>
diff --git a/app/src/main/res/layout/activity_networkserver_edit.xml b/app/src/main/res/layout/activity_networkserver_edit.xml
index 63110f65c..f77fb0cab 100644
--- a/app/src/main/res/layout/activity_networkserver_edit.xml
+++ b/app/src/main/res/layout/activity_networkserver_edit.xml
@@ -59,7 +59,7 @@
                     android:id="@+id/host"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="host"/>
+                    android:hint="@string/host"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -71,7 +71,7 @@
                     android:id="@+id/port"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="port"
+                    android:hint="@string/port"
                     android:inputType="number"
                     android:maxLength="5"/>
 
@@ -81,7 +81,7 @@
                 android:id="@+id/useSSL"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="useSSL"/>
+                android:text="@string/usessl"/>
 
             <android.support.design.widget.TextInputLayout
                 android:layout_width="match_parent"
@@ -91,7 +91,7 @@
                     android:id="@+id/password"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:hint="password"/>
+                    android:hint="@string/password"/>
 
             </android.support.design.widget.TextInputLayout>
 
@@ -101,7 +101,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="48dp"
                 android:gravity="center_vertical"
-                android:text="Proxy"
+                android:text="@string/proxy"
                 android:textColor="?attr/colorAccent"
                 android:textSize="14sp"/>
 
@@ -120,7 +120,7 @@
                         android:id="@+id/proxyHost"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="proxyHost"/>
+                        android:hint="@string/proxyhost"/>
 
                 </android.support.design.widget.TextInputLayout>
 
@@ -132,7 +132,7 @@
                         android:id="@+id/proxyPort"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="proxyPort"
+                        android:hint="@string/proxyport"
                         android:inputType="number"
                         android:maxLength="5"/>
 
@@ -151,7 +151,7 @@
                         android:layout_marginBottom="8dp"
                         android:paddingLeft="3dp"
                         android:paddingRight="3dp"
-                        android:text="proxyType"
+                        android:text="@string/proxytype"
                         android:textSize="12sp"/>
 
                     <android.support.v7.widget.AppCompatSpinner
@@ -173,7 +173,7 @@
                         android:id="@+id/proxyUser"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="proxyUser"/>
+                        android:hint="@string/proxyuser"/>
 
                 </android.support.design.widget.TextInputLayout>
 
@@ -185,7 +185,7 @@
                         android:id="@+id/proxyPassword"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:hint="proxyPassword"/>
+                        android:hint="@string/proxypassword"/>
 
                 </android.support.design.widget.TextInputLayout>
 
diff --git a/app/src/main/res/layout/activity_nick_list.xml b/app/src/main/res/layout/activity_nick_list.xml
deleted file mode 100644
index 7f3dcc699..000000000
--- a/app/src/main/res/layout/activity_nick_list.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ QuasselDroid - Quassel client for Android
-  ~ Copyright (C) 2016 Janne Koschinski
-  ~ Copyright (C) 2016 Ken Børge Viktil
-  ~ Copyright (C) 2016 Magnus Fjell
-  ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
-  ~
-  ~ This program is free software: you can redistribute it and/or modify it
-  ~ under the terms of the GNU General Public License as published by the Free
-  ~ Software Foundation, either version 3 of the License, or (at your option)
-  ~ any later version.
-  ~
-  ~ This program is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU General Public License along
-  ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <android.support.design.widget.AppBarLayout
-        android:id="@+id/appBar"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:theme="?attr/actionBarTheme">
-
-        <android.support.v7.widget.Toolbar
-            android:id="@+id/toolbar"
-            android:layout_width="match_parent"
-            android:layout_height="?attr/actionBarSize"/>
-
-    </android.support.design.widget.AppBarLayout>
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical">
-
-        <android.support.v7.widget.RecyclerView
-            android:id="@+id/list"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
-
-        <android.support.design.widget.FloatingActionButton
-            android:id="@+id/add"
-            android:layout_width="56dp"
-            android:layout_height="56dp"
-            android:layout_gravity="end|bottom"
-            android:layout_marginBottom="16dp"
-            android:layout_marginEnd="16dp"
-            android:layout_marginRight="16dp"
-            android:tint="@color/colorFillDark"
-            app:srcCompat="@drawable/ic_add"/>
-    </FrameLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_setup.xml b/app/src/main/res/layout/activity_setup.xml
index c415b4ac9..70aadb377 100644
--- a/app/src/main/res/layout/activity_setup.xml
+++ b/app/src/main/res/layout/activity_setup.xml
@@ -20,12 +20,11 @@
   ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
   -->
 
-<FrameLayout
+<merge
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="?attr/colorPrimary">
+    android:layout_height="match_parent">
 
     <android.support.v4.view.ViewPager
         android:id="@+id/view_pager"
@@ -47,4 +46,4 @@
         app:pressedTranslationZ="0dip"
         app:srcCompat="@drawable/ic_arrow_right"/>
 
-</FrameLayout>
+</merge>
diff --git a/app/src/main/res/layout/dialog_address.xml b/app/src/main/res/layout/dialog_address.xml
deleted file mode 100644
index 59d124bf3..000000000
--- a/app/src/main/res/layout/dialog_address.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ QuasselDroid - Quassel client for Android
-  ~ Copyright (C) 2016 Janne Koschinski
-  ~ Copyright (C) 2016 Ken Børge Viktil
-  ~ Copyright (C) 2016 Magnus Fjell
-  ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
-  ~
-  ~ This program is free software: you can redistribute it and/or modify it
-  ~ under the terms of the GNU General Public License as published by the Free
-  ~ Software Foundation, either version 3 of the License, or (at your option)
-  ~ any later version.
-  ~
-  ~ This program is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU General Public License along
-  ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:paddingBottom="@dimen/activity_vertical_margin"
-    android:paddingLeft="@dimen/activity_horizontal_margin"
-    android:paddingRight="@dimen/activity_horizontal_margin"
-    android:paddingTop="@dimen/activity_vertical_margin">
-    <android.support.design.widget.TextInputLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-        <android.support.v7.widget.AppCompatEditText
-            android:id="@+id/host"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:hint="@string/labelHostname"
-            android:inputType="textUri" />
-    </android.support.design.widget.TextInputLayout>
-
-    <android.support.design.widget.TextInputLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-        <android.support.v7.widget.AppCompatEditText
-            android:id="@+id/port"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:hint="@string/labelPort"
-            android:inputType="number" />
-    </android.support.design.widget.TextInputLayout>
-</LinearLayout>
diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml
index 484db8acd..002c1ebe1 100644
--- a/app/src/main/res/layout/fragment_chat.xml
+++ b/app/src/main/res/layout/fragment_chat.xml
@@ -32,7 +32,7 @@
     app:umanoPanelHeight="?attr/actionBarSize"
     app:umanoScrollableView="@+id/chatline_scroller"
     app:umanoShadowHeight="4dp"
-    tools:showIn="@layout/activity_chat">
+    tools:showIn="@layout/activity_main">
 
     <FrameLayout
         android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/fragment_loading.xml b/app/src/main/res/layout/fragment_loading.xml
index 17025c0e1..2b0c883c4 100644
--- a/app/src/main/res/layout/fragment_loading.xml
+++ b/app/src/main/res/layout/fragment_loading.xml
@@ -20,38 +20,37 @@
   ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
   -->
 
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="240dp"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center_vertical|center_horizontal"
+    android:orientation="vertical">
 
     <LinearLayout
-        android:layout_width="240dp"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
-        android:layout_centerVertical="true"
-        android:orientation="vertical">
-        <LinearLayout
-            android:layout_width="match_parent"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/label"
+            android:layout_width="0dip"
             android:layout_height="wrap_content"
-            android:orientation="horizontal">
-            <TextView
-                android:id="@+id/label"
-                android:layout_width="0dip"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:text="@string/statusConnecting"
-                android:textAppearance="@style/TextAppearance.AppCompat.Caption" />
-            <TextView
-                android:id="@+id/count"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="@style/TextAppearance.AppCompat.Caption" />
-        </LinearLayout>
-        <ProgressBar
-            android:id="@+id/progressBar"
-            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
-            android:layout_width="match_parent"
+            android:layout_weight="1"
+            android:text="@string/statusConnecting"
+            android:textAppearance="@style/TextAppearance.AppCompat.Caption"/>
+
+        <TextView
+            android:id="@+id/count"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:indeterminate="true" />
+            android:textAppearance="@style/TextAppearance.AppCompat.Caption"/>
     </LinearLayout>
-</RelativeLayout>
+
+    <ProgressBar
+        android:id="@+id/progressBar"
+        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:indeterminate="true"/>
+</LinearLayout>
diff --git a/app/src/main/res/layout/slide_account_name.xml b/app/src/main/res/layout/slide_account_name.xml
index 5fcd81ce6..2d4a66a89 100644
--- a/app/src/main/res/layout/slide_account_name.xml
+++ b/app/src/main/res/layout/slide_account_name.xml
@@ -22,20 +22,19 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:orientation="vertical"
     android:padding="32dp">
 
     <android.support.design.widget.TextInputLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:hint="Account Name">
+        android:hint="@string/account_name">
         <android.support.design.widget.TextInputEditText
             android:id="@+id/name"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:inputType="textEmailSubject" />
+            android:layout_height="wrap_content"/>
     </android.support.design.widget.TextInputLayout>
 
 </LinearLayout>
diff --git a/app/src/main/res/layout/slide_account_user.xml b/app/src/main/res/layout/slide_account_user.xml
index add3a0edd..d20320cc3 100644
--- a/app/src/main/res/layout/slide_account_user.xml
+++ b/app/src/main/res/layout/slide_account_user.xml
@@ -22,15 +22,15 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:orientation="vertical"
     android:padding="32dp">
 
     <android.support.design.widget.TextInputLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:hint="Username">
+        android:hint="@string/username">
         <android.support.design.widget.TextInputEditText
             android:id="@+id/user"
             android:layout_width="match_parent"
@@ -41,7 +41,7 @@
     <android.support.design.widget.TextInputLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:hint="Password">
+        android:hint="@string/password">
         <android.support.design.widget.TextInputEditText
             android:id="@+id/pass"
             android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/slide_core_select_backend.xml b/app/src/main/res/layout/widget_chatmessage_markerline.xml
similarity index 92%
rename from app/src/main/res/layout/slide_core_select_backend.xml
rename to app/src/main/res/layout/widget_chatmessage_markerline.xml
index 6e39a33fa..bfbbd490f 100644
--- a/app/src/main/res/layout/slide_core_select_backend.xml
+++ b/app/src/main/res/layout/widget_chatmessage_markerline.xml
@@ -20,7 +20,8 @@
   ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
   -->
 
-<android.support.v7.widget.RecyclerView
+<View
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="400dp" />
\ No newline at end of file
+    android:layout_height="8dp"
+    android:background="@color/md_red_500"/>
diff --git a/app/src/main/res/layout/widget_core_account_add.xml b/app/src/main/res/layout/widget_core_account_add.xml
index 8c5422b65..01567be95 100644
--- a/app/src/main/res/layout/widget_core_account_add.xml
+++ b/app/src/main/res/layout/widget_core_account_add.xml
@@ -67,10 +67,10 @@
             android:fontFamily="sans-serif-medium"
             android:gravity="center_vertical|start"
             android:lines="1"
+            android:paddingEnd="@dimen/material_drawer_item_primary_icon_padding_right"
             android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right"
             android:singleLine="true"
-            android:text="Add Account"
-            android:textDirection="anyRtl"
+            android:text="@string/add_account"
             android:textSize="@dimen/material_drawer_item_profile_text" />
     </LinearLayout>
 </LinearLayout>
diff --git a/app/src/main/res/layout/widget_drawer_network.xml b/app/src/main/res/layout/widget_drawer_network.xml
index 0078a5940..99ccea32a 100644
--- a/app/src/main/res/layout/widget_drawer_network.xml
+++ b/app/src/main/res/layout/widget_drawer_network.xml
@@ -19,37 +19,29 @@
   ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
   -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              xmlns:tools="http://schemas.android.com/tools"
-              android:layout_width="match_parent"
-              android:layout_height="@dimen/material_drawer_item_primary"
-              android:background="?attr/selectableItemBackground"
-              android:clickable="true"
-              android:orientation="horizontal"
-              android:paddingEnd="@dimen/material_drawer_vertical_padding"
-              android:paddingLeft="@dimen/material_drawer_vertical_padding"
-              android:paddingRight="@dimen/material_drawer_vertical_padding"
-              android:paddingStart="@dimen/material_drawer_vertical_padding">
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/material_drawer_item_primary"
+    android:background="?attr/selectableItemBackground"
+    android:clickable="true"
+    android:gravity="center_vertical|start"
+    android:orientation="vertical"
+    android:paddingEnd="@dimen/material_drawer_vertical_padding"
+    android:paddingLeft="@dimen/material_drawer_vertical_padding"
+    android:paddingRight="@dimen/material_drawer_vertical_padding"
+    android:paddingStart="@dimen/material_drawer_vertical_padding">
 
-    <LinearLayout
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
+    <TextView
+        android:id="@+id/material_drawer_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:fontFamily="sans-serif-medium"
         android:gravity="center_vertical|start"
-        android:orientation="vertical">
+        android:lines="1"
+        android:singleLine="true"
+        android:textSize="@dimen/material_drawer_item_primary_text"
+        tools:text="Some drawer text"/>
 
-        <TextView
-            android:id="@+id/material_drawer_name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:fontFamily="sans-serif-medium"
-            android:gravity="center_vertical|start"
-            android:lines="1"
-            android:singleLine="true"
-            android:textDirection="anyRtl"
-            android:textSize="@dimen/material_drawer_item_primary_text"
-            tools:text="Some drawer text" />
-
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/app/src/main/res/layout/widget_slider.xml b/app/src/main/res/layout/widget_slider.xml
index 812fa9d2d..aeb551b6f 100644
--- a/app/src/main/res/layout/widget_slider.xml
+++ b/app/src/main/res/layout/widget_slider.xml
@@ -21,21 +21,21 @@
   -->
 
 <com.sothree.slidinguppanel.SlidingUpPanelLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/sliding_layout_history"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:background="?attr/colorBackgroundCard"
-    android:clickable="false"
-    android:focusable="true"
-    android:gravity="bottom"
-    app:umanoFadeColor="?attr/colorBackground"
-    app:umanoOverlay="true"
-    app:umanoPanelHeight="0dip"
-    app:umanoScrollableView="@+id/msg_history"
-    app:umanoShadowHeight="0.0dip"
-    tools:showIn="@layout/activity_chat">
+                                                 xmlns:app="http://schemas.android.com/apk/res-auto"
+                                                 xmlns:tools="http://schemas.android.com/tools"
+                                                 android:id="@+id/sliding_layout_history"
+                                                 android:layout_width="fill_parent"
+                                                 android:layout_height="fill_parent"
+                                                 android:background="?attr/colorBackgroundCard"
+                                                 android:clickable="false"
+                                                 android:focusable="true"
+                                                 android:gravity="bottom"
+                                                 app:umanoFadeColor="?attr/colorBackground"
+                                                 app:umanoOverlay="true"
+                                                 app:umanoPanelHeight="0dip"
+                                                 app:umanoScrollableView="@+id/msg_history"
+                                                 app:umanoShadowHeight="0.0dip"
+                                                 tools:showIn="@layout/activity_main">
 
 
     <include layout="@layout/widget_editor" />
diff --git a/app/src/main/res/menu/chat.xml b/app/src/main/res/menu/chat.xml
index c6154866f..02cb18e3f 100644
--- a/app/src/main/res/menu/chat.xml
+++ b/app/src/main/res/menu/chat.xml
@@ -37,11 +37,11 @@
         app:showAsAction="never" />
     <item
         android:id="@+id/action_networks"
-        android:title="Networks"
+        android:title="@string/networks"
         app:showAsAction="never" />
     <item
         android:id="@+id/action_identities"
-        android:title="Identities"
+        android:title="@string/identities"
         app:showAsAction="never" />
     <item
         android:id="@+id/action_reauth"
diff --git a/app/src/main/res/menu/confirm.xml b/app/src/main/res/menu/confirm.xml
index 637496929..c952bf45a 100644
--- a/app/src/main/res/menu/confirm.xml
+++ b/app/src/main/res/menu/confirm.xml
@@ -25,6 +25,6 @@
     <item
         android:id="@+id/action_confirm"
         android:icon="@drawable/ic_check"
-        android:title="Save"
+        android:title="@string/save"
         app:showAsAction="always"/>
 </menu>
\ No newline at end of file
diff --git a/app/src/main/res/menu/confirm_delete.xml b/app/src/main/res/menu/confirm_delete.xml
index d45a6de75..c42fbdd84 100644
--- a/app/src/main/res/menu/confirm_delete.xml
+++ b/app/src/main/res/menu/confirm_delete.xml
@@ -25,11 +25,11 @@
     <item
         android:id="@+id/action_delete"
         android:icon="@drawable/ic_delete"
-        android:title="Delete"
+        android:title="@string/delete"
         app:showAsAction="always"/>
     <item
         android:id="@+id/action_confirm"
         android:icon="@drawable/ic_check"
-        android:title="Save"
+        android:title="@string/save"
         app:showAsAction="always"/>
 </menu>
\ No newline at end of file
diff --git a/app/src/main/res/values-w720dp/bools.xml b/app/src/main/res/values-w720dp/bools.xml
deleted file mode 100644
index 533e6f4ea..000000000
--- a/app/src/main/res/values-w720dp/bools.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ QuasselDroid - Quassel client for Android
-  ~ Copyright (C) 2016 Janne Koschinski
-  ~ Copyright (C) 2016 Ken Børge Viktil
-  ~ Copyright (C) 2016 Magnus Fjell
-  ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
-  ~
-  ~ This program is free software: you can redistribute it and/or modify it
-  ~ under the terms of the GNU General Public License as published by the Free
-  ~ Software Foundation, either version 3 of the License, or (at your option)
-  ~ any later version.
-  ~
-  ~ This program is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU General Public License along
-  ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<resources>
-    <bool name="isTablet">true</bool>
-</resources>
diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml
deleted file mode 100644
index 26d3877c3..000000000
--- a/app/src/main/res/values/bools.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ QuasselDroid - Quassel client for Android
-  ~ Copyright (C) 2016 Janne Koschinski
-  ~ Copyright (C) 2016 Ken Børge Viktil
-  ~ Copyright (C) 2016 Magnus Fjell
-  ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
-  ~
-  ~ This program is free software: you can redistribute it and/or modify it
-  ~ under the terms of the GNU General Public License as published by the Free
-  ~ Software Foundation, either version 3 of the License, or (at your option)
-  ~ any later version.
-  ~
-  ~ This program is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU General Public License along
-  ~ with this program.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<resources>
-    <bool name="isTablet">false</bool>
-</resources>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index f5c1591a4..8a80003cd 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -27,7 +27,5 @@
     <dimen name="message_horizontal">8dp</dimen>
     <dimen name="message_vertical">2dp</dimen>
 
-    <dimen name="circular_button_size">56dp</dimen>
-
     <dimen name="action_bar_default_padding_start_material">0dp</dimen>
 </resources>
diff --git a/app/src/main/res/values/preferences.xml b/app/src/main/res/values/preferences.xml
index 3b51bbdff..6fb036b3a 100644
--- a/app/src/main/res/values/preferences.xml
+++ b/app/src/main/res/values/preferences.xml
@@ -30,23 +30,23 @@
 
     <string name="preference_colors" translatable="false">preference_colors</string>
     <string name="preference_colors_title">Use mIRC Colors</string>
-    <string name="preference_colors_summary_on"></string>
-    <string name="preference_colors_summary_off"></string>
+    <string name="preference_colors_summary_on">preference_colors_summary_on</string>
+    <string name="preference_colors_summary_off">preference_colors_summary_off</string>
 
     <string name="preference_hostmask" translatable="false">preference_hostname</string>
     <string name="preference_hostmask_title">Show Hostmask in Messages</string>
-    <string name="preference_hostmask_summary_on"></string>
-    <string name="preference_hostmask_summary_off"></string>
+    <string name="preference_hostmask_summary_on">preference_hostmask_summary_on</string>
+    <string name="preference_hostmask_summary_off">preference_hostmask_summary_off</string>
 
     <string name="preference_lag" translatable="false">preference_lag</string>
     <string name="preference_lag_title">Show Connection Lag</string>
-    <string name="preference_lag_summary_on"></string>
-    <string name="preference_lag_summary_off"></string>
+    <string name="preference_lag_summary_on">preference_lag_summary_on</string>
+    <string name="preference_lag_summary_off">preference_lag_summary_off</string>
 
     <string name="preference_brackets" translatable="false">preference_brackets</string>
     <string name="preference_brackets_title">Classical Nick Style</string>
-    <string name="preference_brackets_summary_on"></string>
-    <string name="preference_brackets_summary_off"></string>
+    <string name="preference_brackets_summary_on">preference_brackets_summary_on</string>
+    <string name="preference_brackets_summary_off">preference_brackets_summary_off</string>
 
     <string-array name="preference_theme_entries">
         <item>Quassel™ (Light)</item>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b9de9c4ae..27bc27d9c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -40,10 +40,7 @@
     <!-- Actions, Labels and Messages -->
     <string name="labelLogin">Login</string>
     <string name="labelCancel">Cancel</string>
-    <string name="labelReconnect">Connect</string>
-    <string name="labelSettings">Settings</string>
     <string name="labelStatusBuffer">Status Buffer</string>
-    <string name="labelAddress">Address</string>
     <string name="labelHistory">Input History</string>
     <string name="labelHostname">Hostname</string>
     <string name="labelPort">Port</string>
@@ -95,12 +92,89 @@
     <string name="action_part">Part</string>
     <string name="action_delete">Delete</string>
 
-    <string name="action_hidden_display">Show hidden Buffers</string>
-    <string name="action_hidden_hide">Hide hidden Buffers</string>
-
     <string name="action_unhide">Make Visible</string>
     <string name="action_hide_temp">Hide Temporarily</string>
     <string name="action_hide_perm">Hide Permanently</string>
 
     <string name="all_networks">All Networks</string>
+    <string name="channeldetails">Channel Details</string>
+    <string name="editchatlists">Edit Chat Lists</string>
+    <string name="editchatlist">Edit Chat List</string>
+    <string name="createchatlist">Create Chat List</string>
+    <string name="editnetworks">Edit Networks</string>
+    <string name="editnetwork">Edit Network</string>
+    <string name="createnetwork">Create Network</string>
+    <string name="editnetworkservers">Edit NetworkServers</string>
+    <string name="editidentities">Edit Identities</string>
+    <string name="editidentity">Edit Identity</string>
+    <string name="createidentity">Create Identity</string>
+    <string name="editnicks">Edit Nicks</string>
+    <string name="editnetworkserver">Edit NetworkServer</string>
+    <string name="accountsetup">Account Setup</string>
+    <string name="accountselection">Account Selection</string>
+    <string name="coresetup">Core Setup</string>
+    <string name="settings">Settings</string>
+    <string name="areyousureyouwanttodelete">Are you sure you want to delete "%1$s"?</string>
+    <string name="yes">Yes</string>
+    <string name="no">No</string>
+    <string name="youhavemadechangesdoyouwishtosavethem">You have made changes, do you wish to save them?</string>
+    <string name="name">Name</string>
+    <string name="network">Network</string>
+    <string name="show_channels">Show channels</string>
+    <string name="show_queries">Show Queries</string>
+    <string name="hide_inactive_chats">Hide inactive chats</string>
+    <string name="hide_inactive_networks">Hide inactive networks</string>
+    <string name="add_new_chats_automatically">Add new chats automatically</string>
+    <string name="sort_alphabetically">Sort alphabetically</string>
+    <string name="minimum_activity">Minimum Activity</string>
+    <string name="identityname">identityName</string>
+    <string name="realname">realName</string>
+    <string name="ident">ident</string>
+    <string name="edit_nicks">Edit Nicks</string>
+    <string name="messages">Messages</string>
+    <string name="kickreason">kickReason</string>
+    <string name="partreason">partReason</string>
+    <string name="quitreason">quitReason</string>
+    <string name="away">Away</string>
+    <string name="awayreason">awayReason</string>
+    <string name="away_on_detach">Away on Detach</string>
+    <string name="awayondetachreason">awayOnDetachReason</string>
+    <string name="networkname">networkName</string>
+    <string name="identity">identity</string>
+    <string name="rejoinchannels">rejoinChannels</string>
+    <string name="edit_servers">Edit Servers</string>
+    <string name="custom_codecs">Custom Codecs</string>
+    <string name="codecforserver">codecForServer</string>
+    <string name="codecforencoding">codecForEncoding</string>
+    <string name="codecfordecoding">codecForDecoding</string>
+    <string name="auto_identify">Auto Identify</string>
+    <string name="autoidentifyservice">autoIdentifyService</string>
+    <string name="autoidentifypassword">autoIdentifyPassword</string>
+    <string name="sasl">SASL</string>
+    <string name="saslaccount">saslAccount</string>
+    <string name="saslpassword">saslPassword</string>
+    <string name="auto_reconnect">Auto Reconnect</string>
+    <string name="autoreconnectinterval">autoReconnectInterval</string>
+    <string name="unlimitedautoreconnectretries">unlimitedAutoReconnectRetries</string>
+    <string name="autoreconnectretries">autoReconnectRetries</string>
+    <string name="host">host</string>
+    <string name="port">port</string>
+    <string name="usessl">useSSL</string>
+    <string name="password">password</string>
+    <string name="proxy">Proxy</string>
+    <string name="proxyhost">proxyHost</string>
+    <string name="proxyport">proxyPort</string>
+    <string name="proxytype">proxyType</string>
+    <string name="proxyuser">proxyUser</string>
+    <string name="proxypassword">proxyPassword</string>
+    <string name="networks">Networks</string>
+    <string name="identities">Identities</string>
+    <string name="save">Save</string>
+    <string name="delete">Delete</string>
+    <string name="topic">Topic</string>
+    <string name="edit_topic">Edit Topic</string>
+    <string name="channel_modes">Channel Modes</string>
+    <string name="account_name">Account Name</string>
+    <string name="username">Username</string>
+    <string name="add_account">Add Account</string>
 </resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 5d48bcba6..1881c90ce 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -76,6 +76,8 @@
         <item name="colorFill">@color/colorFillLight</item>
         <item name="colorOffline">@color/colorOfflineLight</item>
         <item name="colorAway">@color/colorAwayLight</item>
+
+        <item name="android:windowBackground">@color/colorPrimary</item>
     </style>
 
     <style name="RippleOverlay" parent="ThemeOverlay.AppCompat">
-- 
GitLab