diff --git a/app/models/project.rb b/app/models/project.rb
index bc15ca3fc2e64c1f129b665cc2109c71ea4ebfd8..94105a8ea79973f84f297cc0f737f5c17220c850 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -738,6 +738,10 @@ class Project < ActiveRecord::Base
     end
   end
 
+  def all_labels
+    Label.find_by_project_id(self.id)
+  end
+
   def find_service(list, name)
     list.find { |service| service.to_param == name }
   end
diff --git a/lib/gitlab/import_export/attribute_cleaner.rb b/lib/gitlab/import_export/attribute_cleaner.rb
index b9e4042220a5a680578050e2f69a89ee250a1fd4..f755a40469313faad06d2b507274d290e5234471 100644
--- a/lib/gitlab/import_export/attribute_cleaner.rb
+++ b/lib/gitlab/import_export/attribute_cleaner.rb
@@ -1,7 +1,7 @@
 module Gitlab
   module ImportExport
     class AttributeCleaner
-      ALLOWED_REFERENCES = RelationFactory::PROJECT_REFERENCES + RelationFactory::USER_REFERENCES
+      ALLOWED_REFERENCES = RelationFactory::PROJECT_REFERENCES + RelationFactory::USER_REFERENCES + ['group_id']
 
       def self.clean!(relation_hash:)
         relation_hash.reject! do |key, _value|
diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml
index 8882f146632ed10095a182122c4142f8c5b3ec1d..e6ecd11860999cdef08ad2c2d9b217419fa47249 100644
--- a/lib/gitlab/import_export/import_export.yml
+++ b/lib/gitlab/import_export/import_export.yml
@@ -1,6 +1,7 @@
 # Model relationships to be included in the project import/export
 project_tree:
-  - :labels
+  - labels:
+      :priorities
   - milestones:
     - :events
   - issues:
@@ -9,7 +10,8 @@ project_tree:
       - :author
       - :events
     - label_links:
-      - :label
+      - label:
+          :priorities
     - milestone:
       - :events
   - snippets:
@@ -26,7 +28,8 @@ project_tree:
     - :merge_request_diff
     - :events
     - label_links:
-      - :label
+      - label:
+          :priorities
     - milestone:
       - :events
   - pipelines:
diff --git a/lib/gitlab/import_export/json_hash_builder.rb b/lib/gitlab/import_export/json_hash_builder.rb
index 0cc10f4008712da59483bea5ce4efba8922a8cf6..48c09dafcb6b76dc02e3c3f6dd845827d53559f2 100644
--- a/lib/gitlab/import_export/json_hash_builder.rb
+++ b/lib/gitlab/import_export/json_hash_builder.rb
@@ -65,11 +65,17 @@ module Gitlab
       # +value+ existing model to be included in the hash
       # +parsed_hash+ the original hash
       def parse_hash(value)
+        return nil if already_contains_methods?(value)
+
         @attributes_finder.parse(value) do |hash|
           { include: hash_or_merge(value, hash) }
         end
       end
 
+      def already_contains_methods?(value)
+        value.is_a?(Hash) && value.values.detect { |val| val[:methods]}
+      end
+
       # Adds new model configuration to an existing hash with key +current_key+
       # It may include exceptions or other attribute detail configuration, parsed by +@attributes_finder+
       #
diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb
index 8bc4ab85c184bbed7571b6f7f5fc802f85e89c5e..dc630e76411e3a4d4b48d964686a84f2129bf2c9 100644
--- a/lib/gitlab/import_export/relation_factory.rb
+++ b/lib/gitlab/import_export/relation_factory.rb
@@ -11,6 +11,7 @@ module Gitlab
                     merge_access_levels: 'ProtectedBranch::MergeAccessLevel',
                     push_access_levels: 'ProtectedBranch::PushAccessLevel',
                     labels: :project_labels,
+                    priorities: :label_priorities,
                     label: :project_label }.freeze
 
       USER_REFERENCES = %w[author_id assignee_id updated_by_id user_id].freeze
@@ -23,8 +24,6 @@ module Gitlab
 
       EXISTING_OBJECT_CHECK = %i[milestone milestones label labels project_label project_labels project_label group_label].freeze
 
-      FINDER_ATTRIBUTES = %w[title project_id].freeze
-
       def self.create(*args)
         new(*args).create
       end
@@ -134,6 +133,7 @@ module Gitlab
       def handle_group_label
         # If there's no group, move the label to a project label
         if @relation_hash['group_id']
+          @relation_hash['project_id'] = nil
           @relation_name = :group_label
         else
           @relation_hash['type'] = 'ProjectLabel'
@@ -188,11 +188,9 @@ module Gitlab
         # Otherwise always create the record, skipping the extra SELECT clause.
         @existing_or_new_object ||= begin
           if EXISTING_OBJECT_CHECK.include?(@relation_name)
-            events = parsed_relation_hash.delete('events')
+            attribute_hash = attribute_hash_for(['events', 'priorities'])
 
-            unless events.blank?
-              existing_object.assign_attributes(events: events)
-            end
+            existing_object.assign_attributes(attribute_hash) if attribute_hash.any?
 
             existing_object
           else
@@ -201,14 +199,22 @@ module Gitlab
         end
       end
 
+      def attribute_hash_for(attributes)
+        attributes.inject({}) do |hash, value|
+          hash[value] = parsed_relation_hash.delete(value) if parsed_relation_hash[value]
+          hash
+        end
+      end
+
       def existing_object
         @existing_object ||=
           begin
-            finder_hash = parsed_relation_hash.slice(*FINDER_ATTRIBUTES)
+            finder_attributes = @relation_name == :group_label ? %w[title group_id] : %w[title project_id]
+            finder_hash = parsed_relation_hash.slice(*finder_attributes)
             existing_object = relation_class.find_or_create_by(finder_hash)
             # Done in two steps, as MySQL behaves differently than PostgreSQL using
             # the +find_or_create_by+ method and does not return the ID the second time.
-            existing_object.update(parsed_relation_hash)
+            existing_object.update!(parsed_relation_hash)
             existing_object
           end
       end
diff --git a/spec/features/projects/import_export/test_project_export.tar.gz b/spec/features/projects/import_export/test_project_export.tar.gz
index 8f683cf89aa281dc252fd753aa69c8f875ffae80..bfe59bdb90e75cb869cab6aa86cb9dc81ac5e225 100644
Binary files a/spec/features/projects/import_export/test_project_export.tar.gz and b/spec/features/projects/import_export/test_project_export.tar.gz differ
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index 8fcbf12eab8eae45eaf6cdbf372d8ebf9100e7a1..02b11bd999a695961adb7e0deb61bbc997fe9b01 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -38,6 +38,7 @@ label:
 - label_links
 - issues
 - merge_requests
+- priorities
 milestone:
 - project
 - issues
@@ -186,3 +187,5 @@ project:
 award_emoji:
 - awardable
 - user
+priorities:
+- label
\ No newline at end of file
diff --git a/spec/lib/gitlab/import_export/project.json b/spec/lib/gitlab/import_export/project.json
index bf9dc279f7deec54e60305aa54a792490434545b..ed9df468cede2a66f28fa23296655a79b553eb0c 100644
--- a/spec/lib/gitlab/import_export/project.json
+++ b/spec/lib/gitlab/import_export/project.json
@@ -2,6 +2,21 @@
   "description": "Nisi et repellendus ut enim quo accusamus vel magnam.",
   "visibility_level": 10,
   "archived": false,
+  "labels": [
+    {
+      "id": 2,
+      "title": "test2",
+      "color": "#428bca",
+      "project_id": 8,
+      "created_at": "2016-07-22T08:55:44.161Z",
+      "updated_at": "2016-07-22T08:55:44.161Z",
+      "template": false,
+      "description": "",
+      "type": "ProjectLabel",
+      "priorities": [
+      ]
+    }
+  ],
   "issues": [
     {
       "id": 40,
@@ -64,7 +79,6 @@
             "updated_at": "2016-07-22T08:55:44.161Z",
             "template": false,
             "description": "",
-            "priority": null,
             "type": "ProjectLabel"
           }
         },
@@ -84,9 +98,18 @@
             "updated_at": "2016-07-22T08:55:44.161Z",
             "template": false,
             "description": "",
-            "priority": null,
             "project_id": null,
-            "type": "GroupLabel"
+            "type": "GroupLabel",
+            "priorities": [
+              {
+                "id": 1,
+                "project_id": 5,
+                "label_id": 1,
+                "priority": 1,
+                "created_at": "2016-10-18T09:35:43.338Z",
+                "updated_at": "2016-10-18T09:35:43.338Z"
+              }
+            ]
           }
         }
       ],
@@ -558,7 +581,6 @@
             "updated_at": "2016-07-22T08:55:44.161Z",
             "template": false,
             "description": "",
-            "priority": null,
             "type": "ProjectLabel"
           }
         }
@@ -2249,9 +2271,6 @@
         }
       ]
     }
-  ],
-  "labels": [
-
   ],
   "milestones": [
     {
diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
index 6312b990a66257f9a8042dd3e13d47056d3a786a..069ea960321c485c7af3c1a8ca7aa65295cfe075 100644
--- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
@@ -134,6 +134,12 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do
 
           expect(GroupLabel.count).to eq(1)
         end
+
+        it 'has label priorities' do
+          restored_project_json
+
+          expect(GroupLabel.first.priorities).not_to be_empty
+        end
       end
 
       it 'has a project feature' do
diff --git a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
index 9a8ba61559b16510bd4550a45f50ee52798d1d31..c8bba553558e50d656c97770d47ab194bd850a76 100644
--- a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb
@@ -114,7 +114,13 @@ describe Gitlab::ImportExport::ProjectTreeSaver, services: true do
       it 'has project and group labels' do
         label_types = saved_project_json['issues'].first['label_links'].map { |link| link['label']['type']}
 
-        expect(label_types).to match(['ProjectLabel', 'GroupLabel'])
+        expect(label_types).to match_array(['ProjectLabel', 'GroupLabel'])
+      end
+
+      it 'has priorities associated to labels' do
+        priorities = saved_project_json['issues'].first['label_links'].map { |link| link['label']['priorities']}
+
+        expect(priorities.flatten).not_to be_empty
       end
 
       it 'saves the correct service type' do
@@ -154,6 +160,7 @@ describe Gitlab::ImportExport::ProjectTreeSaver, services: true do
     group_label = create(:group_label, group: group)
     create(:label_link, label: project_label, target: issue)
     create(:label_link, label: group_label, target: issue)
+    create(:label_priority, label: group_label, priority: 1)
     milestone = create(:milestone, project: project)
     merge_request = create(:merge_request, source_project: project, milestone: milestone)
     commit_status = create(:commit_status, project: project)
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index 26049914bacfe4a3009eb15b1973a6b6a2536fcb..feee0f025d86c7c526bba93b0171d37ad42db46d 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -60,7 +60,7 @@ LabelLink:
 - target_type
 - created_at
 - updated_at
-Label:
+ProjectLabel:
 - id
 - title
 - color
@@ -331,3 +331,10 @@ AwardEmoji:
 - awardable_type
 - created_at
 - updated_at
+LabelPriority:
+- id
+- project_id
+- label_id
+- priority
+- created_at
+- updated_at
\ No newline at end of file