diff --git a/app/assets/javascripts/dispatcher.js.es6 b/app/assets/javascripts/dispatcher.js.es6
index 70f467d608f78243dd8bedb0b63398076aa8c00f..048ceaa41f168f48a4e22fbb068abbca192919e2 100644
--- a/app/assets/javascripts/dispatcher.js.es6
+++ b/app/assets/javascripts/dispatcher.js.es6
@@ -254,7 +254,7 @@
           new gl.ProtectedBranchCreate();
           new gl.ProtectedBranchEditList();
           break;
-        case 'projects:variables:index':
+        case 'projects:ci_cd:show':
           new gl.ProjectVariables();
           break;
         case 'ci:lints:create':
diff --git a/app/controllers/projects/pipelines_settings_controller.rb b/app/controllers/projects/pipelines_settings_controller.rb
index 53ce23221edf85cf533426a6e224bbc3ada8f8ba..c8c80551ac966398a07adacc6c46910d12708208 100644
--- a/app/controllers/projects/pipelines_settings_controller.rb
+++ b/app/controllers/projects/pipelines_settings_controller.rb
@@ -2,20 +2,13 @@ class Projects::PipelinesSettingsController < Projects::ApplicationController
   before_action :authorize_admin_pipeline!
 
   def show
-    @ref = params[:ref] || @project.default_branch || 'master'
-
-    @badges = [Gitlab::Badge::Build::Status,
-               Gitlab::Badge::Coverage::Report]
-
-    @badges.map! do |badge|
-      badge.new(@project, @ref).metadata
-    end
+    redirect_to namespace_project_settings_ci_cd_path(@project.namespace, @project, params: params)
   end
 
   def update
     if @project.update_attributes(update_params)
       flash[:notice] = "CI/CD Pipelines settings for '#{@project.name}' were successfully updated."
-      redirect_to namespace_project_pipelines_settings_path(@project.namespace, @project)
+      redirect_to namespace_project_settings_ci_cd_path(@project.namespace, @project)
     else
       render 'show'
     end
diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb
index 53c36635efe1ecd779360bf14ead772aa2556b97..74c54037ba9bcf2bd94beae5efba30c1f1b8c8c0 100644
--- a/app/controllers/projects/runners_controller.rb
+++ b/app/controllers/projects/runners_controller.rb
@@ -5,11 +5,7 @@ class Projects::RunnersController < Projects::ApplicationController
   layout 'project_settings'
 
   def index
-    @project_runners = project.runners.ordered
-    @assignable_runners = current_user.ci_authorized_runners.
-      assignable_for(project).ordered.page(params[:page]).per(20)
-    @shared_runners = Ci::Runner.shared.active
-    @shared_runners_count = @shared_runners.count(:all)
+    redirect_to namespace_project_settings_ci_cd_path(@project.namespace, @project)
   end
 
   def edit
@@ -53,7 +49,7 @@ class Projects::RunnersController < Projects::ApplicationController
   def toggle_shared_runners
     project.toggle!(:shared_runners_enabled)
 
-    redirect_to namespace_project_runners_path(project.namespace, project)
+    redirect_to namespace_project_settings_ci_cd_path(@project.namespace, @project)
   end
 
   protected
diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6f009d6195062cba1af675340f2354b6d9dd113e
--- /dev/null
+++ b/app/controllers/projects/settings/ci_cd_controller.rb
@@ -0,0 +1,44 @@
+module Projects
+  module Settings
+    class CiCdController < Projects::ApplicationController
+      before_action :authorize_admin_pipeline!
+
+      def show
+        define_runners_variables
+        define_secret_variables
+        define_triggers_variables
+        define_badges_variables
+      end
+
+      private
+
+      def define_runners_variables
+        @project_runners = @project.runners.ordered
+        @assignable_runners = current_user.ci_authorized_runners.
+          assignable_for(project).ordered.page(params[:page]).per(20)
+        @shared_runners = Ci::Runner.shared.active
+        @shared_runners_count = @shared_runners.count(:all)
+      end
+
+      def define_secret_variables
+        @variable = Ci::Variable.new
+      end
+
+      def define_triggers_variables
+        @triggers = @project.triggers
+        @trigger = Ci::Trigger.new
+      end
+
+      def define_badges_variables
+        @ref = params[:ref] || @project.default_branch || 'master'
+
+        @badges = [Gitlab::Badge::Build::Status,
+                   Gitlab::Badge::Coverage::Report]
+
+        @badges.map! do |badge|
+          badge.new(@project, @ref).metadata
+        end
+      end
+    end
+  end
+end
diff --git a/app/controllers/projects/triggers_controller.rb b/app/controllers/projects/triggers_controller.rb
index 92359745cec883d6d9405340a5d9f571243529c8..b2c11ea4156d280cff1ba443c465b6609f16815d 100644
--- a/app/controllers/projects/triggers_controller.rb
+++ b/app/controllers/projects/triggers_controller.rb
@@ -4,8 +4,7 @@ class Projects::TriggersController < Projects::ApplicationController
   layout 'project_settings'
 
   def index
-    @triggers = project.triggers
-    @trigger = Ci::Trigger.new
+    redirect_to namespace_project_settings_ci_cd_path(@project.namespace, @project)
   end
 
   def create
@@ -13,17 +12,18 @@ class Projects::TriggersController < Projects::ApplicationController
     @trigger.save
 
     if @trigger.valid?
-      redirect_to namespace_project_triggers_path(@project.namespace, @project)
+      redirect_to namespace_project_variables_path(project.namespace, project), notice: 'Trigger was created successfully.'
     else
       @triggers = project.triggers.select(&:persisted?)
-      render :index
+      render action: "show"
     end
   end
 
   def destroy
     trigger.destroy
+    flash[:alert] = "Trigger removed"
 
-    redirect_to namespace_project_triggers_path(@project.namespace, @project)
+    redirect_to namespace_project_settings_ci_cd_path(@project.namespace, @project)
   end
 
   private
diff --git a/app/controllers/projects/variables_controller.rb b/app/controllers/projects/variables_controller.rb
index 6f0687293907c6cdecbef2b335029711f1878ae2..a4d1b1ee69b7d85c03de0bc90bdaf63333c9cb2f 100644
--- a/app/controllers/projects/variables_controller.rb
+++ b/app/controllers/projects/variables_controller.rb
@@ -4,7 +4,7 @@ class Projects::VariablesController < Projects::ApplicationController
   layout 'project_settings'
 
   def index
-    @variable = Ci::Variable.new
+    redirect_to namespace_project_settings_ci_cd_path(@project.namespace, @project)
   end
 
   def show
@@ -25,9 +25,10 @@ class Projects::VariablesController < Projects::ApplicationController
     @variable = Ci::Variable.new(project_params)
 
     if @variable.valid? && @project.variables << @variable
-      redirect_to namespace_project_variables_path(project.namespace, project), notice: 'Variables were successfully updated.'
+      flash[:notice] = 'Variables were successfully updated.'
+      redirect_to namespace_project_settings_ci_cd_path(project.namespace, project)
     else
-      render action: "index"
+      render "show"
     end
   end
 
@@ -35,7 +36,7 @@ class Projects::VariablesController < Projects::ApplicationController
     @key = @project.variables.find(params[:id])
     @key.destroy
 
-    redirect_to namespace_project_variables_path(project.namespace, project), notice: 'Variable was successfully removed.'
+    redirect_to namespace_project_settings_ci_cd_path(project.namespace, project), notice: 'Variable was successfully removed.'
   end
 
   private
diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb
index 2159e4ce21a42c4b4a8269ca01386d331c278b4b..f16a63e21789212635bf77313068dadf570c7c44 100644
--- a/app/helpers/gitlab_routing_helper.rb
+++ b/app/helpers/gitlab_routing_helper.rb
@@ -211,8 +211,12 @@ module GitlabRoutingHelper
   def project_settings_integrations_path(project, *args)
     namespace_project_settings_integrations_path(project.namespace, project, *args)
   end
-  
+
   def project_settings_members_path(project, *args)
     namespace_project_settings_members_path(project.namespace, project, *args)
   end
+
+  def project_settings_ci_cd_path(project, *args)
+    namespace_project_settings_ci_cd_path(project.namespace, project, *args)
+  end
 end
diff --git a/app/views/layouts/nav/_project_settings.html.haml b/app/views/layouts/nav/_project_settings.html.haml
index d6c158b6de3cb613ae8acb6815cb3c466b3d7d68..665725f6862cdf24131e8df20edfa066fdc42179 100644
--- a/app/views/layouts/nav/_project_settings.html.haml
+++ b/app/views/layouts/nav/_project_settings.html.haml
@@ -18,20 +18,8 @@
         Protected Branches
 
   - if @project.feature_available?(:builds, current_user)
-    = nav_link(controller: :runners) do
-      = link_to namespace_project_runners_path(@project.namespace, @project), title: 'Runners' do
-        %span
-          Runners
-    = nav_link(controller: :variables) do
-      = link_to namespace_project_variables_path(@project.namespace, @project), title: 'Variables' do
-        %span
-          Variables
-    = nav_link(controller: :triggers) do
-      = link_to namespace_project_triggers_path(@project.namespace, @project), title: 'Triggers' do
-        %span
-          Triggers
-    = nav_link(controller: :pipelines_settings) do
-      = link_to namespace_project_pipelines_settings_path(@project.namespace, @project), title: 'CI/CD Pipelines' do
+    = nav_link(controller: :ci_cd) do
+      = link_to namespace_project_settings_ci_cd_path(@project.namespace, @project), title: 'CI/CD Pipelines' do
         %span
           CI/CD Pipelines
   = nav_link(controller: :pages) do
diff --git a/app/views/projects/pipelines_settings/show.html.haml b/app/views/projects/pipelines_settings/_show.html.haml
similarity index 97%
rename from app/views/projects/pipelines_settings/show.html.haml
rename to app/views/projects/pipelines_settings/_show.html.haml
index 18328c67f0243a9c94209f0bac6912eaead49b5e..8024fb8979d6fa4f5942b4d04d1d704e87ddb086 100644
--- a/app/views/projects/pipelines_settings/show.html.haml
+++ b/app/views/projects/pipelines_settings/_show.html.haml
@@ -1,9 +1,7 @@
-- page_title "CI/CD Pipelines"
-
 .row.prepend-top-default
   .col-lg-3.profile-settings-sidebar
     %h4.prepend-top-0
-      = page_title
+      CI/CD Pipelines
   .col-lg-9
     = form_for @project, url: namespace_project_pipelines_settings_path(@project.namespace.becomes(Namespace), @project) do |f|
       %fieldset.builds-feature
@@ -95,4 +93,4 @@
 %hr
 
 .row.prepend-top-default
-  = render partial: 'badge', collection: @badges
+  = render partial: 'projects/pipelines_settings/badge', collection: @badges
diff --git a/app/views/projects/runners/index.html.haml b/app/views/projects/runners/_index.html.haml
similarity index 87%
rename from app/views/projects/runners/index.html.haml
rename to app/views/projects/runners/_index.html.haml
index d6f691d9c240770bd9cc8ce1e553c162a7cd0f7f..f9808f7c990f6b0b4a27d9e9ac62f60c802910a3 100644
--- a/app/views/projects/runners/index.html.haml
+++ b/app/views/projects/runners/_index.html.haml
@@ -1,5 +1,3 @@
-- page_title "Runners"
-
 .light.prepend-top-default
   %p
     A 'Runner' is a process which runs a job.
@@ -22,6 +20,6 @@
 %p.lead To start serving your jobs you can either add specific Runners to your project or use shared Runners
 .row
   .col-sm-6
-    = render 'specific_runners'
+    = render 'projects/runners/specific_runners'
   .col-sm-6
-    = render 'shared_runners'
+    = render 'projects/runners/shared_runners'
diff --git a/app/views/projects/runners/_shared_runners.html.haml b/app/views/projects/runners/_shared_runners.html.haml
index 5afa193357ef7227e16e694fd3862152a0bda895..0671dd66e78d29d818a3998eb081be52197fbad7 100644
--- a/app/views/projects/runners/_shared_runners.html.haml
+++ b/app/views/projects/runners/_shared_runners.html.haml
@@ -22,7 +22,7 @@
 - else
   %h4.underlined-title Available shared Runners : #{@shared_runners_count}
   %ul.bordered-list.available-shared-runners
-    = render partial: 'runner', collection: @shared_runners, as: :runner
+    = render partial: 'projects/runners/runner', collection: @shared_runners, as: :runner
   - if @shared_runners_count > 10
     .light
       and #{@shared_runners_count - 10} more...
diff --git a/app/views/projects/runners/_specific_runners.html.haml b/app/views/projects/runners/_specific_runners.html.haml
index dcff675eafc387954da96155acbd128123f02693..6b8e6bd4feef60ded81a588f27b07699a252e51a 100644
--- a/app/views/projects/runners/_specific_runners.html.haml
+++ b/app/views/projects/runners/_specific_runners.html.haml
@@ -20,10 +20,10 @@
 - if @project_runners.any?
   %h4.underlined-title Runners activated for this project
   %ul.bordered-list.activated-specific-runners
-    = render partial: 'runner', collection: @project_runners, as: :runner
+    = render partial: 'projects/runners/runner', collection: @project_runners, as: :runner
 
 - if @assignable_runners.any?
   %h4.underlined-title Available specific runners
   %ul.bordered-list.available-specific-runners
-    = render partial: 'runner', collection: @assignable_runners, as: :runner
+    = render partial: 'projects/runners/runner', collection: @assignable_runners, as: :runner
   = paginate @assignable_runners, theme: "gitlab"
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..52f5f7b81e2afb493fe05a4e1ea792fd521f27eb
--- /dev/null
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -0,0 +1,6 @@
+- page_title "CI/CD Pipelines"
+
+= render 'projects/runners/index'
+= render 'projects/variables/index'
+= render 'projects/triggers/index'
+= render 'projects/pipelines_settings/show'
diff --git a/app/views/projects/triggers/index.html.haml b/app/views/projects/triggers/_index.html.haml
similarity index 93%
rename from app/views/projects/triggers/index.html.haml
rename to app/views/projects/triggers/_index.html.haml
index b9c4e323430a7397452fd7fe697baeb00a9c4dd8..5cb1818ae549143faf9a01ba41f0fce75c0d09d8 100644
--- a/app/views/projects/triggers/index.html.haml
+++ b/app/views/projects/triggers/_index.html.haml
@@ -1,9 +1,7 @@
-- page_title "Triggers"
-
 .row.prepend-top-default.append-bottom-default
   .col-lg-3
     %h4.prepend-top-0
-      = page_title
+      Triggers
     %p.prepend-top-20
       Triggers can force a specific branch or tag to get rebuilt with an API call.
     %p.append-bottom-0
@@ -25,12 +23,12 @@
                 %th
                   %strong Last used
                 %th
-              = render partial: 'trigger', collection: @triggers, as: :trigger
+              = render partial: 'projects/triggers/trigger', collection: @triggers, as: :trigger
         - else
           %p.settings-message.text-center.append-bottom-default
             No triggers have been created yet. Add one using the button below.
 
-        = form_for @trigger, url: url_for(controller: 'projects/triggers', action: 'create') do |f|
+        = form_for @trigger, url: url_for(controller: '/projects/triggers', action: 'create') do |f|
           = f.submit "Add trigger", class: 'btn btn-success'
 
       .panel-footer
diff --git a/app/views/projects/variables/index.html.haml b/app/views/projects/variables/_index.html.haml
similarity index 74%
rename from app/views/projects/variables/index.html.haml
rename to app/views/projects/variables/_index.html.haml
index cf7ae0b489f35cca2f4f72a94c6f468670f23b1f..1b852a9c5b36e922eea0714b150e10118ba74bbc 100644
--- a/app/views/projects/variables/index.html.haml
+++ b/app/views/projects/variables/_index.html.haml
@@ -1,12 +1,10 @@
-- page_title "Variables"
-
 .row.prepend-top-default.append-bottom-default
   .col-lg-3
-    = render "content"
+    = render "projects/variables/content"
   .col-lg-9
     %h5.prepend-top-0
       Add a variable
-    = render "form", btn_text: "Add new variable"
+    = render "projects/variables/form", btn_text: "Add new variable"
     %hr
     %h5.prepend-top-0
       Your variables (#{@project.variables.size})
@@ -14,5 +12,5 @@
       %p.settings-message.text-center.append-bottom-0
         No variables found, add one with the form above.
     - else
-      = render "table"
+      = render "projects/variables/table"
       %button.btn.btn-info.js-btn-toggle-reveal-values{ "data-status" => 'hidden' } Reveal Values
diff --git a/config/routes/project.rb b/config/routes/project.rb
index c24893f4cd538f26a46ceeba4efa662051ebde98..2ac98cf3842d62b90e10342157d720ef202be7fc 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -315,6 +315,7 @@ constraints(ProjectUrlConstrainer.new) do
       end
       namespace :settings do
         resource :members, only: [:show]
+        resource :ci_cd, only: [:show], controller: 'ci_cd'
         resource :integrations, only: [:show]
       end
 
diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e9a91cff1b3474b66f0682d4209fb9a18a4ac446
--- /dev/null
+++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
@@ -0,0 +1,20 @@
+require('spec_helper')
+
+describe Projects::Settings::CiCdController do
+  let(:project) { create(:empty_project, :public, :access_requestable) }
+  let(:user) { create(:user) }
+
+  before do
+    project.team << [user, :master]
+    sign_in(user)
+  end
+
+  describe 'GET show' do
+    it 'renders show with 200 status code' do
+      get :show, namespace_id: project.namespace, project_id: project
+
+      expect(response).to have_http_status(200)
+      expect(response).to render_template(:show)
+    end
+  end
+end
diff --git a/spec/controllers/projects/variables_controller_spec.rb b/spec/controllers/projects/variables_controller_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9fa358f7d6211672bddca6c0ef95cf8579aaf834
--- /dev/null
+++ b/spec/controllers/projects/variables_controller_spec.rb
@@ -0,0 +1,59 @@
+require 'spec_helper'
+
+describe Projects::VariablesController do
+  let(:project) { create(:empty_project) }
+  let(:user) { create(:user) }
+
+  before do
+    sign_in(user)
+    project.team << [user, :master]
+  end
+
+  describe 'POST #create' do
+    context 'variable is valid' do
+      it 'shows a success flash message' do
+        post :create, namespace_id: project.namespace.to_param, project_id: project.to_param,
+                      variable: { key: "one", value: "two" }
+
+        expect(flash[:notice]).to include 'Variables were successfully updated.'
+        expect(response).to redirect_to(namespace_project_settings_ci_cd_path(project.namespace, project))
+      end
+    end
+
+    context 'variable is invalid' do
+      it 'shows an alert flash message' do
+        post :create, namespace_id: project.namespace.to_param, project_id: project.to_param,
+                      variable: { key: "..one", value: "two" }
+
+        expect(response).to render_template("projects/variables/show")
+      end
+    end
+  end
+
+  describe 'POST #update' do
+    let(:variable) { create(:ci_variable) }
+
+    context 'updating a variable with valid characters' do
+      before do
+        variable.gl_project_id = project.id
+        project.variables << variable
+      end
+
+      it 'shows a success flash message' do
+        post :update, namespace_id: project.namespace.to_param, project_id: project.to_param,
+                      id: variable.id, variable: { key: variable.key, value: 'two' }
+
+        expect(flash[:notice]).to include 'Variable was successfully updated.'
+        expect(response).to redirect_to(namespace_project_variables_path(project.namespace, project))
+      end
+
+      it 'renders the action #show if the variable key is invalid' do
+        post :update, namespace_id: project.namespace.to_param, project_id: project.to_param,
+                      id: variable.id, variable: { key: '?', value: variable.value }
+
+        expect(response).to have_http_status(200)
+        expect(response).to render_template :show
+      end
+    end
+  end
+end
diff --git a/spec/features/security/project/internal_access_spec.rb b/spec/features/security/project/internal_access_spec.rb
index 92d5a2fbc48cc3ecec283bdf23293cb7f99f0201..24af062d76327f628eb4fc3213cae0ca6bcc0cfe 100644
--- a/spec/features/security/project/internal_access_spec.rb
+++ b/spec/features/security/project/internal_access_spec.rb
@@ -96,6 +96,20 @@ describe "Internal Project Access", feature: true  do
     it { is_expected.to be_denied_for(:external) }
   end
 
+  describe "GET /:project_path/settings/ci_cd" do
+    subject { namespace_project_settings_ci_cd_path(project.namespace, project) }
+
+    it { is_expected.to be_allowed_for(:admin) }
+    it { is_expected.to be_allowed_for(:owner).of(project) }
+    it { is_expected.to be_allowed_for(:master).of(project) }
+    it { is_expected.to be_denied_for(:developer).of(project) }
+    it { is_expected.to be_denied_for(:reporter).of(project) }
+    it { is_expected.to be_denied_for(:guest).of(project) }
+    it { is_expected.to be_denied_for(:user) }
+    it { is_expected.to be_denied_for(:visitor) }
+    it { is_expected.to be_denied_for(:external) }
+  end
+
   describe "GET /:project_path/blob" do
     let(:commit) { project.repository.commit }
     subject { namespace_project_blob_path(project.namespace, project, File.join(commit.id, '.gitignore')) }
diff --git a/spec/features/security/project/private_access_spec.rb b/spec/features/security/project/private_access_spec.rb
index b616e4884875f250bced00b5b31d498bfc980cfb..c511dcfa18e39d614a185d75d9c65f1b79c46090 100644
--- a/spec/features/security/project/private_access_spec.rb
+++ b/spec/features/security/project/private_access_spec.rb
@@ -92,8 +92,22 @@ describe "Private Project Access", feature: true  do
     it { is_expected.to be_allowed_for(:reporter).of(project) }
     it { is_expected.to be_allowed_for(:guest).of(project) }
     it { is_expected.to be_denied_for(:user) }
+    it { is_expected.to be_denied_for(:visitor) }
     it { is_expected.to be_denied_for(:external) }
+  end
+
+  describe "GET /:project_path/settings/ci_cd" do
+    subject { namespace_project_settings_ci_cd_path(project.namespace, project) }
+
+    it { is_expected.to be_allowed_for(:admin) }
+    it { is_expected.to be_allowed_for(:owner).of(project) }
+    it { is_expected.to be_allowed_for(:master).of(project) }
+    it { is_expected.to be_denied_for(:developer).of(project) }
+    it { is_expected.to be_denied_for(:reporter).of(project) }
+    it { is_expected.to be_denied_for(:guest).of(project) }
+    it { is_expected.to be_denied_for(:user) }
     it { is_expected.to be_denied_for(:visitor) }
+    it { is_expected.to be_denied_for(:external) }
   end
 
   describe "GET /:project_path/blob" do
diff --git a/spec/features/security/project/public_access_spec.rb b/spec/features/security/project/public_access_spec.rb
index ded85e837f49fec1060ed82c078a618e16590e7f..d8cc012c27e010ef0d56eb77b4844d527c6c1ad0 100644
--- a/spec/features/security/project/public_access_spec.rb
+++ b/spec/features/security/project/public_access_spec.rb
@@ -96,6 +96,20 @@ describe "Public Project Access", feature: true  do
     it { is_expected.to be_allowed_for(:external) }
   end
 
+  describe "GET /:project_path/settings/ci_cd" do
+    subject { namespace_project_settings_ci_cd_path(project.namespace, project) }
+
+    it { is_expected.to be_allowed_for(:admin) }
+    it { is_expected.to be_allowed_for(:owner).of(project) }
+    it { is_expected.to be_allowed_for(:master).of(project) }
+    it { is_expected.to be_denied_for(:developer).of(project) }
+    it { is_expected.to be_denied_for(:reporter).of(project) }
+    it { is_expected.to be_denied_for(:guest).of(project) }
+    it { is_expected.to be_denied_for(:user) }
+    it { is_expected.to be_denied_for(:visitor) }
+    it { is_expected.to be_denied_for(:external) }
+  end
+
   describe "GET /:project_path/pipelines" do
     subject { namespace_project_pipelines_path(project.namespace, project) }
 
diff --git a/spec/features/triggers_spec.rb b/spec/features/triggers_spec.rb
index 72354834c5a539d1bfbd4a983ee0154dfa39efcc..4a7511589d6963d0bb288d7091307350ac398814 100644
--- a/spec/features/triggers_spec.rb
+++ b/spec/features/triggers_spec.rb
@@ -7,7 +7,7 @@ describe 'Triggers' do
   before do
     @project = FactoryGirl.create :empty_project
     @project.team << [user, :master]
-    visit namespace_project_triggers_path(@project.namespace, @project)
+    visit namespace_project_settings_ci_cd_path(@project.namespace, @project)
   end
 
   context 'create a trigger' do
diff --git a/spec/features/variables_spec.rb b/spec/features/variables_spec.rb
index ff30ffd78206caf844bdc698cebeb496cfd802d7..9a4bc0270041268d240204921056997dc86e261c 100644
--- a/spec/features/variables_spec.rb
+++ b/spec/features/variables_spec.rb
@@ -10,7 +10,7 @@ describe 'Project variables', js: true do
     project.team << [user, :master]
     project.variables << variable
 
-    visit namespace_project_variables_path(project.namespace, project)
+    visit namespace_project_settings_ci_cd_path(project.namespace, project)
   end
 
   it 'shows list of variables' do