diff --git a/CHANGELOG b/CHANGELOG
index 1d1c6d26e11a9a52aa373e41e9e19ce70a6781c3..cc287b670639fcb307b54e73191af0472b769d62 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ v 7.5.0
   - Fix LDAP config lookup for provider 'ldap'
   - Add Atlassian Bamboo CI service (Drew Blessing)
   - Mentioned @user will receive email even if he is not participating in issue or commit
+  - Tie up loose ends with annotated tags: API & UI (Sean Edge)
 
 v 7.4.2
   - Fix internal snippet exposing for unauthenticated users
diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml
index c415ae2ddc8fa798700365edecc5d93116613218..bf7770ceedf5e0aca531f9ca42ee79d15f5cd189 100644
--- a/app/views/projects/diffs/_file.html.haml
+++ b/app/views/projects/diffs/_file.html.haml
@@ -10,7 +10,10 @@
         - if @commit.parent_ids.present?
           = view_file_btn(@commit.parent_id, diff_file, project)
     - else
-      %span= diff_file.new_path
+      - if diff_file.renamed_file
+        %span= "#{diff_file.old_path} renamed to #{diff_file.new_path}"
+      - else
+        %span= diff_file.new_path
       - if diff_file.mode_changed?
         %span.file-mode= "#{diff_file.diff.a_mode} → #{diff_file.diff.b_mode}"
 
diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml
index bce105a033bf631a5135080619d7a43f92013228..f93c1b4211fd5c9693e2ff63c127b846dd9ec1e7 100644
--- a/app/views/projects/tags/_tag.html.haml
+++ b/app/views/projects/tags/_tag.html.haml
@@ -4,6 +4,9 @@
     = link_to project_commits_path(@project, tag.name), class: "" do
       %i.fa.fa-tag
       = tag.name
+    - if tag.message.present?
+       
+      = tag.message
     .pull-right
       - if can? current_user, :download_code, @project
         = render 'projects/repositories/download_archive', ref: tag.name, btn_class: 'btn-grouped btn-group-small'
diff --git a/doc/api/repositories.md b/doc/api/repositories.md
index a412f60c0d9769b9568f6a1abbfac519a1fb9d4b..8acf85d21c81a927470831f3df9257e630776fd6 100644
--- a/doc/api/repositories.md
+++ b/doc/api/repositories.md
@@ -56,6 +56,7 @@ Parameters:
 [
   {
     "name": "v1.0.0",
+    "message": "Release 1.0.0",
     "commit": {
       "id": "2695effb5807a22ff3d138d593fd856244e155e7",
       "parents": [],
@@ -67,10 +68,11 @@ Parameters:
       "committed_date": "2012-05-28T04:42:42-07:00",
       "committer_email": "jack@example.com"
     },
-    "protected": false
   }
 ]
 ```
+The message will be `nil` when creating a lightweight tag otherwise
+it will contain the annotation.
 
 It returns 200 if the operation succeed. In case of an error,
 405 with an explaining error message is returned.
diff --git a/doc/install/installation.md b/doc/install/installation.md
index ac6535b0c8633cb5734bf492038edadf4d3b091d..b5f54ff9b286236966ce873112f956d039c3c103 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -76,6 +76,7 @@ Is the system packaged Git too old? Remove it and compile from source.
     cd /tmp
     curl -L --progress https://www.kernel.org/pub/software/scm/git/git-2.1.2.tar.gz | tar xz
     cd git-2.1.2/
+    ./configure
     make prefix=/usr/local all
 
     # Install into /usr/local/bin
@@ -91,7 +92,7 @@ Then select 'Internet Site' and press enter to confirm the hostname.
 
 ## 2. Ruby
 
-The use of ruby version managers such as [RVM](http://rvm.io/), [rbenv](https://github.com/sstephenson/rbenv) or [chruby](https://github.com/postmodern/chruby) with GitLab in production frequently leads to hard to diagnose problems. For example, GitLab Shell is called from OpenSSH and having a version manager can prevent pushing and pulling over SSH. Version managers are not supported and we strongly advise everyone to follow the instructions below to use a system ruby.
+The use of Ruby version managers such as [RVM](http://rvm.io/), [rbenv](https://github.com/sstephenson/rbenv) or [chruby](https://github.com/postmodern/chruby) with GitLab in production frequently leads to hard to diagnose problems. For example, GitLab Shell is called from OpenSSH and having a version manager can prevent pushing and pulling over SSH. Version managers are not supported and we strongly advise everyone to follow the instructions below to use a system Ruby.
 
 Remove the old Ruby 1.8 if present
 
diff --git a/doc/update/6.x-or-7.x-to-7.3.md b/doc/update/6.x-or-7.x-to-7.3.md
index 66853634d38b4cf5200e5fa46b0485d71fe8c684..ae086cc44350443d8fe4e1fa40540c6f98755407 100644
--- a/doc/update/6.x-or-7.x-to-7.3.md
+++ b/doc/update/6.x-or-7.x-to-7.3.md
@@ -267,6 +267,7 @@ mysql> \q
 #   Set production -> username: git
 #   Set production -> password: the password your replaced $password with earlier
 sudo -u git -H editor /home/git/gitlab/config/database.yml
+```
 
 ## Things went south? Revert to previous version (6.0)
 
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 80e9470195ed4dc1059bc70e9bd155d044a10ef9..d19caf5b23aa53cb99222dc8e30f1d440fe8102a 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -73,6 +73,25 @@ module API
       end
     end
 
+    class RepoTag < Grape::Entity
+      expose :name
+      expose :message do |repo_obj, _options|
+        if repo_obj.respond_to?(:message)
+          repo_obj.message
+        else
+          nil
+        end
+      end
+
+      expose :commit do |repo_obj, options|
+        if repo_obj.respond_to?(:commit)
+          repo_obj.commit
+        elsif options[:project]
+          options[:project].repository.commit(repo_obj.target)
+        end
+      end
+    end
+
     class RepoObject < Grape::Entity
       expose :name
 
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index 626d99c26491201f4b6712848726fae6ea248128..a1a7721b28894cd542d87728fa90bafd4eb0dfd6 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -23,7 +23,8 @@ module API
       # Example Request:
       #   GET /projects/:id/repository/tags
       get ":id/repository/tags" do
-        present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject, project: user_project
+        present user_project.repo.tags.sort_by(&:name).reverse,
+                with: Entities::RepoTag, project: user_project
       end
 
       # Create tag
@@ -43,7 +44,7 @@ module API
 
         if result[:status] == :success
           present result[:tag],
-                  with: Entities::RepoObject,
+                  with: Entities::RepoTag,
                   project: user_project
         else
           render_api_error!(result[:message], 400)
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index 6e54839b67777de7fea1a7a327bd9dd5606a289e..dd7a0fc6cc8e88a76937cf480cfd04277ea286de 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -34,21 +34,24 @@ describe API::API, api: true  do
       end
     end
 
-    # TODO: fix this test for CI
-    #context 'annotated tag' do
-      #it 'should create a new annotated tag' do
-        #post api("/projects/#{project.id}/repository/tags", user),
-             #tag_name: 'v7.1.0',
-             #ref: 'master',
-             #message: 'tag message'
-
-        #response.status.should == 201
-        #json_response['name'].should == 'v7.1.0'
-        # The message is not part of the JSON response.
-        # Additional changes to the gitlab_git gem may be required.
-        # json_response['message'].should == 'tag message'
-      #end
-    #end
+    context 'annotated tag' do
+      it 'should create a new annotated tag' do
+        # Identity must be set in .gitconfig to create annotated tag.
+        repo_path = File.join(Gitlab.config.gitlab_shell.repos_path,
+                              project.path_with_namespace + '.git')
+        system(*%W(git --git-dir=#{repo_path} config user.name #{user.name}))
+        system(*%W(git --git-dir=#{repo_path} config user.email #{user.email}))
+
+        post api("/projects/#{project.id}/repository/tags", user),
+             tag_name: 'v7.1.0',
+             ref: 'master',
+             message: 'Release 7.1.0'
+
+        response.status.should == 201
+        json_response['name'].should == 'v7.1.0'
+        json_response['message'].should == 'Release 7.1.0'
+      end
+    end
 
     it 'should deny for user without push access' do
       post api("/projects/#{project.id}/repository/tags", user2),