diff --git a/app/src/main/java/de/kuschku/libquassel/Client.java b/app/src/main/java/de/kuschku/libquassel/Client.java
index d556e4a4595edc063e7a0f2b07e32315f26b5e6d..199c761f010686cd60d953fc316578db5018ccef 100644
--- a/app/src/main/java/de/kuschku/libquassel/Client.java
+++ b/app/src/main/java/de/kuschku/libquassel/Client.java
@@ -23,7 +23,7 @@ import de.kuschku.libquassel.syncables.types.BufferSyncer;
 import de.kuschku.libquassel.syncables.types.BufferViewManager;
 import de.kuschku.libquassel.syncables.types.Network;
 import de.kuschku.libquassel.syncables.types.SyncableObject;
-import de.kuschku.util.Stream;
+import de.kuschku.util.backports.Stream;
 
 
 public class Client {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java
index 4b4960b60702469b83f6645f3791734b9e47b4d0..b0d5681f56d9d013fc322a9a90741d2c3578ef3d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java
@@ -7,12 +7,18 @@ import android.content.res.Configuration;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.support.design.widget.Snackbar;
+import android.support.v4.text.TextUtilsCompat;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.AppCompatImageButton;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.Toolbar;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.style.ForegroundColorSpan;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -33,6 +39,9 @@ import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 import com.mikepenz.materialdrawer.model.interfaces.IProfile;
 import com.mikepenz.materialdrawer.util.KeyboardUtil;
 
+import org.joda.time.format.DateTimeFormat;
+
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -52,8 +61,9 @@ import de.kuschku.libquassel.primitives.types.Message;
 import de.kuschku.libquassel.syncables.types.BufferViewConfig;
 import de.kuschku.libquassel.syncables.types.Network;
 import de.kuschku.quasseldroid_ng.utils.ServerAddress;
+import de.kuschku.util.IrcUserUtils;
 import de.kuschku.util.ObservableList;
-import de.kuschku.util.Stream;
+import de.kuschku.util.backports.Stream;
 
 public class MainActivity extends AppCompatActivity {
 
@@ -319,7 +329,40 @@ public class MainActivity extends AppCompatActivity {
 
         @Override
         public void onBindViewHolder(MessageViewHolder holder, int position) {
-            holder.text1.setText(messageList.list.get(position).toString());
+            int[] colors = {
+                    R.color.md_pink_500,
+                    R.color.md_purple_500,
+                    R.color.md_red_500,
+                    R.color.md_green_500,
+                    R.color.md_cyan_500,
+                    R.color.md_deep_purple_500,
+                    R.color.md_amber_500,
+                    R.color.md_blue_500,
+                    R.color.md_pink_700,
+                    R.color.md_purple_700,
+                    R.color.md_red_700,
+                    R.color.md_green_700,
+                    R.color.md_cyan_700,
+                    R.color.md_deep_purple_700,
+                    R.color.md_amber_700,
+                    R.color.md_blue_700
+            };
+
+            Message msg = messageList.list.get(position);
+            SpannableString timeSpan = new SpannableString(DateTimeFormat.forPattern("[hh:mm]").print(msg.time));
+            timeSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.md_light_secondary)), 0, timeSpan.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+
+            String nick = IrcUserUtils.getNick(msg.sender);
+            SpannableString nickSpan = new SpannableString(nick);
+            nickSpan.setSpan(new ForegroundColorSpan(getResources().getColor(colors[IrcUserUtils.getSenderColor(nick)])), 0, nickSpan.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+
+            holder.text1.setText(TextUtils.concat(
+                    timeSpan,
+                    " ",
+                    nickSpan,
+                    " ",
+                    msg.content
+            ));
         }
 
         @Override
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java
index eb97d3f94a88cad026fc960204efd1900b0e18c4..5def317fbf4fc148caa3e71776836b4a339430d8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java
@@ -9,7 +9,7 @@ import java.util.Set;
 
 import de.kuschku.libquassel.localtypes.Buffer;
 import de.kuschku.libquassel.syncables.types.Network;
-import de.kuschku.util.Stream;
+import de.kuschku.util.backports.Stream;
 
 public class NetworkDrawerItem extends PrimaryDrawerItem {
     final Network network;
diff --git a/app/src/main/java/de/kuschku/util/IrcUserUtils.java b/app/src/main/java/de/kuschku/util/IrcUserUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..03953b10a789353ed17ddff6f2b4f78432e17137
--- /dev/null
+++ b/app/src/main/java/de/kuschku/util/IrcUserUtils.java
@@ -0,0 +1,79 @@
+package de.kuschku.util;
+
+import java.nio.charset.Charset;
+import java.util.Locale;
+
+public class IrcUserUtils {
+    private IrcUserUtils() {
+
+    }
+
+    public static int getSenderColor(String nick) {
+        nick = trimEnd(nick, '_').toLowerCase(Locale.US);
+        byte[] data = nick.getBytes(Charset.forName("ISO-8859-1"));
+        return (0xf & CRCUtils.qChecksum(data));
+    }
+
+    public static String trimEnd(String str, char character) {
+        char[] val = str.toCharArray();
+        int len = val.length;
+        while ((0 < len) && (val[len - 1] == character)) {
+            len--;
+        }
+        return ((len < val.length)) ? str.substring(0, len) : str;
+    }
+
+    public static class CRCUtils {
+        private CRCUtils() {
+
+        }
+
+        public static int qChecksum(byte[] data) {
+            int crc = 0xffff;
+            int crcHighBitMask = 0x8000;
+
+            for (byte b : data) {
+                int c = reflect(b, 8);
+                for (int j = 0x80; j > 0; j >>= 1) {
+                    int highBit = crc & crcHighBitMask;
+                    crc <<= 1;
+                    if ((c & j) > 0) {
+                        highBit ^= crcHighBitMask;
+                    }
+                    if (highBit > 0) {
+                        crc ^= 0x1021;
+                    }
+                }
+            }
+
+            crc = reflect(crc, 16);
+            crc ^= 0xffff;
+            crc &= 0xffff;
+
+            return crc;
+        }
+
+        private static int reflect(int crc, int n) {
+            int j = 1, crcout = 0;
+            for (int i = (1 << (n - 1)); i > 0; i >>= 1) {
+                if ((crc & i) > 0) {
+                    crcout |= j;
+                }
+                j <<= 1;
+            }
+            return crcout;
+        }
+    }
+
+    public static String getNick(String hostmask) {
+        return hostmask.split("!")[0];
+    }
+
+    public static String getUser(String hostmask) {
+        return hostmask.split("!")[1].split("@")[0];
+    }
+
+    public static String getHost(String hostmask) {
+        return hostmask.split("@")[1];
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/util/ReflectionUtils.java b/app/src/main/java/de/kuschku/util/ReflectionUtils.java
index 979d097db20ef2b1e2bb8f1c99cb593c1a46dafc..25f4b826fd2eadb962a37b23d621e89f95ee6049 100644
--- a/app/src/main/java/de/kuschku/util/ReflectionUtils.java
+++ b/app/src/main/java/de/kuschku/util/ReflectionUtils.java
@@ -23,16 +23,14 @@ public class ReflectionUtils {
             classes[i] = argv[i].getClass();
         }
         Method m = getMethodFromSignature(name, o.getClass(), classes);
-        try {
-
-            if (m != null) {
-                m.invoke(o, argv);
-            }
+        if (m == null)
+            throw new SyncInvocationException(String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
 
+        try {
+            m.invoke(o, argv);
         } catch (Exception e) {
             throw new SyncInvocationException(e, String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
         }
-        throw new SyncInvocationException(String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
     }
 
     @NonNull
diff --git a/app/src/main/java/de/kuschku/util/SortedListWrapper.java b/app/src/main/java/de/kuschku/util/SortedListWrapper.java
index 3af1f8bfd5f770c39af7d4fbdda58c28c4f1f1eb..a50824ce1e6b0847d422a6119881b361f9f8f8ac 100644
--- a/app/src/main/java/de/kuschku/util/SortedListWrapper.java
+++ b/app/src/main/java/de/kuschku/util/SortedListWrapper.java
@@ -8,6 +8,8 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
 
+import de.kuschku.util.backports.Stream;
+
 public class SortedListWrapper<T> implements List<T> {
     final SortedList<T> list;
 
diff --git a/app/src/main/java/de/kuschku/util/Absent.java b/app/src/main/java/de/kuschku/util/backports/Absent.java
similarity index 96%
rename from app/src/main/java/de/kuschku/util/Absent.java
rename to app/src/main/java/de/kuschku/util/backports/Absent.java
index 515ed35ff4dd3edecbc65cb723e1d86026a60793..ac2e15cf89d750670120a1f0ff48348017a36c5d 100644
--- a/app/src/main/java/de/kuschku/util/Absent.java
+++ b/app/src/main/java/de/kuschku/util/backports/Absent.java
@@ -1,4 +1,4 @@
-package de.kuschku.util;
+package de.kuschku.util.backports;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
diff --git a/app/src/main/java/de/kuschku/util/BinaryFunction.java b/app/src/main/java/de/kuschku/util/backports/BinaryFunction.java
similarity index 68%
rename from app/src/main/java/de/kuschku/util/BinaryFunction.java
rename to app/src/main/java/de/kuschku/util/backports/BinaryFunction.java
index 5ab2ebf2794f93d3ab2a8514f1ef93311937e09e..3616eaa8ebfd928a3bc7f5c85ddb89299fee2824 100644
--- a/app/src/main/java/de/kuschku/util/BinaryFunction.java
+++ b/app/src/main/java/de/kuschku/util/backports/BinaryFunction.java
@@ -1,4 +1,4 @@
-package de.kuschku.util;
+package de.kuschku.util.backports;
 
 public interface BinaryFunction<A, B, C> {
     C apply(A arg0, B arg1);
diff --git a/app/src/main/java/de/kuschku/util/Consumer.java b/app/src/main/java/de/kuschku/util/backports/Consumer.java
similarity index 62%
rename from app/src/main/java/de/kuschku/util/Consumer.java
rename to app/src/main/java/de/kuschku/util/backports/Consumer.java
index b609ea1230ebd9cb4e2019b1b30cf4d39c2f69f7..65ab930cb2124033dde07ccc33d1be58d4d9afc5 100644
--- a/app/src/main/java/de/kuschku/util/Consumer.java
+++ b/app/src/main/java/de/kuschku/util/backports/Consumer.java
@@ -1,4 +1,4 @@
-package de.kuschku.util;
+package de.kuschku.util.backports;
 
 public interface Consumer<T> {
     void apply(T elem);
diff --git a/app/src/main/java/de/kuschku/util/ICollector.java b/app/src/main/java/de/kuschku/util/backports/ICollector.java
similarity index 67%
rename from app/src/main/java/de/kuschku/util/ICollector.java
rename to app/src/main/java/de/kuschku/util/backports/ICollector.java
index 51517375638019db32edbeae116fb21bf6c95af9..15c02a76c93fd4c293335425ce53ffc161a515a9 100644
--- a/app/src/main/java/de/kuschku/util/ICollector.java
+++ b/app/src/main/java/de/kuschku/util/backports/ICollector.java
@@ -1,4 +1,4 @@
-package de.kuschku.util;
+package de.kuschku.util.backports;
 
 public interface ICollector<T, R> {
     R collect(Stream<T> stream);
diff --git a/app/src/main/java/de/kuschku/util/Optional.java b/app/src/main/java/de/kuschku/util/backports/Optional.java
similarity index 94%
rename from app/src/main/java/de/kuschku/util/Optional.java
rename to app/src/main/java/de/kuschku/util/backports/Optional.java
index 7f5d7f4393a4c4021adea8e724a2d3bd64c0cd91..266bc93286d2aa217421f0a5a6ef95c81e979477 100644
--- a/app/src/main/java/de/kuschku/util/Optional.java
+++ b/app/src/main/java/de/kuschku/util/backports/Optional.java
@@ -1,4 +1,4 @@
-package de.kuschku.util;
+package de.kuschku.util.backports;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
diff --git a/app/src/main/java/de/kuschku/util/Optionals.java b/app/src/main/java/de/kuschku/util/backports/Optionals.java
similarity index 92%
rename from app/src/main/java/de/kuschku/util/Optionals.java
rename to app/src/main/java/de/kuschku/util/backports/Optionals.java
index 68d88661292a7cd6983e117d3e27b0f39376cd36..7a898eeb969e3124ebe8306eda1d5fb724aa6668 100644
--- a/app/src/main/java/de/kuschku/util/Optionals.java
+++ b/app/src/main/java/de/kuschku/util/backports/Optionals.java
@@ -1,4 +1,4 @@
-package de.kuschku.util;
+package de.kuschku.util.backports;
 
 public class Optionals {
     private Optionals() {
diff --git a/app/src/main/java/de/kuschku/util/Present.java b/app/src/main/java/de/kuschku/util/backports/Present.java
similarity index 97%
rename from app/src/main/java/de/kuschku/util/Present.java
rename to app/src/main/java/de/kuschku/util/backports/Present.java
index 87e9f3c4c36a4416380d5f601aa93638c88d2b34..19a5168f6f32fe7948aad589ade3cf05d6cf89e5 100644
--- a/app/src/main/java/de/kuschku/util/Present.java
+++ b/app/src/main/java/de/kuschku/util/backports/Present.java
@@ -1,4 +1,4 @@
-package de.kuschku.util;
+package de.kuschku.util.backports;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
diff --git a/app/src/main/java/de/kuschku/util/Stream.java b/app/src/main/java/de/kuschku/util/backports/Stream.java
similarity index 95%
rename from app/src/main/java/de/kuschku/util/Stream.java
rename to app/src/main/java/de/kuschku/util/backports/Stream.java
index c86550220bead71efefc8eda4873756d2e14be8f..ddf14856bf70b7040bc43823b5a7e68beb14466f 100644
--- a/app/src/main/java/de/kuschku/util/Stream.java
+++ b/app/src/main/java/de/kuschku/util/backports/Stream.java
@@ -1,4 +1,4 @@
-package de.kuschku.util;
+package de.kuschku.util.backports;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
@@ -10,7 +10,7 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
-import de.kuschku.util.collectors.Collectors;
+import de.kuschku.util.backports.collectors.Collectors;
 
 public class Stream<T> {
     List<T> list;
diff --git a/app/src/main/java/de/kuschku/util/collectors/Collectors.java b/app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java
similarity index 80%
rename from app/src/main/java/de/kuschku/util/collectors/Collectors.java
rename to app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java
index 957921a7b07338f77f1e7d26367897314ebf30f4..c5ef5b3745d8054a995e5f87a69f63d6aead8751 100644
--- a/app/src/main/java/de/kuschku/util/collectors/Collectors.java
+++ b/app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java
@@ -1,9 +1,9 @@
-package de.kuschku.util.collectors;
+package de.kuschku.util.backports.collectors;
 
 import java.util.List;
 import java.util.Map;
 
-import de.kuschku.util.Stream;
+import de.kuschku.util.backports.Stream;
 
 public class Collectors {
     private Collectors() {
diff --git a/app/src/main/java/de/kuschku/util/collectors/ListCollector.java b/app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java
similarity index 59%
rename from app/src/main/java/de/kuschku/util/collectors/ListCollector.java
rename to app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java
index a2f7749a7bfcc61e198235447cfdd1ffcee991ce..95b94d522f4fef5ea247e7c87abbe88b4259148c 100644
--- a/app/src/main/java/de/kuschku/util/collectors/ListCollector.java
+++ b/app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java
@@ -1,9 +1,9 @@
-package de.kuschku.util.collectors;
+package de.kuschku.util.backports.collectors;
 
 import java.util.List;
 
-import de.kuschku.util.ICollector;
-import de.kuschku.util.Stream;
+import de.kuschku.util.backports.ICollector;
+import de.kuschku.util.backports.Stream;
 
 public class ListCollector<T> implements ICollector<T, List<T>> {
     @Override
diff --git a/app/src/main/java/de/kuschku/util/collectors/MapCollector.java b/app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java
similarity index 81%
rename from app/src/main/java/de/kuschku/util/collectors/MapCollector.java
rename to app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java
index a23a218930130e6aca597ef9d602c31f1a59c92e..cc52c36dc742beb142c5f4a83971f6045c570ac1 100644
--- a/app/src/main/java/de/kuschku/util/collectors/MapCollector.java
+++ b/app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java
@@ -1,11 +1,11 @@
-package de.kuschku.util.collectors;
+package de.kuschku.util.backports.collectors;
 
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import de.kuschku.util.ICollector;
-import de.kuschku.util.Stream;
+import de.kuschku.util.backports.ICollector;
+import de.kuschku.util.backports.Stream;
 
 public class MapCollector<T> implements ICollector<T, Map<T, T>> {
     @Override