diff --git a/angular-tour-of-heroes/src/app/app-routing.module.ts b/angular-tour-of-heroes/src/app/app-routing.module.ts
new file mode 100644
index 0000000..83a06b9
--- /dev/null
+++ b/angular-tour-of-heroes/src/app/app-routing.module.ts
@@ -0,0 +1,19 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { HeroesComponent } from './heroes/heroes.component';
+import { DashboardComponent } from './dashboard/dashboard.component';
+import { HeroDetailComponent } from './hero-detail/hero-detail.component';
+
+const routes: Routes = [
+  { path: '', redirectTo: '/dashboard', pathMatch: 'full'},
+  { path: 'dashboard', component: DashboardComponent },
+  { path: 'detail/:id', component: HeroDetailComponent },
+  { path: 'heroes', component: HeroesComponent }
+];
+
+@NgModule({
+  imports: [ RouterModule.forRoot(routes) ],
+  exports: [ RouterModule ]
+})
+
+export class AppRoutingModule { }
diff --git a/angular-tour-of-heroes/src/app/app.component.css b/angular-tour-of-heroes/src/app/app.component.css
index e69de29..c62f266 100644
--- a/angular-tour-of-heroes/src/app/app.component.css
+++ b/angular-tour-of-heroes/src/app/app.component.css
@@ -0,0 +1,28 @@
+/* AppComponent's private CSS styles */
+h1 {
+  font-size: 1.2em;
+  margin-bottom: 0;
+}
+h2 {
+  font-size: 2em;
+  margin-top: 0;
+  padding-top: 0;
+}
+nav a {
+  padding: 5px 10px;
+  text-decoration: none;
+  margin-top: 10px;
+  display: inline-block;
+  background-color: #eee;
+  border-radius: 4px;
+}
+nav a:visited, a:link {
+  color: #334953;
+}
+nav a:hover {
+  color: #039be5;
+  background-color: #cfd8dc;
+}
+nav a.active {
+  color: #039be5;
+}
diff --git a/angular-tour-of-heroes/src/app/app.component.html b/angular-tour-of-heroes/src/app/app.component.html
index cb45ac4..49c7d17 100644
--- a/angular-tour-of-heroes/src/app/app.component.html
+++ b/angular-tour-of-heroes/src/app/app.component.html
@@ -1,3 +1,7 @@
 
{{title}}
-
+
+
 
diff --git a/angular-tour-of-heroes/src/app/app.module.ts b/angular-tour-of-heroes/src/app/app.module.ts
index 14166af..80b1c06 100644
--- a/angular-tour-of-heroes/src/app/app.module.ts
+++ b/angular-tour-of-heroes/src/app/app.module.ts
@@ -6,17 +6,21 @@ import { AppComponent } from './app.component';
 import { HeroesComponent } from './heroes/heroes.component';
 import { HeroDetailComponent } from './hero-detail/hero-detail.component';
 import { MessagesComponent } from './messages/messages.component';
+import { AppRoutingModule } from './app-routing.module';
+import { DashboardComponent } from './dashboard/dashboard.component';
 
 @NgModule({
   declarations: [
     AppComponent,
     HeroesComponent,
     HeroDetailComponent,
-    MessagesComponent
+    MessagesComponent,
+    DashboardComponent
   ],
   imports: [
     BrowserModule,
-    FormsModule
+    FormsModule,
+    AppRoutingModule
   ],
   providers: [],
   bootstrap: [AppComponent]
diff --git a/angular-tour-of-heroes/src/app/dashboard/dashboard.component.css b/angular-tour-of-heroes/src/app/dashboard/dashboard.component.css
new file mode 100644
index 0000000..4b7ec1c
--- /dev/null
+++ b/angular-tour-of-heroes/src/app/dashboard/dashboard.component.css
@@ -0,0 +1,63 @@
+/* DashboardComponent's private CSS styles */
+[class*='col-'] {
+  float: left;
+  padding-right: 20px;
+  padding-bottom: 20px;
+}
+[class*='col-']:last-of-type {
+  padding-right: 0;
+}
+a {
+  text-decoration: none;
+}
+*, *:after, *:before {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+h3 {
+  text-align: center;
+  margin-bottom: 0;
+}
+h4 {
+  position: relative;
+}
+.grid {
+  margin: 0;
+}
+.col-1-4 {
+  width: 25%;
+}
+.module {
+  padding: 20px;
+  text-align: center;
+  color: #eee;
+  max-height: 120px;
+  min-width: 120px;
+  background-color: #3f525c;
+  border-radius: 2px;
+}
+.module:hover {
+  background-color: #eee;
+  cursor: pointer;
+  color: #607d8b;
+}
+.grid-pad {
+  padding: 10px 0;
+}
+.grid-pad > [class*='col-']:last-of-type {
+  padding-right: 20px;
+}
+@media (max-width: 600px) {
+  .module {
+    font-size: 10px;
+    max-height: 75px; }
+}
+@media (max-width: 1024px) {
+  .grid {
+    margin: 0;
+  }
+  .module {
+    min-width: 60px;
+  }
+}
diff --git a/angular-tour-of-heroes/src/app/dashboard/dashboard.component.html b/angular-tour-of-heroes/src/app/dashboard/dashboard.component.html
new file mode 100644
index 0000000..9827aff
--- /dev/null
+++ b/angular-tour-of-heroes/src/app/dashboard/dashboard.component.html
@@ -0,0 +1,9 @@
+Top Heroes
+
diff --git a/angular-tour-of-heroes/src/app/dashboard/dashboard.component.spec.ts b/angular-tour-of-heroes/src/app/dashboard/dashboard.component.spec.ts
new file mode 100644
index 0000000..9c996c3
--- /dev/null
+++ b/angular-tour-of-heroes/src/app/dashboard/dashboard.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DashboardComponent } from './dashboard.component';
+
+describe('DashboardComponent', () => {
+  let component: DashboardComponent;
+  let fixture: ComponentFixture;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ DashboardComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(DashboardComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/angular-tour-of-heroes/src/app/dashboard/dashboard.component.ts b/angular-tour-of-heroes/src/app/dashboard/dashboard.component.ts
new file mode 100644
index 0000000..c559ccd
--- /dev/null
+++ b/angular-tour-of-heroes/src/app/dashboard/dashboard.component.ts
@@ -0,0 +1,23 @@
+import { Component, OnInit } from '@angular/core';
+import { Hero } from '../hero';
+import { HeroService } from '../hero.service';
+
+@Component({
+  selector: 'app-dashboard',
+  templateUrl: './dashboard.component.html',
+  styleUrls: [ './dashboard.component.css' ]
+})
+export class DashboardComponent implements OnInit {
+  heroes: Hero[] = [];
+
+  constructor(private heroService: HeroService) { }
+
+  ngOnInit() {
+    this.getHeroes();
+  }
+
+  getHeroes(): void {
+    this.heroService.getHeroes()
+      .subscribe(heroes => this.heroes = heroes.slice(1, 5));
+  }
+}
diff --git a/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.css b/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.css
index e69de29..3981760 100644
--- a/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.css
+++ b/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.css
@@ -0,0 +1,31 @@
+/* HeroDetailComponent's private CSS styles */
+label {
+  display: inline-block;
+  width: 3em;
+  margin: .5em 0;
+  color: #607D8B;
+  font-weight: bold;
+}
+input {
+  height: 2em;
+  font-size: 1em;
+  padding-left: .4em;
+}
+button {
+  margin-top: 20px;
+  font-family: Arial;
+  background-color: #eee;
+  border: none;
+  padding: 5px 10px;
+  border-radius: 4px;
+  cursor: pointer;
+  cursor: hand;
+}
+button:hover {
+  background-color: #cfd8dc;
+}
+button:disabled {
+  background-color: #eee;
+  color: #ccc;
+  cursor: auto;
+}
diff --git a/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.html b/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.html
index 072489d..78cba67 100644
--- a/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.html
+++ b/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.html
@@ -9,4 +9,7 @@
     
   
 
+  
+
 
+
diff --git a/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.ts b/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.ts
index 948cd11..b7124a9 100644
--- a/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.ts
+++ b/angular-tour-of-heroes/src/app/hero-detail/hero-detail.component.ts
@@ -1,5 +1,9 @@
 import { Component, OnInit, Input } from '@angular/core';
 import { Hero } from '../hero';
+import { ActivatedRoute } from '@angular/router';
+import { Location } from '@angular/common';
+
+import { HeroService } from '../hero.service';
 
 @Component({
   selector: 'app-hero-detail',
@@ -8,9 +12,25 @@ import { Hero } from '../hero';
 })
 export class HeroDetailComponent implements OnInit {
   @Input() hero: Hero;
-  constructor() { }
 
-  ngOnInit() {
+  constructor(
+    private route: ActivatedRoute,
+    private heroService: HeroService,
+    private location: Location
+  ) { }
+
+  ngOnInit(): void {
+    this.getHero();
+  }
+
+  getHero(): void {
+    const id = +this.route.snapshot.paramMap.get('id');
+    this.heroService.getHero(id)
+      .subscribe(hero => this.hero = hero);
+  }
+
+  goBack(): void {
+    this.location.back();
   }
 
 }
diff --git a/angular-tour-of-heroes/src/app/hero.service.ts b/angular-tour-of-heroes/src/app/hero.service.ts
index 5f1649e..20fc51c 100644
--- a/angular-tour-of-heroes/src/app/hero.service.ts
+++ b/angular-tour-of-heroes/src/app/hero.service.ts
@@ -16,4 +16,10 @@ export class HeroService {
     this.messageService.add('HeroService: fetched heroes.')
     return of(HEROES);
   }
+
+  getHero(id: number): Observable {
+    // TODO: send the message _after_ fetching the hero
+    this.messageService.add(`HeroService: fetched hero id=${id}`);
+    return of(HEROES.find(hero => hero.id === id));
+  }
 }
diff --git a/angular-tour-of-heroes/src/app/heroes/heroes.component.css b/angular-tour-of-heroes/src/app/heroes/heroes.component.css
index 9759a42..94a91be 100644
--- a/angular-tour-of-heroes/src/app/heroes/heroes.component.css
+++ b/angular-tour-of-heroes/src/app/heroes/heroes.component.css
@@ -6,39 +6,26 @@
   width: 15em;
 }
 .heroes li {
-  cursor: pointer;
   position: relative;
-  left: 0;
+  cursor: pointer;
   background-color: #EEE;
   margin: .5em;
   padding: .3em 0;
   height: 1.6em;
   border-radius: 4px;
 }
+
 .heroes li:hover {
   color: #607D8B;
   background-color: #DDD;
   left: .1em;
 }
-.heroes li.selected {
-  background-color: #CFD8DC;
-  color: white;
-}
-.heroes li.selected:hover {
-  background-color: #BBD8DC;
-  color: white;
-}
-.heroes .badge {
-  display: inline-block;
-  font-size: small;
-  color: white;
-  padding: 0.8em 0.7em 0 0.7em;
-  background-color:#405061;
-  line-height: 1em;
+
+.heroes a {
+  color: #333;
+  text-decoration: none;
   position: relative;
-  left: -1px;
-  top: -4px;
-  height: 1.8em;
-  margin-right: .8em;
-  border-radius: 4px 0 0 4px;
+  display: block;
+  width: 250px;
 }
+
diff --git a/angular-tour-of-heroes/src/app/heroes/heroes.component.html b/angular-tour-of-heroes/src/app/heroes/heroes.component.html
index 5ad0b60..7cdbc43 100644
--- a/angular-tour-of-heroes/src/app/heroes/heroes.component.html
+++ b/angular-tour-of-heroes/src/app/heroes/heroes.component.html
@@ -2,12 +2,9 @@
 
 
 
-
-
-
diff --git a/angular-tour-of-heroes/src/app/heroes/heroes.component.ts b/angular-tour-of-heroes/src/app/heroes/heroes.component.ts
index 6aebf70..d678a02 100644
--- a/angular-tour-of-heroes/src/app/heroes/heroes.component.ts
+++ b/angular-tour-of-heroes/src/app/heroes/heroes.component.ts
@@ -10,10 +10,6 @@ import { HeroService } from '../hero.service';
 })
 export class HeroesComponent implements OnInit {
   heroes: Hero[];
-  hero: Hero = {
-    id: 1,
-    name: 'Windstorm'
-  };
 
   constructor(private heroService: HeroService) { }
 
@@ -21,11 +17,6 @@ export class HeroesComponent implements OnInit {
     this.getHeroes();
   }
 
-  selectedHero: Hero;
-  onSelect(hero: Hero): void {
-    this.selectedHero = hero;
-  }
-  
   getHeroes(): void {
     this.heroService.getHeroes()
       .subscribe(heroes => this.heroes = heroes);