diff --git a/app/models/project.rb b/app/models/project.rb
index e9c7108e80531db6745bc201e8c448e237e26edb..7a5bf77c5a93904d2c711218fef429d77c5f3f4a 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -1186,7 +1186,11 @@ class Project < ActiveRecord::Base
   end
 
   def remove_pages
-    FileUtils.rm_r(pages_path, force: true)
+    temp_path = "#{path}.#{SecureRandom.hex}"
+
+    if Gitlab::PagesTransfer.new.rename_project(path, temp_path, namespace.path)
+      PagesWorker.perform_in(5.minutes, :remove, namespace.path, temp_path)
+    end
   end
 
   def wiki
diff --git a/app/services/update_pages_service.rb b/app/services/update_pages_service.rb
index 818bb94a293f50914e08c030f3cd8606fa9b9a0e..39f08b2a03dece4175478f72a9e682511000ac34 100644
--- a/app/services/update_pages_service.rb
+++ b/app/services/update_pages_service.rb
@@ -10,6 +10,6 @@ class UpdatePagesService
     return unless data[:build_name] == 'pages'
     return unless data[:build_status] == 'success'
 
-    PagesWorker.perform_async(data[:build_id])
+    PagesWorker.perform_async(:deploy, data[:build_id])
   end
 end
diff --git a/app/workers/pages_worker.rb b/app/workers/pages_worker.rb
index 836e8d8ad9df5c254006105213d966a35d9e19e9..ff765a6c13c898526a8ecb05acc846ace70281ac 100644
--- a/app/workers/pages_worker.rb
+++ b/app/workers/pages_worker.rb
@@ -7,7 +7,11 @@ class PagesWorker
 
   sidekiq_options queue: :pages, retry: false
 
-  def perform(build_id)
+  def perform(action, *arg)
+    send(action, *arg)
+  end
+
+  def deploy(build_id)
     @build_id = build_id
     return unless valid?
 
@@ -36,6 +40,11 @@ class PagesWorker
     return false
   end
 
+  def remove(namespace_path, project_path)
+    full_path = File.join(Settings.pages.path, namespace_path, project_path)
+    FileUtils.rm_r(full_path, force: true)
+  end
+
   private
 
   def create_status
diff --git a/spec/workers/pages_worker_spec.rb b/spec/workers/pages_worker_spec.rb
index 158a4b3ba8d6d5f387354c875b80bc29954ace61..85592154598cd1c38d94937add0d90a6a8a584f1 100644
--- a/spec/workers/pages_worker_spec.rb
+++ b/spec/workers/pages_worker_spec.rb
@@ -18,41 +18,48 @@ describe PagesWorker do
 
     it 'succeeds' do
       expect(project.pages_url).to be_nil
-      expect(worker.perform(build.id)).to be_truthy
+      expect(worker.deploy(build.id)).to be_truthy
       expect(project.pages_url).to_not be_nil
     end
 
     it 'limits pages size' do
       stub_application_setting(max_pages_size: 1)
-      expect(worker.perform(build.id)).to_not be_truthy
+      expect(worker.deploy(build.id)).to_not be_truthy
     end
 
     it 'removes pages after destroy' do
+      expect(PagesWorker).to receive(:perform_in)
       expect(project.pages_url).to be_nil
-      expect(worker.perform(build.id)).to be_truthy
+      expect(worker.deploy(build.id)).to be_truthy
       expect(project.pages_url).to_not be_nil
       project.destroy
       expect(Dir.exist?(project.public_pages_path)).to be_falsey
     end
   end
 
+  it 'fails to remove project pages when no pages is deployed' do
+    expect(PagesWorker).to_not receive(:perform_in)
+    expect(project.pages_url).to be_nil
+    project.destroy
+  end
+
   it 'fails if no artifacts' do
-    expect(worker.perform(build.id)).to_not be_truthy
+    expect(worker.deploy(build.id)).to_not be_truthy
   end
 
   it 'fails for empty file fails' do
     build.update_attributes(artifacts_file: empty_file)
-    expect(worker.perform(build.id)).to_not be_truthy
+    expect(worker.deploy(build.id)).to_not be_truthy
   end
 
   it 'fails for invalid archive' do
     build.update_attributes(artifacts_file: invalid_file)
-    expect(worker.perform(build.id)).to_not be_truthy
+    expect(worker.deploy(build.id)).to_not be_truthy
   end
 
   it 'fails if sha on branch is not latest' do
     commit.update_attributes(sha: 'old_sha')
     build.update_attributes(artifacts_file: file)
-    expect(worker.perform(build.id)).to_not be_truthy
+    expect(worker.deploy(build.id)).to_not be_truthy
   end
 end