diff --git a/.gitignore b/.gitignore
index 25e1bf3919dec63d6ece33c935dd540897a2700e..b35af4d6a0d7d8b47c1afb18964e9612a83091f5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@ gradle*
 gradle.properties
 */version.properties
 *.sh
+signing.gradle
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 44e183dac54170c16ad5ff8304ab57115e8fa3a3..63a2c2fbd1d30942ce556055a0354857cbe4dee3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,16 +2,54 @@ apply plugin: 'com.android.application'
 apply plugin: 'com.neenbedankt.android-apt'
 apply plugin: 'me.tatarka.retrolambda'
 
+if (project.hasProperty("storeFile")) {
+  android {
+    signingConfigs {
+      release {
+        storeFile file(project.property("storeFile"))
+        storePassword project.property("storePassword")
+        keyAlias project.property("keyAlias")
+        keyPassword project.property("keyPassword")
+      }
+    }
+    
+    buildTypes {
+      release {
+        signingConfig signingConfigs.release
+      }
+    }
+  }
+}
+
+def versionPropsFile = file('version.properties')
+def versionBuild = 0
+if (versionPropsFile.canRead()) {
+  def Properties versionProps = new Properties()
+
+  versionProps.load(new FileInputStream(versionPropsFile))
+  def runTasks = gradle.startParameter.taskNames
+  versionBuild = Integer.valueOf(versionProps['VERSION_BUILD'])
+  if ('assemble' in runTasks || 'assembleRelease' in runTasks || 'aR' in runTasks) {
+    versionBuild = versionBuild + 1
+  }
+  versionProps['VERSION_BUILD'] = versionBuild.toString()
+  versionProps.store(versionPropsFile.newWriter(), null)
+} else {
+  throw new GradleException("Could not read version.properties!"+versionPropsFile.toString())
+}
+
+def rawVersionName = "0.2.0"
+
 android {
-    compileSdkVersion 'Google Inc.:Google APIs:23'
+    compileSdkVersion 23
     buildToolsVersion "23.0.2"
-
+    
     defaultConfig {
         applicationId "de.kuschku.quasseldroid_ng"
         minSdkVersion 16
         targetSdkVersion 23
-        versionCode 1
-        versionName "0.1.0"
+        versionCode versionBuild
+        versionName rawVersionName + " Build #" + versionBuild
     }
     buildTypes {
         release {
@@ -21,7 +59,9 @@ android {
 
             applicationVariants.all { variant ->
                 variant.outputs.each { output ->
-                    def fileName = output.outputFile.name.replace(".apk", String.format("-%s-build%d.apk", defaultConfig.versionName, versionCode))
+                    def fileName = output.outputFile.name
+                      .replace(".apk", String.format("-%s-build%d.apk", rawVersionName, versionCode))
+                      .replace("app-", "QuasselDroidNG-")
                     output.outputFile = new File(output.outputFile.parent, fileName)
                 }
             }
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2be27dbc7ed0cc00dbf1bf327d707207494158f5..1b5240e8daa316fd5801f9f9a7bff99ed4aaafc9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,8 +8,7 @@
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
-        android:supportsRtl="true"
-        android:theme="@style/AppTheme.Light">
+        android:supportsRtl="true">
 
         <service android:name=".service.QuasselService" />
 
@@ -17,7 +16,7 @@
             android:name=".ui.chat.ChatActivity"
             android:label="@string/app_name"
             android:launchMode="singleTask"
-            android:theme="@style/Quassel">
+            android:theme="@style/AppTheme.Light">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java
index ec15e0623d158ba05958ed4ffcae856cdb8fb33a..8890efa051ec1f9541488e20b5f8861444814e66 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java
@@ -1,25 +1,35 @@
 package de.kuschku.libquassel.localtypes.backlogmanagers;
 
 import android.support.annotation.NonNull;
+import android.util.Log;
 
-import com.android.internal.util.Predicate;
+import org.joda.time.DateTime;
+
+import java.util.HashSet;
+import java.util.Set;
 
 import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.message.Message;
-import de.kuschku.quasseldroid_ng.ui.AppContext;
+import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.util.observables.callbacks.UICallback;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
 public class BacklogFilter implements UICallback {
     @NonNull
     private final Client client;
+    private final int bufferId;
     @NonNull
     private final ObservableSortedList<Message> unfiltered;
     @NonNull
     private final ObservableSortedList<Message> filtered;
 
-    public BacklogFilter(@NonNull Client client, @NonNull ObservableSortedList<Message> unfiltered, @NonNull ObservableSortedList<Message> filtered) {
+    private final Set<Message.Type> filteredTypes = new HashSet<>();
+
+    private DateTime earliestMessage;
+
+    public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableSortedList<Message> unfiltered, @NonNull ObservableSortedList<Message> filtered) {
         this.client = client;
+        this.bufferId = bufferId;
         this.unfiltered = unfiltered;
         this.filtered = filtered;
     }
@@ -27,11 +37,66 @@ public class BacklogFilter implements UICallback {
     @Override
     public void notifyItemInserted(int position) {
         Message message = unfiltered.get(position);
-        if (filterItem(message)) filtered.add(message);
+        if (!filterItem(message)) filtered.add(message);
+        if (message.time.isBefore(earliestMessage)) earliestMessage = message.time;
+        updateDayChangeMessages();
+    }
+
+    private void updateDayChangeMessages() {
+        DateTime now = DateTime.now().withMillisOfDay(0);
+        int id = -1;
+        while (now.isAfter(earliestMessage)) {
+            filtered.add(new Message(
+                    id,
+                    now,
+                    Message.Type.DayChange,
+                    new Message.Flags(false, false, false, false, false),
+                    new BufferInfo(
+                            bufferId,
+                            -1,
+                            BufferInfo.Type.INVALID,
+                            -1,
+                            null
+                    ),
+                    "",
+                    ""
+            ));
+            now = now.minusDays(1);
+        }
     }
 
     private boolean filterItem(Message message) {
-        return !client.getIgnoreListManager().matches(message);
+        return client.getIgnoreListManager().matches(message) || filteredTypes.contains(message.type);
+    }
+
+    public void addFilter(Message.Type type) {
+        filteredTypes.add(type);
+        updateRemove();
+    }
+
+    public void removeFilter(Message.Type type) {
+        filteredTypes.remove(type);
+        updateAdd();
+    }
+
+    private void updateRemove() {
+        for (Message message : unfiltered) {
+            if (filterItem(message)) {
+                String simpleName = getClass().getSimpleName();
+                Log.e(simpleName, "Filtered: "+message);
+                filtered.remove(message);
+            }
+        }
+    }
+
+    private void updateAdd() {
+        for (Message message : unfiltered) {
+            if (!filterItem(message)) {
+                String simpleName = getClass().getSimpleName();
+                Log.e(simpleName, "Unfiltered: "+message);
+                filtered.add(message);
+            }
+        }
     }
 
     @Override
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java
index edfee61b352576452a996e814d3b27cfd7c081e2..2abd74a6d6399ed95c775ae004b8a885bbf2cf0f 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java
@@ -19,11 +19,13 @@ import de.kuschku.libquassel.functions.types.InitDataFunction;
 import de.kuschku.libquassel.functions.types.SyncFunction;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.primitives.types.QVariant;
+import de.kuschku.util.AndroidAssert;
 import de.kuschku.util.observables.AutoScroller;
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.observables.lists.ObservableComparableSortedList;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
+import static de.kuschku.util.AndroidAssert.*;
 import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> {
@@ -107,10 +109,11 @@ public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> {
     }
 
     private void ensureExisting(@IntRange(from = -1) int bufferId) {
+        assertNotNull(client);
         if (backlogs.get(bufferId) == null) {
             ObservableComparableSortedList<Message> messages = new ObservableComparableSortedList<>(Message.class, true);
             ObservableComparableSortedList<Message> filteredMessages = new ObservableComparableSortedList<>(Message.class, true);
-            BacklogFilter backlogFilter = new BacklogFilter(client, messages, filteredMessages);
+            BacklogFilter backlogFilter = new BacklogFilter(client, bufferId, messages, filteredMessages);
             messages.addCallback(backlogFilter);
             backlogs.put(bufferId, messages);
             filteredBacklogs.put(bufferId, filteredMessages);
diff --git a/app/src/main/java/de/kuschku/libquassel/message/Message.java b/app/src/main/java/de/kuschku/libquassel/message/Message.java
index cd62255891986c79e4e6cf3d880565cc32849b12..430442535bf36e7dbcb867a02fa3253bb6623e1b 100644
--- a/app/src/main/java/de/kuschku/libquassel/message/Message.java
+++ b/app/src/main/java/de/kuschku/libquassel/message/Message.java
@@ -75,7 +75,7 @@ public class Message implements ContentComparable<Message> {
 
     @Override
     public int compareTo(@NonNull Message another) {
-        return this.messageId - another.messageId;
+        return this.time.compareTo(another.time);
     }
 
     public enum Type {
diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
index ed1322d3fa4879a780ee57e02b3cf1b72925e4bf..b8cea4b7b5431d912e396698c69484b9d458f046 100644
--- a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
+++ b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
@@ -119,6 +119,8 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull SyncFunction func) {
+        assertNotNull(func);
+
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<SyncFunction>get(),
@@ -127,6 +129,9 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull RpcCallFunction func) {
+        assertNotNull(func);
+
+        Log.e("TEST", String.valueOf(func));
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<RpcCallFunction>get(),
@@ -135,6 +140,8 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull InitRequestFunction func) {
+        assertNotNull(func);
+
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<InitRequestFunction>get(),
@@ -143,6 +150,8 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull InitDataFunction func) {
+        assertNotNull(func);
+
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<InitDataFunction>get(),
@@ -151,6 +160,8 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull Heartbeat func) {
+        assertNotNull(func);
+
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<InitDataFunction>get(),
@@ -159,6 +170,8 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull HeartbeatReply func) {
+        assertNotNull(func);
+
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(
                 VariantVariantListSerializer.<InitDataFunction>get(),
@@ -167,6 +180,8 @@ public class DatastreamPeer implements RemotePeer {
     }
 
     public void onEventBackgroundThread(@NonNull HandshakeFunction func) {
+        assertNotNull(func);
+
         assertNotNull(connection.getOutputExecutor());
         Map<String, QVariant> variantMap = MessageTypeRegistry.toVariantMap(func.data).data;
         assertNotNull(variantMap);
diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/RemotePeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/RemotePeer.java
index 95e3fc7fd444dfc2d86ea9a9409a6f183f618662..7abea3188f57478d00f3b10679f0b9ac13a59f1c 100644
--- a/app/src/main/java/de/kuschku/libquassel/protocols/RemotePeer.java
+++ b/app/src/main/java/de/kuschku/libquassel/protocols/RemotePeer.java
@@ -6,6 +6,8 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 
 import de.kuschku.libquassel.functions.types.HandshakeFunction;
+import de.kuschku.libquassel.functions.types.Heartbeat;
+import de.kuschku.libquassel.functions.types.HeartbeatReply;
 import de.kuschku.libquassel.functions.types.InitDataFunction;
 import de.kuschku.libquassel.functions.types.InitRequestFunction;
 import de.kuschku.libquassel.functions.types.RpcCallFunction;
@@ -26,6 +28,10 @@ public interface RemotePeer {
 
     void onEventBackgroundThread(@NonNull HandshakeFunction func);
 
+    void onEventBackgroundThread(@NonNull Heartbeat func);
+
+    void onEventBackgroundThread(@NonNull HeartbeatReply func);
+
     void processMessage() throws IOException;
 
     @NonNull
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppTheme.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppTheme.java
index c24ebeff6a3f1532eb58fa5ded378723bf7e45ec..6753fd6220dd3de7a8aaf34243ef4d9c3abd9c11 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppTheme.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/AppTheme.java
@@ -5,7 +5,8 @@ import android.support.annotation.StyleRes;
 import de.kuschku.quasseldroid_ng.R;
 
 public enum AppTheme {
-    QUASSEL(R.style.Quassel),
+    QUASSEL_LIGHT(R.style.Quassel_Light),
+    QUASSEL_DARK(R.style.Quassel_Dark),
     MATERIAL_DARK(R.style.Material_Dark),
     MATERIAL_LIGHT(R.style.Material_Light);
 
@@ -24,9 +25,10 @@ public enum AppTheme {
         switch (s) {
             case "MATERIAL_DARK": return MATERIAL_DARK;
             case "MATERIAL_LIGHT": return MATERIAL_LIGHT;
+            case "QUASSEL_DARK": return QUASSEL_DARK;
 
             default:
-            case "QUASSEL": return QUASSEL;
+            case "QUASSEL_LIGHT": return QUASSEL_LIGHT;
         }
     }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java
index 50205398eaa4daac23467498a15f5136d0edee41..7b70ddd74acdfd5ba3462503b6f22a1523561023 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java
@@ -1,7 +1,6 @@
 package de.kuschku.quasseldroid_ng.ui.chat.chatview;
 
 import android.content.Context;
-import android.content.SharedPreferences;
 import android.graphics.Typeface;
 import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
@@ -11,18 +10,15 @@ import android.util.Log;
 
 import org.joda.time.format.DateTimeFormatter;
 
-import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.localtypes.Buffer;
 import de.kuschku.libquassel.message.Message;
-import de.kuschku.quasseldroid_ng.BuildConfig;
 import de.kuschku.quasseldroid_ng.R;
 import de.kuschku.quasseldroid_ng.ui.AppContext;
-import de.kuschku.quasseldroid_ng.ui.AppTheme;
 import de.kuschku.util.annotationbind.AutoBinder;
 import de.kuschku.util.annotationbind.AutoString;
 import de.kuschku.util.irc.IrcFormatHelper;
 import de.kuschku.util.irc.IrcUserUtils;
-import de.kuschku.util.ui.DateFormatHelper;
+import de.kuschku.util.ui.DateTimeFormatHelper;
 import de.kuschku.util.ui.SpanFormatter;
 import de.kuschku.util.ui.ThemeUtil;
 
@@ -30,8 +26,6 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 @UiThread
 public class ChatMessageRenderer {
-    @NonNull
-    private final DateTimeFormatter format;
     @NonNull
     private final FormatStrings strings;
 
@@ -45,7 +39,6 @@ public class ChatMessageRenderer {
     private AppContext context;
 
     public ChatMessageRenderer(@NonNull Context ctx, @NonNull AppContext context) {
-        this.format = DateFormatHelper.getTimeFormatter(ctx);
         this.strings = new FormatStrings(ctx);
         this.context = context;
         setTheme(context.getThemeUtil());
@@ -211,7 +204,9 @@ public class ChatMessageRenderer {
 
     private void onBindDayChange(@NonNull MessageViewHolder holder, @NonNull Message message) {
         applyStyle(holder, serverStyle, highlightStyle, message.flags.Highlight);
-        holder.content.setText(message.toString());
+        holder.content.setText(strings.formatDayChange(
+                context.getThemeUtil().formatter.getLongDateFormatter().print(message.time)
+        ));
     }
 
     private void onBindTopic(@NonNull MessageViewHolder holder, @NonNull Message message) {
@@ -235,7 +230,7 @@ public class ChatMessageRenderer {
     }
 
     public void onBind(@NonNull MessageViewHolder holder, @NonNull Message message) {
-        holder.time.setText(format.print(message.time));
+        holder.time.setText(context.getThemeUtil().formatter.getTimeFormatter().print(message.time));
         switch (message.type) {
             case Plain:
                 onBindPlain(holder, message);
diff --git a/app/src/main/java/de/kuschku/util/ui/DateFormatHelper.java b/app/src/main/java/de/kuschku/util/ui/DateFormatHelper.java
deleted file mode 100644
index 172e899b056511ed478b0f4eae6983bd6a2d3a73..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/util/ui/DateFormatHelper.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.kuschku.util.ui;
-
-import android.content.Context;
-import android.support.annotation.NonNull;
-
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-
-import java.text.SimpleDateFormat;
-
-public class DateFormatHelper {
-    private DateFormatHelper() {
-
-    }
-
-    @NonNull
-    public static DateTimeFormatter getTimeFormatter(Context ctx) {
-        return DateTimeFormat.forPattern(((SimpleDateFormat) android.text.format.DateFormat.getTimeFormat(ctx)).toLocalizedPattern());
-    }
-}
diff --git a/app/src/main/java/de/kuschku/util/ui/DateTimeFormatHelper.java b/app/src/main/java/de/kuschku/util/ui/DateTimeFormatHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..bca319fadcc686c738b3bdfdfb8834d0c1707e2a
--- /dev/null
+++ b/app/src/main/java/de/kuschku/util/ui/DateTimeFormatHelper.java
@@ -0,0 +1,58 @@
+package de.kuschku.util.ui;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+
+import java.text.SimpleDateFormat;
+
+public class DateTimeFormatHelper {
+    @NonNull
+    private final Context context;
+
+    public DateTimeFormatHelper(@NonNull Context context) {
+        this.context = context;
+    }
+
+    @NonNull
+    public DateTimeFormatter getTimeFormatter() {
+        return getTimeFormatter(context);
+    }
+
+    @NonNull
+    public DateTimeFormatter getDateFormatter() {
+        return getDateFormatter(context);
+    }
+
+    @NonNull
+    public DateTimeFormatter getLongDateFormatter() {
+        return getLongDateFormatter(context);
+    }
+
+    @NonNull
+    public  DateTimeFormatter getMediumDateFormatter() {
+        return getMediumDateFormatter(context);
+    }
+
+    @NonNull
+    public static DateTimeFormatter getTimeFormatter(Context ctx) {
+        return DateTimeFormat.forPattern(((SimpleDateFormat) android.text.format.DateFormat.getTimeFormat(ctx)).toLocalizedPattern());
+    }
+
+    @NonNull
+    public static DateTimeFormatter getDateFormatter(Context ctx) {
+        return DateTimeFormat.forPattern(((SimpleDateFormat) android.text.format.DateFormat.getDateFormat(ctx)).toLocalizedPattern());
+    }
+
+    @NonNull
+    public static DateTimeFormatter getLongDateFormatter(Context ctx) {
+        return DateTimeFormat.forPattern(((SimpleDateFormat) android.text.format.DateFormat.getLongDateFormat(ctx)).toLocalizedPattern());
+    }
+
+    @NonNull
+    public static DateTimeFormatter getMediumDateFormatter(Context ctx) {
+        return DateTimeFormat.forPattern(((SimpleDateFormat) android.text.format.DateFormat.getMediumDateFormat(ctx)).toLocalizedPattern());
+    }
+}
diff --git a/app/src/main/java/de/kuschku/util/ui/ThemeUtil.java b/app/src/main/java/de/kuschku/util/ui/ThemeUtil.java
index fe20887ee23fb75606361b44d8990aafa1f81ccc..8e4732d42000d57085953e1701da9c136ce3a3e8 100644
--- a/app/src/main/java/de/kuschku/util/ui/ThemeUtil.java
+++ b/app/src/main/java/de/kuschku/util/ui/ThemeUtil.java
@@ -14,13 +14,16 @@ import de.kuschku.util.annotationbind.AutoColor;
 public class ThemeUtil {
     @NonNull
     public final Colors colors = new Colors();
+    public DateTimeFormatHelper formatter;
 
     public ThemeUtil(@NonNull Context ctx) {
         initColors(new ContextThemeWrapper(ctx, ctx.getTheme()));
+        formatter = new DateTimeFormatHelper(ctx);
     }
 
     public ThemeUtil(@NonNull Context ctx, @NonNull AppTheme theme) {
         initColors(new ContextThemeWrapper(ctx, theme.themeId));
+        formatter = new DateTimeFormatHelper(ctx);
     }
 
     @UiThread
@@ -37,6 +40,18 @@ public class ThemeUtil {
         @ColorInt
         public int transparent;
 
+        @AutoColor(R.attr.colorPrimary)
+        @ColorInt
+        public int colorPrimary;
+
+        @AutoColor(R.attr.colorPrimaryDark)
+        @ColorInt
+        public int colorPrimaryDark;
+
+        @AutoColor(R.attr.colorAccent)
+        @ColorInt
+        public int colorAccent;
+
         @AutoColor({R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
                 R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
                 R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
diff --git a/app/src/main/res/layout/slider_main.xml b/app/src/main/res/layout/slider_main.xml
index bc50b355b83c97bda299a5733a7b2796160cf58c..4c7f5c4f76fe7098e780549e71000c79bbeb87c1 100644
--- a/app/src/main/res/layout/slider_main.xml
+++ b/app/src/main/res/layout/slider_main.xml
@@ -7,7 +7,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="?attr/actionBarSize"
-        android:background="?attr/chatlineBackground"
+        android:background="?attr/colorBackgroundCard"
         android:orientation="horizontal">
 
         <android.support.v7.widget.AppCompatEditText
@@ -40,5 +40,5 @@
         android:layout_width="match_parent"
         android:layout_height="0dip"
         android:layout_weight="1"
-        android:background="?attr/chatlineBackground" />
+        android:background="?attr/colorBackgroundSecondary" />
 </LinearLayout>
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 7ae52ee34b11f17e80d3f5a0e5ff982c11edd8ef..6e98e96b5942fb6c04953f9f45806c8ea3b239c4 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -1,9 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <attr name="messagesBackground" format="reference" />
-    <attr name="chatlineBackground" format="reference" />
-    <attr name="dividerColor" format="reference" />
-
     <!-- sender colors -->
 
     <attr name="senderColor0" format="color" />
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 61e55ba3d51243f4e17e95c39a3888b6f435b536..d52c48ef3ce6f314e5b454e79dc779c87ecfcf54 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,9 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
+    <!--
     <color name="colorPrimary">#3F51B5</color>
     <color name="colorPrimaryDark">#303F9F</color>
     <color name="colorAccent">#FF4081</color>
-
-    <color name="messagesBackgroundLight">#f5f5f5</color>
-    <color name="messagesBackgroundDark">@android:color/transparent</color>
+    -->
+    <color name="colorPrimary">#0271B3</color>
+    <color name="colorPrimaryDark">#02588c</color>
+    <color name="colorAccent">#ffeb3b</color>
 </resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 569a42b14eea0e4461fd1cd28b0643b39e2d803b..ef43644007a894a82a628aeb6b15011f346183ce 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -6,10 +6,6 @@
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
         <item name="colorAccent">@color/colorAccent</item>
-
-        <item name="dividerColor">@color/material_drawer_dark_divider</item>
-        <item name="messagesBackground">@color/messagesBackgroundDark</item>
-        <item name="chatlineBackground">@color/md_dark_cards</item>
     </style>
 
     <style name="AppTheme.Light" parent="MaterialDrawerTheme.Light.DarkToolbar.TranslucentStatus">
@@ -17,10 +13,6 @@
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
         <item name="colorAccent">@color/colorAccent</item>
-
-        <item name="dividerColor">@color/material_drawer_divider</item>
-        <item name="messagesBackground">@color/messagesBackgroundLight</item>
-        <item name="chatlineBackground">@color/md_light_cards</item>
     </style>
 
     <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 3c39fb034f85c8796f4245b39a9417ba066c25fb..e82a73a14b2c28bb52a57643951962213a410707 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-
-    <style name="Material_Dark" parent="AppTheme">
+    <style name="Material_Light" parent="AppTheme.Light">
         <item name="senderColor0">@color/md_pink_500</item>
         <item name="senderColor1">@color/md_purple_500</item>
         <item name="senderColor2">@color/md_red_500</item>
@@ -19,22 +18,39 @@
         <item name="senderColorE">@color/md_amber_500</item>
         <item name="senderColorF">@color/md_blue_500</item>
 
-        <item name="colorForeground">@color/md_dark_primary_text</item>
-        <item name="colorForegroundHighlight">@color/md_dark_primary_text</item>
-        <item name="colorForegroundSecondary">@color/md_dark_secondary</item>
-        <item name="colorForegroundAction">#7986cb</item>
+        <item name="mircColor0">#f2f2f2</item>
+        <item name="mircColor1">#2c2c2c</item>
+        <item name="mircColor2">#2467be</item>
+        <item name="mircColor3">#568a34</item>
+        <item name="mircColor4">#ec5354</item>
+        <item name="mircColor5">#c3282d</item>
+        <item name="mircColor6">#6a2398</item>
+        <item name="mircColor7">#fc8e23</item>
+        <item name="mircColor8">#fc9f25</item>
+        <item name="mircColor9">#8cc251</item>
+        <item name="mircColorA">#17838e</item>
+        <item name="mircColorB">#39c6d9</item>
+        <item name="mircColorC">#6bb6f4</item>
+        <item name="mircColorD">#b96ac6</item>
+        <item name="mircColorE">#545454</item>
+        <item name="mircColorF">#e0e0e0</item>
 
-        <item name="colorBackground">@color/md_dark_background</item>
+        <item name="colorForeground">@color/md_light_primary_text</item>
+        <item name="colorForegroundHighlight">@color/md_light_primary_text</item>
+        <item name="colorForegroundSecondary">@color/md_light_secondary</item>
+        <item name="colorForegroundAction">#1a237e</item>
+
+        <item name="colorBackground">@color/md_light_background</item>
         <item name="colorBackgroundHighlight">#ff8811</item>
         <item name="colorBackgroundSecondary">@android:color/transparent</item>
-        <item name="colorBackgroundCard">@color/md_dark_cards</item>
+        <item name="colorBackgroundCard">@color/md_light_cards</item>
 
         <item name="colorTintActivity">#88cc33</item>
         <item name="colorTintMessage">#2277dd</item>
         <item name="colorTintHighlight">#ff8811</item>
     </style>
 
-    <style name="Material_Light" parent="AppTheme">
+    <style name="Material_Dark" parent="AppTheme">
         <item name="senderColor0">@color/md_pink_500</item>
         <item name="senderColor1">@color/md_purple_500</item>
         <item name="senderColor2">@color/md_red_500</item>
@@ -52,22 +68,39 @@
         <item name="senderColorE">@color/md_amber_500</item>
         <item name="senderColorF">@color/md_blue_500</item>
 
-        <item name="colorForeground">@color/md_light_primary_text</item>
-        <item name="colorForegroundHighlight">@color/md_light_primary_text</item>
-        <item name="colorForegroundSecondary">@color/md_light_secondary</item>
-        <item name="colorForegroundAction">#1a237e</item>
+        <item name="mircColor0">#f2f2f2</item>
+        <item name="mircColor1">#2c2c2c</item>
+        <item name="mircColor2">#2467be</item>
+        <item name="mircColor3">#568a34</item>
+        <item name="mircColor4">#ec5354</item>
+        <item name="mircColor5">#c3282d</item>
+        <item name="mircColor6">#6a2398</item>
+        <item name="mircColor7">#fc8e23</item>
+        <item name="mircColor8">#fc9f25</item>
+        <item name="mircColor9">#8cc251</item>
+        <item name="mircColorA">#17838e</item>
+        <item name="mircColorB">#39c6d9</item>
+        <item name="mircColorC">#6bb6f4</item>
+        <item name="mircColorD">#b96ac6</item>
+        <item name="mircColorE">#545454</item>
+        <item name="mircColorF">#e0e0e0</item>
 
-        <item name="colorBackground">@color/md_light_background</item>
+        <item name="colorForeground">@color/md_dark_primary_text</item>
+        <item name="colorForegroundHighlight">@color/md_dark_primary_text</item>
+        <item name="colorForegroundSecondary">@color/md_dark_secondary</item>
+        <item name="colorForegroundAction">#7986cb</item>
+
+        <item name="colorBackground">@color/md_dark_background</item>
         <item name="colorBackgroundHighlight">#ff8811</item>
         <item name="colorBackgroundSecondary">@android:color/transparent</item>
-        <item name="colorBackgroundCard">@color/md_light_cards</item>
+        <item name="colorBackgroundCard">@color/md_dark_cards</item>
 
         <item name="colorTintActivity">#88cc33</item>
         <item name="colorTintMessage">#2277dd</item>
         <item name="colorTintHighlight">#ff8811</item>
     </style>
 
-    <style name="Quassel" parent="AppTheme.Light">
+    <style name="Quassel_Light" parent="AppTheme.Light">
         <item name="senderColor0">#e90d7f</item>
         <item name="senderColor1">#8e55e9</item>
         <item name="senderColor2">#b30e0e</item>
@@ -116,4 +149,54 @@
         <item name="colorTintMessage">#2277dd</item>
         <item name="colorTintHighlight">#ff8811</item>
     </style>
+
+    <style name="Quassel_Dark" parent="AppTheme">
+        <item name="senderColor0">#e90d7f</item>
+        <item name="senderColor1">#8e55e9</item>
+        <item name="senderColor2">#b30e0e</item>
+        <item name="senderColor3">#17b339</item>
+        <item name="senderColor4">#58afb3</item>
+        <item name="senderColor5">#9d54b3</item>
+        <item name="senderColor6">#b39775</item>
+        <item name="senderColor7">#3176b3</item>
+        <item name="senderColor8">#e90d7f</item>
+        <item name="senderColor9">#8e55e9</item>
+        <item name="senderColorA">#b30e0e</item>
+        <item name="senderColorB">#17b339</item>
+        <item name="senderColorC">#58afb3</item>
+        <item name="senderColorD">#9d54b3</item>
+        <item name="senderColorE">#b39775</item>
+        <item name="senderColorF">#3176b3</item>
+
+        <item name="mircColor0">#ffffff</item>
+        <item name="mircColor1">#000000</item>
+        <item name="mircColor2">#000080</item>
+        <item name="mircColor3">#008000</item>
+        <item name="mircColor4">#ff0000</item>
+        <item name="mircColor5">#800000</item>
+        <item name="mircColor6">#800080</item>
+        <item name="mircColor7">#ffa500</item>
+        <item name="mircColor8">#ffff00</item>
+        <item name="mircColor9">#00ff00</item>
+        <item name="mircColorA">#008080</item>
+        <item name="mircColorB">#00ffff</item>
+        <item name="mircColorC">#4169e1</item>
+        <item name="mircColorD">#ff00ff</item>
+        <item name="mircColorE">#808080</item>
+        <item name="mircColorF">#c0c0c0</item>
+
+        <item name="colorForeground">@color/md_dark_primary_text</item>
+        <item name="colorForegroundHighlight">@color/md_dark_primary_text</item>
+        <item name="colorForegroundSecondary">@color/md_dark_secondary</item>
+        <item name="colorForegroundAction">#7986cb</item>
+
+        <item name="colorBackground">@color/md_dark_background</item>
+        <item name="colorBackgroundHighlight">#ff8811</item>
+        <item name="colorBackgroundSecondary">@android:color/transparent</item>
+        <item name="colorBackgroundCard">@color/md_dark_cards</item>
+
+        <item name="colorTintActivity">#88cc33</item>
+        <item name="colorTintMessage">#2277dd</item>
+        <item name="colorTintHighlight">#ff8811</item>
+    </style>
 </resources>