diff --git a/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb b/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb
index 786485e49..5abf50e18 100644
--- a/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb
+++ b/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb
@@ -4,6 +4,7 @@ Discourse.Emoji = {};
 Discourse.Emoji.ImageVersion = "0"
 
 var emoji = <%= Emoji.standard.map(&:name).flatten.inspect %>;
+var aliases = <%= Emoji.aliases.inspect.gsub("=>", ":") %>;
 
 var extendedEmoji = {};
 Discourse.Dialect.registerEmoji = function(code, url) {
@@ -13,19 +14,19 @@ Discourse.Dialect.registerEmoji = function(code, url) {
 
 Discourse.Emoji.list = function(){
   var list = emoji.slice(0);
+  _.each(aliases, function(v,k){ list.push(k); });
   _.each(extendedEmoji, function(v,k){ list.push(k); });
   return list;
 };
 
 var toSearch;
 
-var search = function(term, options) {
+Discourse.Emoji.search = function(term, options) {
   var maxResults = (options && options["maxResults"]) || -1;
-
-  toSearch = toSearch || emoji.concat(Object.keys(extendedEmoji));
-
   if (maxResults === 0) { return []; }
 
+  toSearch = toSearch || Discourse.Emoji.list();
+
   var i, results = [];
 
   var done = function() {
@@ -51,12 +52,17 @@ var search = function(term, options) {
   return results;
 }
 
-Discourse.Emoji.search = search;
-
 var emojiHash = {};
+// add all default emojis
 emoji.forEach(function(code){ emojiHash[code] = true; });
+// and their aliases
+for (var name in aliases) {
+  aliases[name].forEach(function(alias) {
+    emojiHash[alias] = true;
+  });
+}
 
-var urlFor = function(code) {
+Discourse.Emoji.urlFor = urlFor = function(code) {
   var url, set = Discourse.SiteSettings.emoji_set;
 
   code = code.toLowerCase();
@@ -66,6 +72,7 @@ var urlFor = function(code) {
   }
 
   if(!url && emojiHash.hasOwnProperty(code)) {
+    if (aliases.hasOwnProperty(code)) { code = aliases[code]; }
     url = Discourse.getURL('/images/emoji/' + set + '/' + code + '.png');
   }
 
@@ -80,8 +87,6 @@ var urlFor = function(code) {
   return url;
 }
 
-Discourse.Emoji.urlFor = urlFor;
-
 Discourse.Emoji.exists = function(code){
   code = code.toLowerCase();
   return !!(extendedEmoji.hasOwnProperty(code) || emojiHash.hasOwnProperty(code));
@@ -98,27 +103,27 @@ function imageFor(code) {
 // Also support default emotions
 var translations = {
   ':)'   : 'smile',
-  ':-)'   : 'smile',
+  ':-)'  : 'smile',
   ':('   : 'frowning',
-  ':-('   : 'frowning',
+  ':-('  : 'frowning',
   ';)'   : 'wink',
-  ';-)'   : 'wink',
+  ';-)'  : 'wink',
   ':\'(' : 'cry',
-  ':\'-(' : 'cry',
-  ':-\'(' : 'cry',
+  ':\'-(': 'cry',
+  ':-\'(': 'cry',
   ':p'   : 'stuck_out_tongue',
   ':P'   : 'stuck_out_tongue',
-  ':-P'   : 'stuck_out_tongue',
+  ':-P'  : 'stuck_out_tongue',
   ':O'   : 'open_mouth',
-  ':-O'   : 'open_mouth',
+  ':-O'  : 'open_mouth',
   ':D'   : 'smiley',
-  ':-D'   : 'smiley',
+  ':-D'  : 'smiley',
   ':|'   : 'expressionless',
-  ':-|'   : 'expressionless',
+  ':-|'  : 'expressionless',
   ";P"   : 'stuck_out_tongue_winking_eye',
-  ";-P"   : 'stuck_out_tongue_winking_eye',
+  ";-P"  : 'stuck_out_tongue_winking_eye',
   ":$"   : 'blush',
-  ":-$"   : 'blush'
+  ":-$"  : 'blush'
 };
 
 Discourse.Emoji.translations = translations;
diff --git a/app/models/emoji.rb b/app/models/emoji.rb
index 0ae75aee0..d1dcab4ad 100644
--- a/app/models/emoji.rb
+++ b/app/models/emoji.rb
@@ -27,6 +27,10 @@ class Emoji
     Discourse.cache.fetch("standard_emojis") { load_standard }
   end
 
+  def self.aliases
+    Discourse.cache.fetch("aliases_emojis") { load_aliases }
+  end
+
   def self.custom
     Discourse.cache.fetch("custom_emojis") { load_custom }
   end
@@ -74,6 +78,7 @@ class Emoji
   def self.clear_cache
     Discourse.cache.delete("custom_emojis")
     Discourse.cache.delete("standard_emojis")
+    Discourse.cache.delete("aliases_emojis")
     Discourse.cache.delete("all_emojis")
   end
 
@@ -81,9 +86,21 @@ class Emoji
     "#{Rails.root}/lib/emoji/db.json"
   end
 
+  def self.db
+    @db ||= File.open(db_file, "r:UTF-8") { |f| JSON.parse(f.read) }
+  end
+
   def self.load_standard
-    File.open(db_file, "r:UTF-8") { |f| JSON.parse(f.read) }
-        .map { |emoji| Emoji.create_from_db_item(emoji) }
+    db.map { |emoji| Emoji.create_from_db_item(emoji) }
+  end
+
+  def self.load_aliases
+    aliases = {}
+
+    db.select { |emoji| emoji["aliases"].count > 1 }
+      .each { |emoji| aliases[emoji["aliases"][0]] = emoji["aliases"][1..-1] }
+
+    aliases
   end
 
   def self.load_custom