diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index 2476b17ef90a75c4cb691785cbbe73bed4b3ce0c..1c50c66e5f6df2a43eec91e65814ac94da758467 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -1,5 +1,6 @@
 class DashboardController < ApplicationController
   def index
     @projects = current_user.projects.all
+    @active_projects = @projects.select(&:last_activity_date).sort_by(&:last_activity_date).reverse
   end
 end
diff --git a/app/helpers/dashboard_helper.rb b/app/helpers/dashboard_helper.rb
index a94ddfc2e33b85433921195ba9c46defd03bc09a..878c877d2f3d5281c87ab0701fe3606e60fd093f 100644
--- a/app/helpers/dashboard_helper.rb
+++ b/app/helpers/dashboard_helper.rb
@@ -1,2 +1,9 @@
 module DashboardHelper
+  def path_to_object(project, object)
+    case object.class.name.to_s
+    when "Issue" then project_issues_path(project, project.issues.find(object.id))
+    when "Grit::Commit" then project_commit_path(project, project.repo.commits(object.id).first)
+    else "#"
+    end
+  end
 end
diff --git a/app/models/project.rb b/app/models/project.rb
index ef7f4e4654e977fa074bdf88ee67622d63f438b7..54cf77e4275dd9d08a663dd62cc07a0393db7a31 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -119,6 +119,26 @@ class Project < ActiveRecord::Base
     repo rescue false
   end
 
+  def last_activity 
+    updates(1).first
+  rescue 
+    nil
+  end
+
+  def last_activity_date
+    last_activity.try(:created_at)
+  end
+
+  def updates(n = 3)
+    [ 
+      fresh_commits(n),
+      issues.last(n),
+      notes.fresh.limit(n)
+    ].compact.flatten.sort do |x, y|
+      y.created_at <=> x.created_at
+    end[0..n]
+  end
+
   def commit(commit_id = nil)
     if commit_id
       repo.commits(commit_id).first
@@ -131,16 +151,16 @@ class Project < ActiveRecord::Base
     @heads ||= repo.heads
   end
 
-  def fresh_commits
+  def fresh_commits(n = 10)
     commits = heads.map do |h|
-      repo.commits(h.name, 10)
+      repo.commits(h.name, n)
     end.flatten.uniq { |c| c.id }
 
     commits.sort! do |x, y|
       y.committed_date <=> x.committed_date
     end
 
-    commits[0..10]
+    commits[0..n]
   end
 
   def commits_since(date)
diff --git a/app/views/dashboard/index.html.haml b/app/views/dashboard/index.html.haml
index f4ce9a17d8231f4e59a0844ddb91482baa9a837e..da0cbc7c336e334ef2404e9165a9591a4940259b 100644
--- a/app/views/dashboard/index.html.haml
+++ b/app/views/dashboard/index.html.haml
@@ -1 +1,36 @@
-timeline
+#dashboard-content.dashboard-content.content
+  %aside
+    %h4
+      %a.button-small.button-green{:href => ""} New Repository
+      Your Repositories
+    %ol.project-list
+      - @projects.each do |project|
+        %li
+          %a{:href => "#"}
+            %span.arrow →
+            %span.project-name= project.name
+            %span.time
+              %strong Last activity:
+              = project.last_activity_date ? time_ago_in_words(project.last_activity_date) + " ago" : "Never"
+  #news-feed.news-feed
+    %h2.icon
+      %span>
+      Dashboard
+    - @active_projects.each do |project|
+      .project-box.project-updates.ui-box.ui-box-small.ui-box-big
+        %h3= project.name
+        .data
+          - project.updates.each do |update|
+            %a.project-update{:href => path_to_object(project, update)}
+              %img{:src => "http://placehold.it/40x40"}
+                %span.update-title [#{update.class.name}] added a matcher that helps debugging matching problems
+                %span.update-author
+                  %strong= update.author.name
+                  authored
+                  = time_ago_in_words(update.created_at) 
+                  ago
+            %br
+            / .project-update
+      / .project-updates
+  / #news-feed
+/ #dashboard-content
diff --git a/app/views/layouts/_head_panel.html.erb b/app/views/layouts/_head_panel.html.erb
index 07de8de4c2abb0e57e1711e4a9f4cdd6b8df4329..6dad1084fe4d89c6a2113a9bfefd6aa37d07baf2 100644
--- a/app/views/layouts/_head_panel.html.erb
+++ b/app/views/layouts/_head_panel.html.erb
@@ -10,6 +10,7 @@
       </div>
       <div class="right">
         <%= link_to truncate(@project.name, :length => 20), project_path(@project), :class => "current button" if @project && !@project.new_record? %>
+        <%= link_to 'Dashboard', dashboard_path, :class => current_page?(dashboard_path) ? "current button" : "button" %>
         <%= link_to 'Projects', projects_path, :class => current_page?(projects_path) ? "current button" : "button" %>
         <%= link_to('Admin', admin_root_path, :class => admin_namespace? ? "current button" : "button" ) if current_user.is_admin? %>
         <%= link_to profile_path, :class => ((controller.controller_name == "keys" || controller.controller_name == "profile") ? "current button" : "button") do %>
diff --git a/config/routes.rb b/config/routes.rb
index 5f95e1133ae40f004044973b0c07bd1d89383bf2..bac472a2fba1a155fba64bf5aa5f2b2eba71d4a6 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -15,6 +15,7 @@ Gitlab::Application.routes.draw do
   put "profile/password", :to => "profile#password_update"
   put "profile/edit", :to => "profile#social_update"
   get "profile", :to => "profile#show"
+  get "dashboard", :to => "dashboard#index"
   #get "profile/:id", :to => "profile#show"
 
   resources :projects, :only => [:new, :create, :index]
diff --git a/lib/commit_ext.rb b/lib/commit_ext.rb
index 411809f05edcea0b694076c9a66a21b236754018..32706acb617bbde2cecc4dcb81c4f63a3743317c 100644
--- a/lib/commit_ext.rb
+++ b/lib/commit_ext.rb
@@ -8,4 +8,8 @@ module CommitExt
   rescue
     "-- invalid encoding for commit message"
   end
+
+  def created_at
+    committed_date
+  end
 end