diff --git a/app/assets/stylesheets/framework/tables.scss b/app/assets/stylesheets/framework/tables.scss
index 75b770ae5a275317887ed1f0cc53bf6af41abfd0..3a7f5bb932eb8cd232afeafef3de11878a99544b 100644
--- a/app/assets/stylesheets/framework/tables.scss
+++ b/app/assets/stylesheets/framework/tables.scss
@@ -34,6 +34,25 @@ table {
         font-weight: normal;
         font-size: 15px;
         border-bottom: 1px solid $border-color;
+
+        .rotate {
+          height: 140px;
+          white-space: nowrap;
+        }
+
+        .rotate > div {
+          transform:
+                  /* Magic Numbers */
+                  translate(25px, 51px)
+                    /* 45 is really 360 - 45 */
+                  rotate(315deg);
+          width: 30px;
+        }
+
+        .rotate > div > span {
+          border-bottom: 1px solid #ccc;
+          padding: 5px 10px;
+        }
       }
 
       td {
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 764c8cc9cca665db46334a8e744d7a9866661d84..a3e72fbdef14f474762471dde7f37d0d8105047b 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -1,4 +1,4 @@
-class Projects::PipelineController < Projects::ApplicationController
+class Projects::PipelinesController < Projects::ApplicationController
   before_action :ci_commit, except: [:index, :new, :create]
   before_action :authorize_read_pipeline!
   before_action :authorize_create_pipeline!, only: [:new, :create]
diff --git a/app/helpers/ci_status_helper.rb b/app/helpers/ci_status_helper.rb
index effa7ce77e1c93bfdf12b8543889875cae4cd310..3f7282d0c6cb875f2c5d737d1f9f59e868125f18 100644
--- a/app/helpers/ci_status_helper.rb
+++ b/app/helpers/ci_status_helper.rb
@@ -37,7 +37,7 @@ module CiStatusHelper
     return unless ci_commit.is_a?(Commit) || ci_commit.is_a?(Ci::Commit)
 
     link_to ci_icon_for_status(ci_commit.status),
-      project_ci_commit_path(ci_commit.project, ci_commit),
+      project_pipeline_path(ci_commit.project, ci_commit),
       class: "ci-status-link ci-status-icon-#{ci_commit.status.dasherize}",
       title: "Build #{ci_label_for_status(ci_commit.status)}",
       data: { toggle: 'tooltip', placement: tooltip_placement }
diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb
index f1af8e163cdb8490f4ff4f38521887615a41b500..ed0db04e0697d22ada36eabdc5fa19de6b2cdb4f 100644
--- a/app/helpers/gitlab_routing_helper.rb
+++ b/app/helpers/gitlab_routing_helper.rb
@@ -37,7 +37,7 @@ module GitlabRoutingHelper
     builds_namespace_project_commit_path(project.namespace, project, commit.id)
   end
 
-  def project_ci_commit_path(project, ci_commit)
+  def project_pipeline_path(project, ci_commit)
     builds_namespace_project_commit_path(project.namespace, project, ci_commit.sha)
   end
 
diff --git a/app/models/ci/commit.rb b/app/models/ci/commit.rb
index 8865bd76bd208d285bceb02ebbc2516454d8a0ea..687654d3c89b2d4321dd7ecc6f27e561d6b8f3c8 100644
--- a/app/models/ci/commit.rb
+++ b/app/models/ci/commit.rb
@@ -94,6 +94,10 @@ module Ci
       end
     end
 
+    def triggered?
+      trigger_requests.any?
+    end
+
     def invalidate
       write_attribute(:status, nil)
       write_attribute(:started_at, nil)
diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml
index fcce1b1dc98114d5bbb7e3e9d9b3b5066aa3cf6a..b58d8270230069cc70cb660ae0e5a912df238c3e 100644
--- a/app/views/layouts/nav/_project.html.haml
+++ b/app/views/layouts/nav/_project.html.haml
@@ -40,7 +40,7 @@
 
   - if project_nav_tab? :builds
     = nav_link(controller: %w(ci_commits)) do
-      = link_to project_ci_commits_path(@project), title: 'Pipelines', class: 'shortcuts-builds' do
+      = link_to project_pipelines_path(@project), title: 'Pipelines', class: 'shortcuts-builds' do
         = icon('ship fw')
         %span
           Pipelines
diff --git a/app/views/projects/ci/commits/_commit.html.haml b/app/views/projects/ci/commits/_commit.html.haml
index 29efcc9cfdd4528b73f36afe36900674d89c4212..7c6ba2163863131b340d68200baf9c3fc29d9d81 100644
--- a/app/views/projects/ci/commits/_commit.html.haml
+++ b/app/views/projects/ci/commits/_commit.html.haml
@@ -1,7 +1,7 @@
 - status = commit.status
 %tr.commit
   %td.commit-link
-    = link_to namespace_project_commit_url(@project.namespace, @project, commit), class: "ci-status ci-#{status}" do
+    = link_to namespace_project_commit_path(@project.namespace, @project, commit.sha), class: "ci-status ci-#{status}" do
       = ci_icon_for_status(status)
       %strong ##{commit.id}
 
@@ -14,7 +14,7 @@
         %span.label.label-primary tag
       - if commit.branch?
         %span.label.label-primary branch
-      - if commit.trigger_requests.any?
+      - if commit.triggered?
         %span.label.label-primary triggered
       - if commit.yaml_errors.present?
         %span.label.label-danger.has-tooltip(title="#{commit.yaml_errors}") yaml invalid
@@ -27,22 +27,21 @@
         %p
           Cant find HEAD commit for this branch
 
+    - stages_status = commit.statuses.stages_status
     - stages.each do |stage|
       %td
-        - status = commit.statuses.latest.where(stage: stage).status
-        %span.has-tooltip(title="#{status || "missing"}"){class: "ci-status-icon-#{status || "skipped"}"}
-          = ci_icon_for_status(status || "missing")
-        -#- if status
-        -#  = ci_status_with_icon(status)
-        -#- else
-        -#  = ci_status_with_icon('missing')
+        - if status = stages_status[stage]
+          %span.has-tooltip(title="#{status}"){class: "ci-status-icon-#{status}"}
+            = ci_icon_for_status(status)
 
   %td
     - if commit.started_at && commit.finished_at
       %p
+        %i.fa.fa-late-o
         #{duration_in_words(commit.finished_at, commit.started_at)}
     - if commit.finished_at
       %p
+        %i.fa.fa-date-o
         #{time_ago_with_tooltip(commit.finished_at)}
 
   %td.content
@@ -63,11 +62,11 @@
 
       - if can?(current_user, :update_pipeline, @project)
         - if commit.retryable?
-          = link_to retry_namespace_project_ci_commit_path(@project.namespace, @project, commit.id), class: 'btn has-tooltip', title: "Retry", method: :post do
+          = link_to retry_namespace_project_pipeline_path(@project.namespace, @project, commit.id), class: 'btn has-tooltip', title: "Retry", method: :post do
             = icon("repeat")
 
         &nbsp;
 
         - if commit.active?
-          = link_to cancel_namespace_project_ci_commit_path(@project.namespace, @project, commit.id), class: 'btn btn-remove has-tooltip', title: "Cancel", method: :post do
+          = link_to cancel_namespace_project_pipeline_path(@project.namespace, @project, commit.id), class: 'btn btn-remove has-tooltip', title: "Cancel", method: :post do
             = icon("remove cred")
diff --git a/app/views/projects/ci_commits/_header_title.html.haml b/app/views/projects/ci_commits/_header_title.html.haml
deleted file mode 100644
index 27c125ca40f07f5208e073f09793dc65d7c22643..0000000000000000000000000000000000000000
--- a/app/views/projects/ci_commits/_header_title.html.haml
+++ /dev/null
@@ -1 +0,0 @@
-- header_title project_title(@project, "Pipelines", project_ci_commits_path(@project))
diff --git a/app/views/projects/pipelines/_header_title.html.haml b/app/views/projects/pipelines/_header_title.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..faf63d64a792a319728365034490699252f20192
--- /dev/null
+++ b/app/views/projects/pipelines/_header_title.html.haml
@@ -0,0 +1 @@
+- header_title project_title(@project, "Pipelines", project_pipelines_path(@project))
diff --git a/app/views/projects/ci_commits/index.html.haml b/app/views/projects/pipelines/index.html.haml
similarity index 76%
rename from app/views/projects/ci_commits/index.html.haml
rename to app/views/projects/pipelines/index.html.haml
index 0347c220382299bedc7b184da18cbcb469aa2b16..b9877cd37beb3c9be70040e07652ded2294d3929 100644
--- a/app/views/projects/ci_commits/index.html.haml
+++ b/app/views/projects/pipelines/index.html.haml
@@ -4,32 +4,32 @@
 .top-area
   %ul.nav-links
     %li{class: ('active' if @scope.nil?)}
-      = link_to project_ci_commits_path(@project) do
+      = link_to project_pipelines_path(@project) do
         All
         %span.badge.js-totalbuilds-count
           = number_with_delimiter(@all_commits.count(:id))
 
     %li{class: ('active' if @scope == 'branches')}
-      = link_to project_ci_commits_path(@project, scope: :branches) do
+      = link_to project_pipelines_path(@project, scope: :branches) do
         Branches
         %span.badge.js-running-count
           = number_with_delimiter(@all_commits.running_or_pending.count(:id))
 
     %li{class: ('active' if @scope == 'tags')}
-      = link_to project_ci_commits_path(@project, scope: :tags) do
+      = link_to project_pipelines_path(@project, scope: :tags) do
         Tags
         %span.badge.js-running-count
           = number_with_delimiter(@all_commits.running_or_pending.count(:id))
 
     %li{class: ('active' if @scope == 'running')}
-      = link_to project_ci_commits_path(@project, scope: :running) do
+      = link_to project_pipelines_path(@project, scope: :running) do
         Failed
         %span.badge.js-running-count
           = number_with_delimiter(@all_commits.running_or_pending.count(:id))
 
   .nav-controls
     - if can? current_user, :create_pipeline, @project
-      = link_to new_namespace_project_ci_commit_path(@project.namespace, @project), class: 'btn btn-create' do
+      = link_to new_namespace_project_pipeline_path(@project.namespace, @project), class: 'btn btn-create' do
         = icon('plus')
         New
 
@@ -56,10 +56,10 @@
           %th Pipeline ID
           %th Commit
           - @commits.stages.each do |stage|
-            %th
+            %th.rotate
               = stage.titleize
           %th
           %th
-        = render @commits.includes(:statuses).includes(:builds), commit_sha: true, stage: true, allow_retry: true, stages: stages
+        = render @commits, commit_sha: true, stage: true, allow_retry: true, stages: stages
 
     = paginate @commits, theme: 'gitlab'
diff --git a/app/views/projects/ci_commits/new.html.haml b/app/views/projects/pipelines/new.html.haml
similarity index 72%
rename from app/views/projects/ci_commits/new.html.haml
rename to app/views/projects/pipelines/new.html.haml
index e9a22bbb1579abdca42454ebee539878b95997b9..39b1571b9cfa6cf8b746f6d5f95eeb502aa7a0f1 100644
--- a/app/views/projects/ci_commits/new.html.haml
+++ b/app/views/projects/pipelines/new.html.haml
@@ -9,7 +9,7 @@
   New Pipeline
 %hr
 
-= form_tag namespace_project_ci_commits_path, method: :post, id: "new-pipeline-form", class: "form-horizontal js-create-branch-form js-requires-input" do
+= form_tag namespace_project_pipelines_path, method: :post, id: "new-pipeline-form", class: "form-horizontal js-create-branch-form js-requires-input" do
   .form-group
     = label_tag :ref, 'Create for', class: 'control-label'
     .col-sm-10
@@ -17,7 +17,7 @@
       .help-block Existing branch name, tag
   .form-actions
     = button_tag 'Create pipeline', class: 'btn btn-create', tabindex: 3
-    = link_to 'Cancel', namespace_project_ci_commits_path(@project.namespace, @project), class: 'btn btn-cancel'
+    = link_to 'Cancel', namespace_project_pipelines_path(@project.namespace, @project), class: 'btn btn-cancel'
 
 :javascript
   var availableRefs = #{@project.repository.ref_names.to_json};
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 1688e91ca62598c4400a1754e2ef5e5ea73447d1..59df2c5cb879336c4794a5b51c47d935c1b9e5b1 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -62,7 +62,7 @@ describe Project, models: true do
     it { is_expected.to have_one(:pushover_service).dependent(:destroy) }
     it { is_expected.to have_one(:asana_service).dependent(:destroy) }
     it { is_expected.to have_many(:commit_statuses) }
-    it { is_expected.to have_many(:ci_commits) }
+    it { is_expected.to have_many(:pipelines) }
     it { is_expected.to have_many(:builds) }
     it { is_expected.to have_many(:runner_projects) }
     it { is_expected.to have_many(:runners) }