diff --git a/client.css b/client.css
new file mode 100644
index 0000000000000000000000000000000000000000..fbeded876e26b9eec78a5ed3a1d22423bc022d9a
--- /dev/null
+++ b/client.css
@@ -0,0 +1,30 @@
+body{
+    width: 500px;
+    #height: 500px;
+    background-color: deepskyblue;
+}
+
+#main-left{
+width: 340px;
+height: 400px;
+background-image: url("wimage.png");
+border: solid;
+}
+
+#right-top {
+    width: 250px;
+    height: 100px;
+    margin-left: 350px;
+    margin-top: -404px;
+    background-color: white;
+    border: solid;
+}
+
+#right-dow {
+    margin-left: 350px;
+    margin-top: 10px;
+    background-color: white;
+    width: 250px;
+    height: 284px;
+    border: solid;
+}
\ No newline at end of file
diff --git a/client.html b/client.html
new file mode 100644
index 0000000000000000000000000000000000000000..a1b09b771868c9239c63a72ecebd4d61050c2884
--- /dev/null
+++ b/client.html
@@ -0,0 +1,32 @@
+<html>
+    <head>
+        <link href="client.css" type="text/css" rel="stylesheet">
+        <script src="client.js" type="text/javascript"></script>
+        <script src="serverstub.js" type="text/javascript"></script>
+    </head>
+    <body>
+        <div id="main-left">
+        </div>
+        <div id="right-top">
+            <form action="" id="save-form" onsubmit="saveContent(this); return false">
+                <div><label for="name">Name</label><input type="text" id="name" name="name"></div>
+                <div><label for="number">Number</label><input type="text" id="number" name="phonenumber"></div>
+                <input type="submit">
+            </form>  
+        </div>
+        <div id="right-dow">
+            <form action="" id="save-form" onsubmit="saveContent(this); return false">
+                <div><label for="name">FirstName</label><input type="text" id="name" name="name"></div>
+                <div><label for="number">FamilyName</label><input type="text" id="number" name="phonenumber"></div>
+                <div><label for="name">FirstName</label><input type="text" id="name" name="name"></div>
+                <div><label for="number">FamilyName</label><input type="text" id="number" name="phonenumber"></div>
+                <div><label for="name">FirstName</label><input type="text" id="name" name="name"></div>
+                <div><label for="number">FamilyName</label><input type="text" id="number" name="phonenumber"></div>
+                <input type="submit">
+            </form>  
+            
+        </div>
+
+
+    </body>
+</html>
\ No newline at end of file
diff --git a/client.js b/client.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/serverstub.js b/serverstub.js
new file mode 100644
index 0000000000000000000000000000000000000000..06590bf1dbb930708dcc2355f33e361dbd9c918b
--- /dev/null
+++ b/serverstub.js
@@ -0,0 +1,187 @@
+/**
+ * Serverstub.js
+ *
+ * Simple dummy server for TDDD97
+ *
+ * If you're a student, you shouldn't need to look through this file,
+ *  the description of how it works is in the lab instructions.
+ **/
+var serverstub = (function() {
+    'use strict';
+  
+    var users;
+    var loggedInUsers;
+  
+    var syncStorage = function(){
+      if (localStorage.getItem("users") === null) {
+          users = {};
+      } else {
+          users = JSON.parse(localStorage.getItem("users"));
+      }
+  
+      if (localStorage.getItem("loggedinusers") === null) {
+          loggedInUsers = {};
+      } else {
+          loggedInUsers = JSON.parse(localStorage.getItem("loggedinusers"));
+        }
+  
+    }
+    
+    var persistUsers = function(){
+      localStorage.setItem("users", JSON.stringify(users));
+    };
+    var persistLoggedInUsers = function(){
+      localStorage.setItem("loggedinusers", JSON.stringify(loggedInUsers));
+    };
+    var tokenToEmail = function(token){
+      return loggedInUsers[token];
+    };
+    var copyUser = function(user){
+      return JSON.parse(JSON.stringify(user));
+    };
+  
+    var serverstub = {
+      signIn: function(email, password){
+        syncStorage();
+        if(users[email] != null && users[email].password == password){
+          var letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+          var token = "";
+          for (var i = 0 ; i < 36 ; ++i) {
+            token += letters[Math.floor(Math.random() * letters.length)];
+          }
+          loggedInUsers[token] = email;
+          persistLoggedInUsers();
+          return {"success": true, "message": "Successfully signed in.", "data": token};
+        } else {
+          return {"success": false, "message": "Wrong username or password."};
+        }
+      },
+  
+      postMessage: function(token, content, toEmail){
+        syncStorage();
+        var fromEmail = tokenToEmail(token);
+        if (fromEmail != null) {
+          if (toEmail == null) {
+            toEmail = fromEmail;
+          }
+          if(users[toEmail] != null){
+            var recipient = users[toEmail];
+            var message = {"writer": fromEmail, "content": content};
+            recipient.messages.unshift(message);
+            persistUsers();
+            return {"success": true, "message": "Message posted"};
+          } else {
+            return {"success": false, "message": "No such user."};
+          }
+        } else {
+          return {"success": false, "message": "You are not signed in."};
+        }
+      },
+  
+      getUserDataByToken: function(token){
+        syncStorage();
+        var email = tokenToEmail(token);
+        return serverstub.getUserDataByEmail(token, email);
+      },
+  
+      getUserDataByEmail: function(token, email){
+      syncStorage();
+        if (loggedInUsers[token] != null){
+          if (users[email] != null) {
+            var match = copyUser(users[email]);
+            delete match.messages;
+            delete match.password;
+            return {"success": true, "message": "User data retrieved.", "data": match};
+          } else {
+            return {"success": false, "message": "No such user."};
+          }
+        } else {
+          return {"success": false, "message": "You are not signed in."};
+        }
+      },
+  
+      getUserMessagesByToken: function(token){
+        syncStorage();
+        var email = tokenToEmail(token);
+        return serverstub.getUserMessagesByEmail(token,email);
+      },
+  
+      getUserMessagesByEmail: function(token, email){
+      syncStorage();
+        if (loggedInUsers[token] != null){
+          if (users[email] != null) {
+            var match = copyUser(users[email]).messages;
+            return {"success": true, "message": "User messages retrieved.", "data": match};
+          } else {
+            return {"success": false, "message": "No such user."};
+          }
+        } else {
+          return {"success": false, "message": "You are not signed in."};
+        }
+      },
+  
+      signOut: function(token){
+        syncStorage();
+        if (loggedInUsers[token] != null){
+          delete loggedInUsers[token];
+          persistLoggedInUsers();
+          return {"success": true, "message": "Successfully signed out."};
+        } else {
+          return {"success": false, "message": "You are not signed in."};
+        }
+      },
+  
+      signUp: function(inputObject){ // {email, password, firstname, familyname, gender, city, country}
+        syncStorage();
+        if (users[inputObject.email] === undefined){
+          if(
+            (typeof(inputObject.email) === 'string') &&
+            (typeof(inputObject.password) === 'string') &&
+            (typeof(inputObject.firstname) === 'string') &&
+            (typeof(inputObject.familyname) === 'string') &&
+            (typeof(inputObject.gender) === 'string') &&
+            (typeof(inputObject.city) === 'string') &&
+            (typeof(inputObject.country) === 'string')
+          ) {
+            var user = {
+              'email': inputObject.email,
+              'password': inputObject.password,
+              'firstname': inputObject.firstname,
+              'familyname': inputObject.familyname,
+              'gender': inputObject.gender,
+              'city': inputObject.city,
+              'country': inputObject.country,
+              'messages': []
+            };
+              users[inputObject.email] = user;
+              persistUsers();
+              return {"success": true, "message": "Successfully created a new user."};
+          } else {
+            return {"success": false, "message": "Form data missing or incorrect type."};
+          }
+  
+        } else {
+          return {"success": false, "message": "User already exists."};
+        }
+      },
+  
+      changePassword: function(token, oldPassword, newPassword){
+        syncStorage();
+        if (loggedInUsers[token] != null){
+          var email = tokenToEmail(token);
+          if (users[email].password == oldPassword){
+            users[email].password = newPassword;
+            persistUsers();
+            return {"success": true, "message": "Password changed."};
+          } else {
+            return {"success": false, "message": "Wrong password."};
+          }
+        } else {
+          return {"success": false, "message": "You are not logged in."};
+        }
+      }
+    };
+  
+    return serverstub;
+  })();
+  
\ No newline at end of file
diff --git a/wimage.png b/wimage.png
new file mode 100644
index 0000000000000000000000000000000000000000..048bdd2fcf666069f57f0aab8521dc49f9914725
Binary files /dev/null and b/wimage.png differ