diff --git a/CHANGELOG b/CHANGELOG
index 67fca2c6f6dc197b3f3dd57b7731fb544da3cdbd..0884ac1947dc02db2b864fbbfaf9a69b75beff6f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -13,6 +13,7 @@ v 8.8.0 (unreleased)
   - Added inline diff styling for `change_title` system notes. (Adam Butler)
   - Project#open_branches has been cleaned up and no longer loads entire records into memory.
   - Escape HTML in commit titles in system note messages
+  - Improve design of Pipeline View
   - Fix creation of Ci::Commit object which can lead to pending, failed in some scenarios
   - Improve multiple branch push performance by memoizing permission checking
   - Log to application.log when an admin starts and stops impersonating a user
diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss
index 546176b65e4aa5527c8e62ba80d0499c1c4edf4f..87b0562c29a0ddb4bd5d3f94b202af6b7078aed0 100644
--- a/app/assets/stylesheets/pages/pipelines.scss
+++ b/app/assets/stylesheets/pages/pipelines.scss
@@ -1,4 +1,24 @@
-.pipeline-stage {
-  overflow: hidden;
-  text-overflow: ellipsis;
+.pipelines {
+  .stage {
+    max-width: 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+
+  .duration, .finished_at {
+    margin: 4px 0;
+  }
+
+  .commit-title {
+    margin: 0;
+  }
+
+  .controls {
+    white-space: nowrap;
+  }
+
+  .btn {
+    margin: 4px;
+  }
 }
diff --git a/app/views/projects/ci/commits/_commit.html.haml b/app/views/projects/ci/commits/_commit.html.haml
index 13162b41f9b514865f874cbdc20141125d9d895b..2ea9333913c0a989d7287bed9e4412d1ab89a248 100644
--- a/app/views/projects/ci/commits/_commit.html.haml
+++ b/app/views/projects/ci/commits/_commit.html.haml
@@ -12,10 +12,10 @@
         ·
       = link_to commit.short_sha, namespace_project_commit_path(@project.namespace, @project, commit.sha), class: "commit-id monospace"
        
-      - if commit.latest?
-        %span.label.label-success latest
       - if commit.tag?
         %span.label.label-primary tag
+      - elsif commit.latest?
+        %span.label.label-success.has-tooltip{ title: 'Latest build for this branch' } latest
       - if commit.triggered?
         %span.label.label-primary triggered
       - if commit.yaml_errors.present?
@@ -23,30 +23,33 @@
       - if commit.builds.any?(&:stuck?)
         %span.label.label-warning stuck
 
-      %p
-        %span
-          - if commit_data = commit.commit_data
-            = link_to_gfm commit_data.title, namespace_project_commit_path(@project.namespace, @project, commit_data.id), class: "commit-row-message"
-          - else
-            Cant find HEAD commit for this branch
+      %p.commit-title
+        - if commit_data = commit.commit_data
+          = link_to_gfm truncate(commit_data.title, length: 60), namespace_project_commit_path(@project.namespace, @project, commit_data.id), class: "commit-row-message"
+        - else
+          Cant find HEAD commit for this branch
 
 
     - stages_status = commit.statuses.stages_status
     - stages.each do |stage|
       %td
-        - if status = stages_status[stage]
-          - tooltip = "#{stage.titleize}: #{status}"
-          %span.has-tooltip{ title: "#{tooltip}", class: "ci-status-icon-#{status}" }
+        - status = stages_status[stage]
+        - tooltip = "#{stage.titleize}: #{status || 'not found'}"
+        - if status
+          = link_to namespace_project_pipeline_path(@project.namespace, @project, commit.id, anchor: stage), class: "has-tooltip ci-status-icon-#{status || 'skipped'}", title: tooltip do
             = ci_icon_for_status(status)
+        - else
+          .light
+            \-
 
   %td
     - if commit.started_at && commit.finished_at
-      %p
+      %p.duration
         = icon("clock-o")
          
         #{duration_in_words(commit.finished_at, commit.started_at)}
     - if commit.finished_at
-      %p
+      %p.finished_at
         = icon("calendar")
          
         #{time_ago_with_tooltip(commit.finished_at)}
@@ -67,11 +70,9 @@
                   %span #{build.name}
 
       - if can?(current_user, :update_pipeline, @project)
-         
         - if commit.retryable? && commit.builds.failed.any?
           = link_to retry_namespace_project_pipeline_path(@project.namespace, @project, commit.id), class: 'btn has-tooltip', title: "Retry", method: :post do
             = icon("repeat")
-         
         - if commit.active?
           = 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")
diff --git a/app/views/projects/commit/_ci_stage.html.haml b/app/views/projects/commit/_ci_stage.html.haml
index aaa318e1eb3f0c947ace8b1ecd63abaab59e3d4d..ae7bb01223eda241fe5b031fca23dc11bda5ee0a 100644
--- a/app/views/projects/commit/_ci_stage.html.haml
+++ b/app/views/projects/commit/_ci_stage.html.haml
@@ -1,6 +1,7 @@
 %tr
   %th{colspan: 10}
     %strong
+      %a{name: stage}
       - status = statuses.latest.status
       %span{class: "ci-status-link ci-status-icon-#{status}"}
         = ci_icon_for_status(status)
diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml
index 9d5b6d367c9f115172f48a89245b5b0d7ff1158b..4e2e81907007ecebcc097c3ef5bcf4c61eecf9be 100644
--- a/app/views/projects/pipelines/index.html.haml
+++ b/app/views/projects/pipelines/index.html.haml
@@ -44,7 +44,7 @@
   - else
     #{@scope.titleize} for this project
 
-%ul.content-list
+%ul.content-list.pipelines
   - stages = @pipelines.stages
   - if @pipelines.blank?
     %li
@@ -56,8 +56,8 @@
           %th ID
           %th Commit
           - stages.each do |stage|
-            %th
-              %span.pipeline-stage.has-tooltip{ title: "#{stage.titleize}" }
+            %th.stage
+              %span.has-tooltip{ title: "#{stage.titleize}" }
                 = stage.titleize.pluralize
           %th
           %th