diff --git a/lib/gitlab/import_export.rb b/lib/gitlab/import_export.rb
index aa69f7c44a59de10ffc96a7848eb6903365aa831..84860b43cbe72fbaa9e860351eee259422bd6add 100644
--- a/lib/gitlab/import_export.rb
+++ b/lib/gitlab/import_export.rb
@@ -11,7 +11,7 @@ module Gitlab
     end
 
     def project_tree
-      Gitlab::ImportExport::ImportExportReader.project_tree
+      Gitlab::ImportExport::ImportExportReader.new.project_tree
     end
 
     def storage_path
diff --git a/lib/gitlab/import_export/attributes_finder.rb b/lib/gitlab/import_export/attributes_finder.rb
new file mode 100644
index 0000000000000000000000000000000000000000..12ae79a877330bd00c86840851333667c52318a3
--- /dev/null
+++ b/lib/gitlab/import_export/attributes_finder.rb
@@ -0,0 +1,35 @@
+module Gitlab
+  module ImportExport
+    class AttributesFinder
+      def initialize(included_attributes:, excluded_attributes:)
+        @included_attributes = included_attributes || {}
+        @excluded_attributes = excluded_attributes || {}
+      end
+
+      def find(model_object)
+        parsed_hash = find_attributes_only(model_object)
+        parsed_hash.empty? ? model_object : { model_object => parsed_hash }
+      end
+
+      def find_attributes_only(value)
+        find_included(value).merge(find_excluded(value))
+      end
+
+      def find_included(value)
+        key = key_from_hash(value)
+        @included_attributes[key].nil? ? {} : { only: @included_attributes[key] }
+      end
+
+      def find_excluded(value)
+        key = key_from_hash(value)
+        @excluded_attributes[key].nil? ? {} : { except: @excluded_attributes[key] }
+      end
+
+      private
+
+      def key_from_hash(value)
+        value.is_a?(Hash) ? value.keys.first : value
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/lib/gitlab/import_export/import_export_reader.rb b/lib/gitlab/import_export/import_export_reader.rb
index 77db6cabe3853c000a0e8fe46c678ecb79c6d199..a6cf191010561b7ba7e4c3278337c1e2eaf0a26a 100644
--- a/lib/gitlab/import_export/import_export_reader.rb
+++ b/lib/gitlab/import_export/import_export_reader.rb
@@ -1,37 +1,27 @@
 module Gitlab
   module ImportExport
-    module ImportExportReader
-      extend self
+    class ImportExportReader
+      #FIXME
 
-      def project_tree
-        { only: included_attributes[:project], include: build_hash(tree) }
+      def initialize(config: 'lib/gitlab/import_export/import_export.yml')
+        config = YAML.load_file('lib/gitlab/import_export/import_export.yml').with_indifferent_access
+        @tree = config[:project_tree]
+        @attributes_parser = Gitlab::ImportExport::AttributesFinder.new(included_attributes: config[:included_attributes],
+                                                                        excluded_attributes: config[:excluded_attributes])
       end
 
-      def tree
-        config[:project_tree]
+      def project_tree
+        { only: @attributes_parser.find_included(:project), include: build_hash(@tree) }
       end
 
       private
 
-      def config
-        @config ||= YAML.load_file('lib/gitlab/import_export/import_export.yml').with_indifferent_access
-      end
-
-      def included_attributes
-        config[:included_attributes] || {}
-      end
-
-      def excluded_attributes
-        config[:excluded_attributes] || {}
-      end
-
-      def build_hash(array)
-        array.map do |model_object|
+      def build_hash(model_list)
+        model_list.map do |model_object|
           if model_object.is_a?(Hash)
             process_include(model_object)
           else
-            only_except_hash = check_only_and_except(model_object)
-            only_except_hash.empty? ? model_object : { model_object => only_except_hash }
+            @attributes_parser.find(model_object)
           end
         end
       end
@@ -51,48 +41,30 @@ module Gitlab
 
       def process_current_class(hash, included_classes_hash, value)
         value = value.is_a?(Hash) ? process_include(hash, included_classes_hash) : value
-        only_except_hash = check_only_and_except(hash.keys.first)
-        included_classes_hash[hash.keys.first] ||= only_except_hash unless only_except_hash.empty?
+        attributes_hash = @attributes_parser.find_attributes_only(hash.keys.first)
+        included_classes_hash[hash.keys.first] ||= attributes_hash unless attributes_hash.empty?
         value
       end
 
       def add_new_class(current_key, included_classes_hash, value)
-        only_except_hash = check_only_and_except(value)
+        attributes_hash = @attributes_parser.find_attributes_only(value)
         parsed_hash = { include: value }
-        unless only_except_hash.empty?
+        unless attributes_hash.empty?
           if value.is_a?(Hash)
-            parsed_hash = { include: value.merge(only_except_hash) }
+            parsed_hash = { include: value.merge(attributes_hash) }
           else
-            parsed_hash = { include: { value => only_except_hash } }
+            parsed_hash = { include: { value => attributes_hash } }
           end
         end
         included_classes_hash[current_key] = parsed_hash
       end
 
       def add_to_class(current_key, included_classes_hash, value)
-        only_except_hash = check_only_and_except(value)
-        value = { value => only_except_hash } unless only_except_hash.empty?
+        attributes_hash = @attributes_parser.find_attributes_only(value)
+        value = { value => attributes_hash } unless attributes_hash.empty?
         old_values = included_classes_hash[current_key][:include]
         included_classes_hash[current_key][:include] = ([old_values] + [value]).compact.flatten
       end
-
-      def check_only_and_except(value)
-        check_only(value).merge(check_except(value))
-      end
-
-      def check_only(value)
-        key = key_from_hash(value)
-        included_attributes[key].nil? ? {} : { only: included_attributes[key] }
-      end
-
-      def check_except(value)
-        key = key_from_hash(value)
-        excluded_attributes[key].nil? ? {} : { except: excluded_attributes[key] }
-      end
-
-      def key_from_hash(value)
-        value.is_a?(Hash) ? value.keys.first : value
-      end
     end
   end
 end
diff --git a/spec/lib/gitlab/import_export/import_export_reader_spec.rb b/spec/lib/gitlab/import_export/import_export_reader_spec.rb
index 0b2da73a2259b4459c125226c6cbf1c4b17f1022..6be2289b5a02cf152edd53590c25ec6e5ee0360b 100644
--- a/spec/lib/gitlab/import_export/import_export_reader_spec.rb
+++ b/spec/lib/gitlab/import_export/import_export_reader_spec.rb
@@ -17,8 +17,6 @@ describe Gitlab::ImportExport::ImportExportReader do
   end
 
   it 'should generate hash from project tree config' do
-    allow(described_class).to receive(:config).and_return(YAML.load_file(test_config).deep_symbolize_keys)
-
-    expect(described_class.project_tree).to eq(project_tree_hash)
+    expect(described_class.new(config: test_config).project_tree).to eq(project_tree_hash)
   end
 end