diff --git a/.gitignore b/.gitignore
index dfe8dfedbf8fb92f025b2e7e42a3fd6325260c6a..b91b52b61500439acb17889f08c2e50e0ae52f3b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,5 +25,6 @@ graph/*.png
 graph/*.dot
 
 webclient/config.js
+webclient/test/environment-protractor.js
 
 uploads
diff --git a/webclient/test/README b/webclient/test/README
index b1e0d7adeaaea7ccccd07f3400aa28313f710adf..1813883196bdfe6269e803e8bd272ed5d0dc58fa 100644
--- a/webclient/test/README
+++ b/webclient/test/README
@@ -1,9 +1,22 @@
 Requires:
- - npm
+ - nodejs/npm
  - npm install karma
  - npm install jasmine
+ - npm install protractor (e2e testing)
 
-Setting up continuous integration / run the tests:
+Setting up continuous integration / run the unit tests (make sure you're in
+this directory so it can find the config file):
   karma start
 
+Setting up e2e tests (only if you don't have a selenium server to run the tests
+on. If you do, edit the config to point to that url):
+  webdriver-manager update
+  webdriver-manager start
+
+Running e2e tests:
+  protractor protractor.conf.js
+
+
+
+
 
diff --git a/webclient/test/e2e/user.spec.js b/webclient/test/e2e/user.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..bbac53899b8d9a626e1e9a14f2aa3efb625e15ad
--- /dev/null
+++ b/webclient/test/e2e/user.spec.js
@@ -0,0 +1,6 @@
+describe("user page", function() {
+    it("should have a title", function() {
+        browser.get("http://matrix.org/alpha/#/login");
+        expect(browser.getTitle()).toEqual("[matrix]");
+    });
+});
diff --git a/webclient/test/protractor.conf.js b/webclient/test/protractor.conf.js
new file mode 100644
index 0000000000000000000000000000000000000000..66f4df54075ceb630869d8ed461c355c68322bc2
--- /dev/null
+++ b/webclient/test/protractor.conf.js
@@ -0,0 +1,6 @@
+var env = require("./environment-protractor.js");
+
+exports.config = {
+  seleniumAddress: env.seleniumAddress,
+  specs: ['e2e/*.spec.js']
+}
diff --git a/webclient/test/unit/user-controller.spec.js b/webclient/test/unit/user-controller.spec.js
index 217559114b2243e98d00adea94a9c8f57b118050..798cc4de48c7086eb0f6999b37a7df445e50cbc8 100644
--- a/webclient/test/unit/user-controller.spec.js
+++ b/webclient/test/unit/user-controller.spec.js
@@ -21,13 +21,12 @@ describe("UserCtrl", function() {
 
                 getDisplayName: function(uid) {
                     var d = $q.defer();
-                    // FIXME: everything goes into fire here
                     d.resolve({
                         data: {
                             displayname: displayName
                         }
                     });
-                    return d;
+                    return d.promise;
                 },
 
                 getProfilePictureUrl: function(uid) {
@@ -37,7 +36,7 @@ describe("UserCtrl", function() {
                             avatar_url: avatarUrl
                         }
                     });
-                    return d;
+                    return d.promise;
                 }
             };
             scope = $rootScope.$new();
@@ -49,7 +48,6 @@ describe("UserCtrl", function() {
                 '$routeParams': routeParams, 
                 'matrixService': matrixService
             });
-            console.log("end inject");
         });
     });