diff --git a/.jshintrc b/.jshintrc
index e75832d8..64e26f6b 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,5 +1,6 @@
 {
   "predef": [
+    "server",
     "document",
     "window",
     "-Promise",
diff --git a/app/mirage/config.js b/app/mirage/config.js
new file mode 100644
index 00000000..3ee1ab41
--- /dev/null
+++ b/app/mirage/config.js
@@ -0,0 +1,115 @@
+import Ember from 'ember';
+
+export default function() {
+  let _turnIntoV3Singular = function(type, record) {
+    record['@type'] = type;
+    record['@href'] = `/${type}/${record.id}`
+
+    return record;
+  };
+
+  let turnIntoV3 = function(type, payload) {
+    let response;
+    if(Ember.isArray(payload)) {
+      let records = payload.map( (record) => { return _turnIntoV3Singular(type, record) } );
+
+      let pluralized = Ember.String.pluralize(type);
+      response = {};
+      response['@type'] = pluralized;
+      response['@href'] = `/${pluralized}`
+      response[pluralized] = records;
+    } else {
+      response = _turnIntoV3Singular(type, payload);
+    }
+
+    return response;
+  };
+
+  this.get('/v3/repos', function(db, request) {
+    return turnIntoV3('repository', db.repositories);
+  });
+
+  this.get('/v3/repos', function(db, request) {
+    return turnIntoV3('repository', db.repositories);
+  });
+
+  // These comments are here to help you get started. Feel free to delete them.
+
+  /*
+    Config (with defaults).
+
+    Note: these only affect routes defined *after* them!
+  */
+  // this.urlPrefix = '';    // make this `http://localhost:8080`, for example, if your API is on a different server
+  // this.namespace = '';    // make this `api`, for example, if your API is namespaced
+  // this.timing = 400;      // delay for each request, automatically set to 0 during testing
+
+  /*
+    Route shorthand cheatsheet
+  */
+  /*
+    GET shorthands
+
+    // Collections
+    this.get('/contacts');
+    this.get('/contacts', 'users');
+    this.get('/contacts', ['contacts', 'addresses']);
+
+    // Single objects
+    this.get('/contacts/:id');
+    this.get('/contacts/:id', 'user');
+    this.get('/contacts/:id', ['contact', 'addresses']);
+  */
+
+  /*
+    POST shorthands
+
+    this.post('/contacts');
+    this.post('/contacts', 'user'); // specify the type of resource to be created
+  */
+
+  /*
+    PUT shorthands
+
+    this.put('/contacts/:id');
+    this.put('/contacts/:id', 'user'); // specify the type of resource to be updated
+  */
+
+  /*
+    DELETE shorthands
+
+    this.del('/contacts/:id');
+    this.del('/contacts/:id', 'user'); // specify the type of resource to be deleted
+
+    // Single object + related resources. Make sure parent resource is first.
+    this.del('/contacts/:id', ['contact', 'addresses']);
+  */
+
+  /*
+    Function fallback. Manipulate data in the db via
+
+      - db.{collection}
+      - db.{collection}.find(id)
+      - db.{collection}.where(query)
+      - db.{collection}.update(target, attrs)
+      - db.{collection}.remove(target)
+
+    // Example: return a single object with related models
+    this.get('/contacts/:id', function(db, request) {
+      var contactId = +request.params.id;
+
+      return {
+        contact: db.contacts.find(contactId),
+        addresses: db.addresses.where({contact_id: contactId})
+      };
+    });
+
+  */
+}
+
+/*
+You can optionally export a config that is only loaded during tests
+export function testConfig() {
+
+}
+*/
diff --git a/app/mirage/factories/contact.js b/app/mirage/factories/contact.js
new file mode 100644
index 00000000..1b3a3eab
--- /dev/null
+++ b/app/mirage/factories/contact.js
@@ -0,0 +1,20 @@
+/*
+  This is an example factory definition.
+
+  Create more files in this directory to define additional factories.
+*/
+import Mirage/*, {faker} */ from 'ember-cli-mirage';
+
+export default Mirage.Factory.extend({
+  // name: 'Pete',                         // strings
+  // age: 20,                              // numbers
+  // tall: true,                           // booleans
+
+  // email: function(i) {                  // and functions
+  //   return 'person' + i + '@test.com';
+  // },
+
+  // firstName: faker.name.firstName,       // using faker
+  // lastName: faker.name.firstName,
+  // zipCode: faker.address.zipCode
+});
diff --git a/app/mirage/factories/repository.js b/app/mirage/factories/repository.js
new file mode 100644
index 00000000..7001999c
--- /dev/null
+++ b/app/mirage/factories/repository.js
@@ -0,0 +1,7 @@
+import Mirage from 'ember-cli-mirage';
+
+export default Mirage.Factory.extend({
+  slug: 'travis-ci/travis-web',
+  githubLanguage: 'ruby',
+  active: true
+});
diff --git a/app/mirage/scenarios/default.js b/app/mirage/scenarios/default.js
new file mode 100644
index 00000000..e07271cc
--- /dev/null
+++ b/app/mirage/scenarios/default.js
@@ -0,0 +1,7 @@
+export default function(/* server */) {
+
+  // Seed your development database using your factories. This
+  // data will not be loaded in your tests.
+
+  // server.createList('contact', 10);
+}
diff --git a/bower.json b/bower.json
index 1cd79336..e8874666 100644
--- a/bower.json
+++ b/bower.json
@@ -15,8 +15,10 @@
     "moment": "~2.9.0",
     "jquery-timeago": "~1.4.1",
     "pusher": "~2.2.3",
-    "pretender": "0.1.0",
-    "ember-resolver": "~0.1.20"
+    "ember-resolver": "~0.1.20",
+    "pretender": "~0.10.1",
+    "lodash": "~3.7.0",
+    "Faker": "~3.0.0"
   },
   "resolutions": {
     "ember": "2.2.1",
diff --git a/package.json b/package.json
index 81138c0d..d40148d8 100644
--- a/package.json
+++ b/package.json
@@ -34,6 +34,8 @@
     "ember-cli-htmlbars-inline-precompile": "^0.3.1",
     "ember-cli-inject-live-reload": "^1.3.1",
     "ember-cli-inline-images": "^0.0.4",
+    "ember-cli-mirage": "0.1.11",
+    "ember-cli-page-object": "1.0.0",
     "ember-cli-pendo": "drogus/ember-cli-pendo",
     "ember-cli-pretender": "0.3.1",
     "ember-cli-qunit": "^1.2.1",
diff --git a/tests/.jshintrc b/tests/.jshintrc
index 51c88317..14325959 100644
--- a/tests/.jshintrc
+++ b/tests/.jshintrc
@@ -1,5 +1,6 @@
 {
   "predef": [
+    "server",
     "document",
     "window",
     "location",