diff --git a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
index dcffa36f7d25dcd4da4993b2be8a49c4381d72bf..c6026667c27094b190ca1b9623029fc5f3a1df69 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
@@ -23,7 +23,7 @@ package de.kuschku.libquassel.client;
 
 import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
-import android.util.Log;
+import android.support.annotation.Nullable;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -53,7 +53,7 @@ public class BufferManager {
     private final Map<String, Integer> buffersByChannel = new HashMap<>();
     private final Map<Integer, ObservableSet<Integer>> buffersByNetwork = new HashMap<>();
     private final ObservableSet<Integer> bufferIds = new ObservableSet<>();
-    private Set<Integer> laterRequests = new HashSet<>();
+    private final Set<Integer> laterRequests = new HashSet<>();
 
     public BufferManager(Client client) {
         this.client = client;
@@ -88,35 +88,36 @@ public class BufferManager {
         buffer.setInfo(bufferInfo);
     }
 
-    public void init(List<BufferInfo> bufferInfos) {
+    public void init(@NonNull List<BufferInfo> bufferInfos) {
         for (BufferInfo info : bufferInfos) {
             createBuffer(info);
             laterRequests.add(info.id());
         }
     }
 
+    @NonNull
     public Map<Integer, Buffer> buffers() {
         return buffers;
     }
 
-    public void createBuffer(BufferInfo info) {
+    public void createBuffer(@NonNull BufferInfo info) {
         Buffer buffer = Buffers.fromType(info, client);
         assertNotNull(buffer);
         createBuffer(buffer);
     }
 
-    public boolean exists(BufferInfo info) {
+    public boolean exists(@NonNull BufferInfo info) {
         return buffers.containsKey(info.id());
     }
 
-    public void renameBuffer(int bufferId, String newName) {
+    public void renameBuffer(int bufferId, @NonNull String newName) {
         Buffer buffer = buffer(bufferId);
         if (buffer != null) {
             buffer.renameBuffer(newName);
         }
     }
 
-    private void updateBufferMapEntries(Buffer buffer, String name) {
+    private void updateBufferMapEntries(@NonNull Buffer buffer, String name) {
         buffersByNick.remove(buffer.objectName());
         buffersByChannel.remove(buffer.objectName());
         if (buffer instanceof ChannelBuffer) {
@@ -126,7 +127,8 @@ public class BufferManager {
         }
     }
 
-    public ChannelBuffer channel(QIrcChannel channel) {
+    @Nullable
+    public ChannelBuffer channel(@Nullable QIrcChannel channel) {
         if (channel == null)
             return null;
         if (!buffersByChannel.containsKey(channel.getObjectName()))
@@ -137,7 +139,8 @@ public class BufferManager {
         return (ChannelBuffer) buffer;
     }
 
-    public QueryBuffer user(QIrcUser user) {
+    @Nullable
+    public QueryBuffer user(@Nullable QIrcUser user) {
         if (user == null)
             return null;
         if (!buffersByNick.containsKey(user.getObjectName()))
@@ -154,6 +157,7 @@ public class BufferManager {
         return buffersByNetwork.get(networkId);
     }
 
+    @NonNull
     public ObservableSet<Integer> bufferIds() {
         return bufferIds;
     }
@@ -170,6 +174,6 @@ public class BufferManager {
         laterRequests.clear();
         int waitingMax = client.backlogManager().waitingMax();
         int waitingCurrently = client.backlogManager().waiting().size();
-        client.provider().sendEvent(new BacklogInitEvent(waitingMax-waitingCurrently, waitingMax));
+        client.provider().sendEvent(new BacklogInitEvent(waitingMax - waitingCurrently, waitingMax));
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/client/Client.java b/app/src/main/java/de/kuschku/libquassel/client/Client.java
index fa1bb4613151a07e9372cd0269df9de959ca89ac..1b3597e9b49c7a204697dd2b528399d1482c45ad 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/Client.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/Client.java
@@ -82,6 +82,7 @@ public class Client extends AClient {
     @NonNull
     private final NotificationManager notificationManager;
     private final List<String> initRequests = new LinkedList<>();
+    @NonNull
     private final QBacklogManager<? extends QBacklogManager> backlogManager;
     private final Map<String, List<SyncFunction>> bufferedSyncs = new HashMap<>();
     private final Map<Integer, Pair<QBufferViewConfig, Integer>> bufferedBuffers = new HashMap<>();
@@ -122,6 +123,7 @@ public class Client extends AClient {
         return aliasManager;
     }
 
+    @NonNull
     public QBacklogManager<? extends QBacklogManager> backlogManager() {
         return backlogManager;
     }
@@ -147,12 +149,12 @@ public class Client extends AClient {
     }
 
     @Override
-    public void _bufferInfoUpdated(BufferInfo bufferInfo) {
+    public void _bufferInfoUpdated(@NonNull BufferInfo bufferInfo) {
         bufferManager.updateBufferInfo(bufferInfo);
     }
 
     @Override
-    public void _identityCreated(Identity identity) {
+    public void _identityCreated(@NonNull Identity identity) {
         identityManager.createIdentity(identity);
     }
 
@@ -194,9 +196,7 @@ public class Client extends AClient {
 
         this.connectionStatus = connectionStatus;
         if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) {
-            Log.e("libquassel", "test1");
             bufferManager().doBacklogInit(20);
-            Log.e("libquassel", "test2");
         } else if (connectionStatus == ConnectionChangeEvent.Status.CONNECTED) {
             // FIXME: Init buffer activity state and highlightss
         }
@@ -452,7 +452,7 @@ public class Client extends AClient {
         Log.d("libquassel", "Queued buffers: " + bufferedBuffers.keySet());
     }
 
-    public void unbufferBuffer(BufferInfo info) {
+    public void unbufferBuffer(@NonNull BufferInfo info) {
         if (!bufferManager().exists(info)) {
             bufferManager().createBuffer(info);
             Log.d("libquassel", "Creating buffer from message info: " + info.id());
@@ -464,6 +464,7 @@ public class Client extends AClient {
         }
     }
 
+    @Nullable
     public BusProvider provider() {
         return provider;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java b/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java
index 04d417aba54650ae9c76b991df32de08d683d11a..9a1fe8ef6102943c8eae514bd14e8ffd5ae3cf2b 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java
@@ -23,6 +23,7 @@ package de.kuschku.libquassel.client;
 
 import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import java.util.HashMap;
 import java.util.List;
@@ -47,6 +48,7 @@ public class IdentityManager {
         identities.remove(id);
     }
 
+    @Nullable
     public QIdentity identity(@IntRange(from = 0) int id) {
         return identities.get(id);
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java b/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java
index 58f6d9bf106ee4a1d5fef9ab9482210bbd25d007..27ca0a8169793feaf199845d91875facba726b0f 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java
@@ -37,10 +37,12 @@ import de.kuschku.util.observables.lists.ObservableSet;
 public class NetworkManager extends Observable {
     @NonNull
     private final Map<Integer, QNetwork> networks = new HashMap<>();
+    @NonNull
     private final ObservableSet<QNetwork> list = new ObservableSet<>();
+    @NonNull
     private final Client client;
 
-    public NetworkManager(Client client) {
+    public NetworkManager(@NonNull Client client) {
         this.client = client;
     }
 
@@ -71,10 +73,12 @@ public class NetworkManager extends Observable {
         }
     }
 
+    @NonNull
     public ObservableSet<QNetwork> list() {
         return list;
     }
 
+    @NonNull
     public List<QNetwork> networks() {
         return new ArrayList<>(networks.values());
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java b/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java
index afa47520ae1c685ffc110ebd97bbc60eb48f7140..00534a76ee28813779f6f5d2ec2ae56a305d9513 100644
--- a/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java
+++ b/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java
@@ -21,6 +21,8 @@
 
 package de.kuschku.libquassel.events;
 
+import android.support.annotation.NonNull;
+
 @SuppressWarnings("WeakerAccess")
 public class GeneralErrorEvent {
     public String debugInfo;
@@ -40,6 +42,7 @@ public class GeneralErrorEvent {
     }
 
     @Override
+    @NonNull
     public String toString() {
         if (debugInfo == null)
             return String.format("%s: %s", exception.getClass().getSimpleName(), exception.getLocalizedMessage());
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 b673b822544da2776f3105a37ca494a00168a632..8ae2cb05f6230a1d39dc5d98d0883e2c8ef7abdb 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
@@ -36,7 +36,7 @@ public class HeartbeatReply {
         this(DateTime.now().toDateTimeISO());
     }
 
-    public HeartbeatReply(Heartbeat heartbeat) {
+    public HeartbeatReply(@NonNull Heartbeat heartbeat) {
         this(heartbeat.dateTime);
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java
index 09e8c5e57bff19d5c8f47af670104fcd38872e0e..4f9dffe9fd65d6edae365a5cebb196d3d69e6234 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java
@@ -30,7 +30,7 @@ public class RpcCallFunction {
     @NonNull
     public final String functionName;
     @NonNull
-    public final List<Object> params;
+    public final List params;
 
     public RpcCallFunction(@NonNull String functionName, @NonNull List params) {
         this.functionName = functionName;
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
index 64458965e279ad40fada4297ca61e3ff85caf474..83c60019cbe65f6866895fbaf9f2474b97c7e87f 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
@@ -49,12 +49,10 @@ public class BacklogFilter implements UICallback {
 
     @NonNull
     private final Set<Message.Type> filteredTypes = new HashSet<>();
-
+    private final EventBus bus = new EventBus();
     @Nullable
     private DateTime earliestMessage;
 
-    private EventBus bus = new EventBus();
-
     public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableComparableSortedList<Message> unfiltered, @NonNull ObservableComparableSortedList<Message> filtered) {
         this.client = client;
         this.bufferId = bufferId;
@@ -127,17 +125,17 @@ public class BacklogFilter implements UICallback {
         }
     }
 
-    public void onEventAsync(MessageFilterEvent event) {
+    public void onEventAsync(@NonNull MessageFilterEvent event) {
         if (!filterItem(event.msg)) bus.post(new MessageInsertEvent(event.msg));
         if (event.msg.time.isBefore(earliestMessage)) earliestMessage = event.msg.time;
         updateDayChangeMessages();
     }
 
-    public void onEventMainThread(MessageInsertEvent event) {
+    public void onEventMainThread(@NonNull MessageInsertEvent event) {
         filtered.add(event.msg);
     }
 
-    public void onEventMainThread(MessageRemoveEvent event) {
+    public void onEventMainThread(@NonNull MessageRemoveEvent event) {
         filtered.remove(event.msg);
     }
 
@@ -204,6 +202,7 @@ public class BacklogFilter implements UICallback {
 
     private class MessageInsertEvent {
         public final Message msg;
+
         public MessageInsertEvent(Message msg) {
             this.msg = msg;
         }
@@ -211,6 +210,7 @@ public class BacklogFilter implements UICallback {
 
     private class MessageRemoveEvent {
         public final Message msg;
+
         public MessageRemoveEvent(Message msg) {
             this.msg = msg;
         }
@@ -218,6 +218,7 @@ public class BacklogFilter implements UICallback {
 
     private class MessageFilterEvent {
         public final Message msg;
+
         public MessageFilterEvent(Message msg) {
             this.msg = msg;
         }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java
index 491c09db51aee0a4c753fea8b05a6fd3ae5ce5e7..c887d11adf89ea8316c97fc99f7ee64db648df6f 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java
@@ -80,7 +80,7 @@ public class MemoryBacklogStorage implements BacklogStorage {
         }
     }
 
-    public void updateLatest(Message message) {
+    public void updateLatest(@NonNull Message message) {
         if (message.messageId > getLatest(message.bufferInfo.id())) {
             latestMessage.put(message.bufferInfo.id(), message.messageId);
         }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java
index ce73300dc1f70b1d871cd5a80f8ed63c8f84dcb5..849f5d13d75286773890a46419dc68f65063ec57 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java
@@ -40,7 +40,9 @@ public interface Buffer {
 
     void renameBuffer(@NonNull String newName);
 
+    @NonNull
     String objectName();
 
+    @NonNull
     String objectName(String name);
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
index 8fb9f4ca0bf2dffb5058606e1462615115be6171..fada32de074e459b068fc85f4358f75857db7cdc 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
@@ -67,11 +67,13 @@ public class ChannelBuffer implements Buffer {
         info.setName(newName);
     }
 
+    @NonNull
     @Override
     public String objectName() {
         return objectName(info.name());
     }
 
+    @NonNull
     @Override
     public String objectName(String name) {
         return info.networkId() + "/" + name;
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
index a87ddc8fda116f2ae4ca35706e2360f297e631ba..e373eade1eaaadeff10590951eb41031d4d4c867 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
@@ -69,11 +69,13 @@ public class QueryBuffer implements Buffer {
         info.setName(newName);
     }
 
+    @NonNull
     @Override
     public String objectName() {
         return objectName(info.name());
     }
 
+    @NonNull
     @Override
     public String objectName(String name) {
         return info.networkId() + "/" + name;
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
index 4bab97e2fd0ec163ca59b3e5845e3ccc8933ad66..ec75adde3ca84bb57ff4f201ee5889dc85b12f6c 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
@@ -66,11 +66,13 @@ public class StatusBuffer implements Buffer {
         return getNetwork().isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE;
     }
 
+    @NonNull
     @Override
     public String objectName() {
         return objectName(info.name());
     }
 
+    @NonNull
     @Override
     public String objectName(String name) {
         return info.networkId() + "/" + name;
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java
index 09b4c6e23e42a783a181b9253ac50adef5164d67..b8eb23ba937778113fa75e303786fa82b11a1897 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java
@@ -29,7 +29,7 @@ import de.kuschku.libquassel.syncables.types.SyncableObject;
 import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager;
 
 public abstract class ABacklogManager<T extends ABacklogManager<T>> extends SyncableObject<T> implements QBacklogManager<T> {
-    static String intName = QMetaType.Type.Int.getSerializableName();
+    static final String intName = QMetaType.Type.Int.getSerializableName();
 
     @Override
     public void requestBacklog(int id, int first, int last, int limit, int additional) {
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java
index af5bf64374b35568e52e7ba3863c9b3c90275dd9..44c91289df3fe07b9e6fcc5f6fd8a6e8a5bd7f64 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java
@@ -21,6 +21,8 @@
 
 package de.kuschku.libquassel.syncables.types.abstracts;
 
+import android.support.annotation.NonNull;
+
 import java.util.List;
 
 import de.kuschku.libquassel.syncables.types.SyncableObject;
@@ -53,13 +55,13 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje
     }
 
     @Override
-    public void joinIrcUser(QIrcUser ircuser) {
+    public void joinIrcUser(@NonNull QIrcUser ircuser) {
         _joinIrcUser(ircuser);
         syncVar("joinIrcUser", ircuser.nick());
     }
 
     @Override
-    public void part(QIrcUser ircuser) {
+    public void part(@NonNull QIrcUser ircuser) {
         _part(ircuser);
         syncVar("part", ircuser.nick());
     }
@@ -71,7 +73,7 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje
     }
 
     @Override
-    public void setUserModes(QIrcUser ircuser, String modes) {
+    public void setUserModes(@NonNull QIrcUser ircuser, String modes) {
         _setUserModes(ircuser, modes);
         syncVar("setUserModes", ircuser.nick(), modes);
     }
@@ -83,7 +85,7 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje
     }
 
     @Override
-    public void addUserMode(QIrcUser ircuser, String mode) {
+    public void addUserMode(@NonNull QIrcUser ircuser, String mode) {
         _addUserMode(ircuser, mode);
         syncVar("addUserMode", ircuser.nick(), mode);
     }
@@ -95,7 +97,7 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje
     }
 
     @Override
-    public void removeUserMode(QIrcUser ircuser, String mode) {
+    public void removeUserMode(@NonNull QIrcUser ircuser, String mode) {
         _removeUserMode(ircuser, mode);
         syncVar("removeUserMode", ircuser.nick(), mode);
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java
index 300175bcab3085903fe783e2b6f29271fa82729d..f6dfb61007566268ebdbe5481564f5e9b665e889 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java
@@ -21,6 +21,8 @@
 
 package de.kuschku.libquassel.syncables.types.abstracts;
 
+import android.support.annotation.NonNull;
+
 import org.joda.time.DateTime;
 
 import de.kuschku.libquassel.syncables.types.SyncableObject;
@@ -125,13 +127,13 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T>
     }
 
     @Override
-    public void joinChannel(QIrcChannel channel) {
+    public void joinChannel(@NonNull QIrcChannel channel) {
         _joinChannel(channel);
         syncVar("joinChannel", channel.name());
     }
 
     @Override
-    public void joinChannel(QIrcChannel channel, boolean skip_channel_join) {
+    public void joinChannel(@NonNull QIrcChannel channel, boolean skip_channel_join) {
         _joinChannel(channel, skip_channel_join);
         syncVar("joinChannel", channel.name(), skip_channel_join);
     }
@@ -143,7 +145,7 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T>
     }
 
     @Override
-    public void partChannel(QIrcChannel channel) {
+    public void partChannel(@NonNull QIrcChannel channel) {
         _partChannel(channel);
         syncVar("partChannel", channel.name());
     }
@@ -173,7 +175,7 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T>
     }
 
     @Override
-    public void partChannel(QIrcChannel channel, boolean skip_channel_part) {
+    public void partChannel(@NonNull QIrcChannel channel, boolean skip_channel_part) {
         _partChannel(channel, skip_channel_part);
         syncVar("partChannel", channel.name(), skip_channel_part);
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java
index f7f196f362dbfa1623a5ba9bbf063ecca67ce652..1b87a2323ac067c3b14960d368dc71cc6f99e757 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java
@@ -21,6 +21,8 @@
 
 package de.kuschku.libquassel.syncables.types.abstracts;
 
+import android.support.annotation.NonNull;
+
 import java.util.List;
 
 import de.kuschku.libquassel.objects.types.NetworkServer;
@@ -249,13 +251,13 @@ public abstract class ANetwork<T extends ANetwork<T>> extends SyncableObject<T>
     }
 
     @Override
-    public void removeIrcChannel(QIrcChannel ircChannel) {
+    public void removeIrcChannel(@NonNull QIrcChannel ircChannel) {
         _removeIrcChannel(ircChannel);
         syncVar("removeIrcChannel", ircChannel.name());
     }
 
     @Override
-    public void removeIrcUser(QIrcUser ircuser) {
+    public void removeIrcUser(@NonNull QIrcUser ircuser) {
         _removeIrcUser(ircuser);
         syncVar("removeIrcUser", ircuser.nick());
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java
index 73bdef72b4c2658405d670ea2c24c870ee050b29..f64af79214bd1e22e4b78750feb217f3483eb448 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java
@@ -23,7 +23,6 @@ package de.kuschku.libquassel.syncables.types.impl;
 
 import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
-import android.util.Log;
 
 import java.util.HashSet;
 import java.util.List;
@@ -107,7 +106,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> {
         assertNotNull(provider);
 
         if (client.connectionStatus() == ConnectionChangeEvent.Status.LOADING_BACKLOG) {
-            provider.sendEvent(new BacklogInitEvent(waitingMax-waiting.size(), waitingMax));
+            provider.sendEvent(new BacklogInitEvent(waitingMax - waiting.size(), waitingMax));
             if (waiting.isEmpty()) {
                 client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED);
             }
@@ -164,7 +163,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> {
     }
 
     @Override
-    public void receiveBacklog(Message msg) {
+    public void receiveBacklog(@NonNull Message msg) {
         storage.insertMessages(msg);
         if (msg.bufferInfo.id() == openBuffer && openBuffer != -1)
             client.bufferSyncer().requestMarkBufferAsRead(openBuffer);
@@ -175,6 +174,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> {
         return waitingMax;
     }
 
+    @NonNull
     @Override
     public Set<Integer> waiting() {
         return waiting;
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java
index 967cb5bb0e4a91f330c01d231211f097a70d86b9..14414e07205974fb8dfe1590638e1428e8061754 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java
@@ -25,9 +25,7 @@ import android.support.annotation.NonNull;
 import android.util.Log;
 import android.util.SparseIntArray;
 
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.client.Client;
@@ -35,24 +33,30 @@ import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer;
 import de.kuschku.libquassel.syncables.types.abstracts.ABufferSyncer;
+import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager;
 import de.kuschku.util.observables.lists.ObservableComparableSortedList;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
+import static de.kuschku.util.AndroidAssert.assertNotNull;
+
 public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
 
+    @NonNull
+    private final SparseIntArray activities = new SparseIntArray();
+    @NonNull
     private SparseIntArray lastSeenMsgs = new SparseIntArray();
+    @NonNull
     private SparseIntArray markerLines = new SparseIntArray();
-    private SparseIntArray activities = new SparseIntArray();
-    private Set<Integer> bufferIds = new HashSet<>();
 
     public BufferSyncer(@NonNull Map<Integer, Integer> lastSeenMsgs, @NonNull Map<Integer, Integer> markerLines) {
+        assertNotNull(lastSeenMsgs);
+        assertNotNull(markerLines);
+
         for (int bufferId : lastSeenMsgs.keySet()) {
             this.lastSeenMsgs.put(bufferId, lastSeenMsgs.get(bufferId));
-            this.bufferIds.add(bufferId);
         }
         for (int bufferId : markerLines.keySet()) {
             this.markerLines.put(bufferId, markerLines.get(bufferId));
-            this.bufferIds.add(bufferId);
         }
     }
 
@@ -68,6 +72,10 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
 
     @Override
     public void _setLastSeenMsg(int buffer, int msgId) {
+        assertNotNull(client);
+        QBacklogManager<? extends QBacklogManager> backlogManager = client.backlogManager();
+        assertNotNull(backlogManager);
+
         if (msgId < 0)
             return;
 
@@ -76,7 +84,7 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
             lastSeenMsgs.put(buffer, msgId);
         }
         setActivity(buffer, 0);
-        ObservableComparableSortedList<Message> filtered = client.backlogManager().filtered(buffer);
+        ObservableComparableSortedList<Message> filtered = backlogManager.filtered(buffer);
         for (Message m : filtered) {
             addActivity(m);
         }
@@ -112,9 +120,10 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
 
     @Override
     public void _removeBuffer(int buffer) {
+        assertNotNull(client);
+
         markerLines.removeAt(markerLines.indexOfKey(buffer));
         lastSeenMsgs.removeAt(lastSeenMsgs.indexOfKey(buffer));
-        bufferIds.remove(buffer);
         client.bufferManager().removeBuffer(buffer);
         _update();
     }
@@ -126,6 +135,8 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
 
     @Override
     public void _renameBuffer(int bufferId, @NonNull String newName) {
+        assertNotNull(client);
+
         client.bufferManager().renameBuffer(bufferId, newName);
         _update();
     }
@@ -147,6 +158,8 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
 
     @Override
     public void _requestMarkBufferAsRead(int buffer) {
+        assertNotNull(client);
+
         int lastMessage = client.backlogStorage().getLatest(buffer);
         if (lastMessage != -1) {
             requestSetLastSeenMsg(buffer, lastMessage);
@@ -156,6 +169,8 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
 
     @Override
     public void _markBufferAsRead(int buffer) {
+        assertNotNull(client);
+
         ObservableSortedList<Message> messages = client.backlogStorage().getUnfiltered(buffer);
         Message lastMessage = messages.last();
         if (messages.isEmpty() || lastMessage == null) {
@@ -186,22 +201,28 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> {
     }
 
     public int activity(int bufferid) {
+        assertNotNull(activities);
+
         return activities.get(bufferid, 0);
     }
 
     public void setActivity(int bufferid, int activity) {
+        assertNotNull(activities);
+
         activities.put(bufferid, activity);
     }
 
     public void addActivity(int bufferid, int activity) {
+        assertNotNull(activities);
+
         activities.put(bufferid, activities.get(bufferid) | activity);
     }
 
-    public void addActivity(int bufferid, Message.Type type) {
+    public void addActivity(int bufferid, @NonNull Message.Type type) {
         addActivity(bufferid, type.value);
     }
 
-    public void addActivity(Message message) {
+    public void addActivity(@NonNull Message message) {
         int lastSeenMsg = lastSeenMsg(message.bufferInfo.id());
         if (message.messageId > lastSeenMsg) {
             addActivity(message.bufferInfo.id(), message.type);
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java
index 8a00d256eecd9d1edd8e5f7faff7ad6b3312e1ac..5cf65c0a3c1d08939a616734d2ecb4de451208a7 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java
@@ -38,6 +38,14 @@ import de.kuschku.util.observables.lists.ObservableSet;
 import static de.kuschku.libquassel.primitives.types.BufferInfo.Type;
 
 public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
+    @NonNull
+    private final ObservableList<Integer> buffers;
+    @NonNull
+    private final ObservableSet<Integer> buffersIds;
+    @NonNull
+    private final ObservableSet<Integer> removedBuffers;
+    @NonNull
+    private final ObservableSet<Integer> temporarilyRemovedBuffers;
     private int bufferViewId;
     private String bufferViewName;
     private int networkId;
@@ -48,10 +56,6 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
     private int minimumActivity;
     private boolean hideInactiveBuffers;
     private boolean hideInactiveNetworks;
-    private ObservableList<Integer> buffers;
-    private ObservableSet<Integer> buffersIds;
-    private ObservableSet<Integer> removedBuffers;
-    private ObservableSet<Integer> temporarilyRemovedBuffers;
 
     public BufferViewConfig(String bufferViewName, @NonNull List<Integer> temporarilyRemovedBuffers, boolean hideInactiveNetworks, @NonNull List<Integer> buffers, int allowedBufferTypes, boolean sortAlphabetically, boolean disableDecoration, boolean addNewBuffersAutomatically, int networkId, int minimumActivity, boolean hideInactiveBuffers, @NonNull List<Integer> removedBuffers) {
         this.bufferViewName = bufferViewName;
@@ -199,21 +203,25 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
         // Do nothing, we’re on the client – the server will receive the sync just as expected
     }
 
+    @NonNull
     @Override
     public ObservableList<Integer> bufferList() {
         return buffers;
     }
 
+    @NonNull
     @Override
     public ObservableSet<Integer> bufferIds() {
         return buffersIds;
     }
 
+    @NonNull
     @Override
     public ObservableSet<Integer> removedBuffers() {
         return removedBuffers;
     }
 
+    @NonNull
     @Override
     public ObservableSet<Integer> temporarilyRemovedBuffers() {
         return temporarilyRemovedBuffers;
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java
index 27c067aef7582b9b45379c8557abc1706e679168..72e83eac2cec5ed8cead77f859fbfc9686939ab8 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java
@@ -33,7 +33,6 @@ import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.abstracts.AIdentity;
 import de.kuschku.libquassel.syncables.types.interfaces.QIdentity;
-import de.kuschku.util.CompatibilityUtils;
 
 public class Identity extends AIdentity<Identity> {
     private int id;
@@ -80,20 +79,12 @@ public class Identity extends AIdentity<Identity> {
         this.quitReason = quitReason;
     }
 
-    private String defaultNick() {
-        return "quassel";
-    }
-
-
-    private String defaultRealName() {
-        return "Quassel IRC User";
-    }
 
     @Override
     public void setToDefaults() {
         setIdentityName("");
-        setRealName(defaultRealName());
-        setNicks(Collections.singletonList(defaultNick()));
+        setRealName("Quassel IRC User");
+        setNicks(Collections.singletonList("quassel"));
         setAwayNick("");
         setAwayNickEnabled(false);
         setAwayReason("Gone fishing.");
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java
index cd6357971cf521c4fb479e8e0a0d22360f5e83f9..c2d02098206966572ac0a075d89ea7327ec6fea8 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java
@@ -151,10 +151,12 @@ public class IgnoreListManager extends AIgnoreListManager<IgnoreListManager> {
 
     public class IgnoreListItem {
         private final IgnoreType type;
+        @NonNull
         private final SmartRegEx ignoreRule;
         private final boolean isRegEx;
         private final StrictnessType strictness;
         private final ScopeType scope;
+        @NonNull
         private final SmartRegEx[] scopeRules;
         private boolean isActive;
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
index ecdd4368c39e30cab057be311fc1333514861110..aa1c11002ab78995a0e2499f52706a1af38e98db 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
@@ -83,7 +83,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     }
 
     @NonNull
-    public static IrcChannel create(String channelName) {
+    public static IrcChannel create(@NonNull String channelName) {
         return new IrcChannel(
                 channelName,
                 "",
@@ -95,8 +95,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     }
 
     @Override
-    public boolean isKnownUser(QIrcUser ircuser) {
-        return userModes.containsKey(ircuser);
+    public boolean isKnownUser(@Nullable QIrcUser ircuser) {
+        return ircuser != null && userModes.containsKey(ircuser.nick());
     }
 
     @Override
@@ -144,7 +144,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     }
 
     @Override
-    public String userModes(QIrcUser ircuser) {
+    public String userModes(@NonNull QIrcUser ircuser) {
         return userModes(ircuser.nick());
     }
 
@@ -283,7 +283,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     }
 
     public void _joinIrcUser(@Nullable QIrcUser ircuser, @NonNull String mode) {
-        if (ircuser == null || userModes.containsKey(ircuser)) {
+        if (ircuser == null || userModes.containsKey(ircuser.nick())) {
             _addUserMode(ircuser, mode);
         } else {
             userModes.put(ircuser.nick(), ModeUtils.toModes(mode));
@@ -319,7 +319,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     }
 
     @Override
-    public void _setUserModes(QIrcUser ircuser, String modes) {
+    public void _setUserModes(@NonNull QIrcUser ircuser, String modes) {
         if (isKnownUser(ircuser)) {
 
             userModes.put(ircuser.nick(), ModeUtils.toModes(modes));
@@ -334,7 +334,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     }
 
     @Override
-    public void _addUserMode(QIrcUser ircuser, @NonNull String mode) {
+    public void _addUserMode(@NonNull QIrcUser ircuser, @NonNull String mode) {
         if (!isKnownUser(ircuser) || !isValidChannelUserMode(mode))
             return;
 
@@ -351,12 +351,12 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     }
 
     @Override
-    public void _removeUserMode(QIrcUser ircuser, @NonNull String mode) {
+    public void _removeUserMode(@NonNull QIrcUser ircuser, @NonNull String mode) {
         if (!isKnownUser(ircuser) || !isValidChannelUserMode(mode))
             return;
 
-        if (userModes.get(ircuser).contains(ModeUtils.toMode(mode))) {
-            userModes.get(ircuser).remove(ModeUtils.toMode(mode));
+        if (userModes.get(ircuser.nick()).contains(ModeUtils.toMode(mode))) {
+            userModes.get(ircuser.nick()).remove(ModeUtils.toMode(mode));
             _update();
         }
     }
@@ -440,16 +440,16 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
         }
         if (cachedChanModes != null) {
             if (cachedChanModes.get("A") != null)
-            A_channelModes = (Map<Character, List<String>>) cachedChanModes.get("A");
+                A_channelModes = (Map<Character, List<String>>) cachedChanModes.get("A");
 
             if (cachedChanModes.get("B") != null)
-            B_channelModes = (Map<Character, String>) cachedChanModes.get("B");
+                B_channelModes = (Map<Character, String>) cachedChanModes.get("B");
 
             if (cachedChanModes.get("C") != null)
-            C_channelModes = (Map<Character, String>) cachedChanModes.get("C");
+                C_channelModes = (Map<Character, String>) cachedChanModes.get("C");
 
             if (cachedChanModes.get("D") != null)
-            D_channelModes = ModeUtils.toModes((String) cachedChanModes.get("D"));
+                D_channelModes = ModeUtils.toModes((String) cachedChanModes.get("D"));
         }
 
         cachedUserModes = null;
@@ -496,6 +496,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
         init(client.networkManager().network(Integer.parseInt(split[0])), client);
     }
 
+    @NonNull
     public ObservableSet<String> users() {
         return users;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java
index e33a0e401f0a6a07d37dddf0691f750e987192d1..8e61b521aeea17d716d257a8bf83c15033a42402 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java
@@ -52,6 +52,7 @@ public class IrcUser extends AIrcUser<IrcUser> {
     @NonNull
     private final SparseArray<DateTime> lastSpokenTo = new SparseArray<>();
     private final List<String> cachedChannels;
+    private final Set<QIrcChannel> channels = new HashSet<>();
     private String user;
     private String host;
     private String nick;
@@ -68,7 +69,6 @@ public class IrcUser extends AIrcUser<IrcUser> {
     private boolean encrypted;
     private QNetwork network;
     private Set<Character> userModes;
-    private Set<QIrcChannel> channels = new HashSet<>();
 
     public IrcUser(String server, String ircOperator, boolean away, int lastAwayMessage, DateTime idleTime, String whoisServiceReply, String suserHost, String nick, String realName, String awayMessage, DateTime loginTime, boolean encrypted, List<String> channels, String host, String userModes, String user) {
         this.server = server;
@@ -437,9 +437,9 @@ public class IrcUser extends AIrcUser<IrcUser> {
         this.client = client;
 
         if (cachedChannels != null)
-        for (String channelName : cachedChannels) {
-            channels.add(network().newIrcChannel(channelName));
-        }
+            for (String channelName : cachedChannels) {
+                channels.add(network().newIrcChannel(channelName));
+            }
         _update();
     }
 
@@ -459,6 +459,7 @@ public class IrcUser extends AIrcUser<IrcUser> {
     public void _update(IrcUser from) {
     }
 
+    @NonNull
     @Override
     public String toString() {
         return "IrcUser{" + hostmask() + '}';
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java
index ff8721d3895e0a0e38b2db7804bbdd046c378558..a26880d34ddb2575fd390984483de2e9bf44c5ee 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java
@@ -124,7 +124,7 @@ public class Network extends ANetwork<Network> implements Observer {
 
     @Override
     public boolean isMyNick(String nick) {
-        return false;
+        return IrcCaseMapper.equalsIgnoreCase(myNick, nick);
     }
 
     @Override
@@ -185,11 +185,13 @@ public class Network extends ANetwork<Network> implements Observer {
         return index == -1 ? Integer.MAX_VALUE : index;
     }
 
+    @NonNull
     @Override
     public ChannelModeType channelModeType(char mode) {
         return channelModeType(ModeUtils.fromMode(mode));
     }
 
+    @NonNull
     @Override
     public ChannelModeType channelModeType(@NonNull String mode) {
         String chanmodes = support("CHANMODES");
@@ -746,7 +748,7 @@ public class Network extends ANetwork<Network> implements Observer {
     }
 
     @Override
-    public void _addIrcChannel(IrcChannel ircChannel) {
+    public void _addIrcChannel(@NonNull IrcChannel ircChannel) {
         channels.put(ircChannel.name(), ircChannel);
     }
 
@@ -766,10 +768,10 @@ public class Network extends ANetwork<Network> implements Observer {
         networkInfo._setNetworkId(Integer.parseInt(objectName));
         client.networkManager().createNetwork(this);
         for (QIrcChannel channel : channels.values()) {
-            ((IrcChannel) channel).init(networkId()+"/"+channel.name(), provider, client);
+            ((IrcChannel) channel).init(networkId() + "/" + channel.name(), provider, client);
         }
         for (QIrcUser user : nicks.values()) {
-            ((IrcUser) user).init(networkId()+"/"+user.nick(), provider, client);
+            ((IrcUser) user).init(networkId() + "/" + user.nick(), provider, client);
         }
     }
 
@@ -782,6 +784,7 @@ public class Network extends ANetwork<Network> implements Observer {
         return networkInfo.serverList();
     }
 
+    @NonNull
     @Override
     public String toString() {
         return "Network{" +
@@ -791,7 +794,7 @@ public class Network extends ANetwork<Network> implements Observer {
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@Nullable Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java
index 9d07c7d8ae667b17f22b2bfd1e1a2dd14f26c62e..93c2d49b2d88e146dca1039126bb2d13acbd1072 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java
@@ -22,6 +22,7 @@
 package de.kuschku.libquassel.syncables.types.impl;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import java.util.Collections;
 import java.util.List;
@@ -291,40 +292,33 @@ public class NetworkInfo extends Observable {
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@Nullable Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
 
         NetworkInfo that = (NetworkInfo) o;
 
-        if (networkId != that.networkId) return false;
-        if (identity != that.identity) return false;
-        if (useRandomServer != that.useRandomServer) return false;
-        if (useAutoIdentify != that.useAutoIdentify) return false;
-        if (useSasl != that.useSasl) return false;
-        if (useAutoReconnect != that.useAutoReconnect) return false;
-        if (autoReconnectInterval != that.autoReconnectInterval) return false;
-        if (autoReconnectRetries != that.autoReconnectRetries) return false;
-        if (unlimitedReconnectRetries != that.unlimitedReconnectRetries) return false;
-        if (rejoinChannels != that.rejoinChannels) return false;
-        if (networkName != null ? !networkName.equals(that.networkName) : that.networkName != null)
-            return false;
-        if (codecForServer != null ? !codecForServer.equals(that.codecForServer) : that.codecForServer != null)
-            return false;
-        if (codecForEncoding != null ? !codecForEncoding.equals(that.codecForEncoding) : that.codecForEncoding != null)
-            return false;
-        if (codecForDecoding != null ? !codecForDecoding.equals(that.codecForDecoding) : that.codecForDecoding != null)
-            return false;
-        if (serverList != null ? !serverList.equals(that.serverList) : that.serverList != null)
-            return false;
-        if (perform != null ? !perform.equals(that.perform) : that.perform != null) return false;
-        if (autoIdentifyService != null ? !autoIdentifyService.equals(that.autoIdentifyService) : that.autoIdentifyService != null)
-            return false;
-        if (autoIdentifyPassword != null ? !autoIdentifyPassword.equals(that.autoIdentifyPassword) : that.autoIdentifyPassword != null)
-            return false;
-        if (saslAccount != null ? !saslAccount.equals(that.saslAccount) : that.saslAccount != null)
-            return false;
-        return saslPassword != null ? saslPassword.equals(that.saslPassword) : that.saslPassword == null;
+        return (networkId == that.networkId &&
+                identity == that.identity &&
+                useRandomServer == that.useRandomServer &&
+                useAutoIdentify == that.useAutoIdentify &&
+                useSasl == that.useSasl &&
+                useAutoReconnect == that.useAutoReconnect &&
+                autoReconnectInterval == that.autoReconnectInterval &&
+                autoReconnectRetries == that.autoReconnectRetries &&
+                unlimitedReconnectRetries == that.unlimitedReconnectRetries &&
+                rejoinChannels == that.rejoinChannels &&
+                (networkName != null ? networkName.equals(that.networkName) : that.networkName == null) &&
+                (codecForServer != null ? codecForServer.equals(that.codecForServer) : that.codecForServer == null) &&
+                (codecForEncoding != null ? codecForEncoding.equals(that.codecForEncoding) : that.codecForEncoding == null) &&
+                (codecForDecoding != null ? codecForDecoding.equals(that.codecForDecoding) : that.codecForDecoding == null) &&
+                (serverList != null ? serverList.equals(that.serverList) : that.serverList == null) &&
+                (perform != null ? perform.equals(that.perform) : that.perform == null) &&
+                (autoIdentifyService != null ? autoIdentifyService.equals(that.autoIdentifyService) : that.autoIdentifyService == null) &&
+                (autoIdentifyPassword != null ? autoIdentifyPassword.equals(that.autoIdentifyPassword) : that.autoIdentifyPassword == null) &&
+                (saslAccount != null ? saslAccount.equals(that.saslAccount) : that.saslAccount == null) &&
+                (saslPassword != null ? saslPassword.equals(that.saslPassword) : that.saslPassword == null)
+        );
 
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java
index 7c435b84b25e59490b1b6f564783580ff8419595..d4d4f4864279634467cc6db46fb143b33f5cb208 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java
@@ -23,7 +23,6 @@ package de.kuschku.libquassel.syncables.types.interfaces;
 
 import android.support.annotation.NonNull;
 
-import java.util.BitSet;
 import java.util.List;
 import java.util.Set;
 
@@ -72,5 +71,6 @@ public interface QBacklogManager<T extends QSyncableObject<T>> extends QSyncable
 
     int waitingMax();
 
+    @NonNull
     Set<Integer> waiting();
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java
index 5ebe0c0e077383c485c904833e336e54d48d0a7a..640099fc099ad398228a6e747e13c8ebfcd407f3 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java
@@ -21,6 +21,8 @@
 
 package de.kuschku.libquassel.syncables.types.interfaces;
 
+import android.support.annotation.NonNull;
+
 import de.kuschku.libquassel.syncables.Synced;
 import de.kuschku.util.observables.lists.ObservableList;
 import de.kuschku.util.observables.lists.ObservableSet;
@@ -97,12 +99,16 @@ public interface QBufferViewConfig extends QObservable {
 
     void _requestSetBufferViewName(final String bufferViewName);
 
+    @NonNull
     ObservableList<Integer> bufferList();
 
+    @NonNull
     ObservableSet<Integer> bufferIds();
 
+    @NonNull
     ObservableSet<Integer> removedBuffers();
 
+    @NonNull
     ObservableSet<Integer> temporarilyRemovedBuffers();
 
     @Synced
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java
index ba586d878fb5d7436ffc532e4ec9d6f8fc0f8eca..66db4de0df5d8373df8175eb35c0e876b34ee37e 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java
@@ -22,6 +22,7 @@
 package de.kuschku.libquassel.syncables.types.interfaces;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import java.util.List;
 
@@ -148,8 +149,10 @@ public interface QIrcChannel extends QObservable {
 
     void init(QNetwork network, Client client);
 
+    @Nullable
     String getObjectName();
 
+    @NonNull
     ObservableSet<String> users();
 
     void _ircUserNickChanged(String oldNick, String newNick);
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java
index 2db4fa03f7ff09dbe594aa8c8baba6f874a4da60..7152d307ae1fba4769f0fb0ac4d227748a68bf18 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java
@@ -22,6 +22,7 @@
 package de.kuschku.libquassel.syncables.types.interfaces;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import org.joda.time.DateTime;
 
@@ -205,5 +206,6 @@ public interface QIrcUser extends QObservable {
 
     void init(QNetwork network, Client client);
 
+    @Nullable
     String getObjectName();
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java
index 94093c47a627d465a4f12ba9c7cc4e0d8edca11f..c7f42451de13d909911ac209fdcddac6afd1a0b8 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java
@@ -57,8 +57,10 @@ public interface QNetwork extends QObservable {
 
     int modeToIndex(String mode);
 
+    @NonNull
     ChannelModeType channelModeType(final char mode);
 
+    @NonNull
     ChannelModeType channelModeType(final String mode);
 
     String networkName();
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 9a5a1e24e72912eaf685bf98c4b0da0c48d24e30..e5a1e21438ab733f5d547e050c8cfa7ea03ee240 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
@@ -75,6 +75,7 @@ import aspm.annotations.StringPreference;
 import butterknife.Bind;
 import butterknife.ButterKnife;
 import de.kuschku.libquassel.BusProvider;
+import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.events.BacklogInitEvent;
 import de.kuschku.libquassel.events.BacklogReceivedEvent;
 import de.kuschku.libquassel.events.ConnectionChangeEvent;
@@ -87,11 +88,10 @@ import de.kuschku.libquassel.localtypes.BacklogFilter;
 import de.kuschku.libquassel.localtypes.buffers.Buffer;
 import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer;
 import de.kuschku.libquassel.message.Message;
+import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
-import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
-import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 import de.kuschku.quasseldroid_ng.BuildConfig;
 import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread;
@@ -152,29 +152,32 @@ public class ChatActivity extends AppCompatActivity {
     private Drawer drawerLeft;
     private Drawer drawerRight;
     private AdvancedEditor editor;
-    private BufferViewConfigItem wrapper;
-    private NickListWrapper nicklistwrapper;
     @Nullable
     private QuasselService.LocalBinder binder;
     @Nullable
     private final ServiceConnection serviceConnection = new ServiceConnection() {
         @UiThread
-        public void onServiceConnected(@NonNull ComponentName cn, @NonNull IBinder service) {
+        public void onServiceConnected(ComponentName cn, IBinder service) {
+            assertNotNull(cn);
+            assertNotNull(service);
+
             if (service instanceof QuasselService.LocalBinder) {
                 ChatActivity.this.binder = (QuasselService.LocalBinder) service;
-                if (binder.getBackgroundThread() != null) {
+                if (binder != null && binder.getBackgroundThread() != null) {
                     ClientBackgroundThread backgroundThread = binder.getBackgroundThread();
                     assertNotNull(backgroundThread);
 
                     serviceInterface.disconnect();
 
-                    context.setProvider(backgroundThread.client().provider);
-                    context.setClient(backgroundThread.client().client);
-                    context.provider().event.register(ChatActivity.this);
+                    BusProvider provider = backgroundThread.client().provider;
+                    Client client = backgroundThread.client().client;
+                    context.setProvider(provider);
+                    context.setClient(client);
+                    provider.event.register(ChatActivity.this);
 
 
                     updateSubTitle();
-                    if (context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) {
+                    if (client.connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) {
                         updateBufferViewConfigs();
                     }
                 }
@@ -182,22 +185,34 @@ public class ChatActivity extends AppCompatActivity {
         }
 
         @UiThread
-        public void onServiceDisconnected(@NonNull ComponentName cn) {
+        public void onServiceDisconnected(ComponentName cn) {
+            assertNotNull(cn);
+
             serviceInterface.disconnect();
             binder = null;
         }
     };
 
-    private static void updateNoColor(Buffer buffer, @NonNull Menu menu) {
+    private static void updateNoColor(@Nullable 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);
-        menu.findItem(R.id.format_underline).setEnabled(!isNoColor);
-        menu.findItem(R.id.format_paint).setEnabled(!isNoColor);
-        menu.findItem(R.id.format_fill).setEnabled(!isNoColor);
-    }
-
-    public static boolean isNoColor(Buffer buffer) {
+        MenuItem item_bold = menu.findItem(R.id.format_bold);
+        if (item_bold != null)
+            item_bold.setEnabled(!isNoColor);
+        MenuItem item_italic = menu.findItem(R.id.format_italic);
+        if (item_italic != null)
+            item_italic.setEnabled(!isNoColor);
+        MenuItem item_underline = menu.findItem(R.id.format_underline);
+        if (item_underline != null)
+            item_underline.setEnabled(!isNoColor);
+        MenuItem item_paint = menu.findItem(R.id.format_paint);
+        if (item_paint != null)
+            item_paint.setEnabled(!isNoColor);
+        MenuItem item_fill = menu.findItem(R.id.format_fill);
+        if (item_fill != null)
+            item_fill.setEnabled(!isNoColor);
+    }
+
+    public static boolean isNoColor(@Nullable Buffer buffer) {
         if (buffer == null)
             return false;
         if (!(buffer instanceof ChannelBuffer))
@@ -207,10 +222,12 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     private void updateSubTitle() {
-        if (context.client() != null) {
-            if (context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) {
-                if (status.bufferId > 0) {
-                    Buffer buffer = context.client().bufferManager().buffer(status.bufferId);
+        Client client = context.client();
+        if (client != null) {
+            ConnectionChangeEvent.Status status = client.connectionStatus();
+            if (status == ConnectionChangeEvent.Status.CONNECTED) {
+                if (this.status.bufferId > 0) {
+                    Buffer buffer = client.bufferManager().buffer(this.status.bufferId);
                     if (buffer != null && buffer instanceof ChannelBuffer) {
                         QIrcChannel channel = ((ChannelBuffer) buffer).getChannel();
                         if (channel != null) {
@@ -219,8 +236,8 @@ public class ChatActivity extends AppCompatActivity {
                         }
                     }
                 }
-            } else {
-                updateSubTitle(context.client().connectionStatus().name());
+            } else if (status != null) {
+                updateSubTitle(status.name());
                 return;
             }
         }
@@ -313,8 +330,11 @@ public class ChatActivity extends AppCompatActivity {
         return super.onCreateOptionsMenu(menu);
     }
 
+    // FIXME: REWRITE
     @Override
     public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+        assertNotNull(item);
+
         List<Integer> filterSettings = Arrays.asList(
                 Message.Type.Join.value,
                 Message.Type.Part.value,
@@ -374,13 +394,16 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     private void setupContext() {
-        context.setSettings(new WrappedSettings(this));
-        AppTheme theme = AppTheme.themeFromString(context.settings().theme.get());
+        WrappedSettings settings = new WrappedSettings(this);
+        context.setSettings(settings);
+        AppTheme theme = AppTheme.themeFromString(settings.theme.get());
         setTheme(theme.themeId);
         context.setThemeUtil(new ThemeUtil(this, theme));
     }
 
     private void setupEditorLayout() {
+        assertNotNull(slidingLayout);
+
         slidingLayout.setAntiDragView(R.id.card_panel);
         slidingLayout.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() {
             @Override
@@ -412,15 +435,26 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     private void initLoader() {
+        assertNotNull(swipeView);
+        ThemeUtil themeUtil = context.themeUtil();
+        assertNotNull(themeUtil);
+
+        Client client = context.client();
+        assertNotNull(client);
+        QBacklogManager<? extends QBacklogManager> backlogManager = client.backlogManager();
+
+
         swipeView.setEnabled(false);
-        swipeView.setColorSchemeColors(context.themeUtil().res.colorPrimary);
+        swipeView.setColorSchemeColors(themeUtil.res.colorPrimary);
         swipeView.setOnRefreshListener(() -> {
-            assertNotNull(context.client());
-            context.client().backlogManager().requestMoreBacklog(status.bufferId, 20);
+            assertNotNull(backlogManager);
+            backlogManager.requestMoreBacklog(status.bufferId, 20);
         });
     }
 
     private void setupHistory() {
+        assertNotNull(msgHistory);
+
         FastAdapter<IItem> fastAdapter = new FastAdapter<>();
         ItemAdapter<IItem> itemAdapter = new ItemAdapter<>();
         itemAdapter.wrap(fastAdapter);
@@ -448,6 +482,8 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     private void setupContent() {
+        assertNotNull(messages);
+
         messages.setItemAnimator(new DefaultItemAnimator());
         messages.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true));
         messageAdapter = new MessageAdapter(this, context, new AutoScroller(messages));
@@ -455,6 +491,14 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     private void setupEditor() {
+        assertNotNull(formattingMenu);
+        assertNotNull(editor);
+        assertNotNull(slidingLayoutHistory);
+        assertNotNull(send);
+        assertNotNull(chatline);
+        Client client = context.client();
+        assertNotNull(client);
+
         getMenuInflater().inflate(R.menu.formatting, formattingMenu.getMenu());
         formattingMenu.setOnMenuItemClickListener(item -> {
             switch (item.getItemId()) {
@@ -470,22 +514,6 @@ public class ChatActivity extends AppCompatActivity {
                 case R.id.action_history:
                     slidingLayoutHistory.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
                     return true;
-                case R.id.debug_init_channels: {
-                    for (QNetwork network : context.client().networkManager().networks()) {
-                        for (QIrcChannel name : network.ircChannels()) {
-                            context.client().requestInitObject("IrcChannel", network.networkId() + "/" + name.name());
-                        }
-                    }
-                    return true;
-                }
-                case R.id.debug_init_users: {
-                    for (QNetwork network : context.client().networkManager().networks()) {
-                        for (QIrcUser name : network.ircUsers()) {
-                            context.client().requestInitObject("IrcUser", network.networkId() + "/" + name.nick());
-                        }
-                    }
-                    return true;
-                }
                 default:
                     return false;
             }
@@ -504,6 +532,8 @@ public class ChatActivity extends AppCompatActivity {
                 .withSavedInstance(savedInstanceState)
                 .withTranslucentStatusBar(true)
                 .build();
+        assertNotNull(drawerLeft);
+        assertNotNull(drawerLeft.getAdapter());
         drawerLeft.addStickyFooterItem(new PrimaryDrawerItem().withIcon(R.drawable.ic_server_light).withName("(Re-)Connect").withIdentifier(-1));
         drawerLeft.addStickyFooterItem(new SecondaryDrawerItem().withName("Settings").withIdentifier(-2));
         drawerLeft.setOnDrawerItemClickListener((view, position, drawerItem) -> {
@@ -528,7 +558,7 @@ public class ChatActivity extends AppCompatActivity {
         drawerRight = new DrawerBuilder()
                 .withActivity(this)
                 .withSavedInstance(savedInstanceState)
-                .withDrawerGravity(Gravity.RIGHT)
+                .withDrawerGravity(Gravity.END)
                 .build();
     }
 
@@ -547,19 +577,25 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     public void setChatlineExpanded(boolean expanded) {
+        assertNotNull(chatline);
+        assertNotNull(chatline.getLayoutParams());
+        ThemeUtil themeUtil = context.themeUtil();
+        assertNotNull(themeUtil);
+
         int selectionStart = chatline.getSelectionStart();
         int selectionEnd = chatline.getSelectionEnd();
 
         if (expanded) {
             chatline.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
         } else {
-            chatline.getLayoutParams().height = context.themeUtil().res.actionBarSize;
+            chatline.getLayoutParams().height = themeUtil.res.actionBarSize;
         }
         chatline.setSingleLine(!expanded);
 
         chatline.setSelection(selectionStart, selectionEnd);
     }
 
+    // FIXME: Rewrite properly
     public void showThemeDialog() {
         String[] strings = new String[AppTheme.values().length];
         int startIndex = -1;
@@ -584,6 +620,11 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     private void selectBufferViewConfig(@IntRange(from = -1) int bufferViewConfigId) {
+        assertNotNull(drawerLeft);
+        assertNotNull(accountHeader);
+        Client client = context.client();
+        assertNotNull(client);
+
         status.bufferViewConfigId = bufferViewConfigId;
         accountHeader.setActiveProfile(bufferViewConfigId, false);
 
@@ -591,12 +632,12 @@ public class ChatActivity extends AppCompatActivity {
             drawerLeft.removeAllItems();
         } else {
             drawerLeft.removeAllItems();
-            QBufferViewManager bufferViewManager = context.client().bufferViewManager();
+            QBufferViewManager bufferViewManager = client.bufferViewManager();
             assertNotNull(bufferViewManager);
             QBufferViewConfig viewConfig = bufferViewManager.bufferViewConfig(bufferViewConfigId);
             assertNotNull(viewConfig);
 
-            wrapper = new BufferViewConfigItem(drawerLeft, viewConfig, context);
+            new BufferViewConfigItem(drawerLeft, viewConfig, context);
         }
     }
 
@@ -626,7 +667,7 @@ public class ChatActivity extends AppCompatActivity {
             updateNoColor(buffer, formattingMenu.getMenu());
 
             if (buffer instanceof ChannelBuffer && ((ChannelBuffer) buffer).getChannel() != null) {
-                nicklistwrapper = new NickListWrapper(drawerRight, ((ChannelBuffer) buffer).getChannel());
+                NickListWrapper nicklistwrapper = new NickListWrapper(drawerRight, ((ChannelBuffer) buffer).getChannel());
             } else {
                 drawerRight.removeAllItems();
             }
@@ -675,8 +716,6 @@ public class ChatActivity extends AppCompatActivity {
         updateSubTitle();
 
         switch (event.status) {
-            case HANDSHAKE:
-                break;
             case CONNECTED:
                 updateBufferViewConfigs();
                 break;
@@ -791,6 +830,8 @@ public class ChatActivity extends AppCompatActivity {
     }
 
     public void onEventMainThread(@NonNull GeneralErrorEvent event) {
+        assertNotNull(messages);
+
         Snackbar.make(messages, event.toString(), Snackbar.LENGTH_LONG).show();
         for (String line : Splitter.fixedLength(2048).split(event.toString())) {
             Log.e("ChatActivity", line);
@@ -803,8 +844,10 @@ public class ChatActivity extends AppCompatActivity {
         updateSubTitle();
     }
 
-    private void updateSubTitle(CharSequence text) {
-        if (context.client() != null) {
+    private void updateSubTitle(@Nullable CharSequence text) {
+        assertNotNull(toolbar);
+
+        if (text != null) {
             toolbar.setSubtitle(text);
         } else {
             toolbar.setSubtitle("");
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListWrapper.java
index 05a7953832e017c0d7ad0d42c5f6416449ef8ce3..d55c3a6b6aea40ab99efa8733ea6b0e38029db0d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListWrapper.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListWrapper.java
@@ -21,6 +21,8 @@
 
 package de.kuschku.quasseldroid_ng.ui.chat;
 
+import android.support.annotation.NonNull;
+
 import com.mikepenz.materialdrawer.Drawer;
 import com.mikepenz.materialdrawer.holder.BadgeStyle;
 import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
@@ -30,16 +32,16 @@ import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
 import de.kuschku.util.backports.Objects;
 import de.kuschku.util.irc.IrcCaseMapper;
-import de.kuschku.util.irc.IrcUserUtils;
 import de.kuschku.util.observables.callbacks.ElementCallback;
 import de.kuschku.util.observables.callbacks.UICallback;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
 public class NickListWrapper {
+    @NonNull
     private final QIrcChannel channel;
-    private ObservableSortedList<QIrcUser> list = new ObservableSortedList<>(QIrcUser.class, new ObservableSortedList.ItemComparator<QIrcUser>() {
+    private final ObservableSortedList<QIrcUser> list = new ObservableSortedList<>(QIrcUser.class, new ObservableSortedList.ItemComparator<QIrcUser>() {
         @Override
-        public int compare(QIrcUser o1, QIrcUser o2) {
+        public int compare(@NonNull QIrcUser o1, @NonNull QIrcUser o2) {
             int indexa = channel.network().modeToIndex(channel.userModes(o1));
             int indexb = channel.network().modeToIndex(channel.userModes(o2));
             if (indexa == indexb) {
@@ -55,12 +57,12 @@ public class NickListWrapper {
         }
 
         @Override
-        public boolean areItemsTheSame(QIrcUser item1, QIrcUser item2) {
+        public boolean areItemsTheSame(@NonNull QIrcUser item1, @NonNull QIrcUser item2) {
             return Objects.equals(item1.hostmask(), item2.hostmask());
         }
     });
 
-    public NickListWrapper(Drawer drawerRight, QIrcChannel channel) {
+    public NickListWrapper(@NonNull Drawer drawerRight, @NonNull QIrcChannel channel) {
         drawerRight.removeAllItems();
         this.channel = channel;
         for (String nick : channel.users()) {
@@ -141,7 +143,7 @@ public class NickListWrapper {
         }
     }
 
-    private IDrawerItem fromUser(QIrcUser user) {
+    private IDrawerItem fromUser(@NonNull QIrcUser user) {
         return new PrimaryDrawerItem()
                 .withName(user.nick())
                 .withBadge(channel.network().modeToPrefix(channel.userModes(user)))
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 6fa5b285f444f45c2620bff4540999ca85c65500..c466e13cfc23ea163729051240c4d976bf82c054 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
@@ -47,6 +47,7 @@ public class BufferItem extends SecondaryDrawerItem {
     private final Buffer buffer;
     @NonNull
     private final AppContext context;
+
     public BufferItem(@NonNull Buffer buffer, @NonNull AppContext context) {
         this.buffer = buffer;
         this.context = context;
@@ -120,10 +121,11 @@ public class BufferItem extends SecondaryDrawerItem {
         return ColorHolder.fromColor(context.themeUtil().res.colorForegroundSecondary);
     }
 
+    @NonNull
     @Override
     public ColorHolder getTextColor() {
         int type = context.client().bufferSyncer().activity(buffer.getInfo().id());
-        if ((type & Message.Type.Plain.value) != 0  || (type & Message.Type.Notice.value) != 0)
+        if ((type & Message.Type.Plain.value) != 0 || (type & Message.Type.Notice.value) != 0)
             return ColorHolder.fromColor(context.themeUtil().res.colorTintMessage);
         else if ((type & ~Message.Type.DayChange.value) != 0)
             return ColorHolder.fromColor(context.themeUtil().res.colorTintActivity);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItemManager.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItemManager.java
index de6fb515ec803442cfc2d131aef823713fe6dc9e..b4e59756904ba99e1e7674508d954bef6fd6c4e1 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItemManager.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItemManager.java
@@ -22,6 +22,7 @@
 package de.kuschku.quasseldroid_ng.ui.chat.drawer;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -35,10 +36,11 @@ public class BufferItemManager implements ElementCallback<Integer>, IObservable<
 
     private final MultiElementCallbackWrapper<BufferItem> callback = MultiElementCallbackWrapper.<BufferItem>of();
 
+    @Nullable
     private final AppContext context;
     private final Map<Integer, BufferItem> items = new HashMap<>();
 
-    public BufferItemManager(AppContext context) {
+    public BufferItemManager(@Nullable AppContext context) {
         this.context = context;
         context.client().bufferManager().bufferIds().addCallback(this);
         for (Integer id : context.client().bufferManager().bufferIds()) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java
index 9f121e05472a3640ad2f0453c730cf74727d0767..f23eb526e2a86f44244df255c38b6040444d5baf 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java
@@ -21,12 +21,16 @@
 
 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;
 
 import java.util.HashSet;
 import java.util.Set;
 
+import de.kuschku.libquassel.client.Client;
+import de.kuschku.libquassel.client.NetworkManager;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
@@ -34,27 +38,40 @@ import de.kuschku.util.observables.callbacks.DrawerItemCallback;
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.observables.lists.ObservableComparableSortedList;
 
+import static de.kuschku.util.AndroidAssert.assertNotNull;
+
 public class BufferViewConfigItem implements DrawerItemCallback {
+    @NonNull
     private final BufferItemManager manager;
+    @NonNull
     private final ObservableComparableSortedList<NetworkItem> networks = new ObservableComparableSortedList<>(NetworkItem.class);
+    @NonNull
     private final Drawer drawer;
+    @NonNull
     private final QBufferViewConfig config;
+    @NonNull
     private final AppContext context;
 
-    public BufferViewConfigItem(Drawer drawer, QBufferViewConfig config, AppContext context) {
+    public BufferViewConfigItem(@NonNull Drawer drawer, @NonNull QBufferViewConfig config, @NonNull AppContext context) {
         this.drawer = drawer;
         this.config = config;
         this.context = context;
         manager = new BufferItemManager(context);
         config.addObserver(this::rebuildNetworkList);
+        assertNotNull(drawer.getItemAdapter());
         networks.addCallback(new AdapterUICallbackWrapper(drawer.getItemAdapter()));
         rebuildNetworkList();
     }
 
     private void rebuildNetworkList() {
+        Client client = context.client();
+        assertNotNull(client);
+        NetworkManager networkManager = client.networkManager();
+        assertNotNull(networkManager);
+
         // First we build a list of all network ids we want to display
         Set<Integer> ids = new HashSet<>();
-        for (QNetwork network : context.client().networkManager().networks()) {
+        for (QNetwork network : networkManager.networks()) {
             if (config.networkId() <= 0 || network.networkId() == config.networkId()) {
                 ids.add(network.networkId());
             }
@@ -62,7 +79,7 @@ public class BufferViewConfigItem implements DrawerItemCallback {
         // Now we build a list of all items to remove
         Set<NetworkItem> removed = new HashSet<>();
         for (NetworkItem item : networks) {
-            if (ids.contains(item.getNetwork().networkId())) {
+            if (item.getNetwork() != null && ids.contains(item.getNetwork().networkId())) {
                 // And make sure that ids only contains those networks added
                 ids.remove(item.getNetwork().networkId());
             } else {
@@ -78,9 +95,12 @@ public class BufferViewConfigItem implements DrawerItemCallback {
             drawer.removeItem(item.getIdentifier());
         }
         for (int id : ids) {
-            NetworkItem item = new NetworkItem(config, context.client(), manager, context.client().networkManager().network(id));
-            networks.add(item);
-            item.addCallback(this);
+            QNetwork network = networkManager.network(id);
+            if (network != null) {
+                NetworkItem item = new NetworkItem(config, client, manager, network);
+                networks.add(item);
+                item.addCallback(this);
+            }
         }
         for (NetworkItem item : networks) {
             if (ids.contains(item.getNetwork().networkId())) {
@@ -98,7 +118,7 @@ public class BufferViewConfigItem implements DrawerItemCallback {
     }
 
     @Override
-    public void notifyChanged(IDrawerItem item) {
+    public void notifyChanged(@NonNull IDrawerItem item) {
         int position = drawer.getAdapter().getPosition(item);
         if (position != -1) {
             drawer.getAdapter().notifyAdapterItemChanged(position);
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 b4ea95b7f65c7a37f0d1aa333f2f9db8b065cdc4..a0b65a947de23b67180d49112e62b7e11c519220 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
@@ -40,13 +40,17 @@ import de.kuschku.util.observables.callbacks.ElementCallback;
 import de.kuschku.util.observables.callbacks.wrappers.MultiDrawerItemCallback;
 
 public class NetworkItem extends PrimaryDrawerItem implements IObservable<DrawerItemCallback>, ContentComparable<NetworkItem> {
+    @NonNull
     private final QBufferViewConfig config;
+    @NonNull
     private final Client client;
+    @NonNull
     private final BufferItemManager manager;
+    @NonNull
     private final QNetwork network;
     private final MultiDrawerItemCallback callback = MultiDrawerItemCallback.of();
 
-    public NetworkItem(QBufferViewConfig config, Client client, BufferItemManager manager, QNetwork network) {
+    public NetworkItem(@NonNull QBufferViewConfig config, @NonNull Client client, @NonNull BufferItemManager manager, @NonNull QNetwork network) {
         this.config = config;
         this.client = client;
         this.manager = manager;
@@ -71,6 +75,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Drawer
         client.bufferManager().byNetwork(network.networkId()).addCallback(elemCallback);
     }
 
+    @NonNull
     @Override
     public List<IDrawerItem> getSubItems() {
         List<IDrawerItem> bufferItems = new ArrayList<>();
@@ -82,6 +87,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Drawer
         return bufferItems;
     }
 
+    @NonNull
     @Override
     public StringHolder getName() {
         return new StringHolder(network.networkName());
@@ -98,7 +104,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Drawer
     }
 
     @Override
-    public boolean areItemsTheSame(NetworkItem other) {
+    public boolean areItemsTheSame(@NonNull NetworkItem other) {
         return network.networkId() == other.network.networkId();
     }
 
@@ -112,6 +118,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Drawer
         return network.networkName().compareToIgnoreCase(another.network.networkName());
     }
 
+    @NonNull
     public QNetwork getNetwork() {
         return network;
     }
diff --git a/app/src/main/java/de/kuschku/util/CompatibilityUtils.java b/app/src/main/java/de/kuschku/util/CompatibilityUtils.java
index 5ec83b0e7d001bd94ddbdce17b1e6f1d6c5c9f34..f5eacb925b29ef50479700f09c354238064b947a 100644
--- a/app/src/main/java/de/kuschku/util/CompatibilityUtils.java
+++ b/app/src/main/java/de/kuschku/util/CompatibilityUtils.java
@@ -21,22 +21,15 @@
 
 package de.kuschku.util;
 
-import android.accounts.Account;
-import android.accounts.AccountManager;
 import android.os.Build;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.util.Log;
-import android.util.Patterns;
 
 import java.io.OutputStream;
 import java.lang.reflect.Field;
-import java.util.regex.Pattern;
 import java.util.zip.Deflater;
 import java.util.zip.DeflaterOutputStream;
 
-import de.kuschku.quasseldroid_ng.QuasselDroidNG;
-
 public class CompatibilityUtils {
     private CompatibilityUtils() {
     }
@@ -96,13 +89,15 @@ public class CompatibilityUtils {
 
     /**
      * Because Android’s String::split is broken
+     *
      * @param str The string to be broken into chars
      * @return A list with all substrings of length 1 of the first string, in order
      */
-    public static String[] partStringByChar(String str) {
+    @NonNull
+    public static String[] partStringByChar(@NonNull String str) {
         String[] chars = new String[str.length()];
         for (int i = 0; i < chars.length; i++) {
-            chars[i] = str.substring(i, i+1);
+            chars[i] = str.substring(i, i + 1);
         }
         return chars;
     }
diff --git a/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java b/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java
index 4a98bc160023215136353091a07065dbace99a02..a692f8ccbfae3a9250968f74e347f664c797f590 100644
--- a/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java
+++ b/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java
@@ -22,6 +22,7 @@
 package de.kuschku.util.irc;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import java.util.Locale;
 
@@ -44,7 +45,10 @@ public class IrcCaseMapper {
                 .replaceAll("~", "^");
     }
 
-    public static boolean equalsIgnoreCase(@NonNull String a, @NonNull String b) {
-        return toLowerCase(a).equals(toLowerCase(b)) || toUpperCase(a).equals(toUpperCase(b));
+    public static boolean equalsIgnoreCase(@Nullable String a, @Nullable String b) {
+        if (a == null || b == null)
+            return (a == b);
+        else
+            return toLowerCase(a).equals(toLowerCase(b)) || toUpperCase(a).equals(toUpperCase(b));
     }
 }
diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java b/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java
index b4b7086acb25f4aaf725d78bcd3e16d8e01fc824..a42b820cdb838a6733afe98d6eccb23adfd5aed2 100644
--- a/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java
+++ b/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java
@@ -27,7 +27,7 @@ import java.util.Set;
 import de.kuschku.libquassel.syncables.types.interfaces.QObservable;
 
 public class GeneralObservable implements QObservable, GeneralCallback {
-    Set<GeneralCallback> callbackSet = new HashSet<>();
+    final Set<GeneralCallback> callbackSet = new HashSet<>();
 
     @Override
     public void addObserver(GeneralCallback o) {
diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java
index 5c47b2bc38a3a29b7d4a5f2813c458398c78e2ee..83b3b49d50f09ffdd3abe5341987088d7431865c 100644
--- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java
+++ b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java
@@ -37,10 +37,11 @@ public class MultiDrawerItemCallback implements DrawerItemCallback, IObservable<
     @NonNull
     final Set<DrawerItemCallback> callbacks;
 
-    private MultiDrawerItemCallback(List<DrawerItemCallback> multiGeneralCallbacks) {
+    private MultiDrawerItemCallback(@NonNull List<DrawerItemCallback> multiGeneralCallbacks) {
         this.callbacks = new HashSet<>(multiGeneralCallbacks);
     }
 
+    @NonNull
     public static MultiDrawerItemCallback of(DrawerItemCallback... callbacks) {
         return new MultiDrawerItemCallback(Arrays.asList(callbacks));
     }
diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java
index 3cc9c051ade18eaf20329c6444831a4caf2d7529..2d49b099f6fe8c8f015ef77ced027a1c5ad4aa04 100644
--- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java
+++ b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java
@@ -22,6 +22,7 @@
 package de.kuschku.util.observables.callbacks.wrappers;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.UiThread;
 
 import java.util.Arrays;
@@ -42,7 +43,7 @@ public class MultiElementCallbackWrapper<T> implements ElementCallback<T> {
 
     @SafeVarargs
     @NonNull
-    public static <T> MultiElementCallbackWrapper of(@NonNull ElementCallback<T>... callbacks) {
+    public static <T> MultiElementCallbackWrapper<T> of(@NonNull ElementCallback<T>... callbacks) {
         return new MultiElementCallbackWrapper<>(Arrays.asList(callbacks));
     }
 
@@ -55,21 +56,21 @@ public class MultiElementCallbackWrapper<T> implements ElementCallback<T> {
     }
 
     @Override
-    public void notifyItemInserted(T element) {
+    public void notifyItemInserted(@Nullable T element) {
         for (ElementCallback<T> callback : callbacks) {
             callback.notifyItemInserted(element);
         }
     }
 
     @Override
-    public void notifyItemRemoved(T element) {
+    public void notifyItemRemoved(@Nullable T element) {
         for (ElementCallback<T> callback : callbacks) {
             callback.notifyItemInserted(element);
         }
     }
 
     @Override
-    public void notifyItemChanged(T element) {
+    public void notifyItemChanged(@Nullable T element) {
         for (ElementCallback<T> callback : callbacks) {
             callback.notifyItemInserted(element);
         }
diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java
index 1519d2956b6b35c5b774f6e3918f116bc442b3a9..f56ab5a7c2bbd93cecde1afd3ceaddb7212a22a3 100644
--- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java
+++ b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java
@@ -35,10 +35,11 @@ public class MultiGeneralCallback implements IObservable<GeneralCallback>, Gener
     @NonNull
     final Set<GeneralCallback> callbacks;
 
-    private MultiGeneralCallback(List<MultiGeneralCallback> multiGeneralCallbacks) {
+    private MultiGeneralCallback(@NonNull List<MultiGeneralCallback> multiGeneralCallbacks) {
         this.callbacks = new HashSet<>(multiGeneralCallbacks);
     }
 
+    @NonNull
     public static MultiGeneralCallback of(MultiGeneralCallback... callbacks) {
         return new MultiGeneralCallback(Arrays.asList(callbacks));
     }
diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java
index e67bbeb226f7a769b5fb5aea3ab87c4ef7334c89..8efa231a938327e096c1b85b67cf9b3e618d2315 100644
--- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java
+++ b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java
@@ -22,6 +22,7 @@
 package de.kuschku.util.observables.lists;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import java.util.Collection;
 import java.util.HashSet;
@@ -86,11 +87,11 @@ public class ObservableSet<T> extends HashSet<T> implements IObservableSet<Eleme
     }
 
     @Override
-    public boolean remove(Object object) {
+    public boolean remove(@Nullable Object object) {
         assertNotNull(this.callback);
 
         boolean contains = contains(object);
-        if (contains) {
+        if (contains && object != null) {
             super.remove(object);
             callback.notifyItemRemoved((T) object);
             return true;
@@ -130,11 +131,14 @@ public class ObservableSet<T> extends HashSet<T> implements IObservableSet<Eleme
 
         @Override
         public boolean hasNext() {
+            assertNotNull(iterator);
             return iterator.hasNext();
         }
 
+        @Nullable
         @Override
         public E next() {
+            assertNotNull(iterator);
             current = iterator.next();
             return current;
         }
@@ -142,6 +146,7 @@ public class ObservableSet<T> extends HashSet<T> implements IObservableSet<Eleme
         @Override
         public void remove() {
             assertNotNull(callback);
+            assertNotNull(iterator);
 
             iterator.remove();
             callback.notifyItemRemoved((T) current);
diff --git a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java b/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java
index d6be86100b5e19bb59057608c4262c69e669aaf9..7674ab8b0c581eac4340e7d7c337463f65f4fd7c 100644
--- a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java
+++ b/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java
@@ -30,6 +30,7 @@ import java.util.regex.Pattern;
 public class SmartRegEx {
     @NonNull
     private final Pattern pattern;
+    @NonNull
     private final String rule;
 
     public SmartRegEx(@NonNull String rule, int flags, @NonNull Syntax syntax) {
@@ -37,6 +38,7 @@ public class SmartRegEx {
         this.rule = rule;
     }
 
+    @NonNull
     public String rule() {
         return rule;
     }
@@ -60,7 +62,7 @@ public class SmartRegEx {
         }
     }
 
-    private Pattern transformWildcard(String glob, int flags) {
+    private Pattern transformWildcard(@NonNull String glob, int flags) {
         return Pattern.compile(GlobTransformer.convertGlobToRegex(glob), flags);
     }
 
diff --git a/app/src/main/res/menu/formatting.xml b/app/src/main/res/menu/formatting.xml
index 57b0ae94f416955752c39a47a976bd11e15b4039..b807f4c067552fb0be866ca24e08decf74aff8c4 100644
--- a/app/src/main/res/menu/formatting.xml
+++ b/app/src/main/res/menu/formatting.xml
@@ -52,19 +52,4 @@
         android:icon="?attr/iconHistory"
         android:title="@string/labelHistory"
         app:showAsAction="always" />
-
-    <item
-        android:id="@+id/action_debug"
-        android:icon="?attr/iconDebug"
-        android:title="@string/labelDebug"
-        app:showAsAction="always">
-        <menu>
-            <item
-                android:id="@+id/debug_init_channels"
-                android:title="Request Channels" />
-            <item
-                android:id="@+id/debug_init_users"
-                android:title="Request Users" />
-        </menu>
-    </item>
 </menu>