diff --git a/week03/app/controllers/login.js b/week03/app/controllers/login.js
new file mode 100644
index 0000000000000000000000000000000000000000..c350627fc13a7df4ca32b3c29d0ae88aa8668cdb
--- /dev/null
+++ b/week03/app/controllers/login.js
@@ -0,0 +1,7 @@
+import Controller from '@ember/controller';
+import { tracked } from '@glimmer/tracking';
+
+export default class LoginController extends Controller {
+    @tracked email = '';
+    @tracked password = '';
+}
diff --git a/week03/app/router.js b/week03/app/router.js
index fd76d26c01a824e7325e1c8f29daded1e359e35c..83186bc0f8ff6db9373351ad8585a17defd3b3b2 100644
--- a/week03/app/router.js
+++ b/week03/app/router.js
@@ -7,4 +7,5 @@ export default class Router extends EmberRouter {
 }
 
 Router.map(function() {
+  this.route('login');
 });
diff --git a/week03/app/routes/login.js b/week03/app/routes/login.js
new file mode 100644
index 0000000000000000000000000000000000000000..aa52a1a674df529aae4ebe59dbebb754d7768a89
--- /dev/null
+++ b/week03/app/routes/login.js
@@ -0,0 +1,4 @@
+import Route from '@ember/routing/route';
+
+export default class LoginRoute extends Route {
+}
diff --git a/week03/app/templates/login.hbs b/week03/app/templates/login.hbs
new file mode 100644
index 0000000000000000000000000000000000000000..c32a3ed23708b769291a57d14d7482c5e6d54833
--- /dev/null
+++ b/week03/app/templates/login.hbs
@@ -0,0 +1,18 @@
+<div class="grid-x grid-padding-x">
+  <form class="cell large-2 large-offset-5">
+    <div class="callout">
+        <h1>Login</h1>
+        <label>E-Mail
+            <Input type="email" @value={{this.email}} />
+            <span class="form-error is-visible">No user exists with this e-mail address {{this.email}} or the password is not correct.</span>
+        </label>
+        <label>Password
+            <Input type="password" @value={{this.password}} />
+            <span class="form-error is-visible">No user exists with this e-mail address {{this.email}} or the password is not correct.</span>
+        </label>
+        <div class="text-right">
+            <button class="button">Login</button>
+        </div>
+    </div>
+  </form>
+</div>
\ No newline at end of file
diff --git a/week03/tests/unit/controllers/login-test.js b/week03/tests/unit/controllers/login-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..4041af0fc10514f8f18896e0fadfaaf84069701e
--- /dev/null
+++ b/week03/tests/unit/controllers/login-test.js
@@ -0,0 +1,12 @@
+import { module, test } from 'qunit';
+import { setupTest } from 'ember-qunit';
+
+module('Unit | Controller | login', function(hooks) {
+  setupTest(hooks);
+
+  // TODO: Replace this with your real tests.
+  test('it exists', function(assert) {
+    let controller = this.owner.lookup('controller:login');
+    assert.ok(controller);
+  });
+});
diff --git a/week03/tests/unit/routes/login-test.js b/week03/tests/unit/routes/login-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..21569926e65b0aa610be5ebadd307a11e1048e10
--- /dev/null
+++ b/week03/tests/unit/routes/login-test.js
@@ -0,0 +1,11 @@
+import { module, test } from 'qunit';
+import { setupTest } from 'ember-qunit';
+
+module('Unit | Route | login', function(hooks) {
+  setupTest(hooks);
+
+  test('it exists', function(assert) {
+    let route = this.owner.lookup('route:login');
+    assert.ok(route);
+  });
+});