diff --git a/CHANGELOG b/CHANGELOG
index dd48bab978c8c27b5391d498b36e1294f0123b48..3a1cbe4bc56d9f314708327e59641406b0fd8809 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -40,6 +40,7 @@ v 8.0.0 (unreleased)
   - Add ability to get user information by ID of an SSH key via the API
   - Fix bug which IE cannot show image at markdown when the image is raw file	of gitlab  
   - Add support for Crowd
+  - Global Labels that are available to all projects
 
 v 7.14.1
   - Improve abuse reports management from admin area
diff --git a/app/controllers/admin/labels_controller.rb b/app/controllers/admin/labels_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3b070e65d0db6b942fe076d64d97bd0b51168b25
--- /dev/null
+++ b/app/controllers/admin/labels_controller.rb
@@ -0,0 +1,58 @@
+class Admin::LabelsController < Admin::ApplicationController
+  before_action :set_label, only: [:show, :edit, :update, :destroy]
+
+  def index
+    @labels = Label.templates.page(params[:page]).per(PER_PAGE)
+  end
+
+  def show
+  end
+
+  def new
+    @label = Label.new
+  end
+
+  def edit
+  end
+
+  def create
+    @label = Label.new(label_params)
+    @label.template = true
+
+    if @label.save
+      redirect_to admin_labels_url, notice: "Label was created"
+    else
+      render :new
+    end
+  end
+
+  def update
+    if @label.update(label_params)
+      redirect_to admin_labels_path, notice: 'label was successfully updated.'
+    else
+      render :edit
+    end
+  end
+
+  def destroy
+    @label.destroy
+    @labels = Label.templates
+
+    respond_to do |format|
+      format.html do
+        redirect_to(admin_labels_path, notice: 'Label was removed')
+      end
+      format.js
+    end
+  end
+
+  private
+
+  def set_label
+    @label = Label.find(params[:id])
+  end
+
+  def label_params
+    params[:label].permit(:title, :color)
+  end
+end
diff --git a/app/models/label.rb b/app/models/label.rb
index 230631b5180ec5105f9eb64210f54b8bb03fc46e..4a22bd53400480af0f2e981f06393565c8de2a61 100644
--- a/app/models/label.rb
+++ b/app/models/label.rb
@@ -24,7 +24,7 @@ class Label < ActiveRecord::Base
   validates :color,
             format: { with: /\A#[0-9A-Fa-f]{6}\Z/ },
             allow_blank: false
-  validates :project, presence: true
+  validates :project, presence: true, unless: Proc.new { |service| service.template? }
 
   # Don't allow '?', '&', and ',' for label titles
   validates :title,
@@ -34,6 +34,8 @@ class Label < ActiveRecord::Base
 
   default_scope { order(title: :asc) }
 
+  scope :templates, ->  { where(template: true) }
+
   alias_attribute :name, :title
 
   def self.reference_prefix
@@ -78,4 +80,8 @@ class Label < ActiveRecord::Base
   def open_issues_count
     issues.opened.count
   end
+
+  def template?
+    template
+  end
 end
diff --git a/app/models/project.rb b/app/models/project.rb
index c2d7fa5fcb8c0aef17e8822248ec3b4b601c5721..072d7d73f4174ee84fb114b2087e071668fcd14e 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -403,6 +403,15 @@ class Project < ActiveRecord::Base
     end
   end
 
+  def create_labels
+    Label.templates.each do |label|
+      label = label.dup
+      label.template = nil
+      label.project_id = self.id
+      label.save
+    end
+  end
+
   def find_service(list, name)
     list.find { |service| service.to_param == name }
   end
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index b35aed005da24ba73a6037207f5d5868a28f04a9..1bb2462565ab1a1c8c10a2145f60d9c3d4677ced 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -87,6 +87,8 @@ module Projects
 
       @project.build_missing_services
 
+      @project.create_labels
+
       event_service.create_project(@project, current_user)
       system_hook_service.execute_hooks_for(@project, :create)
 
diff --git a/app/views/admin/labels/_form.html.haml b/app/views/admin/labels/_form.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..ad58a3837f63b0ea784a58e44a55e815f50de71e
--- /dev/null
+++ b/app/views/admin/labels/_form.html.haml
@@ -0,0 +1,35 @@
+= form_for [:admin, @label], html: { class: 'form-horizontal label-form js-requires-input' } do |f|
+  -if @label.errors.any?
+    .row
+      .col-sm-offset-2.col-sm-10
+        .alert.alert-danger
+          - @label.errors.full_messages.each do |msg|
+            %span= msg
+            %br
+
+  .form-group
+    = f.label :title, class: 'control-label'
+    .col-sm-10
+      = f.text_field :title, class: "form-control", required: true
+  .form-group
+    = f.label :color, "Background Color", class: 'control-label'
+    .col-sm-10
+      .input-group
+        .input-group-addon.label-color-preview &nbsp;
+        = f.color_field :color, class: "form-control"
+      .help-block
+        Choose any color.
+        %br
+        Or you can choose one of suggested colors below
+
+      .suggest-colors
+        - suggested_colors.each do |color|
+          = link_to '#', style: "background-color: #{color}", data: { color: color } do
+            &nbsp;
+
+  .form-actions
+    = f.submit 'Save', class: 'btn btn-save js-save-button'
+    = link_to "Cancel", admin_labels_path, class: 'btn btn-cancel'
+
+:coffeescript
+  new Labels
diff --git a/app/views/admin/labels/_label.html.haml b/app/views/admin/labels/_label.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..596e06243ddc6a7f9c8fe5691da45a27341e95a7
--- /dev/null
+++ b/app/views/admin/labels/_label.html.haml
@@ -0,0 +1,5 @@
+%li{id: dom_id(label)}
+  = render_colored_label(label)
+  .pull-right
+    = link_to 'Edit', edit_admin_label_path(label), class: 'btn btn-sm'
+    = link_to 'Remove', admin_label_path(label), class: 'btn btn-sm btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"}
diff --git a/app/views/admin/labels/destroy.js.haml b/app/views/admin/labels/destroy.js.haml
new file mode 100644
index 0000000000000000000000000000000000000000..9d51762890fcedbadb02385e64987c07b9463127
--- /dev/null
+++ b/app/views/admin/labels/destroy.js.haml
@@ -0,0 +1,2 @@
+- if @labels.size == 0
+  $('.labels').load(document.URL + ' .light-well').hide().fadeIn(1000)
diff --git a/app/views/admin/labels/edit.html.haml b/app/views/admin/labels/edit.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..45c62a76259d6871fbcb20e4637665496cea71cc
--- /dev/null
+++ b/app/views/admin/labels/edit.html.haml
@@ -0,0 +1,9 @@
+- page_title "Edit", @label.name, "Labels"
+%h3
+  Edit label
+  %span.light #{@label.name}
+.back-link
+  = link_to admin_labels_path do
+    &larr; To labels list
+%hr
+= render 'form'
diff --git a/app/views/admin/labels/index.html.haml b/app/views/admin/labels/index.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..8b11c28c56e99ca59be8d832f5b5be275a7a2fa9
--- /dev/null
+++ b/app/views/admin/labels/index.html.haml
@@ -0,0 +1,16 @@
+- page_title "Labels"
+= link_to new_admin_label_path, class: "pull-right btn btn-new" do
+  New label
+%h3.page-title
+  Labels
+%hr
+
+.labels
+  - if @labels.present?
+    %ul.bordered-list.manage-labels-list
+      = render @labels
+    = paginate @labels, theme: 'gitlab'
+  - else
+    .light-well
+      .nothing-here-block There are no any labels yet
+      
\ No newline at end of file
diff --git a/app/views/admin/labels/new.html.haml b/app/views/admin/labels/new.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..8d298ad20f71d0c3d858b41e155d53107b65cae9
--- /dev/null
+++ b/app/views/admin/labels/new.html.haml
@@ -0,0 +1,7 @@
+- page_title "New Label"
+%h3 New label
+.back-link
+  = link_to admin_labels_path do
+    &larr; To labels list
+%hr
+= render 'form'
diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml
index 2065be3828a3f651d273c9cabb738c38ff5d96d1..3fe0127041e39487ff4082c7432b66cfdce3ce05 100644
--- a/app/views/layouts/nav/_admin.html.haml
+++ b/app/views/layouts/nav/_admin.html.haml
@@ -57,6 +57,12 @@
       %span
         Service Templates
 
+  = nav_link(controller: :labels) do
+    = link_to admin_labels_path, title: 'Labels', data: {placement: 'right'} do
+      = icon('tags fw')
+      %span
+        Labels
+
   = nav_link(controller: :abuse_reports) do
     = link_to admin_abuse_reports_path, title: "Abuse reports" do
       = icon('exclamation-circle fw')
diff --git a/config/routes.rb b/config/routes.rb
index 5bf721d6b13658e0ec85b7bd3a5c0c14f5ec3fa8..011af4825fa926074b0b3d63ad7c6717339218f6 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -210,6 +210,8 @@ Gitlab::Application.routes.draw do
       resources :services
     end
 
+    resources :labels
+
     root to: 'dashboard#index'
   end
 
diff --git a/db/migrate/20150902001023_add_template_to_label.rb b/db/migrate/20150902001023_add_template_to_label.rb
new file mode 100644
index 0000000000000000000000000000000000000000..bd381a97b6939bf1a1916cfef767b563fb976323
--- /dev/null
+++ b/db/migrate/20150902001023_add_template_to_label.rb
@@ -0,0 +1,5 @@
+class AddTemplateToLabel < ActiveRecord::Migration
+  def change
+    add_column :labels, :template, :boolean, default: false
+  end
+end
\ No newline at end of file
diff --git a/db/schema.rb b/db/schema.rb
index 36568dd4edd196c679e344918929fc43dc288bfd..55cbd8c293e891551871b9950532516360db4366 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20150824002011) do
+ActiveRecord::Schema.define(version: 20150902001023) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -186,6 +186,7 @@ ActiveRecord::Schema.define(version: 20150824002011) do
     t.integer  "project_id"
     t.datetime "created_at"
     t.datetime "updated_at"
+    t.boolean  "template",   default: false
   end
 
   add_index "labels", ["project_id"], name: "index_labels_on_project_id", using: :btree
diff --git a/features/admin/labels.feature b/features/admin/labels.feature
new file mode 100644
index 0000000000000000000000000000000000000000..1af0e700bd4d3e4635dd4b0346bedf409ced32f3
--- /dev/null
+++ b/features/admin/labels.feature
@@ -0,0 +1,38 @@
+Feature: Admin Issues Labels
+  Background:
+    Given I sign in as an admin
+    And I have labels: "bug", "feature", "enhancement"
+    Given I visit admin labels page
+
+  Scenario: I should see labels list
+    Then I should see label 'bug'
+    And I should see label 'feature'
+
+  Scenario: I create new label
+    Given I submit new label 'support'
+    Then I should see label 'support'
+
+  Scenario: I edit label
+    Given I visit 'bug' label edit page
+    When I change label 'bug' to 'fix'
+    Then I should not see label 'bug'
+    Then I should see label 'fix'
+
+  Scenario: I remove label
+    When I remove label 'bug'
+    Then I should not see label 'bug'
+
+  @javascript
+  Scenario: I delete all labels
+    When I delete all labels
+    Then I should see labels help message
+
+  Scenario: I create a label with invalid color
+    Given I visit admin new label page
+    When I submit new label with invalid color
+    Then I should see label color error message
+
+  Scenario: I create a label that already exists
+    Given I visit admin new label page
+    When I submit new label 'bug'
+    Then I should see label exist error message
diff --git a/features/steps/admin/labels.rb b/features/steps/admin/labels.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d64380abf73c84d9d4314f3a6683c7aa09d9c750
--- /dev/null
+++ b/features/steps/admin/labels.rb
@@ -0,0 +1,117 @@
+class Spinach::Features::AdminIssuesLabels < Spinach::FeatureSteps
+  include SharedAuthentication
+  include SharedProject
+  include SharedPaths
+
+  step 'I visit \'bug\' label edit page' do
+    visit edit_admin_label_path(bug_label)
+  end
+
+  step 'I visit admin new label page' do
+    visit new_admin_label_path
+  end
+
+  step 'I visit admin labels page' do
+    visit admin_labels_path
+  end
+
+  step 'I remove label \'bug\'' do
+    page.within "#label_#{bug_label.id}" do
+      click_link 'Remove'
+    end
+  end
+
+  step 'I have labels: "bug", "feature", "enhancement"' do
+    ["bug", "feature", "enhancement"].each do |title|
+      Label.create(title: title, template: true)
+    end
+  end
+
+  step 'I delete all labels' do
+    page.within '.labels' do
+      page.all('.btn-remove').each do |remove|
+        remove.click
+        sleep 0.05
+      end
+    end
+  end
+
+  step 'I should see labels help message' do
+    page.within '.labels' do
+      expect(page).to have_content 'There are no any labels yet'
+    end
+  end
+
+  step 'I submit new label \'support\'' do
+    visit new_admin_label_path
+    fill_in 'Title', with: 'support'
+    fill_in 'Background Color', with: '#F95610'
+    click_button 'Save'
+  end
+
+  step 'I submit new label \'bug\'' do
+    visit new_admin_label_path
+    fill_in 'Title', with: 'bug'
+    fill_in 'Background Color', with: '#F95610'
+    click_button 'Save'
+  end
+
+  step 'I submit new label with invalid color' do
+    visit new_admin_label_path
+    fill_in 'Title', with: 'support'
+    fill_in 'Background Color', with: '#12'
+    click_button 'Save'
+  end
+
+  step 'I should see label exist error message' do
+    page.within '.label-form' do
+      expect(page).to have_content 'Title has already been taken'
+    end
+  end
+
+  step 'I should see label color error message' do
+    page.within '.label-form' do
+      expect(page).to have_content 'Color is invalid'
+    end
+  end
+
+  step 'I should see label \'feature\'' do
+    page.within '.manage-labels-list' do
+      expect(page).to have_content 'feature'
+    end
+  end
+
+  step 'I should see label \'bug\'' do
+    page.within '.manage-labels-list' do
+      expect(page).to have_content 'bug'
+    end
+  end
+
+  step 'I should not see label \'bug\'' do
+    page.within '.manage-labels-list' do
+      expect(page).not_to have_content 'bug'
+    end
+  end
+
+  step 'I should see label \'support\'' do
+    page.within '.manage-labels-list' do
+      expect(page).to have_content 'support'
+    end
+  end
+
+  step 'I change label \'bug\' to \'fix\'' do
+    fill_in 'Title', with: 'fix'
+    fill_in 'Background Color', with: '#F15610'
+    click_button 'Save'
+  end
+
+  step 'I should see label \'fix\'' do
+    page.within '.manage-labels-list' do
+      expect(page).to have_content 'fix'
+    end
+  end
+
+  def bug_label
+    Label.templates.find_or_create_by(title: 'bug')
+  end
+end
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index 66cdfd5d7586816113fc6b9d8818ef654dbb6c07..ff4ed2dd484fa02c515c0c63c2c104d0e9444709 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -17,6 +17,14 @@ describe Projects::CreateService do
       expect(project.services).not_to be_empty
     end
 
+    it 'creates labels on Project creation if there are templates' do
+      Label.create(title: "bug", template: true)
+      project = create_project(@user, @opts)
+      project.reload
+
+      expect(project.labels).not_to be_empty
+    end
+
     context 'user namespace' do
       before do
         @project = create_project(@user, @opts)