diff --git a/CHANGELOG b/CHANGELOG
index 215a684a5d002e237e3b9590b94bae2570d3b7c8..10984ebd1907d95bdda508c0c9eb7a762bcd5476 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -17,6 +17,7 @@ v 8.6.0 (unreleased)
   - Add support for cross-project label references
   - Update documentation to reflect Guest role not being enforced on internal projects
   - Allow search for logged out users
+  - Fix bug where Bitbucket `closed` issues were imported as `opened` (Iuri de Silvio)
   - Don't show Issues/MRs from archived projects in Groups view
   - Increase the notes polling timeout over time (Roberto Dip)
   - Show labels in dashboard and group milestone views
diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb
index 3f483847efaa14f6adf98502cf88bc6c92a8799f..46e51a4bf6d9868bc16dc2c439da3cf981c7b799 100644
--- a/lib/gitlab/bitbucket_import/importer.rb
+++ b/lib/gitlab/bitbucket_import/importer.rb
@@ -76,7 +76,7 @@ module Gitlab
           project.issues.create!(
             description: body,
             title: issue["title"],
-            state: %w(resolved invalid duplicate wontfix).include?(issue["status"]) ? 'closed' : 'opened',
+            state: %w(resolved invalid duplicate wontfix closed).include?(issue["status"]) ? 'closed' : 'opened',
             author_id: gl_user_id(project, reporter)
           )
         end
diff --git a/spec/lib/gitlab/bitbucket_import/importer_spec.rb b/spec/lib/gitlab/bitbucket_import/importer_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c413132abe56a3dc4246b2cf728d043ec75c0f58
--- /dev/null
+++ b/spec/lib/gitlab/bitbucket_import/importer_spec.rb
@@ -0,0 +1,88 @@
+require 'spec_helper'
+
+describe Gitlab::BitbucketImport::Importer, lib: true do
+  before do
+    Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "bitbucket")
+  end
+
+  let(:statuses) do
+    [
+      "open",
+      "resolved",
+      "on hold",
+      "invalid",
+      "duplicate",
+      "wontfix",
+      "closed"  # undocumented status
+    ]
+  end
+  let(:sample_issues_statuses) do
+    issues = []
+
+    statuses.map.with_index do |status, index|
+      issues << {
+        local_id: index,
+        status: status,
+        title: "Issue #{index}",
+        content: "Some content to issue #{index}"
+      }
+    end
+
+    issues
+  end
+
+  let(:project_identifier) { 'namespace/repo' }
+  let(:data) do
+    {
+      bb_session: {
+        bitbucket_access_token: "123456",
+        bitbucket_access_token_secret: "secret"
+      }
+    }
+  end
+  let(:project) do
+    create(
+      :project,
+      import_source: project_identifier,
+      import_data: ProjectImportData.new(data: data)
+    )
+  end
+  let(:importer) { Gitlab::BitbucketImport::Importer.new(project) }
+  let(:issues_statuses_sample_data) do
+    {
+      count: sample_issues_statuses.count,
+      issues: sample_issues_statuses
+    }
+  end
+
+  context 'issues statuses' do
+    before do
+      stub_request(
+        :get,
+        "https://bitbucket.org/api/1.0/repositories/#{project_identifier}"
+      ).to_return(status: 200, body: { has_issues: true }.to_json)
+
+      stub_request(
+        :get,
+        "https://bitbucket.org/api/1.0/repositories/#{project_identifier}/issues?limit=50&sort=utc_created_on&start=0"
+      ).to_return(status: 200, body: issues_statuses_sample_data.to_json)
+
+      sample_issues_statuses.each_with_index do |issue, index|
+        stub_request(
+          :get,
+          "https://bitbucket.org/api/1.0/repositories/#{project_identifier}/issues/#{issue[:local_id]}/comments"
+        ).to_return(
+          status: 200,
+          body: [{ author_info: { username: "username" }, utc_created_on: index }].to_json
+        )
+      end
+    end
+
+    it 'map statuses to open or closed' do
+      importer.execute
+
+      expect(project.issues.where(state: "closed").size).to eq(5)
+      expect(project.issues.where(state: "opened").size).to eq(2)
+    end
+  end
+end