diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js
index 1c083db60f5..77b1dd3aef0 100644
--- a/app/assets/javascripts/discourse/models/user.js
+++ b/app/assets/javascripts/discourse/models/user.js
@@ -370,6 +370,7 @@ Discourse.User = Discourse.Model.extend({
         var stat = Em.Object.create(s);
         stat.set('isPM', stat.get('action_type') === Discourse.UserAction.NEW_PRIVATE_MESSAGE ||
                          stat.get('action_type') === Discourse.UserAction.GOT_PRIVATE_MESSAGE);
+        stat.set('description', Em.String.i18n('user_action_groups.' + stat.get('action_type')));
         return stat;
       }));
 
@@ -429,7 +430,7 @@ Discourse.User.reopenClass({
           found = true;
           if (!g[k]) {
             g[k] = Em.Object.create({
-              description: Em.String.i18n("user_action_descriptions." + k),
+              description: Em.String.i18n("user_action_groups." + k),
               count: 0,
               action_type: parseInt(k, 10)
             });
diff --git a/app/assets/javascripts/discourse/models/user_action.js b/app/assets/javascripts/discourse/models/user_action.js
index 207bf362e66..bfbc159392f 100644
--- a/app/assets/javascripts/discourse/models/user_action.js
+++ b/app/assets/javascripts/discourse/models/user_action.js
@@ -8,6 +8,77 @@
 **/
 Discourse.UserAction = Discourse.Model.extend({
 
+  descriptionHtml: (function() {
+    var action = this.get('action_type');
+    var ua = Discourse.UserAction;
+    var actions = [ua.LIKE, ua.WAS_LIKED, ua.STAR, ua.EDIT, ua.BOOKMARK, ua.GOT_PRIVATE_MESSAGE, ua.NEW_PRIVATE_MESSAGE];
+    var icon = "";
+    var sentence = "";
+    var sameUser = (this.get('username') === Discourse.get('currentUser.username'));
+
+    if (action === null || actions.indexOf(action) >= 0) {
+      if (this.get('isPM')) {
+        icon = '<i class="icon icon-envelope-alt" title="{{i18n user.stream.private_message}}"></i>';
+        if (sameUser) {
+          sentence = Em.String.i18n('user_action.sent_by_you', { userUrl: this.get('userUrl') });
+        } else {
+          sentence = Em.String.i18n('user_action.sent_by_user', { user: this.get('name'), userUrl: this.get('userUrl') });
+        }
+      } else {
+        if (sameUser) {
+          sentence = Em.String.i18n('user_action.posted_by_you', { userUrl: this.get('userUrl') });
+        } else {
+          sentence = Em.String.i18n('user_action.posted_by_user', { user: this.get('name'), userUrl: this.get('userUrl') });
+        }
+      }
+    } else if (action === ua.NEW_TOPIC) {
+      if (sameUser) {
+        sentence = Em.String.i18n('user_action.you_posted_topic', { userUrl: this.get('userUrl'), topicUrl: this.get('replyUrl') });
+      } else {
+        sentence = Em.String.i18n('user_action.user_posted_topic', { user: this.get('name'), userUrl: this.get('userUrl'), topicUrl: this.get('replyUrl') });
+      }
+    } else if (action === ua.POST || action === ua.RESPONSE) {
+      if (this.get('reply_to_post_number')) {
+        if (sameUser) {
+          sentence = Em.String.i18n('user_action.you_replied_to_post', { post_number: '#' + this.get('reply_to_post_number'),
+              userUrl: this.get('userUrl'), postUrl: this.get('postUrl') });
+        } else {
+          sentence = Em.String.i18n('user_action.user_replied_to_post', { user: this.get('name'),
+              post_number: '#' + this.get('reply_to_post_number'), userUrl: this.get('userUrl'), postUrl: this.get('postUrl') });
+        }
+      } else {
+        if (sameUser) {
+          sentence = Em.String.i18n('user_action.you_replied_to_topic', { userUrl: this.get('userUrl'),
+              topicUrl: this.get('replyUrl') });
+        } else {
+          sentence = Em.String.i18n('user_action.user_replied_to_topic', { user: this.get('name'),
+              userUrl: this.get('userUrl'), topicUrl: this.get('replyUrl') });
+        }
+      }
+    } else if (action === ua.MENTION) {
+      if (sameUser) {
+        sentence = Em.String.i18n('user_action.you_mentioned_user', { user: this.get('target_name'),
+            user1Url: this.get('userUrl'), user2Url: this.get('targetUserUrl') });
+      } else {
+        if (this.get('target_username') === Discourse.get('currentUser.username')) {
+          sentence = Em.String.i18n('user_action.user_mentioned_you', { user: this.get('name'),
+              user1Url: this.get('userUrl'), user2Url: this.get('targetUserUrl') });
+        } else {
+          sentence = Em.String.i18n('user_action.user_mentioned_user', { user: this.get('name'),
+              another_user: this.get('target_name'), user1Url: this.get('userUrl'), user2Url: this.get('targetUserUrl') });
+        }
+      }
+    } else {
+      Ember.debug("Invalid user action: " + action);
+    }
+
+    return new Handlebars.SafeString(icon + " " + sentence);
+  }).property(),
+
+  targetUserUrl: (function() {
+    return Discourse.Utilities.userUrl(this.get('target_username'));
+  }).property(),
+
   userUrl: (function() {
     return Discourse.Utilities.userUrl(this.get('username'));
   }).property(),
diff --git a/app/assets/javascripts/discourse/templates/user/stream.js.handlebars b/app/assets/javascripts/discourse/templates/user/stream.js.handlebars
index 4c53bfb4830..af55af78c54 100644
--- a/app/assets/javascripts/discourse/templates/user/stream.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/user/stream.js.handlebars
@@ -7,31 +7,7 @@
         <span class="title">
           <a href="{{unbound postUrl}}">{{unbound title}}</a>
         </span>
-        {{#unless description}}
-          <span class="type">
-          {{#if isPM}}
-            <i class="icon icon-envelope-alt" title="{{i18n user.stream.private_message}}"></i>
-            {{i18n user.stream.sent_by}}
-          {{else}}
-            {{i18n user.stream.posted_by}}
-          {{/if}}
-          </span>
-        {{/unless}}
-        <a class='name' href="{{unbound userUrl}}">{{personalizedName name usernamePath="username"}}</a>
-        {{#if description}}
-          <span class='type'>{{unbound description}}</span>
-          {{#if isPostAction}}
-            <a class="post-number" href="{{unbound replyUrl}}">
-            {{#if reply_to_post_number}}
-              #{{unbound reply_to_post_number}}
-            {{else}}
-              {{i18n user.stream.the_topic}}
-            {{/if}}
-            </a>
-          {{else}}
-            <span class="name">{{personalizedName view.parentView.parentView.user.name usernamePath="view.parentView.parentView.user.username"}}</span>
-          {{/if}}
-        {{/if}}
+        <span class="type">{{unbound descriptionHtml}}</span>
       </div>
       <p class='excerpt'>
       {{{unbound excerpt}}}
diff --git a/app/models/user_action.rb b/app/models/user_action.rb
index 17813b942b8..e007962e9fa 100644
--- a/app/models/user_action.rb
+++ b/app/models/user_action.rb
@@ -36,7 +36,7 @@ class UserAction < ActiveRecord::Base
   ].each_with_index.to_a.flatten]
 
   def self.stats(user_id, guardian)
-    results = UserAction.select("action_type, COUNT(*) count, '' AS description")
+    results = UserAction.select("action_type, COUNT(*) count")
       .joins(:target_topic)
       .where(user_id: user_id)
       .group('action_type')
@@ -57,9 +57,6 @@ class UserAction < ActiveRecord::Base
     results = results.to_a
 
     results.sort! { |a,b| ORDER[a.action_type] <=> ORDER[b.action_type] }
-    results.each do |row|
-      row.description = self.description(row.action_type, detailed: true)
-    end
 
     results
   end
@@ -83,6 +80,7 @@ class UserAction < ActiveRecord::Base
     builder = SqlBuilder.new("
 SELECT
   t.title, a.action_type, a.created_at, t.id topic_id,
+  a.user_id AS target_user_id, au.name AS target_name, au.username AS target_username,
   coalesce(p.post_number, 1) post_number,
   p.reply_to_post_number,
   pu.email ,pu.username, pu.name, pu.id user_id,
@@ -94,6 +92,7 @@ LEFT JOIN posts p on p.id = a.target_post_id
 JOIN posts p2 on p2.topic_id = a.target_topic_id and p2.post_number = 1
 JOIN users u on u.id = a.acting_user_id
 JOIN users pu on pu.id = COALESCE(p.user_id, t.user_id)
+JOIN users au on au.id = a.user_id
 /*where*/
 /*order_by*/
 /*offset*/
@@ -126,7 +125,6 @@ JOIN users pu on pu.id = COALESCE(p.user_id, t.user_id)
 
     data.each do |row|
       row["action_type"] = row["action_type"].to_i
-      row["description"] = self.description(row["action_type"])
       row["created_at"] = DateTime.parse(row["created_at"])
       # we should probably cache the excerpts in the db at some point
       row["excerpt"] = PrettyText.excerpt(row["cooked"],300) if row["cooked"]
@@ -141,60 +139,6 @@ JOIN users pu on pu.id = COALESCE(p.user_id, t.user_id)
     data
   end
 
-  def self.description(row, opts = {})
-    t = I18n.t('user_action_descriptions')
-    if opts[:detailed]
-      # will localize as soon as we stablize the names here
-      desc = case row.to_i
-      when BOOKMARK
-        t[:bookmarks]
-      when NEW_TOPIC
-        t[:topics]
-      when WAS_LIKED
-        t[:likes_received]
-      when LIKE
-        t[:likes_given]
-      when RESPONSE
-        t[:responses]
-      when POST
-        t[:posts]
-      when MENTION
-        t[:mentions]
-      when QUOTE
-        t[:quotes]
-      when EDIT
-        t[:edits]
-      when STAR
-        t[:favorites]
-      when NEW_PRIVATE_MESSAGE
-        t[:sent_items]
-      when GOT_PRIVATE_MESSAGE
-        t[:inbox]
-      end
-    else
-      desc =
-      case row.to_i
-      when NEW_TOPIC
-        then t[:posted]
-      when LIKE,WAS_LIKED
-        then t[:liked]
-      when RESPONSE,POST
-        then t[:responded_to]
-      when BOOKMARK
-        then t[:bookmarked]
-      when MENTION
-        then t[:mentioned]
-      when QUOTE
-        then t[:quoted]
-      when STAR
-        then t[:favorited]
-      when EDIT
-        then t[:edited]
-      end
-    end
-    desc
-  end
-
   def self.log_action!(hash)
     require_parameters(hash, :action_type, :user_id, :acting_user_id, :target_topic_id, :target_post_id)
     transaction(requires_new: true) do
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 1711431db7c..e1d20ea0ed7 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -49,8 +49,36 @@ en:
     saving: "Saving..."
     saved: "Saved!"
 
-    user_action_descriptions:
+    user_action:
+      user_posted_topic: "<a href='{{userUrl}}'>{{user}}</a> posted <a href='{{topicUrl}}'>the topic</a>"
+      you_posted_topic: "<a href='{{userUrl}}'>You</a> posted <a href='{{topicUrl}}'>the topic</a>"
+      user_replied_to_post: "<a href='{{userUrl}}'>{{user}}</a> replied to <a href='{{postUrl}}'>{{post_number}}</a>"
+      you_replied_to_post: "<a href='{{userUrl}}'>You</a> replied to <a href='{{postUrl}}'>{{post_number}}</a>"
+      user_replied_to_topic: "<a href='{{userUrl}}'>{{user}}</a> replied to <a href='{{topicUrl}}'>the topic</a>"
+      you_replied_to_topic: "<a href='{{userUrl}}'>You</a> replied to <a href='{{topicUrl}}'>the topic</a>"
+
+      user_mentioned_user: "<a href='{{user1Url}}'>{{user}}</a> mentioned <a href='{{user2Url}}'>{{another_user}}</a>"
+      user_mentioned_you: "<a href='{{user1Url}}'>{{user}}</a> mentioned <a href='{{user2Url}}'>you</a>"
+      you_mentioned_user: "<a href='{{user1Url}}'>You</a> mentioned <a href='{{user2Url}}'>{{user}}</a>"
+
+      posted_by_user: "Posted by <a href='{{userUrl}}'>{{user}}</a>"
+      posted_by_you: "Posted by <a href='{{userUrl}}'>you</a>"
+      sent_by_user: "Sent by <a href='{{userUrl}}'>{{user}}</a>"
+      sent_by_you: "Sent by <a href='{{userUrl}}'>you</a>"
+
+    user_action_groups:
+      "1": "Likes Given"
+      "2": "Likes Received"
+      "3": "Bookmarks"
+      "4": "Topics"
+      "5": "Posts"
       "6": "Responses"
+      "7": "Mentions"
+      "9": "Quotes"
+      "10": "Favorites"
+      "11": "Edits"
+      "12": "Sent Items"
+      "13": "Inbox"
 
     user:
       information: "User Information"
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index c0befed9041..0d0a3972a10 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -544,31 +544,6 @@ en:
   most_recent_poster: "Most Recent Poster"
   frequent_poster: "Frequent Poster"
 
-  user_action_descriptions:
-    bookmarks: "Bookmarks"
-    topics: "Topics"
-    likes_received: "Likes Received"
-    likes_given: "Likes Given"
-    responses: "Responses"
-    topic_responses: "Topic Responses"
-    posts: "Posts"
-    mentions: "Mentions"
-    quotes: "Quotes"
-    edits: "Edits"
-    favorites: "Favorites"
-    sent_items: "Sent Items"
-    inbox: "Inbox"
-
-    was_liked: "was liked"
-    liked: "liked"
-    bookmarked: "bookmarked"
-    posted: "posted"
-    responded_to: "replied to"
-    mentioned: "mentioned"
-    quoted: "quoted"
-    favorited: "favorited"
-    edited: "edited"
-
   move_posts:
     moderator_post:
       one: "I moved a post to a new topic: %{topic_link}"