diff --git a/res/search.css b/res/search.css
index 636a0d839b2becef890654ac32ddfee11d744b4e..bcbb15248658bdb9660ba54305ed2402abbea14b 100644
--- a/res/search.css
+++ b/res/search.css
@@ -68,7 +68,7 @@ message sender {
 }
 
 message time {
-    width: 148px;
+    width: 180px;
     display: inline-block;
     padding: 0 24px;
     text-align: right;
diff --git a/res/search.js b/res/search.js
index 46c0db28ab66acd20434ab6da9cb55ca43882486..2416f7448b59d2f610335ddea5104919f0382e79 100644
--- a/res/search.js
+++ b/res/search.js
@@ -22,7 +22,7 @@ var wrap_click_handler = function (fun) {
         var sel = getSelection().toString();
         if (sel) {
             event.stopPropagation();
-        } else {
+        } else if (fun) {
             fun(event);
         }
     }
@@ -61,7 +61,68 @@ $("#q").blur(function () {
 });
 
 var sendercolor = function (nick) {
-    return "";
+    var sendercolors = [
+        "#e90d7f",
+        "#8e55e9",
+        "#b30e0e",
+        "#17b339",
+        "#58afb3",
+        "#9d54b3",
+        "#b39775",
+        "#3176b3",
+        "#e90d7f",
+        "#8e55e9",
+        "#b30e0e",
+        "#17b339",
+        "#58afb3",
+        "#9d54b3",
+        "#b39775",
+        "#3176b3"
+    ];
+
+    var reflect = function(crc, n) {
+        var j = 1, crcout = 0;
+        for (var i = (1 << (n - 1)); i > 0; i >>= 1) {
+            if ((crc & i) > 0) {
+                crcout |= j;
+            }
+            j <<= 1;
+        }
+        return crcout;
+    };
+
+    var qChecksum = function(str) {
+        var crc = 0xffff;
+        var crcHighBitMask = 0x8000;
+
+        for (var i = 0; i < str.length; i++) {
+            var b = str.codePointAt(i);
+            var c = reflect(b, 8);
+            for (var j = 0x80; j > 0; j >>= 1) {
+                var 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;
+    };
+
+    var senderIndex = function (str) {
+        var nickToHash = nick.replace(/_*$/, "").toLowerCase();
+        return qChecksum(str) & 0xF;
+    };
+
+    return sendercolors[senderIndex(nick)];
 };
 
 var render_buffer_full = function (buffer) {
@@ -164,7 +225,8 @@ var attach_context = function (elem) {
     elem.unbind();
     var id = elem.data("contextid");
     var bufferid = elem.data("bufferid");
-    elem.click(wrap_click_handler(make_toggle_context(bufferid, id)));
+    elem.click(wrap_click_handler(function (e) {e.stopPropagation(); }));
+    $("#message"+buffers[bufferid].contexts[id].original.messageid).click(wrap_click_handler(make_toggle_context(bufferid, id)));
     elem.find(".load_before").click(wrap_click_handler(function (e) {
         earlier(bufferid, id, 5);
         e.stopPropagation();