diff --git a/CHANGELOG b/CHANGELOG
index 1e8fb67032529d065be5131238105ee2215b1fa0..1ab1310c62efd1cf3637154c0822f0fc403fe503 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,7 @@ v 8.3.0 (unreleased)
   - Fix: Assignee selector is empty when 'Unassigned' is selected (Jose Corcuera)
   - Fix 500 error when update group member permission
   - Trim leading and trailing whitespace of milestone and issueable titles (Jose Corcuera)
+  - Fire update hook from GitLab
 
 v 8.2.2
   - Fix 404 in redirection after removing a project (Stan Hu)
diff --git a/app/models/repository.rb b/app/models/repository.rb
index c1836103463dea855aea625d94de36d29e9c583b..d247b0f50124b98405277b626dee258f6bc24898 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -571,9 +571,13 @@ class Repository
 
     # Run GitLab pre-receive hook
     pre_receive_hook = Gitlab::Git::Hook.new('pre-receive', path_to_repo)
-    status = pre_receive_hook.trigger(gl_id, oldrev, newrev, ref)
+    pre_receive_hook_status = pre_receive_hook.trigger(gl_id, oldrev, newrev, ref)
 
-    if status
+    # Run GitLab update hook
+    update_hook = Gitlab::Git::Hook.new('update', path_to_repo)
+    update_hook_status = update_hook.trigger(gl_id, oldrev, newrev, ref)
+
+    if pre_receive_hook_status && update_hook_status
       if was_empty
         # Create branch
         rugged.references.create(ref, newrev)
@@ -596,7 +600,7 @@ class Repository
       # Remove tmp ref and return error to user
       rugged.references.delete(tmp_ref)
 
-      raise PreReceiveError.new('Commit was rejected by pre-receive hook')
+      raise PreReceiveError.new('Commit was rejected by git hook')
     end
   end
 
diff --git a/lib/gitlab/git/hook.rb b/lib/gitlab/git/hook.rb
index dd393fe09d201e8739e3fc5224061565fb36a844..07b856ca64cffec10fa8922eacf8a337bdca17d7 100644
--- a/lib/gitlab/git/hook.rb
+++ b/lib/gitlab/git/hook.rb
@@ -16,6 +16,17 @@ module Gitlab
       def trigger(gl_id, oldrev, newrev, ref)
         return true unless exists?
 
+        case name
+        when "pre-receive", "post-receive"
+          call_receive_hook(gl_id, oldrev, newrev, ref)
+        when "update"
+          call_update_hook(gl_id, oldrev, newrev, ref)
+        end
+      end
+
+      private
+
+      def call_receive_hook(gl_id, oldrev, newrev, ref)
         changes = [oldrev, newrev, ref].join(" ")
 
         # function  will return true if succesful
@@ -54,6 +65,12 @@ module Gitlab
 
         exit_status
       end
+
+      def call_update_hook(gl_id, oldrev, newrev, ref)
+        Dir.chdir(repo_path) do
+          system({ 'GL_ID' => gl_id }, path, ref, oldrev, newrev)
+        end
+      end
     end
   end
 end