diff --git a/CHANGELOG b/CHANGELOG
index e14255ee9b2fffc486572ff2e72009c31a85742b..16ed0470f8eb8e4a8661feeb77d1424b468278f5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -55,6 +55,7 @@ v 7.14.0 (unreleased)
   - Fix bug causing error when the target branch of a symbolic ref was deleted
   - Include branch/tag name in archive file and directory name
   - Add dropzone upload progress
+  - Add a label for merged branches on branches page (Florent Baldino)
 
 v 7.13.3
   - Fix bug causing Bitbucket importer to crash when OAuth application had been removed.
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 0a62980f93a1b528ad39897c94691bd9be70ba5a..3bba3ca888a8b49453389cbddfe9403596c052dd 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -364,6 +364,17 @@ class Repository
     @root_ref ||= raw_repository.root_ref
   end
 
+  def merged_to_root_ref?(branch_name)
+    branch_commit = commit(branch_name)
+    root_ref_commit = commit(root_ref)
+
+    if branch_commit
+      rugged.merge_base(root_ref_commit.id, branch_commit.id) == branch_commit.id
+    else
+      nil
+    end
+  end
+
   def search_files(query, ref)
     offset = 2
     args = %W(git grep -i -n --before-context #{offset} --after-context #{offset} #{query} #{ref || root_ref})
diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml
index 43412624da698af4b1797a061fb3ff423576b6e9..a693c4b282f06504199e9fc4cc0b1ae27413dfce 100644
--- a/app/views/projects/branches/_branch.html.haml
+++ b/app/views/projects/branches/_branch.html.haml
@@ -5,6 +5,11 @@
       %strong.str-truncated= branch.name
       - if branch.name == @repository.root_ref
         %span.label.label-info default
+      - elsif @repository.merged_to_root_ref? branch.name
+        %span.label.label-primary.has_tooltip(title="Merged into #{@repository.root_ref}")
+          %i.fa.fa-check
+          merged
+
       - if @project.protected_branch? branch.name
         %span.label.label-success
           %i.fa.fa-lock
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 0927cde61a6232bd61eb8aa882f576548b9430c8..8e2849691ff0573eacea42e73f1acb4c8bfb6608 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -34,6 +34,26 @@ describe Repository do
     end
   end
 
+  describe :merged_to_root_ref? do
+    context 'merged branch' do
+      subject { repository.merged_to_root_ref?('improve/awesome') }
+
+      it { is_expected.to be_truthy }
+    end
+
+    context 'non merged branch' do
+      subject { repository.merged_to_root_ref?('fix') }
+
+      it { is_expected.to be_falsey }
+    end
+
+    context 'non existent branch' do
+      subject { repository.merged_to_root_ref?('non_existent_branch') }
+
+      it { is_expected.to be_nil }
+    end
+  end
+
   describe "search_files" do
     let(:results) { repository.search_files('feature', 'master') }
     subject { results }