diff --git a/app/assets/javascripts/gfm_auto_complete.js.coffee b/app/assets/javascripts/gfm_auto_complete.js.coffee
index ffc4c409b5421be9f093f061cc8d219c2447ab70..a7038161668b163c949ba3da3b31d0bf78a054bf 100644
--- a/app/assets/javascripts/gfm_auto_complete.js.coffee
+++ b/app/assets/javascripts/gfm_auto_complete.js.coffee
@@ -1,52 +1,58 @@
 # Creates the variables for setting up GFM auto-completion
 
 window.GitLab ?= {}
-GitLab.GfmAutoComplete ?= {}
-
-# Emoji
-data      = []
-template  = "<li data-value='${insert}'>${name} <img alt='${name}' height='20' src='${image}' width='20' /></li>"
-GitLab.GfmAutoComplete.Emoji = {data, template}
-
-# Team Members
-data      = []
-url     = '';
-params  = {private_token: '', page: 1}
-GitLab.GfmAutoComplete.Members = {data, url, params}
-
-# Add GFM auto-completion to all input fields, that accept GFM input.
-GitLab.GfmAutoComplete.setup = ->
-  input = $('.js-gfm-input')
-
+GitLab.GfmAutoComplete =
   # Emoji
-  input.atWho ':',
-    data: GitLab.GfmAutoComplete.Emoji.data,
-    tpl: GitLab.GfmAutoComplete.Emoji.template
+  Emoji:
+    data: []
+    template: '<li data-value="${insert}">${name} <img alt="${name}" height="20" src="${image}" width="20" /></li>'
 
   # Team Members
-  input.atWho '@', (query, callback) ->
-    (getMoreMembers = ->
-      $.getJSON(GitLab.GfmAutoComplete.Members.url, GitLab.GfmAutoComplete.Members.params)
-        .success (members) ->
-          # pick the data we need
-          newMembersData = $.map(members, (m) -> m.name )
-
-          # add the new page of data to the rest
-          $.merge(GitLab.GfmAutoComplete.Members.data, newMembersData)
-
-          # show the pop-up with a copy of the current data
-          callback(GitLab.GfmAutoComplete.Members.data[..])
-
-          # are we past the last page?
-          if newMembersData.length is 0
-            # set static data and stop callbacks
-            input.atWho '@',
-              data: GitLab.GfmAutoComplete.Members.data
-              callback: null
-          else
-            # get next page
-            getMoreMembers()
-
-      # so the next request gets the next page
-      GitLab.GfmAutoComplete.Members.params.page += 1
-    ).call()
+  Members:
+    data: []
+    url: ''
+    params:
+      private_token: ''
+      page: 1
+    template: '<li data-value="${username}">${username} <small>${name}</small></li>'
+
+  # Add GFM auto-completion to all input fields, that accept GFM input.
+  setup: ->
+    input = $('.js-gfm-input')
+
+    # Emoji
+    input.atWho ':',
+      data: @Emoji.data
+      tpl: @Emoji.template
+
+    # Team Members
+    input.atWho '@',
+      tpl: @Members.template
+      callback: (query, callback) =>
+        (getMoreMembers = =>
+          $.getJSON(@Members.url, @Members.params).done (members) =>
+            # pick the data we need
+            newMembersData = $.map(members, (m) ->
+              username: m.username
+              name: m.name
+            )
+
+            # add the new page of data to the rest
+            $.merge(@Members.data, newMembersData)
+
+            # show the pop-up with a copy of the current data
+            callback(@Members.data[..])
+
+            # are we past the last page?
+            if newMembersData.length is 0
+              # set static data and stop callbacks
+              input.atWho '@',
+                data: @Members.data
+                callback: null
+            else
+              # get next page
+              getMoreMembers()
+
+          # so the next callback requests the next page
+          @Members.params.page += 1
+        ).call()
diff --git a/doc/api/issues.md b/doc/api/issues.md
index aaad33054896f8a10b1a714dfc86c65c13159a1a..4c0dde2f4e4173ab77836c4a0e8acd06dc36af89 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -18,6 +18,7 @@ GET /issues
     "assignee": null,
     "author": {
       "id": 1,
+      "username": "john_smith",
       "email": "john@example.com",
       "name": "John Smith",
       "blocked": false,
@@ -46,6 +47,7 @@ GET /issues
     },
     "assignee": {
       "id": 2,
+      "username": "jack_smith",
       "email": "jack@example.com",
       "name": "Jack Smith",
       "blocked": false,
@@ -53,6 +55,7 @@ GET /issues
     },
     "author": {
       "id": 1,
+      "username": "john_smith",
       "email": "john@example.com",
       "name": "John Smith",
       "blocked": false,
@@ -110,6 +113,7 @@ Parameters:
   },
   "assignee": {
     "id": 2,
+    "username": "jack_smith",
     "email": "jack@example.com",
     "name": "Jack Smith",
     "blocked": false,
@@ -117,6 +121,7 @@ Parameters:
   },
   "author": {
     "id": 1,
+    "username": "john_smith",
     "email": "john@example.com",
     "name": "John Smith",
     "blocked": false,
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index e5b067a61d949715ffd7f7e14f54bb9588fb0b87..86bd79ff43aeab2519d55ae4d343090bf1fef8b7 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -22,6 +22,7 @@ Parameters:
         "merged":false,
         "author":{
             "id":1,
+            "username": "admin",
             "email":"admin@local.host",
             "name":"Administrator",
             "blocked":false,
@@ -29,6 +30,7 @@ Parameters:
         },
         "assignee":{
             "id":1,
+            "username": "admin",
             "email":"admin@local.host",
             "name":"Administrator",
             "blocked":false,
@@ -62,6 +64,7 @@ Parameters:
     "merged":false,
     "author":{
         "id":1,
+        "username": "admin",
         "email":"admin@local.host",
         "name":"Administrator",
         "blocked":false,
@@ -69,6 +72,7 @@ Parameters:
     },
     "assignee":{
         "id":1,
+        "username": "admin",
         "email":"admin@local.host",
         "name":"Administrator",
         "blocked":false,
@@ -105,6 +109,7 @@ Parameters:
     "merged":false,
     "author":{
         "id":1,
+        "username": "admin",
         "email":"admin@local.host",
         "name":"Administrator",
         "blocked":false,
@@ -112,6 +117,7 @@ Parameters:
     },
     "assignee":{
         "id":1,
+        "username": "admin",
         "email":"admin@local.host",
         "name":"Administrator",
         "blocked":false,
@@ -150,6 +156,7 @@ Parameters:
     "merged":false,
     "author":{
         "id":1,
+        "username": "admin",
         "email":"admin@local.host",
         "name":"Administrator",
         "blocked":false,
@@ -157,6 +164,7 @@ Parameters:
     },
     "assignee":{
         "id":1,
+        "username": "admin",
         "email":"admin@local.host",
         "name":"Administrator",
         "blocked":false,
@@ -184,6 +192,7 @@ Will return created note with status `201 Created` on success, or `404 Not found
 {
     "author":{
         "id":1,
+        "username": "admin",
         "email":"admin@local.host",
         "name":"Administrator",
         "blocked":false,
diff --git a/doc/api/notes.md b/doc/api/notes.md
index 7b226dea44c6b52fdf1771321717e688d9c14dfb..dddb55edb936e6a5da116a3465469526915f553e 100644
--- a/doc/api/notes.md
+++ b/doc/api/notes.md
@@ -15,6 +15,7 @@ GET /projects/:id/notes
     "body": "The solution is rather tricky",
     "author": {
       "id": 1,
+      "username": "john_smith",
       "email": "john@example.com",
       "name": "John Smith",
       "blocked": false,
diff --git a/doc/api/projects.md b/doc/api/projects.md
index fdedf904a3a50a71d9a8dfa3de1ebd6de8916372..fac4107fd93c3854437afea93841ed662fa05e4c 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -17,6 +17,7 @@ GET /projects
     "default_branch": "master",
     "owner": {
       "id": 1,
+      "username": "john_smith",
       "email": "john@example.com",
       "name": "John Smith",
       "blocked": false,
@@ -38,6 +39,7 @@ GET /projects
     "default_branch": "api",
     "owner": {
       "id": 1,
+      "username": "john_smith",
       "email": "john@example.com",
       "name": "John Smith",
       "blocked": false,
@@ -75,6 +77,7 @@ Parameters:
   "default_branch": "api",
   "owner": {
     "id": 1,
+    "username": "john_smith",
     "email": "john@example.com",
     "name": "John Smith",
     "blocked": false,
@@ -141,6 +144,7 @@ Parameters:
 {
 
   "id": 1,
+  "username": "john_smith",
   "email": "john@example.com",
   "name": "John Smith",
   "blocked": false,
diff --git a/doc/api/session.md b/doc/api/session.md
index 9fdbeb439a4047c52c84a9b0702e23d7386f65ef..c7e57aaca7a896b62a769ad5c31bea51060e7b4a 100644
--- a/doc/api/session.md
+++ b/doc/api/session.md
@@ -13,6 +13,7 @@ Parameters:
 ```json
 {
   "id": 1,
+  "username": "john_smith",
   "email": "john@example.com",
   "name": "John Smith",
   "private_token": "dd34asd13as",
diff --git a/doc/api/snippets.md b/doc/api/snippets.md
index 288fd5296f672638cf324242c8a88ecfc42f81a3..b9638ea8291e962b4b6179d8884881125f9e728a 100644
--- a/doc/api/snippets.md
+++ b/doc/api/snippets.md
@@ -30,6 +30,7 @@ Parameters:
   "file_name": "add.rb",
   "author": {
     "id": 1,
+    "username": "john_smith",
     "email": "john@example.com",
     "name": "John Smith",
     "blocked": false,
diff --git a/doc/api/users.md b/doc/api/users.md
index e5674ab8463321f9e574da1ead4e75888088d9d5..200c0e06e0469cbccf76c19341be138619a75a07 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -10,6 +10,7 @@ GET /users
 [
   {
     "id": 1,
+    "username": "john_smith",
     "email": "john@example.com",
     "name": "John Smith",
     "blocked": false,
@@ -23,6 +24,7 @@ GET /users
   },
   {
     "id": 2,
+    "username": "jack_smith",
     "email": "jack@example.com",
     "name": "Jack Smith",
     "blocked": false,
@@ -52,6 +54,7 @@ Parameters:
 ```json
 {
   "id": 1,
+  "username": "john_smith",
   "email": "john@example.com",
   "name": "John Smith",
   "blocked": false,
@@ -75,6 +78,7 @@ POST /users
 Parameters:
 + `email` (required)                  - Email
 + `password` (required)               - Password
++ `username` (required)               - Username
 + `name` (required)                   - Name
 + `skype`                             - Skype ID
 + `linkedin`                          - Linkedin
@@ -95,6 +99,7 @@ GET /user
 ```json
 {
   "id": 1,
+  "username": "john_smith",
   "email": "john@example.com",
   "name": "John Smith",
   "blocked": false,
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 9e9d44594a292e838c0e63cae923e530f79380c2..070fbad27ed146da09b20ab784e71e74468b9152 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -1,12 +1,12 @@
 module Gitlab
   module Entities
     class User < Grape::Entity
-      expose :id, :email, :name, :bio, :skype, :linkedin, :twitter,
+      expose :id, :username, :email, :name, :bio, :skype, :linkedin, :twitter,
              :dark_scheme, :theme_id, :blocked, :created_at
     end
 
     class UserBasic < Grape::Entity
-      expose :id, :email, :name, :blocked, :created_at
+      expose :id, :username, :email, :name, :blocked, :created_at
     end
 
     class UserLogin < UserBasic