diff --git a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
index aeeef40fc6e957db0e080de38f72408e4bb0a637..e08d04072457bf9865aabed13f5879f08781e904 100644
--- a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
@@ -3,7 +3,6 @@ import SecretValues from '~/behaviors/secret_values';
 import AjaxVariableList from '~/ci_variable_list/ajax_variable_list';
 import registrySettingsApp from '~/registry/settings/registry_settings_bundle';
 import initVariableList from '~/ci_variable_list';
-import initDeployKeys from '~/deploy_keys';
 
 document.addEventListener('DOMContentLoaded', () => {
   // Initialize expandable settings panels
@@ -41,5 +40,4 @@ document.addEventListener('DOMContentLoaded', () => {
   });
 
   registrySettingsApp();
-  initDeployKeys();
 });
diff --git a/app/assets/javascripts/pages/projects/settings/repository/form.js b/app/assets/javascripts/pages/projects/settings/repository/form.js
index fa6d17f072920530be293439efbc1b33cd3202fa..3e02893f24c9413a71ddc5df4672f19ad5ade08b 100644
--- a/app/assets/javascripts/pages/projects/settings/repository/form.js
+++ b/app/assets/javascripts/pages/projects/settings/repository/form.js
@@ -3,6 +3,7 @@
 import ProtectedTagCreate from '~/protected_tags/protected_tag_create';
 import ProtectedTagEditList from '~/protected_tags/protected_tag_edit_list';
 import initSettingsPanels from '~/settings_panels';
+import initDeployKeys from '~/deploy_keys';
 import ProtectedBranchCreate from '~/protected_branches/protected_branch_create';
 import ProtectedBranchEditList from '~/protected_branches/protected_branch_edit_list';
 import DueDateSelectors from '~/due_date_select';
@@ -11,6 +12,7 @@ import fileUpload from '~/lib/utils/file_upload';
 export default () => {
   new ProtectedTagCreate();
   new ProtectedTagEditList();
+  initDeployKeys();
   initSettingsPanels();
   new ProtectedBranchCreate();
   new ProtectedBranchEditList();
diff --git a/app/controllers/projects/deploy_keys_controller.rb b/app/controllers/projects/deploy_keys_controller.rb
index f43e9f2bd1941085e973a0d3c1668dd980db2115..f13fb4d0b3dc2e972ba1009167717e615bd2e9c4 100644
--- a/app/controllers/projects/deploy_keys_controller.rb
+++ b/app/controllers/projects/deploy_keys_controller.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
 class Projects::DeployKeysController < Projects::ApplicationController
+  include RepositorySettingsRedirect
   respond_to :html
 
   # Authorize
@@ -11,7 +12,7 @@ class Projects::DeployKeysController < Projects::ApplicationController
 
   def index
     respond_to do |format|
-      format.html { redirect_to_ci_cd_settings }
+      format.html { redirect_to_repository_settings(@project, anchor: 'js-deploy-keys-settings') }
       format.json do
         render json: Projects::Settings::DeployKeysPresenter.new(@project, current_user: current_user).as_json
       end
@@ -19,7 +20,7 @@ def index
   end
 
   def new
-    redirect_to_ci_cd_settings
+    redirect_to_repository_settings(@project, anchor: 'js-deploy-keys-settings')
   end
 
   def create
@@ -29,7 +30,7 @@ def create
       flash[:alert] = @key.errors.full_messages.join(', ').html_safe
     end
 
-    redirect_to_ci_cd_settings
+    redirect_to_repository_settings(@project, anchor: 'js-deploy-keys-settings')
   end
 
   def edit
@@ -38,7 +39,7 @@ def edit
   def update
     if deploy_key.update(update_params)
       flash[:notice] = _('Deploy key was successfully updated.')
-      redirect_to_ci_cd_settings
+      redirect_to_repository_settings(@project, anchor: 'js-deploy-keys-settings')
     else
       render 'edit'
     end
@@ -50,7 +51,7 @@ def enable
     return render_404 unless key
 
     respond_to do |format|
-      format.html { redirect_to_ci_cd_settings }
+      format.html { redirect_to_repository_settings(@project, anchor: 'js-deploy-keys-settings') }
       format.json { head :ok }
     end
   end
@@ -61,7 +62,7 @@ def disable
     return render_404 unless deploy_key_project
 
     respond_to do |format|
-      format.html { redirect_to_ci_cd_settings }
+      format.html { redirect_to_repository_settings(@project, anchor: 'js-deploy-keys-settings') }
       format.json { head :ok }
     end
   end
@@ -96,8 +97,4 @@ def authorize_update_deploy_key!
       access_denied!
     end
   end
-
-  def redirect_to_ci_cd_settings
-    redirect_to project_settings_ci_cd_path(@project, anchor: 'js-deploy-keys-settings')
-  end
 end
diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb
index c4d291e8634b7464525d270b8a376c4ca936f3bf..d0d100fd88cf1f88e3ee1f9c3a49aee8fc68ce6c 100644
--- a/app/controllers/projects/settings/ci_cd_controller.rb
+++ b/app/controllers/projects/settings/ci_cd_controller.rb
@@ -88,7 +88,6 @@ def define_variables
         define_triggers_variables
         define_badges_variables
         define_auto_devops_variables
-        define_deploy_keys
       end
 
       def define_runners_variables
@@ -135,10 +134,6 @@ def define_badges_variables
       def define_auto_devops_variables
         @auto_devops = @project.auto_devops || ProjectAutoDevops.new
       end
-
-      def define_deploy_keys
-        @deploy_keys = DeployKeysPresenter.new(@project, current_user: current_user)
-      end
     end
   end
 end
diff --git a/app/controllers/projects/settings/repository_controller.rb b/app/controllers/projects/settings/repository_controller.rb
index 68bab952217016671f2f6d1c7ea0d933ebf98e63..0aa55dcc5b9715c19a0b0ecd4302a27c0bd81e91 100644
--- a/app/controllers/projects/settings/repository_controller.rb
+++ b/app/controllers/projects/settings/repository_controller.rb
@@ -63,6 +63,8 @@ def render_show
       end
 
       def define_variables
+        @deploy_keys = DeployKeysPresenter.new(@project, current_user: current_user)
+
         define_deploy_token_variables
         define_protected_refs
         remote_mirror
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index 4c9de58cc01537c6f59614efee2eafc509d3125c..1358077f2b24f7c7d075064e2107c06967b3a9e4 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -51,8 +51,6 @@
   .settings-content
     = render 'ci/variables/index', save_endpoint: project_variables_path(@project)
 
-= render @deploy_keys
-
 %section.settings.no-animate#js-pipeline-triggers{ class: ('expanded' if expanded) }
   .settings-header
     %h4
diff --git a/app/views/projects/settings/repository/show.html.haml b/app/views/projects/settings/repository/show.html.haml
index 77606bfea4202d461a3f4ef7f0c043fc296de340..193053c8c977113b214069cfac664297c4546962 100644
--- a/app/views/projects/settings/repository/show.html.haml
+++ b/app/views/projects/settings/repository/show.html.haml
@@ -13,6 +13,7 @@
 -# reused in EE.
 = render "projects/settings/repository/protected_branches"
 = render "shared/deploy_tokens/index", group_or_project: @project, description: deploy_token_description
+= render @deploy_keys
 = render "projects/cleanup/show"
 
 = render_if_exists 'shared/promotions/promote_repository_features'
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 7ac9ba6a7dd7546fb0b1f58c47f24d5a9809ce27..3221023f73a70f0442fa48d53b1a096bdae2cbf6 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -288,14 +288,6 @@ https://example.gitlab.com/<namespace>/<project>/badges/<branch>/coverage.svg?st
 
 [Environment variables](../variables/README.md#gitlab-cicd-environment-variables) can be set in an environment to be available to a runner.
 
-## Deploy Keys
-
-With Deploy Keys, GitLab allows you to import SSH public keys. You can then have
-read only or read/write access to your project from the machines the keys were generated from.
-
-SSH keys added to your project settings will be used for continuous integration,
-staging, or production servers.
-
 <!-- ## Troubleshooting
 
 Include any troubleshooting steps that you can foresee. If you know beforehand what issues
diff --git a/doc/ssh/README.md b/doc/ssh/README.md
index e6375f15157d88b13cf3334bd3a49d6196a09b30..06db8e5985050298b396167403534232455ea80d 100644
--- a/doc/ssh/README.md
+++ b/doc/ssh/README.md
@@ -384,9 +384,7 @@ If you don't have a key pair, you might want to use a
 
 Project maintainers and owners can add a deploy key for a repository.
 
-1. Navigate to the project's **Settings** page, then:
-   - On GitLab 12.8 and earlier, click **Repository**.
-   - On GitLab 12.9 and later, click **CI / CD**.
+1. Navigate to the project's **Settings > Repository** page.
 1. Expand the **Deploy Keys** section.
 1. Specify a title for the new deploy key and paste a public SSH key.
 
@@ -432,9 +430,7 @@ your repository".
 Once a GitLab administrator adds the Global Deployment key, project maintainers
 and owners can add it by:
 
-1. Navigating the settings page:
-   - On GitLab 12.8 and earlier, the project's **Settings > Repository** page.
-   - On GitLab 12.9 and later, the project's **Settings > CI / CD** page.
+1. Navigate to the project's **Settings > Repository** page.
 1. Expanding the **Deploy Keys** section.
 1. Clicking **Enable** next to the appropriate key listed under
    **Public deploy keys available to any project**.
diff --git a/ee/changelogs/unreleased/212775-revert-deploy-keys-move.yml b/ee/changelogs/unreleased/212775-revert-deploy-keys-move.yml
new file mode 100644
index 0000000000000000000000000000000000000000..21b4f8cbd807152b86e3250aba49f997274d0ff5
--- /dev/null
+++ b/ee/changelogs/unreleased/212775-revert-deploy-keys-move.yml
@@ -0,0 +1,5 @@
+---
+title: Move deploy keys section back to repository settings
+merge_request: 29184
+author:
+type: removed
diff --git a/ee/spec/controllers/projects/deploy_keys_controller_spec.rb b/ee/spec/controllers/projects/deploy_keys_controller_spec.rb
index 7a08e2c72c484fa18437ece1f8ea14fbb48ac771..0ed7df43ed5e4a71e7159bc26301e4b324a55a9a 100644
--- a/ee/spec/controllers/projects/deploy_keys_controller_spec.rb
+++ b/ee/spec/controllers/projects/deploy_keys_controller_spec.rb
@@ -30,7 +30,7 @@
     it 'records an audit event' do
       expect { post :create, params: params }.to change { AuditEvent.count }.by(1)
 
-      expect(response).to redirect_to(project_settings_ci_cd_path(project, anchor: 'js-deploy-keys-settings'))
+      expect(response).to redirect_to(project_settings_repository_path(project, anchor: 'js-deploy-keys-settings'))
     end
   end
 
diff --git a/qa/qa/page/project/settings/ci_cd.rb b/qa/qa/page/project/settings/ci_cd.rb
index c43974c10cbeee5f67f74131ddb082a30e1b02fc..46f93fad61edf27c6c0c3e6636008f9579cdeb55 100644
--- a/qa/qa/page/project/settings/ci_cd.rb
+++ b/qa/qa/page/project/settings/ci_cd.rb
@@ -13,16 +13,6 @@ class CICD < Page::Base
             element :variables_settings_content
           end
 
-          view 'app/views/projects/deploy_keys/_index.html.haml' do
-            element :deploy_keys_settings
-          end
-
-          def expand_deploy_keys(&block)
-            expand_section(:deploy_keys_settings) do
-              Settings::DeployKeys.perform(&block)
-            end
-          end
-
           def expand_runners_settings(&block)
             expand_section(:runners_settings_content) do
               Settings::Runners.perform(&block)
diff --git a/qa/qa/page/project/settings/repository.rb b/qa/qa/page/project/settings/repository.rb
index 97dfc6497a49ea93b6f70f37f1fddfced1736302..8810b971fda38a31511489c27c0ae61ef8fa50dc 100644
--- a/qa/qa/page/project/settings/repository.rb
+++ b/qa/qa/page/project/settings/repository.rb
@@ -19,12 +19,22 @@ class Repository < Page::Base
             element :deploy_tokens_settings
           end
 
+          view 'app/views/projects/deploy_keys/_index.html.haml' do
+            element :deploy_keys_settings
+          end
+
           def expand_deploy_tokens(&block)
             expand_section(:deploy_tokens_settings) do
               Settings::DeployTokens.perform(&block)
             end
           end
 
+          def expand_deploy_keys(&block)
+            expand_section(:deploy_keys_settings) do
+              Settings::DeployKeys.perform(&block)
+            end
+          end
+
           def expand_protected_branches(&block)
             expand_section(:protected_branches_settings) do
               ProtectedBranches.perform(&block)
diff --git a/qa/qa/resource/deploy_key.rb b/qa/qa/resource/deploy_key.rb
index 091d2936d095468fa390e16ff9225b9dc3dc011b..26355729dab665cb2626196dbafe5e7e2d8a66fd 100644
--- a/qa/qa/resource/deploy_key.rb
+++ b/qa/qa/resource/deploy_key.rb
@@ -6,7 +6,7 @@ class DeployKey < Base
       attr_accessor :title, :key
 
       attribute :md5_fingerprint do
-        Page::Project::Settings::CICD.perform do |setting|
+        Page::Project::Settings::Repository.perform do |setting|
           setting.expand_deploy_keys do |key|
             key.find_md5_fingerprint(title)
           end
@@ -23,9 +23,9 @@ class DeployKey < Base
       def fabricate!
         project.visit!
 
-        Page::Project::Menu.perform(&:go_to_ci_cd_settings)
+        Page::Project::Menu.perform(&:go_to_repository_settings)
 
-        Page::Project::Settings::CICD.perform do |setting|
+        Page::Project::Settings::Repository.perform do |setting|
           setting.expand_deploy_keys do |page|
             page.fill_key_title(title)
             page.fill_key_value(key)
diff --git a/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb b/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb
index 1fc5e06963d060d5edf9d9a870512cabacebdefb..89aba112407f7d6182c8d5be4170aa633d622308 100644
--- a/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb
+++ b/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb
@@ -17,7 +17,7 @@ module QA
 
         expect(deploy_key.md5_fingerprint).to eq key.md5_fingerprint
 
-        Page::Project::Settings::CICD.perform do |setting|
+        Page::Project::Settings::Repository.perform do |setting|
           setting.expand_deploy_keys do |keys|
             expect(keys).to have_key(deploy_key_title, key.md5_fingerprint)
           end
diff --git a/spec/controllers/projects/deploy_keys_controller_spec.rb b/spec/controllers/projects/deploy_keys_controller_spec.rb
index a6bbe6bd012c2455138f404497a21daacfc26e49..1b2b326b6e9b366ddf947798cf8cb08e45f56718 100644
--- a/spec/controllers/projects/deploy_keys_controller_spec.rb
+++ b/spec/controllers/projects/deploy_keys_controller_spec.rb
@@ -19,10 +19,10 @@
     end
 
     context 'when html requested' do
-      it 'redirects to project ci / cd settings with the correct anchor' do
+      it 'redirects to project settings with the correct anchor' do
         get :index, params: params
 
-        expect(response).to redirect_to(project_settings_ci_cd_path(project, anchor: 'js-deploy-keys-settings'))
+        expect(response).to redirect_to(project_settings_repository_path(project, anchor: 'js-deploy-keys-settings'))
       end
     end
 
@@ -87,13 +87,13 @@ def create_params(title = 'my-key')
     it 'creates a new deploy key for the project' do
       expect { post :create, params: create_params }.to change(project.deploy_keys, :count).by(1)
 
-      expect(response).to redirect_to(project_settings_ci_cd_path(project, anchor: 'js-deploy-keys-settings'))
+      expect(response).to redirect_to(project_settings_repository_path(project, anchor: 'js-deploy-keys-settings'))
     end
 
     it 'redirects to project settings with the correct anchor' do
       post :create, params: create_params
 
-      expect(response).to redirect_to(project_settings_ci_cd_path(project, anchor: 'js-deploy-keys-settings'))
+      expect(response).to redirect_to(project_settings_repository_path(project, anchor: 'js-deploy-keys-settings'))
     end
 
     context 'when the deploy key is invalid' do
@@ -153,7 +153,7 @@ def create_params(title = 'my-key')
 
         expect(DeployKeysProject.where(project_id: project.id, deploy_key_id: deploy_key.id).count).to eq(1)
         expect(response).to have_gitlab_http_status(:found)
-        expect(response).to redirect_to(namespace_project_settings_ci_cd_path(anchor: 'js-deploy-keys-settings'))
+        expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
       end
 
       it 'returns 404' do
@@ -175,7 +175,7 @@ def create_params(title = 'my-key')
 
         expect(DeployKeysProject.where(project_id: project.id, deploy_key_id: deploy_key.id).count).to eq(1)
         expect(response).to have_gitlab_http_status(:found)
-        expect(response).to redirect_to(namespace_project_settings_ci_cd_path(anchor: 'js-deploy-keys-settings'))
+        expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
       end
     end
   end
@@ -216,7 +216,7 @@ def create_params(title = 'my-key')
         put :disable, params: { id: deploy_key.id, namespace_id: project.namespace, project_id: project }
 
         expect(response).to have_gitlab_http_status(:found)
-        expect(response).to redirect_to(namespace_project_settings_ci_cd_path(anchor: 'js-deploy-keys-settings'))
+        expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
 
         expect { DeployKey.find(deploy_key.id) }.to raise_error(ActiveRecord::RecordNotFound)
       end
@@ -239,7 +239,7 @@ def create_params(title = 'my-key')
         end.to change { DeployKey.count }.by(-1)
 
         expect(response).to have_gitlab_http_status(:found)
-        expect(response).to redirect_to(namespace_project_settings_ci_cd_path(anchor: 'js-deploy-keys-settings'))
+        expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
 
         expect { DeployKey.find(deploy_key.id) }.to raise_error(ActiveRecord::RecordNotFound)
       end
diff --git a/spec/features/projects/deploy_keys_spec.rb b/spec/features/projects/deploy_keys_spec.rb
index 03b7c54faf6d19f528d9c1c0151ceac73851b340..687b6461f056486187e115606b861aaa2ffcbd71 100644
--- a/spec/features/projects/deploy_keys_spec.rb
+++ b/spec/features/projects/deploy_keys_spec.rb
@@ -17,7 +17,7 @@
     end
 
     it 'removes association between project and deploy key' do
-      visit project_settings_ci_cd_path(project)
+      visit project_settings_repository_path(project)
 
       page.within(find('.qa-deploy-keys-settings')) do
         expect(page).to have_selector('.deploy-key', count: 1)
diff --git a/spec/features/projects/settings/ci_cd_settings_spec.rb b/spec/features/projects/settings/ci_cd_settings_spec.rb
deleted file mode 100644
index ed65dcd85abc7a927a0eb56b33dbd38225387b53..0000000000000000000000000000000000000000
--- a/spec/features/projects/settings/ci_cd_settings_spec.rb
+++ /dev/null
@@ -1,97 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-describe 'Projects > Settings > CI / CD settings' do
-  let_it_be(:project) { create(:project_empty_repo) }
-  let_it_be(:user) { create(:user) }
-  let_it_be(:role) { :maintainer }
-
-  context 'Deploy Keys', :js do
-    let_it_be(:private_deploy_key) { create(:deploy_key, title: 'private_deploy_key', public: false) }
-    let_it_be(:public_deploy_key) { create(:another_deploy_key, title: 'public_deploy_key', public: true) }
-    let(:new_ssh_key) { attributes_for(:key)[:key] }
-
-    before do
-      project.add_role(user, role)
-      sign_in(user)
-    end
-
-    it 'get list of keys' do
-      project.deploy_keys << private_deploy_key
-      project.deploy_keys << public_deploy_key
-
-      visit project_settings_ci_cd_path(project)
-
-      expect(page).to have_content('private_deploy_key')
-      expect(page).to have_content('public_deploy_key')
-    end
-
-    it 'add a new deploy key' do
-      visit project_settings_ci_cd_path(project)
-
-      fill_in 'deploy_key_title', with: 'new_deploy_key'
-      fill_in 'deploy_key_key', with: new_ssh_key
-      check 'deploy_key_deploy_keys_projects_attributes_0_can_push'
-      click_button 'Add key'
-
-      expect(page).to have_content('new_deploy_key')
-      expect(page).to have_content('Write access allowed')
-    end
-
-    it 'edit an existing deploy key' do
-      project.deploy_keys << private_deploy_key
-      visit project_settings_ci_cd_path(project)
-
-      find('.deploy-key', text: private_deploy_key.title).find('.ic-pencil').click
-
-      fill_in 'deploy_key_title', with: 'updated_deploy_key'
-      check 'deploy_key_deploy_keys_projects_attributes_0_can_push'
-      click_button 'Save changes'
-
-      expect(page).to have_content('updated_deploy_key')
-      expect(page).to have_content('Write access allowed')
-    end
-
-    it 'edit an existing public deploy key to be writable' do
-      project.deploy_keys << public_deploy_key
-      visit project_settings_ci_cd_path(project)
-
-      find('.deploy-key', text: public_deploy_key.title).find('.ic-pencil').click
-
-      check 'deploy_key_deploy_keys_projects_attributes_0_can_push'
-      click_button 'Save changes'
-
-      expect(page).to have_content('public_deploy_key')
-      expect(page).to have_content('Write access allowed')
-    end
-
-    it 'edit a deploy key from projects user has access to' do
-      project2 = create(:project_empty_repo)
-      project2.add_role(user, role)
-      project2.deploy_keys << private_deploy_key
-
-      visit project_settings_ci_cd_path(project)
-
-      find('.js-deployKeys-tab-available_project_keys').click
-
-      find('.deploy-key', text: private_deploy_key.title).find('.ic-pencil').click
-
-      fill_in 'deploy_key_title', with: 'updated_deploy_key'
-      click_button 'Save changes'
-
-      find('.js-deployKeys-tab-available_project_keys').click
-
-      expect(page).to have_content('updated_deploy_key')
-    end
-
-    it 'remove an existing deploy key' do
-      project.deploy_keys << private_deploy_key
-      visit project_settings_ci_cd_path(project)
-
-      accept_confirm { find('.deploy-key', text: private_deploy_key.title).find('.ic-remove').click }
-
-      expect(page).not_to have_content(private_deploy_key.title)
-    end
-  end
-end
diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb
index 0fd153f051854ec51db8bb69e014e03804f1db0b..2fb6c71384fec8ff457d6353912099497eb4ad7c 100644
--- a/spec/features/projects/settings/repository_settings_spec.rb
+++ b/spec/features/projects/settings/repository_settings_spec.rb
@@ -39,6 +39,89 @@
       end
     end
 
+    context 'Deploy Keys', :js do
+      let_it_be(:private_deploy_key) { create(:deploy_key, title: 'private_deploy_key', public: false) }
+      let_it_be(:public_deploy_key) { create(:another_deploy_key, title: 'public_deploy_key', public: true) }
+      let(:new_ssh_key) { attributes_for(:key)[:key] }
+
+      it 'get list of keys' do
+        project.deploy_keys << private_deploy_key
+        project.deploy_keys << public_deploy_key
+
+        visit project_settings_repository_path(project)
+
+        expect(page).to have_content('private_deploy_key')
+        expect(page).to have_content('public_deploy_key')
+      end
+
+      it 'add a new deploy key' do
+        visit project_settings_repository_path(project)
+
+        fill_in 'deploy_key_title', with: 'new_deploy_key'
+        fill_in 'deploy_key_key', with: new_ssh_key
+        check 'deploy_key_deploy_keys_projects_attributes_0_can_push'
+        click_button 'Add key'
+
+        expect(page).to have_content('new_deploy_key')
+        expect(page).to have_content('Write access allowed')
+      end
+
+      it 'edit an existing deploy key' do
+        project.deploy_keys << private_deploy_key
+        visit project_settings_repository_path(project)
+
+        find('.deploy-key', text: private_deploy_key.title).find('.ic-pencil').click
+
+        fill_in 'deploy_key_title', with: 'updated_deploy_key'
+        check 'deploy_key_deploy_keys_projects_attributes_0_can_push'
+        click_button 'Save changes'
+
+        expect(page).to have_content('updated_deploy_key')
+        expect(page).to have_content('Write access allowed')
+      end
+
+      it 'edit an existing public deploy key to be writable' do
+        project.deploy_keys << public_deploy_key
+        visit project_settings_repository_path(project)
+
+        find('.deploy-key', text: public_deploy_key.title).find('.ic-pencil').click
+
+        check 'deploy_key_deploy_keys_projects_attributes_0_can_push'
+        click_button 'Save changes'
+
+        expect(page).to have_content('public_deploy_key')
+        expect(page).to have_content('Write access allowed')
+      end
+
+      it 'edit a deploy key from projects user has access to' do
+        project2 = create(:project_empty_repo)
+        project2.add_role(user, role)
+        project2.deploy_keys << private_deploy_key
+
+        visit project_settings_repository_path(project)
+
+        find('.js-deployKeys-tab-available_project_keys').click
+
+        find('.deploy-key', text: private_deploy_key.title).find('.ic-pencil').click
+
+        fill_in 'deploy_key_title', with: 'updated_deploy_key'
+        click_button 'Save changes'
+
+        find('.js-deployKeys-tab-available_project_keys').click
+
+        expect(page).to have_content('updated_deploy_key')
+      end
+
+      it 'remove an existing deploy key' do
+        project.deploy_keys << private_deploy_key
+        visit project_settings_repository_path(project)
+
+        accept_confirm { find('.deploy-key', text: private_deploy_key.title).find('.ic-remove').click }
+
+        expect(page).not_to have_content(private_deploy_key.title)
+      end
+    end
+
     context 'remote mirror settings' do
       before do
         visit project_settings_repository_path(project)
diff --git a/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb b/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb
index ac7788ba1fae21e0b13705095211a018193d1dc0..cd9299150b2a2174a540cff7f8de52d70855a56d 100644
--- a/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb
+++ b/spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb
@@ -20,7 +20,7 @@
         click_button("Enable")
 
         expect(page).not_to have_selector(".fa-spinner")
-        expect(current_path).to eq(project_settings_ci_cd_path(project))
+        expect(current_path).to eq(project_settings_repository_path(project))
 
         find(".js-deployKeys-tab-enabled_keys").click
 
@@ -96,7 +96,7 @@
 
       click_button("Add key")
 
-      expect(current_path).to eq(project_settings_ci_cd_path(project))
+      expect(current_path).to eq(project_settings_repository_path(project))
 
       page.within(".deploy-keys") do
         expect(page).to have_content(DEPLOY_KEY_TITLE)