diff --git a/app/app.js b/app/app.js
new file mode 100644
index 0000000..9f012f3
--- /dev/null
+++ b/app/app.js
@@ -0,0 +1,6 @@
+(function () {
+ 'use strict';
+
+ angular.module('app', ['ngRoute']);
+})();
+
diff --git a/app/details.ctrl.js b/app/details.ctrl.js
new file mode 100644
index 0000000..18b9602
--- /dev/null
+++ b/app/details.ctrl.js
@@ -0,0 +1,27 @@
+(function () {
+ 'use strict';
+
+ angular.module('app').controller('DetailsCtrl', Ctrl);
+
+ function Ctrl($http, $routeParams, $location) {
+ var vm = this;
+
+ vm.task = {};
+ vm.back = back;
+
+ init();
+
+ function init() {
+ $http.get('api/tasks/' + $routeParams.id).then(function (result) {
+ vm.task = result.data;
+ });
+ }
+
+ function back() {
+ $location.path('/list');
+ }
+
+ }
+
+})();
+
diff --git a/app/details.html b/app/details.html
new file mode 100644
index 0000000..9416c17
--- /dev/null
+++ b/app/details.html
@@ -0,0 +1,4 @@
+Title: {{ vm.task.title }}
+Added: {{ vm.task.added | date : 'HH:mm' }}
+
+
diff --git a/app/list.ctrl.js b/app/list.ctrl.js
new file mode 100644
index 0000000..0ad8f8c
--- /dev/null
+++ b/app/list.ctrl.js
@@ -0,0 +1,41 @@
+(function () {
+ 'use strict';
+
+ angular.module('app').controller('ListCtrl', Ctrl);
+
+ function Ctrl($http, modalService) {
+ var vm = this;
+ vm.tasks = [];
+ vm.newTitle = '';
+
+ vm.addTask = addTask;
+ vm.removeTask = removeTask;
+
+ init();
+
+ function init() {
+ $http.get('api/tasks').then(function (result) {
+ vm.tasks = result.data;
+ });
+ }
+
+ function addTask() {
+ var newTask = {
+ title: vm.newTitle,
+ added: new Date()
+ };
+
+ $http.post('api/tasks', newTask).then(init);
+
+ vm.newTitle = '';
+ }
+
+ function removeTask(id) {
+ modalService.confirm()
+ .then(function () {
+ return $http.delete('api/tasks/' + id);
+ }).then(init);
+ }
+ }
+})();
+
diff --git a/app/list.html b/app/list.html
new file mode 100644
index 0000000..b6f7a05
--- /dev/null
+++ b/app/list.html
@@ -0,0 +1,9 @@
+