From b11fbf4c4c7e8d8122fbca0d45463e1d770d7497 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 31 Jan 2016 04:23:10 +0100
Subject: [PATCH] Cleaned up the code a bit

---
 app/build.gradle                              |   2 +-
 app/src/main/AndroidManifest.xml              |   4 +-
 .../de/kuschku/libquassel/BusProvider.java    |   4 +
 .../java/de/kuschku/libquassel/Client.java    |  26 ++--
 .../de/kuschku/libquassel/CoreConnection.java |   7 +-
 .../kuschku/libquassel/ProtocolHandler.java   |   5 +-
 .../libquassel/events/LagChangedEvent.java    |   3 +
 .../events/UnknownCertificateEvent.java       |   4 +-
 .../libquassel/functions/types/Heartbeat.java |   7 +
 .../functions/types/HeartbeatReply.java       |   3 +
 .../kuschku/libquassel/localtypes/Buffer.java |   1 +
 .../libquassel/localtypes/ChannelBuffer.java  |   1 +
 .../localtypes/NotificationManager.java       |  25 ++--
 .../libquassel/localtypes/QueryBuffer.java    |   1 +
 .../libquassel/localtypes/StatusBuffer.java   |   1 +
 .../backlogmanagers/BacklogFilter.java        |   6 +-
 .../backlogmanagers/SimpleBacklogManager.java |   9 +-
 .../kuschku/libquassel/message/Message.java   |   2 +-
 .../libquassel/primitives/QMetaType.java      |   1 +
 .../libquassel/protocols/DatastreamPeer.java  |   2 +-
 .../libquassel/ssl/QuasselTrustManager.java   |   4 +-
 .../serializers/AliasManagerSerializer.java   |   4 +
 .../IgnoreListManagerSerializer.java          |   8 +-
 .../serializers/NetworkConfigSerializer.java  |   4 +-
 .../syncables/types/AliasManager.java         |  16 ++-
 .../syncables/types/BufferSyncer.java         |   4 +-
 .../syncables/types/BufferViewConfig.java     |   7 +-
 .../syncables/types/BufferViewManager.java    |   4 +-
 .../libquassel/syncables/types/Identity.java  |   2 +-
 .../syncables/types/IgnoreListManager.java    |  28 ++--
 .../syncables/types/IrcChannel.java           | 123 ++++++++++--------
 .../libquassel/syncables/types/IrcUser.java   |   4 +-
 .../libquassel/syncables/types/Network.java   |  18 ++-
 .../syncables/types/NetworkConfig.java        |   4 +-
 .../service/ClientBackgroundThread.java       |   1 -
 .../service/QuasselService.java               |  10 --
 .../quasseldroid_ng/ui/chat/ChatActivity.java |  72 +++++-----
 .../ui/chat/chatview/ChatMessageRenderer.java |   9 +-
 .../ui/chat/chatview/MessageAdapter.java      |   6 +-
 .../ui/chat/drawer/BufferItem.java            |  20 ++-
 .../chat/drawer/BufferViewConfigWrapper.java  |  14 +-
 .../ui/chat/drawer/NetworkItem.java           |  52 ++++----
 .../ui/editor/AdvancedEditor.java             |   7 +-
 .../ui/editor/FormattingHelper.java           |  14 +-
 .../quasseldroid_ng/ui/theme/AppContext.java  |   6 +
 .../quasseldroid_ng/ui/theme/AppTheme.java    |   6 +-
 .../quasseldroid_ng/ui/theme/ThemeUtil.java   | 100 +++++++-------
 .../java/de/kuschku/util/AndroidAssert.java   |   3 +-
 .../CertificateDatabaseHandler.java           |  21 +--
 .../util/certificates/CertificateUtils.java   |  13 +-
 .../SQLiteCertificateManager.java             |  18 ++-
 .../util/instancestateutil/Storable.java      |   1 +
 .../keyboardutils/DialogKeyboardUtil.java     |  32 -----
 .../keyboardutils/EditTextKeyboardUtil.java   |  62 ---------
 .../de/kuschku/util/niohelpers/Helper.java    |   3 +-
 .../util/niohelpers/WrappedChannel.java       |   2 +-
 .../util/observables/AutoScroller.java        |   3 +-
 .../wrappers/GeneralCallbackWrapper.java      |   5 +-
 .../ChildParentObservableSortedList.java      |  28 +---
 .../lists/ObservableElementList.java          |   1 +
 .../lists/ObservableSortedList.java           |  32 +++--
 .../java/de/kuschku/util/ui/MessageUtil.java  |   5 +-
 .../StorageBackendParcelable.java             |   2 +
 .../drawable/popup_background_material.xml    |  22 ----
 app/src/main/res/layout/content_main.xml      |   4 +-
 app/src/main/res/layout/dialog_address.xml    |   5 +-
 app/src/main/res/layout/dialog_login.xml      |   4 +-
 app/src/main/res/layout/slider_main.xml       |   6 +-
 app/src/main/res/layout/widget_editor.xml     |   9 +-
 app/src/main/res/menu/chat.xml                |   7 +-
 app/src/main/res/menu/formatting.xml          |  24 ++--
 app/src/main/res/menu/global.xml              |   8 --
 app/src/main/res/values/attrs.xml             |  12 +-
 app/src/main/res/values/dimens.xml            |   5 -
 app/src/main/res/values/strings.xml           |  74 ++++++-----
 app/src/main/res/values/styles.xml            |  24 ++--
 76 files changed, 545 insertions(+), 551 deletions(-)
 delete mode 100644 app/src/main/java/de/kuschku/util/keyboardutils/DialogKeyboardUtil.java
 delete mode 100644 app/src/main/java/de/kuschku/util/keyboardutils/EditTextKeyboardUtil.java
 delete mode 100644 app/src/main/res/drawable/popup_background_material.xml
 delete mode 100644 app/src/main/res/menu/global.xml

diff --git a/app/build.gradle b/app/build.gradle
index de410d6a8..af97a0a87 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -36,7 +36,7 @@ if (versionPropsFile.canRead()) {
 
   versionProps.load(new FileInputStream(versionPropsFile))
   def runTasks = gradle.startParameter.taskNames
-  versionBuild = Integer.valueOf(versionProps['VERSION_BUILD'])
+  versionBuild = Integer.valueOf(versionProps['VERSION_BUILD'].toString())
   if ('assemble' in runTasks || 'assembleRelease' in runTasks || 'aR' in runTasks) {
     versionBuild = versionBuild + 1
   }
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f75ba9a47..e4d7309b9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -7,13 +7,13 @@
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
-        android:label="@string/app_name"
+        android:label="@string/appName"
         android:supportsRtl="true">
         <service android:name=".service.QuasselService" />
 
         <activity
             android:name=".ui.chat.ChatActivity"
-            android:label="@string/app_name"
+            android:label="@string/appName"
             android:launchMode="singleTask"
             android:theme="@style/AppTheme.Light">
             <intent-filter>
diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
index 108bad6e0..be377d09c 100644
--- a/app/src/main/java/de/kuschku/libquassel/BusProvider.java
+++ b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
@@ -18,8 +18,11 @@ public class BusProvider {
     @NonNull
     private final String id;
 
+    @NonNull
     private final BusHandler handleHandler = new BusHandler("QHANDLE");
+    @NonNull
     private final BusHandler dispatchHandler = new BusHandler("QDISPATCH");
+    @NonNull
     private final BusHandler eventHandler = new BusHandler("QEVENT");
 
     public BusProvider() {
@@ -44,6 +47,7 @@ public class BusProvider {
         this.event.post(o);
     }
 
+    @NonNull
     @Override
     public String toString() {
         return "BusProvider{" +
diff --git a/app/src/main/java/de/kuschku/libquassel/Client.java b/app/src/main/java/de/kuschku/libquassel/Client.java
index d942bf33a..01cbc30d3 100644
--- a/app/src/main/java/de/kuschku/libquassel/Client.java
+++ b/app/src/main/java/de/kuschku/libquassel/Client.java
@@ -57,15 +57,20 @@ public class Client {
     @NonNull
     private final BusProvider busProvider;
     private long lag;
-    private ConnectionChangeEvent.Status connectionStatus;
+    @NonNull
+    private ConnectionChangeEvent.Status connectionStatus = ConnectionChangeEvent.Status.DISCONNECTED;
+    @Nullable
     private ClientInitAck core;
     @Nullable
     private SessionState state;
+    @Nullable
     private BufferViewManager bufferViewManager;
+    @Nullable
     private BufferSyncer bufferSyncer;
-    private ClientData clientData;
+    @Nullable
     private IgnoreListManager ignoreListManager;
-    private Map<Integer, Identity> Identities = new HashMap<>();
+    @NonNull
+    private final Map<Integer, Identity> Identities = new HashMap<>();
 
     public Client(@NonNull final BusProvider busProvider) {
         this(new SimpleBacklogManager(busProvider), busProvider);
@@ -221,26 +226,24 @@ public class Client {
         }
     }
 
+    @Nullable
     public BufferSyncer getBufferSyncer() {
         return bufferSyncer;
     }
 
-    public void setBufferSyncer(BufferSyncer bufferSyncer) {
+    public void setBufferSyncer(@Nullable BufferSyncer bufferSyncer) {
         this.bufferSyncer = bufferSyncer;
     }
 
+    @Nullable
     public ClientInitAck getCore() {
         return core;
     }
 
-    public void setCore(ClientInitAck core) {
+    public void setCore(@Nullable ClientInitAck core) {
         this.core = core;
     }
 
-    public void setClientData(ClientData clientData) {
-        this.clientData = clientData;
-    }
-
     @NonNull
     public Collection<Buffer> getBuffers(int networkId) {
         return new Stream<>(this.buffers.values()).filter(buffer -> buffer.getInfo().networkId == networkId).list();
@@ -261,7 +264,7 @@ public class Client {
         busProvider.sendEvent(new ConnectionChangeEvent(connectionStatus));
     }
 
-    public void login(String username, String password) {
+    public void login(@NonNull String username, @NonNull String password) {
         busProvider.dispatch(new HandshakeFunction(new ClientLogin(
                 username, password
         )));
@@ -281,11 +284,12 @@ public class Client {
         busProvider.sendEvent(new LagChangedEvent(lag));
     }
 
+    @Nullable
     public IgnoreListManager getIgnoreListManager() {
         return ignoreListManager;
     }
 
-    public void setIgnoreListManager(IgnoreListManager ignoreListManager) {
+    public void setIgnoreListManager(@Nullable IgnoreListManager ignoreListManager) {
         this.ignoreListManager = ignoreListManager;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java
index b7ed184f5..6f7530932 100644
--- a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java
+++ b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java
@@ -5,8 +5,6 @@ import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.util.Log;
 
-import org.joda.time.DateTime;
-
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
@@ -70,7 +68,7 @@ public class CoreConnection {
     @Nullable
     private Client client;
     @NonNull
-    private CertificateManager certificateManager;
+    private final CertificateManager certificateManager;
 
     public CoreConnection(@NonNull final ServerAddress address, @NonNull final ClientData clientData, @NonNull final BusProvider busProvider, @NonNull CertificateManager certificateManager) {
         this.address = address;
@@ -260,6 +258,7 @@ public class CoreConnection {
 
                         // Mark prehandshake as read
                         hasReadPreHandshake = true;
+                        assertNotNull(heartbeatThread);
                         heartbeatThread.start();
 
                         // Send client data to core
@@ -303,7 +302,7 @@ public class CoreConnection {
                 assertNotNull(client);
 
                 while (running) {
-                    Heartbeat heartbeat = new Heartbeat(DateTime.now());
+                    Heartbeat heartbeat = new Heartbeat();
                     busProvider.dispatch(heartbeat);
 
                     Thread.sleep(30 * 1000);
diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
index 323cea8dc..28281d6ea 100644
--- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
+++ b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
@@ -53,6 +53,7 @@ public class ProtocolHandler implements IProtocolHandler {
                     client.getInitDataQueue().remove(packedFunc.className + ":" + packedFunc.objectName);
                     if (client.getInitDataQueue().isEmpty()) {
                         client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED);
+                        busProvider.dispatch(new Heartbeat());
                     }
                 }
             }
@@ -121,7 +122,7 @@ public class ProtocolHandler implements IProtocolHandler {
     }
 
     public void onEvent(@NonNull SessionInit message) {
-        busProvider.dispatch(new Heartbeat(DateTime.now()));
+        busProvider.dispatch(new Heartbeat());
 
         client.setState(message.SessionState);
 
@@ -133,6 +134,8 @@ public class ProtocolHandler implements IProtocolHandler {
         client.sendInitRequest("NetworkConfig", "GlobalNetworkConfig", true);
         client.sendInitRequest("IgnoreListManager", "", true);
         //sendInitRequest("TransferManager", ""); // This thing never gets sent...
+        
+        assertNotNull(client.getState());
         for (int NetworkId : client.getState().NetworkIds) {
             client.sendInitRequest("Network", String.valueOf(NetworkId), true);
         }
diff --git a/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java b/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java
index 4b5cdcf56..e4917ba46 100644
--- a/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java
+++ b/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java
@@ -1,5 +1,7 @@
 package de.kuschku.libquassel.events;
 
+import android.support.annotation.NonNull;
+
 public class LagChangedEvent {
     public final long lag;
 
@@ -7,6 +9,7 @@ public class LagChangedEvent {
         this.lag = lag;
     }
 
+    @NonNull
     @Override
     public String toString() {
         return "LagChangedEvent{" +
diff --git a/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java b/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java
index 93a6e7883..dd795e248 100644
--- a/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java
+++ b/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java
@@ -1,5 +1,7 @@
 package de.kuschku.libquassel.events;
 
+import android.support.annotation.NonNull;
+
 import java.security.cert.X509Certificate;
 
 import de.kuschku.libquassel.ssl.UnknownCertificateException;
@@ -14,7 +16,7 @@ public class UnknownCertificateEvent {
         this.address = address;
     }
 
-    public UnknownCertificateEvent(UnknownCertificateException cause) {
+    public UnknownCertificateEvent(@NonNull UnknownCertificateException cause) {
         this(cause.certificate, cause.address);
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java b/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java
index cf10f69f7..23d083efa 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java
@@ -1,5 +1,7 @@
 package de.kuschku.libquassel.functions.types;
 
+import android.support.annotation.NonNull;
+
 import org.joda.time.DateTime;
 
 public class Heartbeat {
@@ -9,6 +11,11 @@ public class Heartbeat {
         this.dateTime = dateTime;
     }
 
+    public Heartbeat() {
+        this(DateTime.now());
+    }
+
+    @NonNull
     @Override
     public String toString() {
         return "Heartbeat{" +
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java b/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java
index ecfe819d5..b6433eb49 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java
@@ -1,5 +1,7 @@
 package de.kuschku.libquassel.functions.types;
 
+import android.support.annotation.NonNull;
+
 import org.joda.time.DateTime;
 
 public class HeartbeatReply {
@@ -9,6 +11,7 @@ public class HeartbeatReply {
         this.dateTime = dateTime;
     }
 
+    @NonNull
     @Override
     public String toString() {
         return "HeartbeatReply{" +
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/Buffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/Buffer.java
index 6c61d0a3f..725ed1db7 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/Buffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/Buffer.java
@@ -12,5 +12,6 @@ public interface Buffer {
     @Nullable
     String getName();
 
+    @NonNull
     BufferInfo.BufferStatus getStatus();
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java
index 41f855121..5328dbdbb 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java
@@ -29,6 +29,7 @@ public class ChannelBuffer implements Buffer {
         return getInfo().name;
     }
 
+    @NonNull
     @Override
     public BufferInfo.BufferStatus getStatus() {
         return channel == null ? BufferInfo.BufferStatus.OFFLINE : BufferInfo.BufferStatus.ONLINE;
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java b/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java
index 9ae407ba0..caafbdfe6 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java
@@ -1,5 +1,6 @@
 package de.kuschku.libquassel.localtypes;
 
+import android.support.annotation.NonNull;
 import android.util.SparseArray;
 
 import java.util.ArrayList;
@@ -13,14 +14,18 @@ import de.kuschku.libquassel.syncables.types.Network;
 import de.kuschku.util.observables.lists.ObservableComparableSortedList;
 
 public class NotificationManager {
-    private SparseArray<ObservableComparableSortedList<Message>> notifications = new SparseArray<>();
-    private List<HighlightRule> highlights = new ArrayList<>();
-    private Client client;
+    @NonNull
+    private final SparseArray<ObservableComparableSortedList<Message>> notifications = new SparseArray<>();
+    @NonNull
+    private final List<HighlightRule> highlights = new ArrayList<>();
+    @NonNull
+    private final Client client;
 
-    public NotificationManager(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));
@@ -32,13 +37,13 @@ public class NotificationManager {
         notifications.put(id, new ObservableComparableSortedList<>(Message.class));
     }
 
-    public void receiveMessage(Message message) {
+    public void receiveMessage(@NonNull Message message) {
         if (checkMessage(message)) {
             getNotifications(message.bufferInfo.id).add(message);
         }
     }
 
-    public boolean checkMessage(Message message) {
+    public boolean checkMessage(@NonNull Message message) {
         Buffer buffer = client.getBuffer(message.bufferInfo.id);
         if (buffer == null) return false;
         Network network = client.getNetwork(buffer.getInfo().networkId);
@@ -50,6 +55,8 @@ public class NotificationManager {
             if (message.content.contains(nick))
                 return true;
         }
+        if (buffer.getName() == null)
+            return false;
         for (HighlightRule rule : highlights) {
             if (rule.matches(message.content, buffer.getName()))
                 return true;
@@ -57,7 +64,7 @@ public class NotificationManager {
         return false;
     }
 
-    public void receiveMessages(List<Message> messages) {
+    public void receiveMessages(@NonNull List<Message> messages) {
         for (Message message : messages) {
             receiveMessage(message);
         }
@@ -69,14 +76,14 @@ public class NotificationManager {
         public final boolean invertChannelRule;
         public final boolean caseSensitive;
 
-        public HighlightRule(String rule, String channelRule, boolean invertChannelRule, 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(String message, String channelName) {
+        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/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java
index 64c6bcc8c..ea22fc135 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java
@@ -29,6 +29,7 @@ public class QueryBuffer implements Buffer {
         return getInfo().name;
     }
 
+    @NonNull
     @Override
     public BufferInfo.BufferStatus getStatus() {
         return (user == null) ? BufferInfo.BufferStatus.OFFLINE :
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java
index c28a09c25..463f718ba 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java
@@ -29,6 +29,7 @@ public class StatusBuffer implements Buffer {
         return network.getNetworkName();
     }
 
+    @NonNull
     @Override
     public BufferInfo.BufferStatus getStatus() {
         return network.isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE;
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java
index 2fd588da6..ad1820b94 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java
@@ -1,6 +1,7 @@
 package de.kuschku.libquassel.localtypes.backlogmanagers;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeUtils;
@@ -23,8 +24,10 @@ public class BacklogFilter implements UICallback {
     @NonNull
     private final ObservableSortedList<Message> filtered;
 
+    @NonNull
     private final Set<Message.Type> filteredTypes = new HashSet<>();
 
+    @Nullable
     private DateTime earliestMessage;
 
     public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableSortedList<Message> unfiltered, @NonNull ObservableSortedList<Message> filtered) {
@@ -44,7 +47,6 @@ public class BacklogFilter implements UICallback {
 
     private void updateDayChangeMessages() {
         DateTime now = DateTime.now().withMillisOfDay(0);
-        int id = -1;
         while (now.isAfter(earliestMessage)) {
             filtered.add(new Message(
                     (int) DateTimeUtils.toJulianDay(now.getMillis()),
@@ -65,7 +67,7 @@ public class BacklogFilter implements UICallback {
         }
     }
 
-    private boolean filterItem(Message message) {
+    private boolean filterItem(@NonNull Message message) {
         return (client.getIgnoreListManager() != null && client.getIgnoreListManager().matches(message)) || filteredTypes.contains(message.type);
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java
index c3bd0e981..13dc501a5 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java
@@ -46,7 +46,7 @@ public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> {
     }
 
     public void requestBacklog(int bufferId, int from, int to, int count, int extra) {
-        busProvider.dispatch(new SyncFunction<>("BacklogManager", "", "requestBacklog", Lists.newArrayList(
+        busProvider.dispatch(new SyncFunction<>("BacklogManager", "", "requestBacklog", Lists.<QVariant>newArrayList(
                 new QVariant<>("BufferId", bufferId),
                 new QVariant<>("MsgId", from),
                 new QVariant<>("MsgId", to),
@@ -56,6 +56,7 @@ public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> {
     }
 
     public void receiveBacklog(@IntRange(from = 0) int bufferId, int from, int to, int count, int extra, @NonNull List<Message> messages) {
+        assertNotNull(client);
         get(bufferId).addAll(messages);
         client.getNotificationManager().receiveMessages(messages);
 
@@ -64,6 +65,7 @@ public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> {
 
     @Override
     public void displayMessage(@IntRange(from = 0) int bufferId, @NonNull Message message) {
+        assertNotNull(client);
         ObservableSortedList<Message> messages = get(bufferId);
         assertNotNull(messages);
 
@@ -81,10 +83,7 @@ public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> {
     @Override
     public void requestMoreBacklog(@IntRange(from = 0) int bufferId, int count) {
         ObservableSortedList<Message> backlog = backlogs.get(bufferId);
-        int messageId =
-                (backlog == null) ? -1 :
-                        (backlog.last() == null) ? -1 :
-                                backlog.last().messageId;
+        int messageId = (backlog == null || backlog.last() == null) ? -1 : backlog.last().messageId;
 
         requestBacklog(bufferId, -1, messageId, count, 0);
     }
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 627698d1b..96209566c 100644
--- a/app/src/main/java/de/kuschku/libquassel/message/Message.java
+++ b/app/src/main/java/de/kuschku/libquassel/message/Message.java
@@ -57,7 +57,7 @@ public class Message implements ContentComparable<Message> {
     }
 
     @Override
-    public boolean areItemsTheSame(Message other) {
+    public boolean areItemsTheSame(@NonNull Message other) {
         return this.messageId == other.messageId;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java
index 7b8f7bd1e..e865910a1 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java
@@ -45,6 +45,7 @@ public class QMetaType<T> {
     public final String name;
     @NonNull
     public final Class cl;
+    @Nullable
     public final PrimitiveSerializer<T> serializer;
 
     public QMetaType(@NonNull Class cl, @NonNull Type type) {
diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
index 46edc8cc6..4ce9befbb 100644
--- a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
+++ b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
@@ -297,7 +297,7 @@ public class DatastreamPeer implements RemotePeer {
                 } else {
                     handlePackedFunc(data);
                 }
-            } catch (BufferUnderflowException | BufferOverflowException e) {
+            } catch (@NonNull BufferUnderflowException | BufferOverflowException e) {
                 Helper.printHexDump(buffer.array());
                 busProvider.sendEvent(new GeneralErrorEvent(e));
             } catch (Exception e) {
diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java
index 838aff5b3..e56952d48 100644
--- a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java
@@ -21,7 +21,7 @@ public class QuasselTrustManager implements X509TrustManager {
     @NonNull
     private final CertificateManager certificateManager;
     @NonNull
-    private ServerAddress address;
+    private final ServerAddress address;
 
     public QuasselTrustManager(@NonNull X509TrustManager wrapped, @NonNull CertificateManager certificateManager, @NonNull ServerAddress address) {
         this.wrapped = wrapped;
@@ -29,6 +29,7 @@ public class QuasselTrustManager implements X509TrustManager {
         this.address = address;
     }
 
+    @NonNull
     public static QuasselTrustManager fromFactory(@NonNull TrustManagerFactory factory, @NonNull CertificateManager certificateManager, @NonNull ServerAddress address) throws GeneralSecurityException {
         TrustManager[] managers = factory.getTrustManagers();
         for (TrustManager manager : managers) {
@@ -39,6 +40,7 @@ public class QuasselTrustManager implements X509TrustManager {
         throw new GeneralSecurityException("Couldn’t find trustmanager provided by factory");
     }
 
+    @NonNull
     public static QuasselTrustManager fromDefault(@NonNull CertificateManager certificateManager, @NonNull ServerAddress address) throws GeneralSecurityException {
         TrustManagerFactory factory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
         factory.init((KeyStore) null);
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java
index 9aab84c3f..582ce2969 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java
@@ -13,6 +13,9 @@ import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.AliasManager;
 
+import static de.kuschku.util.AndroidAssert.*;
+
+@SuppressWarnings("unchecked")
 public class AliasManagerSerializer implements ObjectSerializer<AliasManager> {
     @NonNull
     private static final AliasManagerSerializer serializer = new AliasManagerSerializer();
@@ -42,6 +45,7 @@ public class AliasManagerSerializer implements ObjectSerializer<AliasManager> {
     @Override
     public AliasManager fromLegacy(@NonNull Map<String, QVariant> map) {
         Map<String, QVariant<List<String>>> aliases = (Map<String, QVariant<List<String>>>) map.get("Aliases").data;
+        assertNotNull(aliases);
         return new AliasManager(
                 aliases.get("names").data,
                 aliases.get("expansions").data
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java
index dcd8885a5..06910ade9 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java
@@ -13,13 +13,18 @@ import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.IgnoreListManager;
 
+import static de.kuschku.util.AndroidAssert.*;
+
+@SuppressWarnings("unchecked")
 public class IgnoreListManagerSerializer implements ObjectSerializer<IgnoreListManager> {
-    private static IgnoreListManagerSerializer serializer = new IgnoreListManagerSerializer();
+    @NonNull
+    private static final IgnoreListManagerSerializer serializer = new IgnoreListManagerSerializer();
 
     private IgnoreListManagerSerializer() {
 
     }
 
+    @NonNull
     public static IgnoreListManagerSerializer get() {
         return serializer;
     }
@@ -41,6 +46,7 @@ public class IgnoreListManagerSerializer implements ObjectSerializer<IgnoreListM
     @Override
     public IgnoreListManager fromLegacy(@NonNull Map<String, QVariant> map) {
         Map<String, QVariant> internalMap = (Map<String, QVariant>) map.get("IgnoreList").data;
+        assertNotNull(internalMap);
         return new IgnoreListManager(
                 (List<Integer>) internalMap.get("scope").data,
                 (List<Integer>) internalMap.get("ignoreType").data,
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java
index a0640ae66..dbb0ce45e 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java
@@ -13,12 +13,14 @@ import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.NetworkConfig;
 
 public class NetworkConfigSerializer implements ObjectSerializer<NetworkConfig> {
-    private static NetworkConfigSerializer serializer = new NetworkConfigSerializer();
+    @NonNull
+    private static final NetworkConfigSerializer serializer = new NetworkConfigSerializer();
 
     private NetworkConfigSerializer() {
 
     }
 
+    @NonNull
     public static NetworkConfigSerializer get() {
         return serializer;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/AliasManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/AliasManager.java
index 4236fc778..fda75af07 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/AliasManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/AliasManager.java
@@ -12,8 +12,8 @@ import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.serializers.AliasManagerSerializer;
 
 public class AliasManager extends SyncableObject<AliasManager> {
-    public List<String> names;
-    public List<String> expansions;
+    private List<String> names;
+    private List<String> expansions;
 
     public AliasManager(List<String> names, List<String> expansions) {
         this.names = names;
@@ -26,13 +26,21 @@ public class AliasManager extends SyncableObject<AliasManager> {
     }
 
     @Override
-    public void update(AliasManager from) {
+    public void update(@NonNull AliasManager from) {
         names = from.names;
         expansions = from.expansions;
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(AliasManagerSerializer.get().fromDatastream(from));
     }
+
+    public List<String> getNames() {
+        return names;
+    }
+
+    public List<String> getExpansions() {
+        return expansions;
+    }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferSyncer.java
index 1e23c7246..483cd014e 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferSyncer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferSyncer.java
@@ -44,13 +44,13 @@ public class BufferSyncer extends SyncableObject<BufferSyncer> {
     }
 
     @Override
-    public void update(BufferSyncer from) {
+    public void update(@NonNull BufferSyncer from) {
         LastSeenMsg = from.LastSeenMsg;
         MarkerLines = from.MarkerLines;
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(BufferSyncerSerializer.get().fromDatastream(from));
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewConfig.java
index 45aefb051..e3594383a 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewConfig.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewConfig.java
@@ -21,7 +21,8 @@ public class BufferViewConfig extends SyncableObject<BufferViewConfig> {
     private List<Integer> temporarilyRemovedBuffers;
     private boolean hideInactiveNetworks;
     private IObservableList<ElementCallback<Integer>, Integer> buffers;
-    private IObservableList<ElementCallback<Integer>, Integer> NetworkList = new ObservableElementList<>();
+    @NonNull
+    private final IObservableList<ElementCallback<Integer>, Integer> NetworkList = new ObservableElementList<>();
     private int allowedBufferTypes;
     private boolean sortAlphabetically;
     private boolean disableDecoration;
@@ -194,7 +195,7 @@ public class BufferViewConfig extends SyncableObject<BufferViewConfig> {
     }
 
     @Override
-    public void update(BufferViewConfig from) {
+    public void update(@NonNull BufferViewConfig from) {
         this.bufferViewName = from.bufferViewName;
         this.temporarilyRemovedBuffers = from.temporarilyRemovedBuffers;
         this.hideInactiveNetworks = from.hideInactiveNetworks;
@@ -210,7 +211,7 @@ public class BufferViewConfig extends SyncableObject<BufferViewConfig> {
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(BufferViewConfigSerializer.get().fromDatastream(from));
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewManager.java
index 8c329eefa..cd19db5ef 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewManager.java
@@ -39,7 +39,7 @@ public class BufferViewManager extends SyncableObject<BufferViewManager> {
     }
 
     @Override
-    public void update(BufferViewManager from) {
+    public void update(@NonNull BufferViewManager from) {
         this.BufferViews = from.BufferViews;
         for (int id : BufferViews.keySet()) {
             client.sendInitRequest("BufferViewConfig", String.valueOf(id));
@@ -47,7 +47,7 @@ public class BufferViewManager extends SyncableObject<BufferViewManager> {
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(BufferViewManagerSerializer.get().fromDatastream(from));
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/Identity.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/Identity.java
index 85d18f607..fbae122e6 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/Identity.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/Identity.java
@@ -268,7 +268,7 @@ public class Identity extends SyncableObject<Identity> {
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(IdentitySerializer.get().fromDatastream(from));
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IgnoreListManager.java
index 876c9e565..0fc331b3f 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IgnoreListManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IgnoreListManager.java
@@ -16,11 +16,12 @@ import de.kuschku.libquassel.syncables.serializers.IgnoreListManagerSerializer;
 import static de.kuschku.util.AndroidAssert.assertEquals;
 
 public class IgnoreListManager extends SyncableObject<IgnoreListManager> {
-    List<IgnoreRule> ignoreRules = new ArrayList<>();
+    @NonNull
+    final List<IgnoreRule> ignoreRules = new ArrayList<>();
 
-    public IgnoreListManager(List<Integer> scope, List<Integer> ignoreType,
-                             List<Boolean> isActive, List<String> scopeRule, List<Boolean> isRegEx,
-                             List<Integer> strictness, List<String> ignoreRule) {
+    public IgnoreListManager(@NonNull List<Integer> scope, @NonNull List<Integer> ignoreType,
+                             @NonNull List<Boolean> isActive, @NonNull List<String> scopeRule, @NonNull List<Boolean> isRegEx,
+                             @NonNull List<Integer> strictness, @NonNull List<String> ignoreRule) {
         assertEquals(scope.size(), ignoreType.size(), isActive.size(), scopeRule.size(), isRegEx.size(), strictness.size(), ignoreRule.size());
 
         for (int i = 0; i < scope.size(); i++) {
@@ -47,7 +48,7 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> {
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(IgnoreListManagerSerializer.get().fromDatastream(from));
     }
 
@@ -56,13 +57,13 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> {
     }
 
     public static class IgnoreRule {
-        private Scope scope;
-        private Type ignoreType;
-        private boolean isActive;
-        private String scopeRule;
-        private boolean isRegEx;
-        private Strictness strictness;
-        private String ignoreRule;
+        private final Scope scope;
+        private final Type ignoreType;
+        private final boolean isActive;
+        private final String scopeRule;
+        private final boolean isRegEx;
+        private final Strictness strictness;
+        private final String ignoreRule;
 
         public IgnoreRule(Integer scope, Integer ignoreType, boolean isActive, String scopeRule, boolean isRegEx, Integer strictness, String ignoreRule) {
             this(
@@ -98,6 +99,7 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> {
                 this.id = id;
             }
 
+            @NonNull
             public static Strictness of(int id) {
                 switch (id) {
                     case 0:
@@ -124,6 +126,7 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> {
                 this.id = id;
             }
 
+            @NonNull
             public static Type of(int id) {
                 switch (id) {
                     case 0:
@@ -150,6 +153,7 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> {
                 this.id = id;
             }
 
+            @NonNull
             public static Scope of(int id) {
                 switch (id) {
                     case 0:
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java
index 5a1b8e9b7..b231d6204 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java
@@ -31,7 +31,7 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
     @Synced
     private Map<String, String> UserModes;
     @Synced
-    private Map<String, Object> ChanModes;
+    private ChanModes chanModes;
     @Synced
     private boolean encrypted;
 
@@ -39,44 +39,15 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
     private Network network;
 
     public IrcChannel(String name, String topic, String password, Map<String, String> userModes,
-                      Map<String, Object> chanModes, boolean encrypted) {
+                      @NonNull Map<String, Object> chanModes, boolean encrypted) {
         this.name = name;
         this.topic = topic;
         this.password = password;
         this.UserModes = userModes;
-        this.ChanModes = chanModes;
+        this.chanModes = new ChanModes(chanModes);
         this.encrypted = encrypted;
     }
 
-    @NonNull
-    public Map<String, List<String>> getA_ChanModes() {
-        if (ChanModes.get("A") == null) ChanModes.put("A", new HashMap<>());
-        return (Map<String, List<String>>) ChanModes.get("A");
-    }
-
-    @NonNull
-    public Map<String, String> getB_ChanModes() {
-        if (ChanModes.get("B") == null) ChanModes.put("B", new HashMap<>());
-        return (Map<String, String>) ChanModes.get("B");
-    }
-
-    @NonNull
-    public Map<String, String> getC_ChanModes() {
-        if (ChanModes.get("C") == null) ChanModes.put("C", new HashMap<>());
-        return (Map<String, String>) ChanModes.get("C");
-    }
-
-    @NonNull
-    public Set<String> getD_ChanModes() {
-        if (ChanModes.get("D") instanceof String) {
-            List<String> list = Arrays.asList(((String) ChanModes.get("D")).split(""));
-            ChanModes.put("D", new HashSet<>(list));
-        } else if (ChanModes.get("D") == null) {
-            ChanModes.put("D", new HashSet<>());
-        }
-        return (Set<String>) ChanModes.get("D");
-    }
-
     @NonNull
     @Override
     public String toString() {
@@ -85,7 +56,7 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
                 ", topic='" + topic + '\'' +
                 ", password='" + password + '\'' +
                 ", UserModes=" + UserModes +
-                ", ChanModes=" + ChanModes +
+                ", ChanModes=" + chanModes +
                 ", encrypted=" + encrypted +
                 '}';
     }
@@ -137,7 +108,7 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
         addChannelMode(String.copyValueOf(new char[]{mode}), params);
     }
 
-    public void addChannelMode(String mode, String params) {
+    public void addChannelMode(@NonNull String mode, String params) {
         assertNotNull(network);
 
         Network.ChannelModeType type = network.channelModeType(mode);
@@ -145,21 +116,21 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
             case NOT_A_CHANMODE:
                 return;
             case A_CHANMODE:
-                if (!getA_ChanModes().containsKey(mode)) {
-                    getA_ChanModes().put(mode, new ArrayList<>(Collections.singleton(params)));
+                if (!chanModes.A.containsKey(mode)) {
+                    chanModes.A.put(mode, new ArrayList<>(Collections.singleton(params)));
                 } else {
-                    getA_ChanModes().get(mode).add(params);
+                    chanModes.A.get(mode).add(params);
                 }
                 break;
             case B_CHANMODE:
-                getB_ChanModes().put(mode, params);
+                chanModes.B.put(mode, params);
                 break;
             case C_CHANMODE:
-                getB_ChanModes().put(mode, params);
+                chanModes.C.put(mode, params);
                 break;
             case D_CHANMODE:
 
-                getD_ChanModes().add(mode);
+                chanModes.D.add(mode);
                 break;
         }
     }
@@ -172,7 +143,7 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
         removeChannelMode(String.copyValueOf(new char[]{mode}), params);
     }
 
-    public void removeChannelMode(String mode, String params) {
+    public void removeChannelMode(@NonNull String mode, String params) {
         assertNotNull(network);
 
         Network.ChannelModeType type = network.channelModeType(mode);
@@ -180,17 +151,17 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
             case NOT_A_CHANMODE:
                 return;
             case A_CHANMODE:
-                if (getA_ChanModes().containsKey(mode))
-                    getA_ChanModes().get(mode).removeAll(Collections.singleton(params));
+                if (chanModes.A.containsKey(mode))
+                    chanModes.A.get(mode).removeAll(Collections.singleton(params));
                 break;
             case B_CHANMODE:
-                getB_ChanModes().remove(mode);
+                chanModes.B.remove(mode);
                 break;
             case C_CHANMODE:
-                getB_ChanModes().remove(mode);
+                chanModes.C.remove(mode);
                 break;
             case D_CHANMODE:
-                getB_ChanModes().remove(mode);
+                chanModes.D.remove(mode);
                 break;
         }
     }
@@ -203,19 +174,19 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
         return hasMode(String.copyValueOf(new char[]{mode}));
     }
 
-    public boolean hasMode(String mode) {
+    public boolean hasMode(@NonNull String mode) {
         assertNotNull(network);
 
         Network.ChannelModeType type = network.channelModeType(mode);
         switch (type) {
             case A_CHANMODE:
-                return getA_ChanModes().containsKey(mode);
+                return chanModes.A.containsKey(mode);
             case B_CHANMODE:
-                return getA_ChanModes().containsKey(mode);
+                return chanModes.B.containsKey(mode);
             case C_CHANMODE:
-                return getA_ChanModes().containsKey(mode);
+                return chanModes.C.containsKey(mode);
             case D_CHANMODE:
-                return getA_ChanModes().containsKey(mode);
+                return chanModes.D.contains(mode);
 
             default:
                 return false;
@@ -273,21 +244,61 @@ public class IrcChannel extends SyncableObject<IrcChannel> {
     }
 
     @Override
-    public void update(IrcChannel from) {
+    public void update(@NonNull IrcChannel from) {
         this.name = from.name;
         this.topic = from.topic;
         this.password = from.password;
         this.UserModes = from.UserModes;
-        this.ChanModes = from.ChanModes;
+        this.chanModes = from.chanModes;
         this.encrypted = from.encrypted;
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(IrcChannelSerializer.get().fromDatastream(from));
     }
 
-    public Map<String, Object> getChanModes() {
-        return ChanModes;
+    public ChanModes getChanModes() {
+        return chanModes;
+    }
+
+    public static class ChanModes {
+        @NonNull
+        public final Map<String, List<String>> A;
+        @NonNull
+        public final Map<String, String> B;
+        @NonNull
+        public final Map<String, String> C;
+        @NonNull
+        public final Set<String> D;
+
+        @SuppressWarnings("unchecked")
+        public ChanModes(@NonNull Map<String, Object> rawModes) {
+            A = (Map<String, List<String>>) rawModes.get("A");
+            B = (Map<String, String>) rawModes.get("B");
+            C = (Map<String, String>) rawModes.get("C");
+            D = new HashSet<>(Arrays.asList(((String) rawModes.get("D")).split("")));
+        }
+
+        @NonNull
+        public Map<String, Object> toMap() {
+            Map<String, Object> out = new HashMap<>();
+            out.put("A", A);
+            out.put("B", B);
+            out.put("C", C);
+            out.put("D", D);
+            return out;
+        }
+
+        @NonNull
+        @Override
+        public String toString() {
+            return "ChanModes{" +
+                    "A=" + A +
+                    ", B=" + B +
+                    ", C=" + C +
+                    ", D=" + D +
+                    '}';
+        }
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java
index e38da03c3..472d2f719 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java
@@ -224,7 +224,7 @@ public class IrcUser extends SyncableObject<IrcUser> {
     }
 
     @Override
-    public void update(IrcUser from) {
+    public void update(@NonNull IrcUser from) {
         this.server = from.server;
         this.ircOperator = from.ircOperator;
         this.away = from.away;
@@ -244,7 +244,7 @@ public class IrcUser extends SyncableObject<IrcUser> {
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(IrcUserSerializer.get().fromDatastream(from));
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java
index cfb73a1c4..5cddcf65b 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java
@@ -156,7 +156,7 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
         setSupportedModes(map);
     }
 
-    public void addIrcUser(String sender) {
+    public void addIrcUser(@NonNull String sender) {
         client.sendInitRequest("IrcUser", getObjectName() + "/" + IrcUserUtils.getNick(sender));
     }
 
@@ -170,9 +170,11 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
         if (modes == null) return new IrcMode(0, "");
 
         final List<IrcMode> usermodes = new ArrayList<>(modes.length());
+        Map<String, IrcMode> supportedModes = getSupportedModes();
+        assertNotNull(supportedModes);
         for (String mode : modes.split("")) {
-            if (getSupportedModes().containsKey(mode))
-                usermodes.add(getSupportedModes().get(mode));
+            if (supportedModes.containsKey(mode))
+                usermodes.add(supportedModes.get(mode));
         }
         Collections.sort(usermodes, (o1, o2) -> o1.rank - o2.rank);
         return usermodes.size() > 0 ? usermodes.get(0) : new IrcMode(0, "");
@@ -506,7 +508,7 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
     }
 
     @Override
-    public void update(Network from) {
+    public void update(@NonNull Network from) {
         this.channels = from.channels;
         this.users = from.users;
         this.ServerList = from.ServerList;
@@ -539,7 +541,7 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(NetworkSerializer.get().fromDatastream(from));
     }
 
@@ -549,7 +551,7 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
     }
 
     @Override
-    public boolean areItemsTheSame(Network other) {
+    public boolean areItemsTheSame(@NonNull Network other) {
         return networkId == other.networkId;
     }
 
@@ -562,11 +564,13 @@ public class Network extends SyncableObject<Network> implements ContentComparabl
         this.client = client;
     }
 
+    @NonNull
     public ChannelModeType channelModeType(char mode) {
         return channelModeType(String.copyValueOf(new char[]{mode}));
     }
 
-    public ChannelModeType channelModeType(String mode) {
+    @NonNull
+    public ChannelModeType channelModeType(@NonNull String mode) {
         if (mode.isEmpty())
             return ChannelModeType.NOT_A_CHANMODE;
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/NetworkConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/NetworkConfig.java
index 32d885b45..bb7d13089 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/NetworkConfig.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/NetworkConfig.java
@@ -101,7 +101,7 @@ public class NetworkConfig extends SyncableObject<NetworkConfig> {
     }
 
     @Override
-    public void update(NetworkConfig from) {
+    public void update(@NonNull NetworkConfig from) {
         this.autoWhoNickLimit = from.autoWhoNickLimit;
         this.autoWhoDelay = from.autoWhoDelay;
         this.autoWhoEnabled = from.autoWhoEnabled;
@@ -113,7 +113,7 @@ public class NetworkConfig extends SyncableObject<NetworkConfig> {
     }
 
     @Override
-    public void update(Map<String, QVariant> from) {
+    public void update(@NonNull Map<String, QVariant> from) {
         update(NetworkConfigSerializer.get().fromDatastream(from));
     }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java
index f3619522e..4ba84fde7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java
@@ -39,7 +39,6 @@ public class ClientBackgroundThread implements Runnable {
         this.certificateManager = new SQLiteCertificateManager(context);
         this.connection = new CoreConnection(address, CLIENT_DATA, provider, certificateManager);
         this.handler = new ProtocolHandler(provider);
-        this.handler.client.setClientData(CLIENT_DATA);
         this.connection.setClient(handler.client);
     }
 
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 b621d9aa2..b6245e866 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
@@ -22,16 +22,6 @@ public class QuasselService extends Service {
         return binder;
     }
 
-    @Override
-    public void onCreate() {
-        super.onCreate();
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-    }
-
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
         return START_STICKY;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java
index ad7f34965..009d877ea 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java
@@ -42,8 +42,6 @@ import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
 import com.mikepenz.materialdrawer.model.SecondaryDrawerItem;
 import com.sothree.slidinguppanel.SlidingUpPanelLayout;
 
-import org.joda.time.DateTime;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -61,13 +59,13 @@ import de.kuschku.libquassel.events.ConnectionChangeEvent;
 import de.kuschku.libquassel.events.GeneralErrorEvent;
 import de.kuschku.libquassel.events.LagChangedEvent;
 import de.kuschku.libquassel.events.UnknownCertificateEvent;
-import de.kuschku.libquassel.functions.types.Heartbeat;
 import de.kuschku.libquassel.localtypes.Buffer;
 import de.kuschku.libquassel.localtypes.ChannelBuffer;
 import de.kuschku.libquassel.localtypes.backlogmanagers.BacklogFilter;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.syncables.types.BufferViewConfig;
 import de.kuschku.libquassel.syncables.types.BufferViewManager;
+import de.kuschku.libquassel.syncables.types.IrcChannel;
 import de.kuschku.quasseldroid_ng.BuildConfig;
 import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread;
@@ -82,7 +80,6 @@ import de.kuschku.util.ServerAddress;
 import de.kuschku.util.certificates.CertificateUtils;
 import de.kuschku.util.instancestateutil.Storable;
 import de.kuschku.util.instancestateutil.Store;
-import de.kuschku.util.keyboardutils.DialogKeyboardUtil;
 import de.kuschku.util.observables.AutoScroller;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 import de.kuschku.util.ui.SpanFormatter;
@@ -138,7 +135,8 @@ public class ChatActivity extends AppCompatActivity {
         int bufferViewConfigId = -1;
     }
 
-    private ServiceInterface serviceInterface = new ServiceInterface();
+    @NonNull
+    private final ServiceInterface serviceInterface = new ServiceInterface();
     private class ServiceInterface {
         private void connect(@NonNull ServerAddress address) {
             assertNotNull(binder);
@@ -148,8 +146,6 @@ public class ChatActivity extends AppCompatActivity {
             context.getProvider().event.register(ChatActivity.this);
             binder.startBackgroundThread(context.getProvider(), address);
             onConnectionEstablished();
-
-            context.getProvider().handle(new Heartbeat(DateTime.parse("1980-01-01T00:00")));
         }
 
         private void disconnect() {
@@ -161,7 +157,8 @@ public class ChatActivity extends AppCompatActivity {
         }
     }
 
-    private ServiceConnection serviceConnection = new ServiceConnection() {
+    @Nullable
+    private final ServiceConnection serviceConnection = new ServiceConnection() {
         @UiThread
         public void onServiceConnected(@NonNull ComponentName cn, @NonNull IBinder service) {
             if (service instanceof QuasselService.LocalBinder) {
@@ -175,8 +172,11 @@ public class ChatActivity extends AppCompatActivity {
                     context.setProvider(backgroundThread.provider);
                     context.setClient(backgroundThread.handler.client);
                     context.getProvider().event.register(ChatActivity.this);
-                    updateBufferViewConfigs();
+
                     updateSubTitle();
+                    if (context.getClient().getConnectionStatus() == ConnectionChangeEvent.Status.CONNECTED) {
+                        updateBufferViewConfigs();
+                    }
                 }
             }
         }
@@ -209,7 +209,9 @@ public class ChatActivity extends AppCompatActivity {
         String lastPassword;
     }
 
-    private AppContext context = new AppContext();
+    @NonNull
+    private final AppContext context = new AppContext();
+    @Nullable
     private QuasselService.LocalBinder binder;
 
     @Override
@@ -299,7 +301,7 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
+    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
         List<Integer> filterSettings = Arrays.asList(
                 Message.Type.Join.value,
                 Message.Type.Part.value,
@@ -358,7 +360,7 @@ public class ChatActivity extends AppCompatActivity {
         return super.onOptionsItemSelected(item);
     }
 
-    private static void updateNoColor(Buffer buffer, Menu menu) {
+    private static void updateNoColor(Buffer buffer, @NonNull Menu menu) {
         boolean isNoColor = isNoColor(buffer);
         menu.findItem(R.id.format_bold).setEnabled(!isNoColor);
         menu.findItem(R.id.format_italic).setEnabled(!isNoColor);
@@ -368,8 +370,14 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     public static boolean isNoColor(Buffer buffer) {
-        return buffer instanceof ChannelBuffer && ((ChannelBuffer) buffer).getChannel() != null &&
-                ((ChannelBuffer) buffer).getChannel().getD_ChanModes().contains("c");
+        assertNotNull(buffer);
+        if (buffer instanceof ChannelBuffer) {
+            IrcChannel channel = ((ChannelBuffer) buffer).getChannel();
+            assertNotNull(channel);
+            return channel.hasMode('c');
+        } else {
+            return false;
+        }
     }
 
     private void setupContext() {
@@ -577,7 +585,6 @@ public class ChatActivity extends AppCompatActivity {
 
             wrapper = new BufferViewConfigWrapper(context, viewConfig, drawerLeft);
             wrapper.updateDrawerItems();
-            String name = viewConfig.getBufferViewName();
         }
     }
 
@@ -586,7 +593,7 @@ public class ChatActivity extends AppCompatActivity {
             swipeView.setEnabled(false);
 
             messageAdapter.setMessageList(MessageAdapter.emptyList());
-            toolbar.setTitle(getResources().getString(R.string.app_name));
+            toolbar.setTitle(getResources().getString(R.string.appName));
         } else {
             swipeView.setEnabled(true);
 
@@ -621,7 +628,7 @@ public class ChatActivity extends AppCompatActivity {
         chatline.setText("");
     }
 
-    public void onEventMainThread(ConnectionChangeEvent event) {
+    public void onEventMainThread(@NonNull ConnectionChangeEvent event) {
         updateSubTitle();
 
         switch (event.status) {
@@ -662,10 +669,11 @@ public class ChatActivity extends AppCompatActivity {
 
     private void showLoginDialog() {
         MaterialDialog dialog = new MaterialDialog.Builder(this)
-                .title("Address")
+                .title(R.string.labelLogin)
                 .customView(R.layout.dialog_login, false)
                 .onPositive((dialog1, which) -> {
                     View parent = dialog1.getCustomView();
+                    assertNotNull(parent);
                     AppCompatEditText usernameField = (AppCompatEditText) parent.findViewById(R.id.username);
                     AppCompatEditText passwordField = (AppCompatEditText) parent.findViewById(R.id.password);
                     String username = usernameField.getText().toString();
@@ -673,14 +681,16 @@ public class ChatActivity extends AppCompatActivity {
                     context.getSettings().lastUsername.set(username);
                     context.getSettings().lastPassword.set(password);
                     context.getClient().login(username, password);
-
-                    Log.e("TIME", String.valueOf(System.currentTimeMillis()));
+                })
+                .cancelListener(dialog1 -> {
+                    if (binder != null)
+                        binder.stopBackgroundThread();
+                    serviceInterface.disconnect();
                 })
                 .negativeColor(context.getThemeUtil().res.colorForeground)
-                .positiveText("Login")
-                .negativeText("Cancel")
+                .positiveText(R.string.labelLogin)
+                .negativeText(R.string.labelCancel)
                 .build();
-        dialog.setOnKeyListener(new DialogKeyboardUtil(dialog));
         ((AppCompatEditText) dialog.getView().findViewById(R.id.username)).setText(context.getSettings().lastUsername.get());
         ((AppCompatEditText) dialog.getView().findViewById(R.id.password)).setText(context.getSettings().lastPassword.get());
         dialog.show();
@@ -688,13 +698,14 @@ public class ChatActivity extends AppCompatActivity {
 
     public void showConnectDialog() {
         MaterialDialog dialog = new MaterialDialog.Builder(this)
-                .title("Address")
+                .title(R.string.labelAddress)
                 .customView(R.layout.dialog_address, false)
                 .onPositive((dialog1, which) -> {
                     if (binder != null && binder.getBackgroundThread() != null)
                         binder.stopBackgroundThread();
 
                     View parent = dialog1.getCustomView();
+                    assertNotNull(parent);
                     AppCompatEditText hostField = (AppCompatEditText) parent.findViewById(R.id.host);
                     AppCompatEditText portField = (AppCompatEditText) parent.findViewById(R.id.port);
                     String host = hostField.getText().toString().trim();
@@ -704,28 +715,27 @@ public class ChatActivity extends AppCompatActivity {
                     serviceInterface.connect(new ServerAddress(host, port));
                 })
                 .negativeColor(context.getThemeUtil().res.colorForeground)
-                .positiveText("Connect")
-                .negativeText("Cancel")
+                .positiveText(R.string.labelConnect)
+                .negativeText(R.string.labelCancel)
                 .build();
         AppCompatEditText hostField = (AppCompatEditText) dialog.getView().findViewById(R.id.host);
         AppCompatEditText portField = (AppCompatEditText) dialog.getView().findViewById(R.id.port);
 
-        dialog.setOnKeyListener(new DialogKeyboardUtil(dialog));
         hostField.setText(context.getSettings().lastHost.get());
         portField.setText(String.valueOf(context.getSettings().lastPort.get()));
 
         dialog.show();
     }
 
-    public void onEventMainThread(BacklogReceivedEvent event) {
+    public void onEventMainThread(@NonNull BacklogReceivedEvent event) {
         if (event.bufferId == status.bufferId) {
             swipeView.setRefreshing(false);
         }
     }
 
-    public void onEventMainThread(UnknownCertificateEvent event) {
+    public void onEventMainThread(@NonNull UnknownCertificateEvent event) {
         new MaterialDialog.Builder(this)
-                .content("Do you trust this certificate?\n" + CertificateUtils.certificateToFingerprint(event.certificate, ""))
+                .content(context.getThemeUtil().translations.warningCertificate + "\n" + CertificateUtils.certificateToFingerprint(event.certificate, ""))
                 .title("Unknown Certificate")
                 .onPositive((dialog, which) -> {
                     if (binder.getBackgroundThread() != null) {
@@ -739,7 +749,7 @@ public class ChatActivity extends AppCompatActivity {
                 .show();
     }
 
-    public void onEventMainThread(GeneralErrorEvent event) {
+    public void onEventMainThread(@NonNull GeneralErrorEvent event) {
         Snackbar.make(messages, event.toString(), Snackbar.LENGTH_LONG).show();
         for (String line : Splitter.fixedLength(2048).split(event.toString())) {
             Log.e("ChatActivity", line);
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 4000bcf78..3abdc7d93 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
@@ -1,6 +1,5 @@
 package de.kuschku.quasseldroid_ng.ui.chat.chatview;
 
-import android.content.Context;
 import android.graphics.Typeface;
 import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
@@ -24,14 +23,14 @@ public class ChatMessageRenderer {
     private MessageStyleContainer plainStyle;
 
     @NonNull
-    private AppContext context;
+    private final AppContext context;
 
-    public ChatMessageRenderer(@NonNull Context ctx, @NonNull AppContext context) {
+    public ChatMessageRenderer(@NonNull AppContext context) {
         this.context = context;
         setTheme(context);
     }
 
-    public void setTheme(AppContext context) {
+    public void setTheme(@NonNull AppContext context) {
         this.helper = new IrcFormatHelper(context);
 
         this.highlightStyle = new MessageStyleContainer(
@@ -84,7 +83,7 @@ public class ChatMessageRenderer {
     }
 
     @NonNull
-    private CharSequence getBufferName(Message message) {
+    private CharSequence getBufferName(@NonNull Message message) {
         assertNotNull(context.getClient());
         Buffer buffer = context.getClient().getBuffer(message.bufferInfo.id);
         assertNotNull(buffer);
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 9a4d6deae..04052b6b8 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
@@ -22,7 +22,8 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 @UiThread
 public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
-    private static ObservableSortedList<Message> emptyList = new ObservableComparableSortedList<Message>(Message.class);
+    @NonNull
+    private static final ObservableSortedList<Message> emptyList = new ObservableComparableSortedList<>(Message.class);
     @NonNull
     private final ChatMessageRenderer renderer;
     @NonNull
@@ -34,10 +35,11 @@ public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
 
     public MessageAdapter(@NonNull Context ctx, @NonNull AppContext context, @Nullable AutoScroller scroller) {
         this.inflater = LayoutInflater.from(ctx);
-        this.renderer = new ChatMessageRenderer(ctx, context);
+        this.renderer = new ChatMessageRenderer(context);
         this.callback = new AdapterUICallbackWrapper(this, scroller);
     }
 
+    @NonNull
     public static ObservableSortedList<Message> emptyList() {
         return emptyList;
     }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java
index ac9816842..3ad9a4b5c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java
@@ -1,6 +1,8 @@
 package de.kuschku.quasseldroid_ng.ui.chat.drawer;
 
 import android.graphics.Color;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.view.View;
 import android.widget.TextView;
 
@@ -27,13 +29,17 @@ import de.kuschku.util.observables.lists.ObservableComparableSortedList;
 import de.kuschku.util.ui.MessageUtil;
 
 public class BufferItem extends SecondaryDrawerItem implements IObservable<GeneralCallback>, GeneralCallback {
+    @NonNull
     private final Buffer buffer;
+    @NonNull
     private final AppContext context;
+    @NonNull
     private final ObservableComparableSortedList<Message> notifications;
 
-    private GeneralCallbackWrapper callback = new GeneralCallbackWrapper();
+    @NonNull
+    private final GeneralCallbackWrapper callback = new GeneralCallbackWrapper();
 
-    public BufferItem(Buffer buffer, AppContext context) {
+    public BufferItem(@NonNull Buffer buffer, @NonNull AppContext context) {
         this.buffer = buffer;
         this.context = context;
         notifications = context.getClient().getNotificationManager().getNotifications(buffer.getInfo().id);
@@ -49,6 +55,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener
         callback.notifyChanged();
     }
 
+    @NonNull
     @Override
     public StringHolder getBadge() {
         return new StringHolder(String.valueOf(notifications.size()));
@@ -79,14 +86,16 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener
         return super.getDescription();
     }
 
+    @Nullable
     @Override
     public StringHolder getName() {
         if (buffer instanceof StatusBuffer)
-            return new StringHolder(context.getThemeUtil().translations.title_status_buffer);
+            return new StringHolder(context.getThemeUtil().translations.titleStatusBuffer);
         else
             return new StringHolder(buffer.getName());
     }
 
+    @NonNull
     @Override
     public ImageHolder getIcon() {
         if (buffer instanceof ChannelBuffer) {
@@ -115,6 +124,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener
         return buffer.getStatus() == BufferInfo.BufferStatus.ONLINE;
     }
 
+    @NonNull
     @Override
     public ColorHolder getIconColor() {
         return buffer.getStatus() == BufferInfo.BufferStatus.ONLINE ?
@@ -122,6 +132,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener
                 new ColorHolder();
     }
 
+    @NonNull
     @Override
     public ColorHolder getDescriptionTextColor() {
         return ColorHolder.fromColor(context.getThemeUtil().res.colorForegroundSecondary);
@@ -137,6 +148,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener
         this.callback.removeCallback(callback);
     }
 
+    @NonNull
     public Buffer getBuffer() {
         return buffer;
     }
@@ -147,7 +159,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener
     }
 
     @Override
-    public void onPostBindView(IDrawerItem drawerItem, View view) {
+    public void onPostBindView(IDrawerItem drawerItem, @NonNull View view) {
         super.onPostBindView(drawerItem, view);
 
         if (getDescription() != null && getDescription().getText() != null)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java
index 83e4c0c57..d8271da29 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java
@@ -1,5 +1,7 @@
 package de.kuschku.quasseldroid_ng.ui.chat.drawer;
 
+import android.support.annotation.NonNull;
+
 import com.mikepenz.materialdrawer.Drawer;
 import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 
@@ -15,10 +17,10 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 public class BufferViewConfigWrapper {
     private Drawer drawer;
-    private BufferViewConfig config;
-    private ObservableSortedList<NetworkItem> networks = new ObservableSortedList<>(NetworkItem.class, new ObservableSortedList.ItemComparator<NetworkItem>() {
+    @NonNull
+    private final ObservableSortedList<NetworkItem> networks = new ObservableSortedList<>(NetworkItem.class, new ObservableSortedList.ItemComparator<NetworkItem>() {
         @Override
-        public int compare(NetworkItem o1, NetworkItem o2) {
+        public int compare(@NonNull NetworkItem o1, @NonNull NetworkItem o2) {
             return o1.getName().getText().compareTo(o2.getName().getText());
         }
 
@@ -28,13 +30,12 @@ public class BufferViewConfigWrapper {
         }
 
         @Override
-        public boolean areItemsTheSame(NetworkItem item1, NetworkItem item2) {
+        public boolean areItemsTheSame(@NonNull NetworkItem item1, @NonNull NetworkItem item2) {
             return item1.getNetwork().getNetworkId() == item2.getNetwork().getNetworkId();
         }
     });
 
-    public BufferViewConfigWrapper(AppContext context, BufferViewConfig config, Drawer drawer) {
-        this.config = config;
+    public BufferViewConfigWrapper(@NonNull AppContext context, @NonNull BufferViewConfig config, Drawer drawer) {
         this.drawer = drawer;
         config.doLateInit();
         networks.clear();
@@ -90,6 +91,7 @@ public class BufferViewConfigWrapper {
         this.drawer = drawer;
     }
 
+    @NonNull
     public ArrayList<IDrawerItem> getItems() {
         ArrayList<IDrawerItem> items = new ArrayList<>();
         for (IDrawerItem item : networks) {
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 ea4bfec59..f1c3a8b4c 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
@@ -1,8 +1,9 @@
 package de.kuschku.quasseldroid_ng.ui.chat.drawer;
 
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.util.SparseArray;
 
-import com.mikepenz.materialdrawer.holder.ColorHolder;
 import com.mikepenz.materialdrawer.holder.StringHolder;
 import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
 import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
@@ -27,32 +28,30 @@ import static de.kuschku.libquassel.primitives.types.BufferInfo.Type.QUERY;
 import static de.kuschku.libquassel.primitives.types.BufferInfo.Type.STATUS;
 
 public class NetworkItem extends PrimaryDrawerItem implements IObservable<GeneralCallback>, GeneralCallback {
-    private final AppContext context;
+    @NonNull
     private final Network network;
-    private final BufferViewConfig config;
+    @NonNull
     private final ObservableSortedList<BufferItem> buffers = new ObservableSortedList<>(BufferItem.class, new AlphabeticalComparator());
+    @NonNull
     private final SparseArray<BufferItem> bufferIds = new SparseArray<>();
-
+    @NonNull
     private final GeneralCallbackWrapper callback = new GeneralCallbackWrapper();
 
-    public NetworkItem(AppContext context, Network network, BufferViewConfig config) {
-        this.context = context;
+    public NetworkItem(@NonNull AppContext context, @NonNull Network network, @NonNull BufferViewConfig config) {
         this.network = network;
-        this.config = config;
 
-        for (Integer bufferId : this.config.getBuffers()) {
+        for (Integer bufferId : config.getBuffers()) {
             Buffer buffer = context.getClient().getBuffer(bufferId);
             if (buffer != null && buffer.getInfo().networkId == network.getNetworkId()) {
                 this.buffers.add(new BufferItem(buffer, context));
             }
         }
-        this.config.getBuffers().addCallback(new ElementCallback<Integer>() {
+        config.getBuffers().addCallback(new ElementCallback<Integer>() {
             @Override
             public void notifyItemInserted(Integer element) {
-                if (network.getBuffers().contains(element)) {
+                Buffer buffer = context.getClient().getBuffer(element);
+                if (network.getBuffers().contains(buffer)) {
                     if (bufferIds.get(element) == null) {
-                        Buffer buffer = context.getClient().getBuffer(element);
-
                         BufferItem bufferItem = new BufferItem(buffer, context);
                         buffers.add(bufferItem);
                         bufferItem.addCallback(NetworkItem.this);
@@ -79,26 +78,19 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera
         });
     }
 
-    @Override
-    public boolean isIconTinted() {
-        return super.isIconTinted();
-    }
-
-    @Override
-    public ColorHolder getIconColor() {
-        return super.getIconColor();
-    }
-
+    @NonNull
     @Override
     public StringHolder getDescription() {
         return new StringHolder(String.valueOf(network.getLatency()));
     }
 
+    @Nullable
     @Override
     public StringHolder getName() {
         return new StringHolder(network.getNetworkName());
     }
 
+    @NonNull
     @Override
     public List<IDrawerItem> getSubItems() {
         ArrayList<IDrawerItem> items = new ArrayList<>();
@@ -123,6 +115,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera
         this.callback.removeCallback(callback);
     }
 
+    @NonNull
     public Network getNetwork() {
         return network;
     }
@@ -134,11 +127,16 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera
 
     class AlphabeticalComparator implements ObservableSortedList.ItemComparator<BufferItem> {
         @Override
-        public int compare(BufferItem o1, BufferItem o2) {
+        public int compare(@NonNull BufferItem o1, @NonNull BufferItem o2) {
             BufferInfo.Type type1 = o1.getBuffer().getInfo().type;
             BufferInfo.Type type2 = o2.getBuffer().getInfo().type;
             if (type1 == type2) {
-                return o1.getBuffer().getName().compareTo(o2.getBuffer().getName());
+                if (o1.getBuffer().getName() == null)
+                    return -1;
+                else if (o2.getBuffer().getName() == null)
+                    return 1;
+                else
+                    return o1.getBuffer().getName().compareTo(o2.getBuffer().getName());
             } else {
                 // Type1 is status, Type2 isn’t
                 if (type1 == STATUS) return -1;
@@ -167,14 +165,14 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera
         }
 
         @Override
-        public boolean areItemsTheSame(BufferItem item1, BufferItem item2) {
+        public boolean areItemsTheSame(@NonNull BufferItem item1, @NonNull BufferItem item2) {
             return item1.getBuffer().getInfo().id == item2.getBuffer().getInfo().id;
         }
     }
 
     class NoneComparator implements ObservableSortedList.ItemComparator<BufferItem> {
         @Override
-        public int compare(BufferItem o1, BufferItem o2) {
+        public int compare(@NonNull BufferItem o1, @NonNull BufferItem o2) {
             return o1.getBuffer().getInfo().id - o2.getBuffer().getInfo().id;
         }
 
@@ -184,7 +182,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera
         }
 
         @Override
-        public boolean areItemsTheSame(BufferItem item1, BufferItem item2) {
+        public boolean areItemsTheSame(@NonNull BufferItem item1, @NonNull BufferItem item2) {
             return item1.getBuffer().getInfo().id == item2.getBuffer().getInfo().id;
         }
     }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java
index ab9884be5..f3efc6f65 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java
@@ -2,6 +2,7 @@ package de.kuschku.quasseldroid_ng.ui.editor;
 
 import android.support.annotation.ColorInt;
 import android.support.annotation.IntRange;
+import android.support.annotation.NonNull;
 import android.text.Spanned;
 import android.text.style.BackgroundColorSpan;
 import android.text.style.ForegroundColorSpan;
@@ -11,8 +12,9 @@ import android.widget.EditText;
 import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 
 public class AdvancedEditor {
-    private EditText editText;
-    private FormattingHelper helper;
+    private final EditText editText;
+    @NonNull
+    private final FormattingHelper helper;
 
     public AdvancedEditor(AppContext context, EditText editText) {
         this.helper = new FormattingHelper(context);
@@ -115,6 +117,7 @@ public class AdvancedEditor {
         }
     }
 
+    @NonNull
     public String toFormatString() {
         return helper.toEscapeCodes(editText.getText());
     }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/FormattingHelper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/FormattingHelper.java
index 74780cc7a..e1caabe55 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/FormattingHelper.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/FormattingHelper.java
@@ -1,21 +1,25 @@
 package de.kuschku.quasseldroid_ng.ui.editor;
 
+import android.support.annotation.NonNull;
 import android.text.Spanned;
 import android.text.style.BackgroundColorSpan;
 import android.text.style.CharacterStyle;
 import android.text.style.ForegroundColorSpan;
 import android.text.style.UnderlineSpan;
 
+import java.util.Locale;
+
 import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 
 public class FormattingHelper {
-    private AppContext context;
+    private final AppContext context;
 
     public FormattingHelper(AppContext context) {
         this.context = context;
     }
 
-    public String toEscapeCodes(Spanned text) {
+    @NonNull
+    public String toEscapeCodes(@NonNull Spanned text) {
         StringBuilder out = new StringBuilder();
         withinParagraph(out, text, 0, text.length());
         return out.toString();
@@ -30,7 +34,7 @@ public class FormattingHelper {
         return 0;
     }
 
-    private void withinParagraph(StringBuilder out, Spanned text,
+    private void withinParagraph(@NonNull StringBuilder out, @NonNull Spanned text,
                                  int start, int end) {
         int next;
         for (int i = start; i < end; i = next) {
@@ -65,7 +69,7 @@ public class FormattingHelper {
                         }
 
                         out.append((char) 0x03);
-                        out.append(String.format("%02d,%02d", fg, bg));
+                        out.append(String.format(Locale.US, "%02d,%02d", fg, bg));
 
                         jump = true;
                     } else if (style[j] instanceof BackgroundColorSpan) {
@@ -80,7 +84,7 @@ public class FormattingHelper {
                         bg = colorToId(((BackgroundColorSpan) style[j]).getBackgroundColor());
 
                         out.append((char) 0x03);
-                        out.append(String.format("%02d,%02d", fg, bg));
+                        out.append(String.format(Locale.US, "%02d,%02d", fg, bg));
 
                         jump = true;
                     }
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 06bf9f86d..ca03163f8 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
@@ -1,5 +1,7 @@
 package de.kuschku.quasseldroid_ng.ui.theme;
 
+import android.support.annotation.NonNull;
+
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.Client;
 import de.kuschku.quasseldroid_ng.ui.chat.WrappedSettings;
@@ -18,6 +20,7 @@ public class AppContext {
         this.themeUtil = themeUtil;
     }
 
+    @NonNull
     public AppContext withThemeUtil(ThemeUtil themeUtil) {
         setThemeUtil(themeUtil);
         return this;
@@ -31,6 +34,7 @@ public class AppContext {
         this.settings = settings;
     }
 
+    @NonNull
     public AppContext withSettings(WrappedSettings settings) {
         setSettings(settings);
         return this;
@@ -44,6 +48,7 @@ public class AppContext {
         this.client = client;
     }
 
+    @NonNull
     public AppContext withClient(Client client) {
         setClient(client);
         return this;
@@ -57,6 +62,7 @@ public class AppContext {
         this.provider = provider;
     }
 
+    @NonNull
     public AppContext withProvider(BusProvider provider) {
         setProvider(provider);
         return this;
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java
index 7bfbbc77f..e85fb35a6 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java
@@ -1,5 +1,7 @@
 package de.kuschku.quasseldroid_ng.ui.theme;
 
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.StyleRes;
 
 import de.kuschku.quasseldroid_ng.R;
@@ -20,7 +22,8 @@ public enum AppTheme {
         return themeFromString(s).themeId;
     }
 
-    public static AppTheme themeFromString(String s) {
+    @NonNull
+    public static AppTheme themeFromString(@Nullable String s) {
         if (s == null) s = "";
         switch (s) {
             case "MATERIAL_DARK":
@@ -36,6 +39,7 @@ public enum AppTheme {
         }
     }
 
+    @NonNull
     @Override
     public String toString() {
         return name() + "{" +
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java
index 336fa5268..2450e23bc 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java
@@ -18,8 +18,10 @@ import de.kuschku.util.ui.SpanFormatter;
 public class ThemeUtil {
     @NonNull
     public final Colors res = new Colors();
+    @NonNull
     public final FormatStrings translations = new FormatStrings();
-    public DateTimeFormatHelper formatter;
+    @NonNull
+    public final DateTimeFormatHelper formatter;
 
     public ThemeUtil(@NonNull Context ctx) {
         initColors(new ContextThemeWrapper(ctx, ctx.getTheme()));
@@ -42,135 +44,137 @@ public class ThemeUtil {
     }
 
     public static class FormatStrings {
-        @AutoString(R.string.username_hostmask)
-        public String username_hostmask;
+        @AutoString(R.string.usernameHostmask)
+        public String usernameHostmask;
 
-        @AutoString(R.string.message_plain)
-        public String message_plain;
+        @AutoString(R.string.messagePlain)
+        public String messagePlain;
 
-        @AutoString(R.string.message_join)
-        public String message_join;
+        @AutoString(R.string.messageJoin)
+        public String messageJoin;
 
-        @AutoString(R.string.message_part)
-        public String message_part;
+        @AutoString(R.string.messagePart)
+        public String messagePart;
 
-        @AutoString(R.string.message_part_extra)
-        public String message_part_extra;
+        @AutoString(R.string.messagePartExtra)
+        public String messagePartExtra;
 
-        @AutoString(R.string.message_quit)
-        public String message_quit;
+        @AutoString(R.string.messageQuit)
+        public String messageQuit;
 
-        @AutoString(R.string.message_quit_extra)
-        public String message_quit_extra;
+        @AutoString(R.string.messageQuitExtra)
+        public String messageQuitExtra;
 
-        @AutoString(R.string.message_kill)
-        public String message_kill;
+        @AutoString(R.string.messageKill)
+        public String messageKill;
 
-        @AutoString(R.string.message_kick)
-        public String message_kick;
+        @AutoString(R.string.messageKick)
+        public String messageKick;
 
-        @AutoString(R.string.message_kick_extra)
-        public String message_kick_extra;
+        @AutoString(R.string.messageKickExtra)
+        public String messageKickExtra;
 
-        @AutoString(R.string.message_mode)
-        public String message_mode;
+        @AutoString(R.string.messageMode)
+        public String messageMode;
 
-        @AutoString(R.string.message_nick_self)
-        public String message_nick_self;
+        @AutoString(R.string.messageNickSelf)
+        public String messageNickSelf;
 
-        @AutoString(R.string.message_nick_other)
-        public String message_nick_other;
+        @AutoString(R.string.messageNickOther)
+        public String messageNickOther;
 
-        @AutoString(R.string.message_daychange)
-        public String message_daychange;
+        @AutoString(R.string.messageDayChange)
+        public String messageDaychange;
 
-        @AutoString(R.string.message_action)
-        public String message_action;
+        @AutoString(R.string.messageAction)
+        public String messageAction;
 
-        @AutoString(R.string.title_status_buffer)
-        public String title_status_buffer;
+        @AutoString(R.string.labelStatusBuffer)
+        public String titleStatusBuffer;
+        @AutoString(R.string.warningCertificate)
+        public String warningCertificate;
 
         @NonNull
         public CharSequence formatUsername(@NonNull CharSequence nick, @NonNull CharSequence hostmask) {
-            return SpanFormatter.format(username_hostmask, nick, hostmask);
+            return SpanFormatter.format(usernameHostmask, nick, hostmask);
         }
 
         @NonNull
         public CharSequence formatJoin(@NonNull CharSequence user, @NonNull CharSequence channel) {
-            return SpanFormatter.format(message_join, user, channel);
+            return SpanFormatter.format(messageJoin, user, channel);
         }
 
         @NonNull
         public CharSequence formatPart(@NonNull CharSequence user, @NonNull CharSequence channel) {
-            return SpanFormatter.format(message_part, user, channel);
+            return SpanFormatter.format(messagePart, user, channel);
         }
 
         @NonNull
         public CharSequence formatPart(@NonNull CharSequence user, @NonNull CharSequence channel, @Nullable CharSequence reason) {
             if (reason == null || reason.length() == 0) return formatPart(user, channel);
 
-            return SpanFormatter.format(message_part_extra, user, channel, reason);
+            return SpanFormatter.format(messagePartExtra, user, channel, reason);
         }
 
         @NonNull
         public CharSequence formatQuit(@NonNull CharSequence user) {
-            return SpanFormatter.format(message_quit, user);
+            return SpanFormatter.format(messageQuit, user);
         }
 
         @NonNull
         public CharSequence formatQuit(@NonNull CharSequence user, @Nullable CharSequence reason) {
             if (reason == null || reason.length() == 0) return formatQuit(user);
 
-            return SpanFormatter.format(message_quit_extra, user, reason);
+            return SpanFormatter.format(messageQuitExtra, user, reason);
         }
 
         @NonNull
         public CharSequence formatKill(@NonNull CharSequence user, @NonNull CharSequence channel) {
-            return SpanFormatter.format(message_kill, user, channel);
+            return SpanFormatter.format(messageKill, user, channel);
         }
 
         @NonNull
         public CharSequence formatKick(@NonNull CharSequence user, @NonNull CharSequence kicked) {
-            return SpanFormatter.format(message_kick, user, kicked);
+            return SpanFormatter.format(messageKick, user, kicked);
         }
 
         @NonNull
         public CharSequence formatKick(@NonNull CharSequence user, @NonNull CharSequence kicked, @Nullable CharSequence reason) {
             if (reason == null || reason.length() == 0) return formatKick(user, kicked);
 
-            return SpanFormatter.format(message_kick_extra, user, kicked, reason);
+            return SpanFormatter.format(messageKickExtra, user, kicked, reason);
         }
 
         @NonNull
         public CharSequence formatMode(@NonNull CharSequence mode, @NonNull CharSequence user) {
-            return SpanFormatter.format(message_mode, mode, user);
+            return SpanFormatter.format(messageMode, mode, user);
         }
 
         @NonNull
         public CharSequence formatNick(@NonNull CharSequence newNick) {
-            return SpanFormatter.format(message_nick_self, newNick);
+            return SpanFormatter.format(messageNickSelf, newNick);
         }
 
         @NonNull
         public CharSequence formatNick(@NonNull CharSequence oldNick, @Nullable CharSequence newNick) {
             if (newNick == null || newNick.length() == 0) return formatNick(oldNick);
 
-            return SpanFormatter.format(message_nick_other, oldNick, newNick);
+            return SpanFormatter.format(messageNickOther, oldNick, newNick);
         }
 
         @NonNull
         public CharSequence formatDayChange(@NonNull CharSequence day) {
-            return SpanFormatter.format(message_daychange, day);
+            return SpanFormatter.format(messageDaychange, day);
         }
 
         @NonNull
         public CharSequence formatAction(@NonNull CharSequence user, @NonNull CharSequence channel) {
-            return SpanFormatter.format(message_action, user, channel);
+            return SpanFormatter.format(messageAction, user, channel);
         }
 
         @NonNull
         public CharSequence formatPlain(@NonNull CharSequence nick, @NonNull CharSequence message) {
-            return SpanFormatter.format(message_plain, nick, message);
+            return SpanFormatter.format(messagePlain, nick, message);
         }
     }
 
diff --git a/app/src/main/java/de/kuschku/util/AndroidAssert.java b/app/src/main/java/de/kuschku/util/AndroidAssert.java
index f9d7bb0f8..1787d84fa 100644
--- a/app/src/main/java/de/kuschku/util/AndroidAssert.java
+++ b/app/src/main/java/de/kuschku/util/AndroidAssert.java
@@ -1,5 +1,6 @@
 package de.kuschku.util;
 
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
 import junit.framework.Assert;
@@ -340,7 +341,7 @@ public class AndroidAssert extends Assert {
         }
     }
 
-    public static void assertEquals(int... elements) {
+    public static void assertEquals(@NonNull int... elements) {
         if (BuildConfig.DEBUG) {
             if (elements.length > 0) {
                 int first = elements[0];
diff --git a/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java b/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java
index f06452b5c..0d55f9784 100644
--- a/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java
+++ b/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java
@@ -5,6 +5,7 @@ import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteStatement;
+import android.support.annotation.NonNull;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -15,32 +16,32 @@ import java.util.Map;
 
 public class CertificateDatabaseHandler extends SQLiteOpenHelper {
     private static final int DATABASE_VERSION = 1;
-    private static final String DATABASE_NAME = "certificates";
-    private static final String TABLE_CERTIFICATES = "certificates";
+    @NonNull private static final String DATABASE_NAME = "certificates";
+    @NonNull private static final String TABLE_CERTIFICATES = "certificates";
 
-    private static final String KEY_CORE_ADDRESS = "core_address";
-    private static final String KEY_FINGERPRINT = "fingerprint";
+    @NonNull private static final String KEY_CORE_ADDRESS = "core_address";
+    @NonNull private static final String KEY_FINGERPRINT = "fingerprint";
 
     // Again we can only use String.format, as SQL doesn’t support table or column names to be bound
     // in prepared statements
-    private static final String STATEMENT_INSERT =
+    @NonNull private static final String STATEMENT_INSERT =
             String.format("INSERT OR IGNORE INTO %s(%s, %s) VALUES (?, ?)",
                     TABLE_CERTIFICATES, KEY_CORE_ADDRESS, KEY_FINGERPRINT);
-    private static final String STATEMENT_DELETE =
+    @NonNull private static final String STATEMENT_DELETE =
             String.format("DELETE FROM %s WHERE %s = ? AND %s = ?",
                     TABLE_CERTIFICATES, KEY_CORE_ADDRESS, KEY_FINGERPRINT);
-    private static final String STATEMENT_DELETE_ALL =
+    @NonNull private static final String STATEMENT_DELETE_ALL =
             String.format("DELETE FROM %s WHERE %s = ?",
                     TABLE_CERTIFICATES, KEY_CORE_ADDRESS);
 
-    private static final String SPECIFIER_FIND_ALL = String.format("%s = ?", KEY_CORE_ADDRESS);
+    @NonNull private static final String SPECIFIER_FIND_ALL = String.format("%s = ?", KEY_CORE_ADDRESS);
 
     public CertificateDatabaseHandler(Context context) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);
     }
 
     @Override
-    public void onCreate(SQLiteDatabase db) {
+    public void onCreate(@NonNull SQLiteDatabase db) {
         // Why do we use String.format and not prepared statements? Because we can’t bind table or
         // column names in prepared statements
         String statement = String.format("CREATE TABLE %s (%s, %s, PRIMARY KEY (%s, %s), UNIQUE(%s, %s));",
@@ -118,6 +119,7 @@ public class CertificateDatabaseHandler extends SQLiteOpenHelper {
         );
     }
 
+    @NonNull
     public List<String> findCertificates(String coreAddress) {
         Cursor cursor = cursorFindCertificates(coreAddress);
         List<String> certificates = new ArrayList<>();
@@ -131,6 +133,7 @@ public class CertificateDatabaseHandler extends SQLiteOpenHelper {
         return certificates;
     }
 
+    @NonNull
     public Map<String, Collection<String>> findAllCertificates() {
         Cursor cursor = cursorFindAllCertificates();
 
diff --git a/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java b/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java
index 2cdcef68e..d683f14ed 100644
--- a/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java
+++ b/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java
@@ -1,5 +1,7 @@
 package de.kuschku.util.certificates;
 
+import android.support.annotation.NonNull;
+
 import com.google.common.base.Joiner;
 
 import java.security.MessageDigest;
@@ -18,11 +20,11 @@ public class CertificateUtils {
     private CertificateUtils() {
     }
 
-    public static String certificateToFingerprint(X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException {
+    public static String certificateToFingerprint(@NonNull X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException {
         return hashToFingerprint(getHash(certificate));
     }
 
-    public static String certificateToFingerprint(X509Certificate certificate, String defaultValue) {
+    public static String certificateToFingerprint(@NonNull X509Certificate certificate, String defaultValue) {
         try {
             return certificateToFingerprint(certificate);
         } catch (Exception e) {
@@ -30,13 +32,13 @@ public class CertificateUtils {
         }
     }
 
-    private static byte[] getHash(X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException {
+    private static byte[] getHash(@NonNull X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException {
         MessageDigest digest = java.security.MessageDigest.getInstance("SHA1");
         digest.update(certificate.getEncoded());
         return digest.digest();
     }
 
-    public static String hashToFingerprint(byte[] hash) {
+    public static String hashToFingerprint(@NonNull byte[] hash) {
         String[] formattedBytes = new String[hash.length];
         for (int i = 0; i < hash.length; i++) {
             // Format each byte as hex string
@@ -45,7 +47,8 @@ public class CertificateUtils {
         return Joiner.on(":").join(formattedBytes);
     }
 
-    public static Collection<String> getHostnames(X509Certificate certificate) throws CertificateParsingException {
+    @NonNull
+    public static Collection<String> getHostnames(@NonNull X509Certificate certificate) throws CertificateParsingException {
         Set<String> hostnames = new HashSet<>();
         for (List<?> data : certificate.getSubjectAlternativeNames()) {
             if (Objects.equals(data.get(0), 2) && data.get(1) instanceof String)
diff --git a/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java b/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java
index 86c74a357..5f58d5c9f 100644
--- a/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java
+++ b/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java
@@ -1,6 +1,7 @@
 package de.kuschku.util.certificates;
 
 import android.content.Context;
+import android.support.annotation.NonNull;
 
 import java.security.cert.X509Certificate;
 import java.util.Collection;
@@ -12,14 +13,15 @@ import de.kuschku.libquassel.ssl.UnknownCertificateException;
 import de.kuschku.util.ServerAddress;
 
 public class SQLiteCertificateManager implements CertificateManager {
-    private CertificateDatabaseHandler handler;
+    @NonNull
+    private final CertificateDatabaseHandler handler;
 
     public SQLiteCertificateManager(Context context) {
         this.handler = new CertificateDatabaseHandler(context);
     }
 
     @Override
-    public boolean isTrusted(X509Certificate certificate, ServerAddress core) {
+    public boolean isTrusted(@NonNull X509Certificate certificate, @NonNull ServerAddress core) {
         try {
             certificate.checkValidity();
             return handler.findCertificates(core.host).contains(CertificateUtils.certificateToFingerprint(certificate));
@@ -29,7 +31,7 @@ public class SQLiteCertificateManager implements CertificateManager {
     }
 
     @Override
-    public boolean addCertificate(X509Certificate certificate, ServerAddress core) {
+    public boolean addCertificate(@NonNull X509Certificate certificate, @NonNull ServerAddress core) {
         try {
             return handler.addCertificate(CertificateUtils.certificateToFingerprint(certificate), core.host);
         } catch (Exception e) {
@@ -38,7 +40,7 @@ public class SQLiteCertificateManager implements CertificateManager {
     }
 
     @Override
-    public boolean removeCertificate(X509Certificate certificate, ServerAddress core) {
+    public boolean removeCertificate(@NonNull X509Certificate certificate, @NonNull ServerAddress core) {
         try {
             return handler.removeCertificate(CertificateUtils.certificateToFingerprint(certificate), core.host);
         } catch (Exception e) {
@@ -47,20 +49,22 @@ public class SQLiteCertificateManager implements CertificateManager {
     }
 
     @Override
-    public boolean removeAllCertificates(ServerAddress core) {
+    public boolean removeAllCertificates(@NonNull ServerAddress core) {
         return handler.removeCertificates(core.host);
     }
 
     @Override
-    public void checkTrusted(X509Certificate certificate, ServerAddress address) throws UnknownCertificateException {
+    public void checkTrusted(@NonNull X509Certificate certificate, @NonNull ServerAddress address) throws UnknownCertificateException {
         if (!isTrusted(certificate, address))
             throw new UnknownCertificateException(certificate, address);
     }
 
-    public List<String> findCertificates(ServerAddress core) {
+    @NonNull
+    public List<String> findCertificates(@NonNull ServerAddress core) {
         return handler.findCertificates(core.host);
     }
 
+    @NonNull
     public Map<String, Collection<String>> findAllCertificates() {
         return handler.findAllCertificates();
     }
diff --git a/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java b/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java
index b29e5ccec..b9e535c2a 100644
--- a/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java
+++ b/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java
@@ -9,6 +9,7 @@ import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 
+@SuppressWarnings("unchecked")
 public class Storable {
     public boolean onRestoreInstanceState(@NonNull Bundle in) {
         try {
diff --git a/app/src/main/java/de/kuschku/util/keyboardutils/DialogKeyboardUtil.java b/app/src/main/java/de/kuschku/util/keyboardutils/DialogKeyboardUtil.java
deleted file mode 100644
index 3e36cc221..000000000
--- a/app/src/main/java/de/kuschku/util/keyboardutils/DialogKeyboardUtil.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package de.kuschku.util.keyboardutils;
-
-import android.content.DialogInterface;
-import android.view.KeyEvent;
-
-import com.afollestad.materialdialogs.DialogAction;
-import com.afollestad.materialdialogs.MaterialDialog;
-
-/**
- * A util class that automatically handles <code>enter</code> and <code>esc</code> in dialogs
- * properly: By calling onPositive or onNeutral
- */
-public class DialogKeyboardUtil implements DialogInterface.OnKeyListener {
-    MaterialDialog dialog;
-
-    public DialogKeyboardUtil(MaterialDialog dialog) {
-        this.dialog = dialog;
-    }
-
-    @Override
-    public boolean onKey(DialogInterface d, int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
-            dialog.getActionButton(DialogAction.POSITIVE).callOnClick();
-            dialog.dismiss();
-            return true;
-        } else if (keyCode == KeyEvent.KEYCODE_ESCAPE) {
-            dialog.dismiss();
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/app/src/main/java/de/kuschku/util/keyboardutils/EditTextKeyboardUtil.java b/app/src/main/java/de/kuschku/util/keyboardutils/EditTextKeyboardUtil.java
deleted file mode 100644
index 317a416c5..000000000
--- a/app/src/main/java/de/kuschku/util/keyboardutils/EditTextKeyboardUtil.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package de.kuschku.util.keyboardutils;
-
-import android.support.v7.widget.AppCompatEditText;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-
-//TODO: FIND A WAY TO TEST THIS – THE EMULATOR DOESN'T WORK
-public class EditTextKeyboardUtil implements AppCompatEditText.OnKeyListener {
-    AppCompatEditText editText;
-    boolean reverse;
-
-    public EditTextKeyboardUtil(AppCompatEditText editText) {
-        this.editText = editText;
-    }
-
-    @Override
-    public boolean onKey(View v, int keyCode, KeyEvent event) {
-        Log.e("DEBUG", keyCode + " : " + event.toString());
-
-        if (event.isShiftPressed()) {
-            switch (keyCode) {
-                case KeyEvent.KEYCODE_DPAD_LEFT:
-                    if (editText.getSelectionStart() == editText.getSelectionEnd())
-                        reverse = true;
-
-                    if (reverse) {
-                        int start = Math.max(0, editText.getSelectionStart() - 1);
-                        editText.setSelection(start, editText.getSelectionEnd());
-                    } else {
-                        int end = Math.min(editText.length(), editText.getSelectionEnd() - 1);
-                        editText.setSelection(end, end);
-                    }
-                    break;
-                case KeyEvent.KEYCODE_DPAD_RIGHT:
-                    if (editText.getSelectionStart() == editText.getSelectionEnd())
-                        reverse = false;
-
-                    if (reverse) {
-                        int start = Math.max(0, editText.getSelectionStart() + 1);
-                        editText.setSelection(start, editText.getSelectionEnd());
-                    } else {
-                        int end = Math.min(editText.length(), editText.getSelectionEnd() + 1);
-                        editText.setSelection(end, end);
-                    }
-                    break;
-            }
-        } else {
-            switch (keyCode) {
-                case KeyEvent.KEYCODE_DPAD_LEFT:
-                    int start = Math.max(0, editText.getSelectionStart() - 1);
-                    editText.setSelection(start, start);
-                    break;
-                case KeyEvent.KEYCODE_DPAD_RIGHT:
-                    int end = Math.min(editText.length(), editText.getSelectionEnd() + 1);
-                    editText.setSelection(end, end);
-                    break;
-            }
-        }
-        return false;
-    }
-}
diff --git a/app/src/main/java/de/kuschku/util/niohelpers/Helper.java b/app/src/main/java/de/kuschku/util/niohelpers/Helper.java
index 30a6250a8..70d3ac538 100644
--- a/app/src/main/java/de/kuschku/util/niohelpers/Helper.java
+++ b/app/src/main/java/de/kuschku/util/niohelpers/Helper.java
@@ -1,5 +1,6 @@
 package de.kuschku.util.niohelpers;
 
+import android.support.annotation.NonNull;
 import android.util.Log;
 
 public class Helper {
@@ -8,7 +9,7 @@ public class Helper {
 
     }
 
-    public static void printHexDump(byte[] data) {
+    public static void printHexDump(@NonNull byte[] data) {
         Log.e("HexDump", "Hexdump following: ");
         String bytes = "";
         String text = "";
diff --git a/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java b/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java
index 33769496b..95e6974d2 100644
--- a/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java
+++ b/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java
@@ -48,7 +48,7 @@ public class WrappedChannel implements Flushable, ByteChannel, InterruptibleChan
         if (this.rawOut != null) this.out = new DataOutputStream(rawOut);
     }
 
-    public WrappedChannel(Socket s) throws IOException {
+    public WrappedChannel(@NonNull Socket s) throws IOException {
         this(s.getInputStream(), s.getOutputStream());
         this.socket = s;
     }
diff --git a/app/src/main/java/de/kuschku/util/observables/AutoScroller.java b/app/src/main/java/de/kuschku/util/observables/AutoScroller.java
index 413495258..89d07c3e6 100644
--- a/app/src/main/java/de/kuschku/util/observables/AutoScroller.java
+++ b/app/src/main/java/de/kuschku/util/observables/AutoScroller.java
@@ -1,5 +1,6 @@
 package de.kuschku.util.observables;
 
+import android.support.annotation.NonNull;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 
@@ -7,7 +8,7 @@ public class AutoScroller {
     private final RecyclerView recyclerView;
     private final LinearLayoutManager manager;
 
-    public AutoScroller(RecyclerView recyclerView) {
+    public AutoScroller(@NonNull RecyclerView recyclerView) {
         this(recyclerView, (LinearLayoutManager) recyclerView.getLayoutManager());
     }
 
diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralCallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralCallbackWrapper.java
index 1cb1f28d6..e66b93b37 100644
--- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralCallbackWrapper.java
+++ b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralCallbackWrapper.java
@@ -1,5 +1,7 @@
 package de.kuschku.util.observables.callbacks.wrappers;
 
+import android.support.annotation.NonNull;
+
 import java.util.HashSet;
 import java.util.Set;
 
@@ -7,7 +9,8 @@ import de.kuschku.util.observables.IObservable;
 import de.kuschku.util.observables.callbacks.GeneralCallback;
 
 public class GeneralCallbackWrapper implements IObservable<GeneralCallback>, GeneralCallback {
-    Set<GeneralCallback> callbacks = new HashSet<>();
+    @NonNull
+    final Set<GeneralCallback> callbacks = new HashSet<>();
 
     @Override
     public void notifyChanged() {
diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ChildParentObservableSortedList.java b/app/src/main/java/de/kuschku/util/observables/lists/ChildParentObservableSortedList.java
index 45466867a..34b52407a 100644
--- a/app/src/main/java/de/kuschku/util/observables/lists/ChildParentObservableSortedList.java
+++ b/app/src/main/java/de/kuschku/util/observables/lists/ChildParentObservableSortedList.java
@@ -10,8 +10,8 @@ import de.kuschku.util.observables.callbacks.wrappers.MultiUIChildParentCallback
 import de.kuschku.util.observables.callbacks.wrappers.ParentUICallbackWrapper;
 
 public class ChildParentObservableSortedList<T extends IObservable<UIChildCallback>> extends ObservableSortedList<T> {
-
-    private MultiUIChildParentCallback callback = MultiUIChildParentCallback.of();
+    @NonNull
+    private final MultiUIChildParentCallback callback = MultiUIChildParentCallback.of();
 
     public ChildParentObservableSortedList(@NonNull Class<T> cl, @NonNull ItemComparator<T> comparator) {
         super(cl, comparator);
@@ -46,21 +46,6 @@ public class ChildParentObservableSortedList<T extends IObservable<UIChildCallba
             get(position).addCallback(callback);
         }
 
-        @Override
-        public void notifyItemChanged(int position) {
-            super.notifyItemChanged(position);
-        }
-
-        @Override
-        public void notifyItemRemoved(int position) {
-            super.notifyItemRemoved(position);
-        }
-
-        @Override
-        public void notifyItemMoved(int from, int to) {
-            super.notifyItemMoved(from, to);
-        }
-
         @Override
         public void notifyItemRangeInserted(int position, int count) {
             super.notifyItemRangeInserted(position, count);
@@ -69,14 +54,5 @@ public class ChildParentObservableSortedList<T extends IObservable<UIChildCallba
             }
         }
 
-        @Override
-        public void notifyItemRangeChanged(int position, int count) {
-            super.notifyItemRangeChanged(position, count);
-        }
-
-        @Override
-        public void notifyItemRangeRemoved(int position, int count) {
-            super.notifyItemRangeRemoved(position, count);
-        }
     }
 }
diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java
index 44a5f35d3..cd9a49d33 100644
--- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java
+++ b/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java
@@ -9,6 +9,7 @@ import java.util.Iterator;
 import de.kuschku.util.observables.callbacks.ElementCallback;
 import de.kuschku.util.observables.callbacks.wrappers.MultiElementCallbackWrapper;
 
+@SuppressWarnings("unchecked")
 public class ObservableElementList<T> extends ArrayList<T> implements IObservableList<ElementCallback<T>, T> {
     @NonNull
     private final MultiElementCallbackWrapper<T> callback = MultiElementCallbackWrapper.<T>of();
diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java
index 41c8ffb83..8f39a208d 100644
--- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java
+++ b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java
@@ -19,6 +19,7 @@ import de.kuschku.util.observables.callbacks.wrappers.MultiUICallbackWrapper;
 
 import static de.kuschku.util.AndroidAssert.assertTrue;
 
+@SuppressWarnings("unchecked")
 public class ObservableSortedList<T> implements IObservableList<UICallback, T> {
     @NonNull
     private final SortedList<T> list;
@@ -213,6 +214,7 @@ public class ObservableSortedList<T> implements IObservableList<UICallback, T> {
         callback.notifyItemChanged(position);
     }
 
+    @NonNull
     @Override
     public String toString() {
         return Arrays.toString(toArray());
@@ -234,35 +236,31 @@ public class ObservableSortedList<T> implements IObservableList<UICallback, T> {
 
         @Override
         public void onInserted(int position, int count) {
-            if (callback != null)
-                if (count == 1)
-                    callback.notifyItemInserted(position);
-                else
-                    callback.notifyItemRangeInserted(position, count);
+            if (count == 1)
+                callback.notifyItemInserted(position);
+            else
+                callback.notifyItemRangeInserted(position, count);
         }
 
         @Override
         public void onRemoved(int position, int count) {
-            if (callback != null)
-                if (count == 1)
-                    callback.notifyItemRemoved(position);
-                else
-                    callback.notifyItemRangeRemoved(position, count);
+            if (count == 1)
+                callback.notifyItemRemoved(position);
+            else
+                callback.notifyItemRangeRemoved(position, count);
         }
 
         @Override
         public void onMoved(int fromPosition, int toPosition) {
-            if (callback != null)
-                callback.notifyItemMoved(fromPosition, toPosition);
+            callback.notifyItemMoved(fromPosition, toPosition);
         }
 
         @Override
         public void onChanged(int position, int count) {
-            if (callback != null)
-                if (count == 1)
-                    callback.notifyItemChanged(position);
-                else
-                    callback.notifyItemRangeChanged(position, count);
+            if (count == 1)
+                callback.notifyItemChanged(position);
+            else
+                callback.notifyItemRangeChanged(position, count);
         }
 
         @Override
diff --git a/app/src/main/java/de/kuschku/util/ui/MessageUtil.java b/app/src/main/java/de/kuschku/util/ui/MessageUtil.java
index e14b2ea81..9426c9a47 100644
--- a/app/src/main/java/de/kuschku/util/ui/MessageUtil.java
+++ b/app/src/main/java/de/kuschku/util/ui/MessageUtil.java
@@ -1,6 +1,7 @@
 package de.kuschku.util.ui;
 
 import android.graphics.Typeface;
+import android.support.annotation.NonNull;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
@@ -18,7 +19,8 @@ public class MessageUtil {
     /**
      * Parse mIRC style codes in IrcMessage
      */
-    public static SpannableString parseStyleCodes(ThemeUtil themeUtil, String content, boolean parse) {
+    @NonNull
+    public static SpannableString parseStyleCodes(@NonNull ThemeUtil themeUtil, @NonNull String content, boolean parse) {
         if (!parse) {
             return new SpannableString(content
                     .replaceAll("\\x02", "")
@@ -46,7 +48,6 @@ public class MessageUtil {
         int start, end, endSearchOffset, startIndicatorLength, style, fg, bg;
         while (true) {
             content = newString.toString();
-            start = -1;
             end = -1;
             startIndicatorLength = 1;
             style = 0;
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 0132e130f..4b9bd9dbd 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
@@ -94,12 +94,14 @@ public class StorageBackendParcelable extends StorageBackend implements Parcelab
             dest.writeInt(type.getValue());
             switch (type) {
                 case Int:
+                    assertNotNull(q.data);
                     dest.writeInt((Integer) q.data);
                     break;
                 case QString:
                     dest.writeString((String) q.data);
                     break;
                 case Bool:
+                    assertNotNull(q.data);
                     dest.writeInt(((Boolean) q.data) ? 1 : 0);
                     break;
                 default:
diff --git a/app/src/main/res/drawable/popup_background_material.xml b/app/src/main/res/drawable/popup_background_material.xml
deleted file mode 100644
index d8de1f5bd..000000000
--- a/app/src/main/res/drawable/popup_background_material.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2014 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-
-    <corners android:radius="2dp" />
-    <solid android:color="?attr/colorBackground" />
-
-</shape>
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
index 2fd170432..404ade997 100644
--- a/app/src/main/res/layout/content_main.xml
+++ b/app/src/main/res/layout/content_main.xml
@@ -1,9 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/swipe_view"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="?attr/colorBackground">
+    android:background="?attr/colorBackground"
+    tools:showIn="@layout/activity_chat">
 
     <android.support.v7.widget.RecyclerView
         android:id="@+id/messages"
diff --git a/app/src/main/res/layout/dialog_address.xml b/app/src/main/res/layout/dialog_address.xml
index 0942bf2b9..b73bd050d 100644
--- a/app/src/main/res/layout/dialog_address.xml
+++ b/app/src/main/res/layout/dialog_address.xml
@@ -13,7 +13,7 @@
         android:layout_height="wrap_content">
         <android.support.v7.widget.AppCompatEditText
             android:id="@+id/host"
-            android:hint="Hostname"
+            android:hint="@string/labelHostname"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:inputType="textUri" />
@@ -24,8 +24,7 @@
         android:layout_height="wrap_content">
         <android.support.v7.widget.AppCompatEditText
             android:id="@+id/port"
-            android:hint="Port"
-            android:text="4242"
+            android:hint="@string/labelPort"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:inputType="number" />
diff --git a/app/src/main/res/layout/dialog_login.xml b/app/src/main/res/layout/dialog_login.xml
index fedef624f..feb924391 100644
--- a/app/src/main/res/layout/dialog_login.xml
+++ b/app/src/main/res/layout/dialog_login.xml
@@ -13,7 +13,7 @@
         android:layout_height="wrap_content">
         <android.support.v7.widget.AppCompatEditText
             android:id="@+id/username"
-            android:hint="Username"
+            android:hint="@string/labelUsername"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:inputType="text" />
@@ -24,7 +24,7 @@
         android:layout_height="wrap_content">
         <android.support.v7.widget.AppCompatEditText
             android:id="@+id/password"
-            android:hint="Password"
+            android:hint="@string/labelPassword"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:inputType="textPassword" />
diff --git a/app/src/main/res/layout/slider_main.xml b/app/src/main/res/layout/slider_main.xml
index f3c374a74..b4b03e6c4 100644
--- a/app/src/main/res/layout/slider_main.xml
+++ b/app/src/main/res/layout/slider_main.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <com.sothree.slidinguppanel.SlidingUpPanelLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:sothree="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"
@@ -12,7 +13,8 @@
     sothree:umanoOverlay="true"
     sothree:umanoPanelHeight="@dimen/message_history_panel_height"
     sothree:umanoScrollableView="@+id/msg_history"
-    sothree:umanoShadowHeight="0.0dip">
+    sothree:umanoShadowHeight="0.0dip"
+    tools:showIn="@layout/activity_chat">
 
 
     <include layout="@layout/widget_editor" />
@@ -42,7 +44,7 @@
                     android:gravity="center_vertical"
                     android:paddingLeft="16.0dip"
                     android:paddingRight="16.0dip"
-                    android:text="@string/message_history"
+                    android:text="@string/labelHistory"
                     android:textAppearance="@style/TextAppearance.AppCompat.Body2"
                     android:textColor="?attr/colorForegroundSecondary" />
 
diff --git a/app/src/main/res/layout/widget_editor.xml b/app/src/main/res/layout/widget_editor.xml
index 58e98cb79..da173e340 100644
--- a/app/src/main/res/layout/widget_editor.xml
+++ b/app/src/main/res/layout/widget_editor.xml
@@ -1,9 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:paddingBottom="@dimen/message_history_panel_height">
+    xmlns:tools="http://schemas.android.com/tools"
+    android:paddingBottom="@dimen/message_history_panel_height"
+    tools:showIn="@layout/slider_main">
 
     <ScrollView
         android:id="@+id/chatline_scroller"
@@ -22,7 +23,7 @@
             android:layout_height="?attr/actionBarSize"
             android:background="@android:color/transparent"
             android:gravity="top"
-            android:hint="@string/message_placeholder"
+            android:hint="@string/placeholder"
             android:inputType="textCapSentences|textShortMessage|textAutoCorrect"
             android:paddingBottom="17dp"
             android:paddingLeft="20dp"
diff --git a/app/src/main/res/menu/chat.xml b/app/src/main/res/menu/chat.xml
index 9f5ae5a47..16640329a 100644
--- a/app/src/main/res/menu/chat.xml
+++ b/app/src/main/res/menu/chat.xml
@@ -5,11 +5,6 @@
         android:id="@+id/action_hide_events"
         android:icon="@android:drawable/ic_menu_sort_by_size"
         android:orderInCategory="100"
-        android:title="Hide events"
+        android:title="@string/labelHideEvents"
         app:showAsAction="ifRoom" />
-    <item
-        android:id="@+id/action_settings"
-        android:orderInCategory="100"
-        android:title="@string/action_settings"
-        app:showAsAction="never" />
 </menu>
diff --git a/app/src/main/res/menu/formatting.xml b/app/src/main/res/menu/formatting.xml
index d2319d915..bbabecc87 100644
--- a/app/src/main/res/menu/formatting.xml
+++ b/app/src/main/res/menu/formatting.xml
@@ -3,32 +3,32 @@
     xmlns:app="http://schemas.android.com/apk/res-auto">
     <item
         android:id="@+id/format_bold"
-        android:icon="?attr/ic_format_bold"
+        android:icon="?attr/iconFormatBold"
         app:showAsAction="always"
-        android:title="@string/format_bold" />
+        android:title="@string/formatBold" />
     <item
         android:id="@+id/format_italic"
-        android:icon="?attr/ic_format_italic"
+        android:icon="?attr/iconFormatItalic"
         app:showAsAction="always"
-        android:title="@string/format_italic" />
+        android:title="@string/formatItalic" />
     <item
         android:id="@+id/format_underline"
-        android:icon="?attr/ic_format_underline"
+        android:icon="?attr/iconFormatUnderline"
         app:showAsAction="always"
-        android:title="@string/format_underline" />
+        android:title="@string/formatUnderline" />
     <item
         android:id="@+id/format_paint"
-        android:icon="?attr/ic_format_paint"
+        android:icon="?attr/iconFormatPaint"
         app:showAsAction="always"
-        android:title="@string/format_color" />
+        android:title="@string/formatColor" />
     <item
         android:id="@+id/format_fill"
-        android:icon="?attr/ic_format_fill"
+        android:icon="?attr/iconFormatFill"
         app:showAsAction="always"
-        android:title="@string/format_fill" />
+        android:title="@string/formatFill" />
     <item
         android:id="@+id/action_history"
-        android:icon="?attr/ic_history"
+        android:icon="?attr/iconHistory"
         app:showAsAction="always"
-        android:title="@string/message_history" />
+        android:title="@string/labelHistory" />
 </menu>
diff --git a/app/src/main/res/menu/global.xml b/app/src/main/res/menu/global.xml
deleted file mode 100644
index 80dac4c96..000000000
--- a/app/src/main/res/menu/global.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-    <item
-        android:id="@+id/action_settings"
-        android:orderInCategory="100"
-        android:title="@string/action_settings"
-        app:showAsAction="never" />
-</menu>
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index c782848f4..ccd73f507 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -60,12 +60,12 @@
     <attr name="chatlineExpandedSize" />
 
     <!-- Format icons -->
-    <attr name="ic_format_bold" format="reference" />
-    <attr name="ic_format_italic" format="reference" />
-    <attr name="ic_format_underline" format="reference" />
-    <attr name="ic_format_paint" format="reference" />
-    <attr name="ic_format_fill" format="reference" />
-    <attr name="ic_history" format="reference" />
+    <attr name="iconFormatBold" format="reference" />
+    <attr name="iconFormatItalic" format="reference" />
+    <attr name="iconFormatUnderline" format="reference" />
+    <attr name="iconFormatPaint" format="reference" />
+    <attr name="iconFormatFill" format="reference" />
+    <attr name="iconHistory" format="reference" />
 
     <attr name="cardStyle" format="reference" />
 </resources>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 879ca0f5a..08082e6cc 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -2,14 +2,9 @@
     <!-- Default screen margins, per the Android Design guidelines. -->
     <dimen name="activity_horizontal_margin">16dp</dimen>
     <dimen name="activity_vertical_margin">16dp</dimen>
-    <dimen name="fab_margin">16dp</dimen>
 
     <dimen name="message_horizontal">8dp</dimen>
     <dimen name="message_vertical">4dp</dimen>
-    <dimen name="text_margin">16dp</dimen>
 
-    <!-- Per the design guidelines, navigation drawers should be between 240dp and 320dp:
-         https://developer.android.com/design/patterns/navigation-drawer.html -->
-    <dimen name="navigation_drawer_width">240dp</dimen>
     <dimen name="message_history_panel_height">0dip</dimen>
 </resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a6a06bdd2..346d1f116 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,44 +1,60 @@
 <resources>
-    <string name="app_name">QuasselDroid</string>
-    <string name="action_settings">Settings</string>
+    <string name="appName">QuasselDroid</string>
+    <string name="appDescription">An Android-based client for the decentralized Quassel IRC client.</string>
+    <string name="appDescriptionLong">Quassel is a distributed, decentralized IRC client, written using C++ and Qt. QuasselDroid is a pure-java client for the Quassel core, allowing you to connect to your Quassel core using your Android™ phone.</string>
+    <string name="appLinkGithubTitle">GitHub</string>
+    <string name="appLinkGithubUrl" translatable="false">https://github.com/sandsmark/QuasselDroid</string>
+    <string name="appLinkCommunityTitle">Community</string>
+    <string name="appLinkCommunityUrl" translatable="false">https://plus.google.com/communities/104094956084217666662</string>
 
     <!-- Message format strings -->
-    <string name="message_plain">%1$s: %2$s</string>
+    <string name="usernameHostmask">%1$s (%2$s)</string>
 
-    <string name="message_join">%1$s has joined %2$s</string>
+    <string name="messagePlain">%1$s: %2$s</string>
 
-    <string name="message_part">%1$s has left %2$s</string>
-    <string name="message_part_extra">"%1$s has left %2$s (%3$s)</string>
+    <string name="messageJoin">%1$s has joined %2$s</string>
 
-    <string name="message_quit">%1$s has quit</string>
-    <string name="message_quit_extra">%1$s has quit (%2$s)</string>
+    <string name="messagePart">%1$s has left %2$s</string>
+    <string name="messagePartExtra">"%1$s has left %2$s (%3$s)</string>
 
-    <string name="message_kill">%1$s was killed: %2$s</string>
+    <string name="messageQuit">%1$s has quit</string>
+    <string name="messageQuitExtra">%1$s has quit (%2$s)</string>
 
-    <string name="message_kick">%1$s has kicked %2$s from %3$s</string>
-    <string name="message_kick_extra">%1$s has kicked %2$s from %3$s: %4$s</string>
+    <string name="messageKill">%1$s was killed: %2$s</string>
 
-    <string name="message_mode">Mode %1$s by %2$s</string>
+    <string name="messageKick">%1$s has kicked %2$s from %3$s</string>
+    <string name="messageKickExtra">%1$s has kicked %2$s from %3$s: %4$s</string>
 
-    <string name="message_nick_self">You are now known as %1$s</string>
-    <string name="message_nick_other">%1$s is now known as %2$s</string>
+    <string name="messageMode">Mode %1$s by %2$s</string>
 
-    <string name="message_daychange">{ Day changed to %1$s }</string>
+    <string name="messageNickSelf">You are now known as %1$s</string>
+    <string name="messageNickOther">%1$s is now known as %2$s</string>
 
-    <string name="message_action">* %1$s %2$s</string>
+    <string name="messageDayChange">{ Day changed to %1$s }</string>
+
+    <string name="messageAction">* %1$s %2$s</string>
 
     <!-- Editor UI -->
-    <string name="message_placeholder">Write a message…</string>
-    <string name="message_history">Message History</string>
-    <string name="format_bold">Bold</string>
-    <string name="format_italic">Italic</string>
-    <string name="format_underline">Underline</string>
-    <string name="format_color">Text Color</string>
-    <string name="format_fill">Background Color</string>
-
-    <!-- Misc -->
-    <string name="username_hostmask">%1$s (%2$s)</string>
-    <string name="title_status_buffer">Status Buffer</string>
-    <string name="open_drawer">open</string>
-    <string name="close_drawer">close</string>
+    <string name="placeholder">Write a message…</string>
+    <string name="formatBold">Bold</string>
+    <string name="formatItalic">Italic</string>
+    <string name="formatUnderline">Underline</string>
+    <string name="formatColor">Text Color</string>
+    <string name="formatFill">Background Color</string>
+
+    <!-- Actions -->
+    <string name="labelLogin">Login</string>
+    <string name="labelCancel">Cancel</string>
+    <string name="labelConnect">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>
+    <string name="labelPassword">Password</string>
+    <string name="labelUsername">Username</string>
+    <string name="labelHideEvents">Hide events</string>
+
+    <string name="warningCertificate">Do you trust this certificate?</string>
 </resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 4e8d94402..e297271ad 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -11,12 +11,12 @@
         <item name="colorControlHighlight">@color/colorAccentFocus</item>
         <item name="windowActionModeOverlay">true</item>
         
-        <item name="ic_format_bold">@drawable/ic_format_bold_dark</item>
-        <item name="ic_format_italic">@drawable/ic_format_italic_dark</item>
-        <item name="ic_format_underline">@drawable/ic_format_underline_dark</item>
-        <item name="ic_format_paint">@drawable/ic_format_paint_dark</item>
-        <item name="ic_format_fill">@drawable/ic_format_fill_dark</item>
-        <item name="ic_history">@drawable/ic_history_dark</item>
+        <item name="iconFormatBold">@drawable/ic_format_bold_dark</item>
+        <item name="iconFormatItalic">@drawable/ic_format_italic_dark</item>
+        <item name="iconFormatUnderline">@drawable/ic_format_underline_dark</item>
+        <item name="iconFormatPaint">@drawable/ic_format_paint_dark</item>
+        <item name="iconFormatFill">@drawable/ic_format_fill_dark</item>
+        <item name="iconHistory">@drawable/ic_history_dark</item>
 
         <item name="cardStyle">@style/CardView.Dark</item>
     </style>
@@ -31,12 +31,12 @@
         <item name="colorControlHighlight">@color/colorAccentFocus</item>
         <item name="windowActionModeOverlay">true</item>
 
-        <item name="ic_format_bold">@drawable/ic_format_bold_light</item>
-        <item name="ic_format_italic">@drawable/ic_format_italic_light</item>
-        <item name="ic_format_underline">@drawable/ic_format_underline_light</item>
-        <item name="ic_format_paint">@drawable/ic_format_paint_light</item>
-        <item name="ic_format_fill">@drawable/ic_format_fill_light</item>
-        <item name="ic_history">@drawable/ic_history_light</item>
+        <item name="iconFormatBold">@drawable/ic_format_bold_light</item>
+        <item name="iconFormatItalic">@drawable/ic_format_italic_light</item>
+        <item name="iconFormatUnderline">@drawable/ic_format_underline_light</item>
+        <item name="iconFormatPaint">@drawable/ic_format_paint_light</item>
+        <item name="iconFormatFill">@drawable/ic_format_fill_light</item>
+        <item name="iconHistory">@drawable/ic_history_light</item>
 
         <item name="cardStyle">@style/CardView.Light</item>
     </style>
-- 
GitLab