diff --git a/HelloWeb/build.xml b/HelloWeb/build.xml
new file mode 100644
index 0000000000000000000000000000000000000000..21452eab775d5660008b4984bf8560036a951e1a
--- /dev/null
+++ b/HelloWeb/build.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See commented blocks below for -->
+<!-- some examples of how to customize the build. -->
+<!-- (If you delete it and reopen the project it will be recreated.) -->
+<!-- By default, only the Clean and Build commands use this build script. -->
+<!-- Commands such as Run, Debug, and Test only use this build script if -->
+<!-- the Compile on Save feature is turned off for the project. -->
+<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
+<!-- in the project's Project Properties dialog box.-->
+<project name="HelloWeb" default="default" basedir=".">
+    <description>Builds, tests, and runs the project HelloWeb.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <!--
+
+    There exist several targets which are by default empty and which can be 
+    used for execution of your tasks. These targets are usually executed 
+    before and after some main targets. They are: 
+
+      -pre-init:                 called before initialization of project properties 
+      -post-init:                called after initialization of project properties 
+      -pre-compile:              called before javac compilation 
+      -post-compile:             called after javac compilation 
+      -pre-compile-single:       called before javac compilation of single file
+      -post-compile-single:      called after javac compilation of single file
+      -pre-compile-test:         called before javac compilation of JUnit tests
+      -post-compile-test:        called after javac compilation of JUnit tests
+      -pre-compile-test-single:  called before javac compilation of single JUnit test
+      -post-compile-test-single: called after javac compilation of single JUunit test
+      -pre-dist:                 called before archive building 
+      -post-dist:                called after archive building 
+      -post-clean:               called after cleaning build products 
+      -pre-run-deploy:           called before deploying
+      -post-run-deploy:          called after deploying
+
+    Example of pluging an obfuscator after the compilation could look like 
+
+        <target name="-post-compile">
+            <obfuscate>
+                <fileset dir="${build.classes.dir}"/>
+            </obfuscate>
+        </target>
+
+    For list of available properties check the imported 
+    nbproject/build-impl.xml file. 
+
+
+    Other way how to customize the build is by overriding existing main targets.
+    The target of interest are: 
+
+      init-macrodef-javac:    defines macro for javac compilation
+      init-macrodef-junit:   defines macro for junit execution
+      init-macrodef-debug:    defines macro for class debugging
+      do-dist:                archive building
+      run:                    execution of project 
+      javadoc-build:          javadoc generation 
+
+    Example of overriding the target for project execution could look like 
+
+        <target name="run" depends="<PROJNAME>-impl.jar">
+            <exec dir="bin" executable="launcher.exe">
+                <arg file="${dist.jar}"/>
+            </exec>
+        </target>
+
+    Notice that overridden target depends on jar target and not only on 
+    compile target as regular run target does. Again, for list of available 
+    properties which you can use check the target you are overriding in 
+    nbproject/build-impl.xml file. 
+
+    -->
+</project>
diff --git a/HelloWeb/web/js/.gitkeep b/HelloWeb/web/js/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/HelloWeb/web/js/app.js b/HelloWeb/web/js/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..dbea0f5c367dec9b0cb20f3b11c4ce40644838a3
--- /dev/null
+++ b/HelloWeb/web/js/app.js
@@ -0,0 +1,102 @@
+function loginValidation() {
+    var username = document.forms["loginform"]["username"];
+    var pwd = document.forms["loginform"]["password"];
+    var usrVerify = Validate(username, "empty");
+    var pwdVerify = Validate(pwd, "empty");
+    return (usrVerify && pwdVerify);
+}
+
+function editProfileValidation() {
+    var name = document.forms["editprofile-form"]["your-name"];
+    var phone = document.forms["editprofile-form"]["phone-number"];
+    var nameVerify = Validate(name, "empty", 0, 20, "length");
+    var phoneVerify = Validate(phone, "empty", 9, 12, "length");
+    return (nameVerify && phoneVerify);
+}
+
+function Validate(inputArea, type1, min = 0, max = 0, type2 = null, type3 = null) {
+    var error = GetErrorMessage(inputArea.value, type1, min, max);
+    if(error === "") {
+        if (type2 != null) {
+            error = GetErrorMessage(inputArea.value, type2, min, max);
+            console.log(type2 + "length");
+        }
+        if (error === "") {
+            if (type3 != null) {
+                error = GetErrorMessage(inputArea.value, type3, min, max);
+            }
+        }
+    }
+    if(error !== "" && inputArea.nextElementSibling === null) {
+        var errorEl = document.createElement("p");
+        errorEl.innerHTML = error;
+        errorEl.className = "error";
+        insertAfterElement(errorEl, inputArea);
+
+        inputArea.addEventListener("blur", function() {
+            var error = GetErrorMessage(inputArea.value, type1, min, max);
+            if(error === "") {
+                if (type2 != null) {
+                    error = GetErrorMessage(inputArea.value, type2, min, max);
+                }
+                if (error === "") {
+                    if (type3 != null) {
+                        error = GetErrorMessage(inputArea.value, type3, min, max);
+                    }
+                }
+            }
+            if (error === ""){
+                this.nextSibling.remove();
+            }
+        },true);
+    }
+    return (error === "");
+}
+
+function insertAfterElement(el, src) {
+    src.parentNode.insertBefore(el, src.nextSibling);
+}
+
+
+function GetErrorMessage(textArea, type, min = 0, max = 0) {
+    var validateText = "";
+    switch(type) {
+        case "empty" :
+            if(isEmpty(textArea)) {
+                validateText = "Fill in the field";
+            }
+            break;
+        case "email" :
+            if(!isEmail(textArea)) {
+                validatedText = "Invalid Email Address";
+            }
+            break;
+        case "number" :
+            if(isNumber(textArea)){
+                validateText = "Fill in with only number";
+            }
+            break;
+        case "length" :
+            if (!isLengthEqual(textArea,min,max)){
+                validateText = "Character must be between " + min.toString() + " and " + max.toString() + " long";
+            }
+            break;
+    }
+    return validateText;
+}
+
+function isEmpty(textArea) {
+    return (textArea.match(/^s+$/) || textArea == "");
+}
+
+function isNumber(textArea) {
+    return (!isNaN(textArea));
+}
+
+function isLengthEqual(textArea, min, max){
+    return (textArea.length >= min && textArea.length <= max);
+}
+
+function isEmail(textArea) {
+    return (textArea.match(/^([a-zA-Z0-9])+([.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-]+)+/));
+}
\ No newline at end of file
diff --git a/HelloWeb/web/js/history.js b/HelloWeb/web/js/history.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e4b3f528dfb96a699cdbb10ad6ba0b731005f5a
--- /dev/null
+++ b/HelloWeb/web/js/history.js
@@ -0,0 +1,41 @@
+
+function tabActive(tag) {
+	var tabUser = document.getElementById('user-his');
+	var tabDriver = document.getElementById('driver-his');
+	var order = document.getElementsByClassName('order-list');
+	var driver = document.getElementsByClassName('driver-list');
+
+	if (tag == 'user') {
+		order[0].classList.add("active-list");
+		driver[0].classList.remove("active-list");
+		tabUser.classList.add('active');
+		tabDriver.classList.remove('active');
+	}
+	else {
+		driver[0].classList.add("active-list");
+		order[0].classList.remove("active-list");
+		tabDriver.classList.add('active');
+		tabUser.classList.remove('active');
+	}
+}
+
+tabActive('user');
+
+function hideThis(user) {
+	updateHide(user);
+	console.log(user[0]);
+}
+
+function updateHide(history)
+{
+	var data = "user=" + history[0] + "&driver=" + history[1] + "&date=" + history[4];
+    var xhr;
+    if (window.XMLHttpRequest) {
+        xhr = new XMLHttpRequest();
+    } else if (window.ActiveXObject) {
+        xhr = new ActiveXObject("Microsoft.XMLHTTP");
+    }
+    xhr.open("GET", "/history/update", true);
+    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");                  
+    xhr.send(data);
+}
\ No newline at end of file
diff --git a/HelloWeb/web/js/selectdriver.js b/HelloWeb/web/js/selectdriver.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d7b38f4833461051ad76f37a3eac112a88b0156
--- /dev/null
+++ b/HelloWeb/web/js/selectdriver.js
@@ -0,0 +1,97 @@
+var prefDriver = document.getElementById("pref-driver");
+var otherDriver = document.getElementById("other-driver");
+var driverSumRating = [];
+var driverCountRating = [];
+var driverNameList = [];
+
+for (var i = 0; i < driverArr.length; i++) {
+    for(var j = 0; j < ratingArr.length; j++) {
+        if(driverArr[i] === ratingArr[j]["usernameDriver"]){
+            driverSumRating[driverArr[i]] = (driverSumRating[driverArr[i]] === undefined) ? parseFloat(ratingArr[j]["rating"]) : driverSumRating[driverArr[i]] + parseFloat(ratingArr[j]["rating"]);
+            driverCountRating[driverArr[i]] = (driverCountRating[driverArr[i]] === undefined) ? 1 : driverCountRating[driverArr[i]]+1;
+        }
+    }
+    for(var k = 0; k < driverNameArr.length; k++) {
+        if(driverArr[i] === driverNameArr[k]["username"]){
+            driverNameList[driverArr[i]] = driverNameArr[k]["fullname"];
+            break;
+        }
+    }
+}
+
+for(var j = 0; j < ratingArr.length; j++) {
+    if(preferredDriver === ratingArr[j]["usernameDriver"]){
+        driverSumRating[preferredDriver] = (driverSumRating[preferredDriver] === undefined) ? parseFloat(ratingArr[j]["rating"]) : driverSumRating[preferredDriver] + parseFloat(ratingArr[j]["rating"]);
+        driverCountRating[preferredDriver] = (driverCountRating[preferredDriver] === undefined) ? 1 : driverCountRating[preferredDriver]+1;
+    }
+}
+for(var k = 0; k < driverNameArr.length; k++) {
+    if(preferredDriver === driverNameArr[k]["username"]){
+        driverNameList[preferredDriver] = driverNameArr[k]["fullname"];
+        break;
+    }
+}
+
+if(preferredDriver !== "") {
+    CreateDriverDisplay(prefDriver, preferredDriver);
+} else {
+    CreateNotFoundDisplay(prefDriver);
+}
+
+if(driverArr.length > 0) {
+    for (var i = 0; i < driverArr.length; i++) {
+        CreateDriverDisplay(otherDriver, driverArr[i]);
+    }
+} else {
+    CreateNotFoundDisplay(otherDriver);
+}
+
+function CreateDriverDisplay(driverType, driverUsrName) {
+    var newForm = driverType.appendChild(document.createElement("form"));
+    var newContainer = newForm.appendChild(document.createElement("div"));
+    var newImg = newContainer.appendChild(document.createElement("img"));
+    var newName = newContainer.appendChild(document.createElement("div"));
+    var newRating = newContainer.appendChild(document.createElement("div"));
+    var postUsrName = newContainer.appendChild(document.createElement("input"));
+    var newPickLoc = newContainer.appendChild(document.createElement("input"));
+    var newDest = newContainer.appendChild(document.createElement("input"));
+    var newBtn = newContainer.appendChild(document.createElement("input"));
+
+
+    var avgRating = (driverSumRating[driverUsrName]/driverCountRating[driverUsrName]).toFixed(1).toString();
+
+    newForm.setAttribute('method', 'post');
+    newForm.setAttribute('action', '/order/' + user + '/completeorder');
+    newContainer.classList.add("driver-content");
+
+    newImg.classList.add("driver-pic");
+    newImg.setAttribute('src', '/public/img/' + driverUsrName);
+
+    newName.classList.add("driver-name-disp");
+    newName.innerHTML = driverNameList[driverUsrName];
+
+    newRating.classList.add("driver-rating-disp");
+    newRating.innerHTML = "★" + avgRating + " <span class='vote-disp'>(" + driverCountRating[driverUsrName] + " votes)</span>";
+
+    postUsrName.setAttribute('type', 'hidden');
+    postUsrName.setAttribute('name', 'driver-username');
+    postUsrName.setAttribute('value', driverUsrName);
+
+    newPickLoc.setAttribute('type','hidden');
+    newPickLoc.setAttribute('name','pickLoc');
+    newPickLoc.setAttribute('value', pickLoc);
+    newDest.setAttribute('type','hidden');
+    newDest.setAttribute('name','dest');
+    newDest.setAttribute('value', dest);
+
+    newBtn.classList.add("accept-button");
+    newBtn.classList.add("select-driver-btn");
+    newBtn.setAttribute('type','submit');
+    newBtn.setAttribute('value','Select Driver');
+}
+
+function CreateNotFoundDisplay(driverType) {
+    var newContainer = driverType.appendChild(document.createElement("div"));
+    newContainer.classList.add("driver-not-found");
+    newContainer.innerHTML = "Nothing to display.";
+}
\ No newline at end of file
diff --git a/HelloWeb/web/js/signup.js b/HelloWeb/web/js/signup.js
new file mode 100644
index 0000000000000000000000000000000000000000..43a9342a95538b30e1b8bf663cf3fc0a0b62718f
--- /dev/null
+++ b/HelloWeb/web/js/signup.js
@@ -0,0 +1,44 @@
+function checkData(name, element)
+{
+    var data = "?" + name + "=" + document.forms["signupform"][name].value;
+    var xhr;
+    if (window.XMLHttpRequest) {
+        xhr = new XMLHttpRequest();
+    } else if (window.ActiveXObject) {
+        xhr = new ActiveXObject("Microsoft.XMLHTTP");
+    }
+    
+    xhr.open("GET", "/validation" + data, true); 
+    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");                  
+    xhr.send(null);
+    xhr.onload = function() {
+        if (xhr.readyState == 4) {
+            if (xhr.status == 200) {
+                if (xhr.responseText === 'OK') { 
+                    document.getElementById(element).innerHTML = "√";
+                } else {
+                    document.getElementById(element).innerHTML = "X";
+                }
+            } 
+            else {
+                alert('There was a problem with the request.');
+            }
+        }
+    }
+}
+
+function signupValidation() {
+    var username = document.forms["signupform"]["username"];
+    var password = document.forms["signupform"]["password"];
+    var cpassword = document.forms["signupform"]["confirm-password"];
+    var email = document.forms["signupform"]["email"];
+    var fullname = document.forms["signupform"]["your-name"];
+    var phone = document.forms["signupform"]["phone"];
+    var usrVerify = Validate(username, "empty");
+    var pwdVerify = Validate(password, "empty");
+    var cpwdVerify = Validate(cpassword, "empty");
+    var emailVerify = Validate(email, "empty", 0, 0, "email");
+    var fullnameVerify = Validate(fullname, "empty", 0, 20, "length");
+    var phoneVerify = Validate(phone, "empty", 9, 12, "length");
+    return (usrVerify && pwdVerify && cpwdVerify && emailVerify && fullnameVerify && phoneVerify);
+}
\ No newline at end of file