diff --git a/database/backends/PostgresSmartBackend.php b/database/backends/PostgresSmartBackend.php
index 451c39ba302e1702bb255a2079c6872318c16719..7c825c979cec0e818c6368d3a7aa09aa90de15b2 100644
--- a/database/backends/PostgresSmartBackend.php
+++ b/database/backends/PostgresSmartBackend.php
@@ -39,6 +39,7 @@ class PostgresSmartBackend implements Backend
               ranked_messages.buffername,
               ranked_messages.networkname,
               ranked_messages.messageid,
+              ranked_messages.type,
               ranked_messages.time,
               ranked_messages.sender,
               ts_headline(replace(replace(ranked_messages.message, '<', '&lt;'), '>', '&gt;'), query, 'HighlightAll=TRUE') AS message
@@ -64,6 +65,7 @@ class PostgresSmartBackend implements Backend
                     buffer.buffername,
                     buffer.networkid,
                     backlog.senderid,
+                    backlog.type,
                     backlog.time,
                     backlog.message,
                     query,
@@ -138,6 +140,7 @@ class PostgresSmartBackend implements Backend
                  buffer.buffername,
                  buffer.networkid,
                  backlog.senderid,
+                 backlog.type,
                  backlog.time,
                  backlog.message,
                  query,
@@ -199,6 +202,7 @@ class PostgresSmartBackend implements Backend
                    backlog.bufferid,
                    buffer.buffername,
                    sender.sender,
+                   backlog.type,
                    backlog.time,
                    network.networkname,
                    replace(replace(replace(backlog.message, '&', '&amp;'), '<', '&lt;'), '>', '&gt;') AS message
@@ -222,6 +226,7 @@ class PostgresSmartBackend implements Backend
                    backlog.bufferid,
                    buffer.buffername,
                    sender.sender,
+                   backlog.type,
                    backlog.time,
                    network.networkname,
                    replace(replace(replace(backlog.message, '&', '&amp;'), '<', '&lt;'), '>', '&gt;') AS message
diff --git a/res/css/_content.sass b/res/css/_content.sass
index 93b6bfe4f4c54cf0780b7852103cce34ebf2039c..9e279a671b2d0281422cb693f5ede47059d59bcd 100644
--- a/res/css/_content.sass
+++ b/res/css/_content.sass
@@ -320,4 +320,25 @@
                 display: inline
 
                 span
-                  vertical-align: top
\ No newline at end of file
+                  vertical-align: top
+          &.action
+            .sender, .content
+              font-style: italic
+
+            .sender
+              &:before
+                content: ' -*- '
+                color: #1a237e
+
+            .content
+              color: #1a237e
+
+          &.notice
+            .content, .sender
+              color: #916409
+
+            .sender
+              &:before
+                content: '['
+              &:after
+                content: ']'
\ No newline at end of file
diff --git a/res/css/search.css b/res/css/search.css
index 03156aadbd698abc4c16603ab493bfba5096c588..b08e97fc3cc8931ea1d03d7d792ae6dacc0dc7dd 100644
--- a/res/css/search.css
+++ b/res/css/search.css
@@ -1188,3 +1188,16 @@ body {
                   display: inline; }
                   .results .buffer .container .context .message .container .content span {
                     vertical-align: top; } }
+          .results .buffer .container .context .message.action .sender, .results .buffer .container .context .message.action .content {
+            font-style: italic; }
+          .results .buffer .container .context .message.action .sender:before {
+            content: ' -*- ';
+            color: #1a237e; }
+          .results .buffer .container .context .message.action .content {
+            color: #1a237e; }
+          .results .buffer .container .context .message.notice .content, .results .buffer .container .context .message.notice .sender {
+            color: #916409; }
+          .results .buffer .container .context .message.notice .sender:before {
+            content: '['; }
+          .results .buffer .container .context .message.notice .sender:after {
+            content: ']'; }
diff --git a/res/js/component/app.js b/res/js/component/app.js
index 457a45ec01acda94b6a8b62353e542b93e63c020..d56ee1cc7001c3434443ac8344c4bf62462c757b 100644
--- a/res/js/component/app.js
+++ b/res/js/component/app.js
@@ -45,7 +45,7 @@ class App {
                 return;
             this.buffers = result.map(buffer => {
                 return new Buffer(buffer.bufferid, buffer.buffername, buffer.networkname, buffer.hasmore, buffer.messages.map(msg => {
-                    return new Context(new Message(msg.messageid, msg.time, msg.sender, msg.message, true));
+                    return new Context(new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message, true));
                 }));
             });
             this.buffers.forEach(buffer => this.insert(buffer));
@@ -99,7 +99,7 @@ class App {
             after: 0,
             before: 10
         })).then(result => {
-            context.loadBefore(result.map(msg => new Message(msg.messageid, msg.time, msg.sender, msg.message)));
+            context.loadBefore(result.map(msg => new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message)));
             context.setLoading(false);
         });
     }
@@ -113,7 +113,7 @@ class App {
             after: 10,
             before: 0
         })).then(result => {
-            context.loadAfter(result.map(msg => new Message(msg.messageid, msg.time, msg.sender, msg.message)));
+            context.loadAfter(result.map(msg => new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message)));
             context.setLoading(false);
         });
     }
@@ -129,8 +129,8 @@ class App {
         })).then(result => {
             const before = result.filter(msg => msg.messageid < context.anchorBefore);
             const after = result.filter(msg => msg.messageid > context.anchorAfter);
-            context.loadBefore(before.map(msg => new Message(msg.messageid, msg.time, msg.sender, msg.message)));
-            context.loadAfter(after.map(msg => new Message(msg.messageid, msg.time, msg.sender, msg.message)));
+            context.loadBefore(before.map(msg => new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message)));
+            context.loadAfter(after.map(msg => new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message)));
             context.setLoading(false);
         });
     }
diff --git a/res/js/component/app.jsx b/res/js/component/app.jsx
index bc70e0278b4621ee56328bd4a9aa73cc0d3fd539..115694d047d04e651e87b2919fe568210d634dde 100644
--- a/res/js/component/app.jsx
+++ b/res/js/component/app.jsx
@@ -49,7 +49,7 @@ class App {
 
             this.buffers = result.map((buffer) => {
                 return new Buffer(buffer.bufferid, buffer.buffername, buffer.networkname, buffer.hasmore, buffer.messages.map((msg) => {
-                    return new Context(new Message(msg.messageid, msg.time, msg.sender, msg.message, true));
+                    return new Context(new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message, true));
                 }));
             });
             this.buffers.forEach((buffer) => this.insert(buffer));
@@ -107,7 +107,7 @@ class App {
             after: 0,
             before: 10
         })).then((result) => {
-            context.loadBefore(result.map((msg) => new Message(msg.messageid, msg.time, msg.sender, msg.message)));
+            context.loadBefore(result.map((msg) => new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message)));
             context.setLoading(false);
         });
     }
@@ -123,7 +123,7 @@ class App {
             after: 10,
             before: 0
         })).then((result) => {
-            context.loadAfter(result.map((msg) => new Message(msg.messageid, msg.time, msg.sender, msg.message)));
+            context.loadAfter(result.map((msg) => new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message)));
             context.setLoading(false);
         });
     }
@@ -142,8 +142,8 @@ class App {
             const before = result.filter((msg) => msg.messageid < context.anchorBefore);
             const after = result.filter((msg) => msg.messageid > context.anchorAfter);
 
-            context.loadBefore(before.map((msg) => new Message(msg.messageid, msg.time, msg.sender, msg.message)));
-            context.loadAfter(after.map((msg) => new Message(msg.messageid, msg.time, msg.sender, msg.message)));
+            context.loadBefore(before.map((msg) => new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message)));
+            context.loadAfter(after.map((msg) => new Message(msg.messageid, msg.type, msg.time, msg.sender, msg.message)));
             context.setLoading(false);
         });
     }
diff --git a/res/js/component/message.js b/res/js/component/message.js
index c6c33a1555e1a8426dd3f09af74bc3f439505f5b..c8501ca84f543d4fb7c76d43672510f656701b65 100644
--- a/res/js/component/message.js
+++ b/res/js/component/message.js
@@ -1,7 +1,8 @@
 class Message extends Component {
-    constructor(id, time, sender, content, isAnchor) {
+    constructor(id, type, time, sender, content, isAnchor) {
         super();
         this.id = id;
+        this.type = type;
         this.time = time;
         this.sender = sender;
         this.content = content;
@@ -9,9 +10,14 @@ class Message extends Component {
         this.render();
     }
     render() {
+        const classes = ['message'];
+        if ((this.type & 2) !== 0)
+            classes.push('notice');
+        if ((this.type & 4) !== 0)
+            classes.push('action');
         return this.elem = function () {
             var $$a = document.createElement('span');
-            $$a.setAttribute('class', 'message');
+            $$a.setAttribute('class', classes.join(' '));
             var $$b = document.createElement('span');
             $$a.appendChild($$b);
             var $$c = document.createElement('time');
diff --git a/res/js/component/message.jsx b/res/js/component/message.jsx
index bb03d6af99361f86e75200b7838530e29eef4da6..cfad04c139ccced2e73937bd5cb05e238e6354cb 100644
--- a/res/js/component/message.jsx
+++ b/res/js/component/message.jsx
@@ -1,8 +1,9 @@
 class Message extends Component {
-    constructor(id, time, sender, content, isAnchor) {
+    constructor(id, type, time, sender, content, isAnchor) {
         super();
 
         this.id = id;
+        this.type = type;
         this.time = time;
         this.sender = sender;
         this.content = content;
@@ -12,8 +13,14 @@ class Message extends Component {
     }
 
     render() {
+        const classes = ["message"];
+        if ((this.type & 0x00000002) !== 0)
+            classes.push("notice");
+        if ((this.type & 0x00000004) !== 0)
+            classes.push("action");
+
         return this.elem = (
-            <span className="message">
+            <span className={classes.join(" ")}>
                 <span><time>{this.formatTime()}</time></span>
                 <span className="container">
                     <span className="sender" data-sendercolor={SenderColorHandler.nickToColor(this.getNick())}>