diff --git a/app/build.gradle b/app/build.gradle
index c8f0f071a1385176a1f82aee0995ee2110fa562a..38fd8549ea63d460d0129f26419b4a80107468be 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 30f732755a9b494587b0108b8fa33aea231d44e1..ea203c82830f7a4a0bc84b740a44b403b9d30f7e 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 7f3eeb4a0626926ab827c8e37a913983e5c0c196..944cd7cccb51d68f6612998caa173fcd2aca8f0f 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 081b643b97e4f4db32b37e55d4af61fd4b511187..eead77323728e05c146b0a9d2eae84635b083853 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 318c46da0893d149b5e03028923178444e60d776..7a40061d6d5d51aa1bea2587cab37a1195be969f 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 1bc37157d162ee267b5f9ce4e7c800a7e3785da5..1da25b58cd22c8d5f154c62f63b5b33c5c5a89e5 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 d64ddf1361e3323bdefb126ec2e680c100773523..8d7ab94836160966a31d4c3e2d6b14e6beaeb4f9 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 fe93036a7d78f2c1708a67eeb11b80abcf3a89c3..4a2343884c67d49f0e7d6ebf2f4e07cb6046f738 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 9779d45b0cd42953a6652b2814ac42b340690e2a..a2f3b8c10c1737662037970b517a9f25eb1f1bab 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 ff0e7e0d47352576625ec43ca323104932dbd2e4..0000000000000000000000000000000000000000
--- 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 32418578b5a3ea813bdf69f5a8cae5a1c770e2f2..d215a841feed021d83cc6efb6cf86ba6048d3910 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 c85e01f8c331930a8b64fcc0d8bb5496fb7dfb02..61612c57ef6618f06d22ca474452cbc85bd8b8aa 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 f900335960a1b71bea7393f0b348fdd3ce2f32e9..162909106142c4cdf719f9ecf9a0fe0af8ef1d23 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 a87f00a1f24052123a1ba31a4660fa57e64fdd02..5b3fc8d9aead95d48bfe1ffc043ffeefc2c1149a 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 bf87ac64d87295523a96cb2e25a1deb2abb8ce0f..fd3158ee54a6c651989ec2cda6864061c99101e4 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 99bd029dc78ab3e6b9c256273d053996e80b01f7..eb795a5b9846370d97100de7d8cf8b254483dbc7 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 953283f6f8ef6b317d02cda61cbe4a86eadea733..b6fe16f838b40505a41fad1af27afa1f27acb0d7 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 018faf12f39d802ddc3fb60e4bf4da3174e31dd0..3a55c3c2430cb64e9f3aab0ae29b5c4afb8ae10d 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 3e3e1df20746f3ba54cb8f6857efb0628472af4d..b4de808488699d66d88c483fe2621d16fa669f15 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 ca3142bd7041f5746a86a3edf512f3ad2b8dd7bb..1f3b3f625025b7bb9a745c675d5b0345e99c819d 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 6474e4b3d192d781a2146583ba40ed904adf4314..5a7e91dc075afa4da89cdd39cc4b6302d4a5b7ea 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 e96bcb9ea56c54df89a861faa289eb760fabb595..fa128a1a7f3ae3410cff52d67a55379801d74a3b 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 c3068527e4a4ccae50057fc17780f643438eb5a2..915c6df82669657e76db58a9de44ea1b43203661 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 ad89470fb847125f335af8f1ac6c98ce8af32a02..260db1f7f7566ec1a46fa2f2ac985abcaaf4c9c8 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 aa7f95970eeac73fe9eb72b3b88346fbf0ec6964..b210b665a5a2d0e4947b42a6e9bac0bc6ceb68d2 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 255e542ca7ad66e4e05600c7085c0ada8ce943d2..2c8398e0f1dcbd7cfa81c0dd59e515b4e51363ea 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 26e66fb45a70d3641390fde3cc543d819b936ac3..9c3840c4da12f4e51f274a003adb5e0b11c0e796 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 65173f84d82980a77e2c6bb7cdc7e248bf2a9796..2083fa9773014b4523479123a0a6c6d674ac6bf4 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 3868be202d0792c154b426ba9c8f0aca64f2f959..2cba3c90380d62f0fc185f02e5906a86c8448464 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 75e2e59f8c6093b93bf5538873d3315d9bea793b..846928d1b1127263d4eb63c4c57d94f9dd3eaf80 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 54ebdc7f3d3161f9d7b0df67f55d1e84339f4d22..e86420ffe08c4f219c6b3c6665eb579b6544a3d4 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 3091ec2b6f5b2bb0949e08166a849d91982a20e0..18a00057c4f092c4b60d14f5078b17e7fc30c6cf 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 55771c3995ff17047e63a3dabecd878c69f1fa90..34c679c3e94f629e092712627d90534b2ec04327 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 dfe270e47c5a0db123dea5a45e00d62a0913c9dd..85fe0971cc868ea5ecf31df8e224a27698fe61bf 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 bb18a24a74dd2d58e1e3567cd6e7b2d4313a343f..376f7b64038f42ba2578a49d7b53d7aa59d1ad36 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 8a58e12f5d01b31bd75f4ad751c46b9689d8a2d1..028db19eebea1c5d947f6972f63d22364fb09809 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 dd692cde0b7eb01751ac707cb18349db211a54f7..af4909d0f8de7cd18d5fea4756d9ed8a35df9ebb 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 7a790a1b26a49ba61955e12f784efb0b1cfe5e0b..a6db50475114bb9472f6b784236ae1bd7c5876ca 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 30e9041a15df3dfcfb0a0c3bfcb9e7809720a689..444821be631cb9185350f67660e9938d4dd7925d 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 2a342af270876e678a9f676b20d813e16ad455e0..30c84c57acd49cea3ca85d87852fd18058ddf709 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 451d9165569bd8dde0300161a435b29b8f09d18d..88e7a4db3476c082a710da6d4c24fbf5363d53d4 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 29d9e7401541a3cf8d2c0d3bec3ce24a40a89512..2eac770c63abbd0f553a9296f8caf4994ba39518 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 fe9a0158e857ad79fcea7c4ccf5666f9e946dd30..167c308d68b82445e59c705eb6e15f4d34e32080 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 5c4476bce244a68755021ec2b5080200e28c352c..d3a1bd65f4e440916312e853e48ace67476899c7 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 c959371bf1b92a261f9345178f5150beb795a14e..e7a98fa7ec92c681924c418bc2f0b4678d21295f 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 73723f657f793aa31049a2e0ec65c61c450ec45a..5551746d72de3b31083b1485fa23babe655018a8 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 e0d86acf3f5b75316dd4c72e8dceeadb2496e3b4..d24225b4ad91fb57da0ec42850c67bbd40d429aa 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 4c329fb2468b254d477551d9e62ab4f28d5bc54c..aaeef76c601da135517824d6e49bddfbccb99189 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 467ca0827a820e066ebef1e2555932b43501db5b..4f7c39ccd98258cfa738e4e175db90aeb414b43f 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 6cd15a9acc52a132488d69effee3fce2c614bbc9..6042a3e86ea72e21440904683fcdfd46a2ed39f8 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 b55873b3fbc1b3cbbcaf8c88da42b97843f49f53..fc1721c0f894b3e39c3b05f643eadf752ec1ac41 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 031130854ff837ce4ed30079ed46e04cec6cb5be..92df9f1bc9f88ecc88af2029b1603287646778d0 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 3001c4ebfd652e5831c855cb965ebd07587421c6..bf010533ef895539bd0f4480f93f7a586a64e03c 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 cb56db012c6289f44028f96551cc0579a12351fd..db46e411447f612bbab9d3799c355e9476cab808 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 563bb1ff3ee401af1c57e615f814b4747b33c04a..3f81a5d275491ce285f1b35010325cc5febdb323 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 de5251792eb3619eed5a2c26b9209c7c2996e14c..2fd7bda3c1a59487922da3c8acfb1d0c98ab2225 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 591fea3904a0c2b895de6796936cd62e475e1fb3..5ad2ef2405c7f4198f1aae695e0bf6bfc2aaee8f 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 eb2e7846f53773b22712080859566dff12bff7e7..d3f7800a008b7f756cb1c4e011c2c2c820c32f5b 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 1de6ee000ff7070178edf9ae0347b169c70b5ebe..79722cd81396a69cbbe1b6bb267a2416cb92d7f5 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 d4257e0c48b843c2df379a07e2b401ae4177bf09..d2dc408c0816f3ae2dcfb5398de42a5957ceefca 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 132908a90b49872e0ac147c57b8a760dab738a06..597e228b8e6add8f54a6f71cee1dcb679d5a1568 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 9e26fdac6d18086525f724d975fe61ae65b35551..14ab0fc1210813603643ef4345609b6e1dbe5c6e 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 3985ebbbff65d8dbfe7664ddee1efcad7326413f..850bf5a5dfec20599fe7493c86f613ccc2b02fdf 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 7834a184d311184df38bbf281ccc741905e2fd9a..d5ee9b0e3930199301fec345bd6be2bd4c3ffe9c 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 58675d57dc2be8dec87f98443b62dbbb1bf6759a..c459aa9910d8881c400f3d0520ccbc2e87eb4f2e 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 9d1f05e82357cf195ef3e6245629f44ed83291bf..25a8c58ecb72bacb100282fca0f83273c003403d 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 0bbe03c3fac400c9bc0ea9f63aa53a60871504f0..0d1928f282c67ee1110f74948908d602257bcf6b 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 2809fac09f32b4df182a984bf0c3873343e168c4..4be29e2cfa749fabce7945f1636a49a611eba146 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 4cd770a663b75f4a34da8522e22eb8e076ed38ce..617df7a8781e59788662afcade6ee8d9d96e6234 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 29305bc836c8bbfd71f8b6d2bcf93e59ce9fbab7..b84884bba048fc4cb48dec01a2f45fecbad9f58f 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 68ab29647d6432b0dd0e460add3812696b1b0e10..907f642071c13e28259fc6c0c9cbf7591f617b76 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 62d1bd3f24e09f12891ea8041c784ec087eda95d..1aee8a6fc68680d78b542c097a84b6f9014809d7 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 caf05dff0d1337ff9d80b4ef31d1c5048a5a7a8f..2e701bf8e38e4e398bc772c4543069f79e2443b5 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 2d0cfdc034f58f406532ef6d21d526acee2f91f3..0000000000000000000000000000000000000000
--- 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 99d0a9c6d34f7152bb8ea13400985bcbf177a386..e6126f4ebc51985d6f63e51b156531853a44f5d6 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 280d7aea203302563c72a954c7a903a750dae50c..ebd2652954517858db28fb382edd615b69924ba5 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 a692f8ccbfae3a9250968f74e347f664c797f590..f487dd22f6a1c4661a92068beebd411eb0b1e994 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 620d766b1840c8c561901dcc2e9ff8cfb6e6c80e..70a6132062d93d985c73f80c048f1e626ce05d7f 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 a4492474d33eb2ccccf5a037f96658aa38865daa..bcd9a8f1b7b48d96668c39094d6195c1891bb1e3 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 c53b0320894bedff29d6b5131c7bc6e7bb1c1ced..fee25f5c3c04db3c79d10a42735d36d7cfbaf774 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 34a7798c14e3cfd9102cafbdcfbae98d49466533..20bcb0f0f78a816290f35e31b92e2d2b04c636e9 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 37c0014c12cf20674fb8358ca65ccd3ad097301c..d4ab607534b91ccc42ead0c6f22c066c20e29a9f 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 26bd287737635840b7be9a7565a1ae7ce581680c..8f67ed5c5daed41339236bc4f65708fc60734a7e 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 b444f42f53f0c807974d70def26d0864424d3b80..13354aa5018e1460286ae3edf673f90464c1853f 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 630b8331b07158b7b1eac5edf527a963756f8903..e4dffc37cad18c6f5600eb1d92a3394f5ac9e2a7 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 b1e81b465bad4c748cefe0c0826953fbafa7db84..15a33499ed44e46b7f12122bc330b45517459896 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 0ed1d4584004fe45b79bea3d602f9dbfeeb200d2..1048d3e991ce1015e5e60f9e8295f66f141c293d 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 648ecfdb7787d82bd4634b0a45f8b9b7909496c2..0d97b55a91e22f240d7028885f06438cccea6aa9 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 01bf730b29e879832807d24afc8bc87c6866d687..99cff9cda02a7e06d2de963e04c91864b904da2c 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 a03b7b1bc122b0ded3258eb85bb0846f31724804..87170845531f42d7423a69ad174eb6b435d8100c 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 92bc806c711e6b1f2b0d2a1507a640df1a7c87d8..39b90fe6f64a9f413e400aef4afd367a25c47b8d 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 3f378790a8d350063d6307f7c35227ac08606657..d9d96d9a912b6c1f27d930304d4b1d8793004536 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 184716b9777a6d9231ad14495bd2209df508173d..cf2007761e31b84503980a4231077607b0c1cb2a 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 40a2b5adaaee89afe6752967e5debd354654625e..e8e420fcd99b9c11f22442dfb90cf798414ec62a 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 8e4035bf6b750613e59b295ad559875adcce087d..3553577e89667700da64b166f2ee358ddb45ac55 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 10180761b48a184a740b98b1fc546965431aed13..e9ee18ee2f94dc20dd47347e2e7a257327a2c2d3 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 59b298f7eec04f2e6a8469b490a8dd5eaa3b1e52..27b072d94dd4a2b60283d51b959fe8a065cdb645 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 0000000000000000000000000000000000000000..d5843ab2b32c757e0261f42bba7daa0148aed445
--- /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 dd524c779dfec4f8906e92a33bbe114dd73214dd..b0251eb3323b6e107c701ad137efd76b15302d52 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 688db48ab021d08472c114a5bcc95311295798c5..f0900ba67f385dc5dff489478da66b2d0a397ef0 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 0dd95917145a706c94c76620a75fd01f6007e9b1..95fe1c1cd071955cf62398188fed387a730bd828 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 eda511cd08fe3bd0a92f41344b4a42c277652cef..1396c604eb62dd686b63e50cccfc8606f353dd26 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 90a6911a409b9e565487b7fce7a5bf851cf13283..c2d2bc662f5257d8cdf8b286fc5bfdad66a8c156 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 b5751ba8a0b579af4980c9bbbbe591d8ec0171ed..0000000000000000000000000000000000000000
--- 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 3d7278e5f54763231d2731de3157da47c1297578..0000000000000000000000000000000000000000
--- 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 b14317e104f7cfcd02ed449ca06fc57a4aa1b8fa..0000000000000000000000000000000000000000
--- 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 aaa9397988bf1958da0add18f51f2e0d9e5d254a..6dd588f4632f0bea23457ac7b270f5f2be42a95a 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 af75da8fd02129461b7ba173bd90f730312a4cd2..b24493cf596519656dd2f05b1f352821f8065cad 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 a20bf7a9958b282b3a8aa7bd0f82b5fdcf293840..d68fea05522e70f586bd2b619ccdaffc330b31df 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 d47d053c3359e3723e986f664708f791fec2679d..0000000000000000000000000000000000000000
--- 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 a6d7d64a8e06c7188af389ce810e2737bf936395..564f036e32156e2811453ba1a547b2a927755ff5 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 50b28109bf9a1412377fd487091ac6b5d1a251b0..0000000000000000000000000000000000000000
--- 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 6609355e65edf35ea28106bbded87e7ba5f93d48..177edc335c16340252e8a463971c271be6912706 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 47c030253c944c989817641d69c58bce27559dce..d98656b633347082d2505af77d4731a113eb1e8f 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 3b18b1c7db4a3dc9bc1ab8df5309e948456283f7..4ca5535645cef528e698bb6bc08230f587b6335c 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 63110f65cbbe553a8fd557f5c5865b70daf2cddc..f77fb0cabafcd6aa2755193ed63011ae7c724847 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 7f3dcc699dcccdee8a95bc8de8a569e21d1f96b3..0000000000000000000000000000000000000000
--- 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 c415b4ac9405c6a7fbd569f9d2bbaf29f16e4845..70aadb377d3fb71c6547cd4fe9c06628d26ea29a 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 59d124bf3afbd72a0e158a5b706bbd07ec2c42ef..0000000000000000000000000000000000000000
--- 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 484db8acd217ee666e6dd1160101e4e94cf0e91d..002c1ebe1f35f71ec3dc08987df19b038b799bf2 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 17025c0e1077ccb1826a1435931ece61f8f5024d..2b0c883c4ae6611364f337f57b9f61f9417fbeee 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 5fcd81ce6b34f2499a0d236b5a8674d36ee91409..2d4a66a89715d99478765d16a9d68f2508297890 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 add3a0edd7c824e7ad9557a26b75ceff4679afdc..d20320cc3ad3ca660171330caa21a02d694bc68c 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 6e39a33fa66c7181f4e6c19cd9594e4c77033204..bfbbd490fc8d37c3246b45b35ba048fa17511767 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 8c5422b65be370544e8f683151b2d547c8d9a3b7..01567be953530c734e4869516e2fad567028d2d2 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 0078a594068dd253b13d1a95a4a42f650a07b22d..99ccea32abcf823779c6e55e089e3b59d430f5f2 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 812fa9d2d5bfd8b3d245620e5a7abbff521f281f..aeb551b6f8328aa2f992dbee117a84f309ac761f 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 c6154866f277f810c58eb8898a3fa21ccfe604fc..02cb18e3f885aefdb1e3c834ad79b9be9f71e386 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 637496929e85f36c26c383f4f4ae5300d76bdd8e..c952bf45a3de80ffcce1737a6a0da01013a483a0 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 d45a6de757772a0143480b16963cd32e452a772c..c42fbdd84a122b72b4d94f1cee6f2c869ff45d20 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 533e6f4eadfe231d29736242ea846d8b4253d44f..0000000000000000000000000000000000000000
--- 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 26d3877c3d5a22a85ccc4670105434059aa24fce..0000000000000000000000000000000000000000
--- 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 f5c1591a4d9e7e7c0e8c04176fa843321cb62f54..8a80003cd36735d23307662c88ea9f5117132655 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 3b51bbdff6134a763a5d7f069823fb6cd117436d..6fb036b3abc69fb35fa8585e4ef57c2ee7d0fb38 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 b9de9c4ae9c6e59927b92c56aab50e11ac3c71a6..27bc27d9cceb3d9c06ef871006dd19035a72ac1b 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 5d48bcba6a6dd2050bab9c9fba37dd51c4e4350f..1881c90cec0744473619305218a3be340cb5882f 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">