diff --git a/PrOjek/.gitignore b/PrOjek/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..995c9710c6027ba62c8a1af399bca4d8f7b3fe4e
--- /dev/null
+++ b/PrOjek/.gitignore
@@ -0,0 +1,22 @@
+.idea
+.idea/*
+.gradle
+.gradle/*
+gradle/wrapper/gradle-wrapper.properties
+*.ipr
+*.iws
+*.iml
+out
+log
+build
+out/*
+log/*
+build/*
+dist
+bin
+classes
+classes/*
+/classes/
+gradlew.bat
+gradlew
+gradle/
\ No newline at end of file
diff --git a/PrOjek/README.md b/PrOjek/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..0826ff662086a454d1bfad52827d362e8b5a5b63
--- /dev/null
+++ b/PrOjek/README.md
@@ -0,0 +1,158 @@
+# Tugas 2 IF3110 Pengembangan Aplikasi Berbasis Web
+
+Melakukan *upgrade* Website ojek online sederhana pada Tugas 1 dengan mengaplikasikan **arsitektur web service REST dan SOAP**.
+
+**Luangkan waktu untuk membaca spek ini sampai selesai. Kerjakan hal yang perlu saja.**
+
+### Tujuan Pembuatan Tugas
+
+Diharapkan dengan tugas ini anda dapat mengerti:
+* Produce dan Consume REST API
+* Mengimplementasikan service Single Sign-On (SSO) sederhana
+* Produce dan Consume Web Services dengan protokol SOAP
+* Membuat web application dengan menggunakan JSP yang akan memanggil web services dengan SOAP (dengan JAX-WS) dan REST (dengan Servlet).
+
+### Petunjuk Pengerjaan
+## Anggota Tim
+
+Setiap kelompok beranggotakan **3 orang dari kelas yang sama**. Jika jumlah mahasiswa dalam satu kelas modulo 3 menghasilkan 1, maka hanya 1 kelompok terdiri dari 4 mahasiswa. Jika jumlah mahasiswa modulo 3 menghasilkan 2, maka ada dua kelompok yang beranggotakan 4 orang. Anggota kelompok harus berbeda dengan tugas 1.
+
+## Petunjuk Pengerjaan
+
+1. Buatlah organisasi pada gitlab dengan format "IF3110-2017-KXX-nama kelompok", dengan XX adalah nomor kelas.
+2. Tambahkan anggota tim pada organisasi anda.
+3. Fork pada repository ini dengan organisasi yang telah dibuat.
+4. Ubah hak akses repository hasil Fork anda menjadi **private**.
+5. [DELIVERABLE] Buat tugas sesuai spesifikasi dan silakan commit pada repository anda (hasil fork). Lakukan berberapa commit dengan pesan yang bermakna, contoh: `add register form`, `fix logout bug`, jangan seperti `final`, `benerin dikit`. Disarankan untuk tidak melakukan commit dengan perubahan yang besar karena akan mempengaruhi penilaian (contoh: hanya melakukan satu commit kemudian dikumpulkan). Sebaiknya commit dilakukan setiap ada penambahan fitur. **Commit dari setiap anggota tim akan mempengaruhi penilaian individu.** Jadi, setiap anggota tim harus melakukan sejumlah commit yang berpengaruh terhadap proses pembuatan aplikasi.
+6. Hapus bagian yang tidak perlu dari *readme* ini.
+7. [DELIVERABLE] Berikan penjelasan mengenai hal di bawah ini pada bagian **Penjelasan** dari *readme* repository git Anda:
+    - Basis data dari sistem yang Anda buat.
+    - Konsep *shared session* dengan menggunakan REST.
+    - Pembangkitan token dan expire time pada sistem yang anda buat.
+    - Kelebihan dan kelemahan dari arsitektur aplikasi tugas ini, dibandingkan dengan aplikasi monolitik (login, CRUD DB, dll jadi dalam satu aplikasi)
+8. Pada *readme* terdapat penjelasan mengenai pembagian tugas masing-masing anggota (lihat formatnya pada bagian **pembagian tugas**).
+9. Merge request dari repository anda ke repository ini dengan format **Nama kelompok** - **NIM terkecil** - **Nama Lengkap dengan NIM terkecil** sebelum **8 November 2017 23.59**.
+
+### Arsitektur Umum Server
+![Gambar Arsitektur Umum](arsitektur_umum.png)
+
+Tugas 2 ini terdiri dari berberapa komponen yang harus dibuat:
+* `Web app`: digunakan untuk menangani HTTP request dari web browser dan menghasilkan HTTP response. Bagian yang diimplementasi dengan JSP ini juga bertugas untuk meng-generate tampilan web layaknya PHP. Bagian ini wajib dibuat dengan **Java + Java Server Pages**. Maka dari itu, konversi seluruh kode PHP pada tugas 1 menjadi kode JSP.
+* `Ojek Online Web Service`: digunakan sebagai interface yang dipanggil oleh aplikasi melalui protokol SOAP. melakukan query ke database, operasi insert, dan operasi update untuk entitas User, History, dan Preferred Locations. Webservice ini akan dipanggil oleh aplikasi dengan menggunakan SOAP. Webservice ini wajib dibuat dengan **JAX-WS dengan protokol SOAP atau Webservice lain** yang basisnya menggunakan **SOAP dan Java**.
+* `Identity service`: dipanggil oleh aplikasi untuk menerima email (sebagai username) dan password pengguna, dan menghasilkan *access token*. Identity Service juga dipanggil oleh *ojek online web service* untuk melakukan validasi terhadap *access token* yang sedang dipegang oleh *web app*. Service ini dibuat menggunakan REST. Namun, selain menghandle request secara REST biasa, Identity Service juga harus bisa **menerima SOAP request dan mengembalikan SOAP response** (contoh SOAP request dan response dapat dilihat pada [link berikut](https://www.tutorialspoint.com/soap/soap_examples.htm)). Identity service ini wajib dibuat dengan menggunakan **Java Servlet**.
+* `Database`: pisahkan basis data yang telah Anda buat pada tugas 1 menjadi basis data khusus manajemen *account* (menyimpan username, password, dkk) dan basis data ojek online tanpa manajemen *account*. Basis data *account* digunakan secara khusus oleh Identity Service. **Ojek Online Web Service tidak boleh secara langsung mengakses basis data account untuk melakukan validasi token** (harus melalui Identity Service).
+
+Perhatikan bahwa Anda tidak perlu menggunakan banyak mesin untuk membuat aplikasi ini. Contohnya, pada satu mesin anda bisa menggunakan port 8000 untuk JSP, port 8001 untuk identity service, dan port 8002 untuk ojek online web service.
+
+### Deskripsi Tugas
+
+Anda diminta untuk membuat ojek online sederhana seperti tugas 1.  Kebutuhan fungsional dan non-fungsional tugas yang harus dibuat adalah sebagai berikut.
+
+1. Halaman website yang memiliki tampilan serupa dengan tugas 1.
+2. Ojek Online web service dengan fungsi-fungsi sesuai kebutuhan sistem dalam mengakses data (kecuali login, register, dan logout).
+3. Identity service yang menangani manajemen *account* seperti login dan register, serta validasi access token.
+4. Fitur validasi email dan username pada halaman register tidak perlu diimplementasikan dengan menggunakan AJAX.
+5. Tidak perlu melakukan validasi javascript.
+6. Tampilan pada tugas ini **tidak akan dinilai**. Sangat disarankan untuk menggunakan asset dan tampilan dari tugas sebelumnya. Boleh menggunakan CSS framework seperti Bootstrap atau javascript library seperti jQuery.
+7. Tidak perlu memperhatikan aspek keamanan dan etika penyimpanan data.
+
+
+### Skenario
+
+#### Login
+1. Pengguna mengakses halaman login, contoh: `/login.jsp` dan mengisi form.
+2. JSP akan membuka HTTP request ke Identity Service, contoh `POST /login` dengan body data email dan password.
+3. Identity service akan melakukan query ke DB untuk mengetahui apakah email dan password tersebut valid.
+4. Identity service akan memberikan HTTP response `access token` dan `expiry time` jika email dan password ada di dalam DB, atau error jika tidak ditemukan data. Silakan definisikan `expiry time` yang menurut Anda sesuai.
+5. Access token ini digunakan sebagai representasi state dari session pengguna dan harus dikirimkan ketika pengguna ingin melakukan semua aktivitas, kecuali login, register, dan logout. 
+6. Access token dibangkitkan secara random. Silakan definisikan sendiri panjang tokennya.
+7. Cara penyimpanan access token dibebaskan.
+8. Silakan definisikan format request dan response sesuai kebutuhan anda. Anda dapat menggunakan JSON atau XML untuk REST.
+
+#### Register
+1. Pengguna mengakses halaman register, contoh: `/register.jsp` dan mengisi form.
+2. JSP akan melakukan HTTP request ke Identity Service, contoh `POST /register` dengan body data yang dibutuhkan untuk registrasi.
+3. Identity service akan query DB untuk melakukan validasi bahwa email dan username belum pernah terdaftar sebelumnya.
+4. Identity service akan menambahkan user ke DB bila validasi berhasil, atau memberi HTTP response error jika username sudah ada atau confirm password salah.
+5. Identity service akan memberikan HTTP response `access token` dan `expiry time` dan user akan ter-login ke halaman profile bila user merupakan driver atau ke halaman order bila user bukan merupakan driver.
+6. Silakan definisikan format request dan response sesuai kebutuhan anda. Anda dapat menggunakan JSON atau XML untuk REST.
+
+#### Logout
+1. Pengguna menekan tombol logout.
+2. JSP akan melakukan HTTP request ke Identity Service, contoh `POST /logout` dengan body data yang dibutuhkan.
+3. Identity service akan menghapus atau melakukan invalidasi terhadap access token yang diberikan.
+4. Identity service akan mengembalikan HTTP response berhasil.
+5. Halaman di-*redirect* ke halaman login.
+
+#### Add Preferred Location, Make an Order, dll
+1. Pengguna mengakses halaman add preferred location, misal `/add-preferred-location.jsp` dan mengisi form.
+2. JSP akan memanggil fungsi pada *ojek online web service* dengan SOAP, misalnya `addPreferredLocation(access_token, location)`. Contohnya, dapat dilihat pada
+[link berikut](http://www.mkyong.com/webservices/jax-ws/jax-ws-hello-world-example/)
+Perhatikan pemanggilan pada contoh ini seperti melakukan remote procedure call.
+3. Fungsi tersebut akan melakukan HTTP request ke Identity Service, untuk mengenali user dengan `access_token` yang diberikan.
+    - Jika `access_token` **kadaluarsa**, maka `addPreferredLocation` akan memberikan response expired token.
+    - Jika `access_token` **tidak valid**, maka `addPreferredLocation` akan memberikan response error ke JSP.
+    - Jika `access_token` **valid**, maka `addPreferredLocation` akan memasukan produk ke DB, dan memberikan response kesuksesan ke JSP.
+4. Jika `access_token` sudah kadaluarsa atau tidak valid (yang diketahui dari response error ojek online web service), sistem akan me-redirect user ke halaman login.
+5. Untuk make an order, get history, dan lainnya kira-kira memiliki mekanisme yang sama dengan add preferred locations di atas.
+6. Silakan definisikan format object request dan response sesuai kebutuhan anda.
+
+#### Prosedur Demo
+Sebelum demo, asisten akan melakukan checkout ke hash commit terakhir yang dilakukan sebelum deadline. Hal ini digunakan untuk memastikan kode yang akan didemokan adalah kode yang terakhir disubmit sebelum deadline.
+
+#### Bonus
+Anda tidak dituntut untuk mengerjakan ini. Fokus terlebih dahulu menyelesaikan semua spesifikasi yang ada sebelum memikirkan bonus.
+- Mekanisme *auto-renew* access token yang tepat sehingga user tidak ter-logout secara paksa saat melakukan serangkaian aktivitas pada sistem dalam waktu yang cukup lama. Access token dapat di generate kembali ketika lifetime dari token tersebut habis. Cara implementasi dibebaskan.
+
+
+### Penjelasan
+1. Sistem yang kami buat menggunakan mysql sebagai basis datanya. Untuk menyimpan informasi username dan password, kami menggunakan satu 
+database terpisah. Database untuk menyimpan user ini berada pada sisi identity service. Selain itu, database ini juga berfungsi untuk 
+menyimpan token setiap user yang sudah berhasil login.
+Untuk database terkait logic dari sistem ojek, DBMS yang digunakan adalah mysql. Database ini berada di sisi ojek web service.
+2. Untuk menyimpan state, kami tidak menggunakan session melainkan menggunakan access token yang disimpan oleh identity service di 
+database-nya dan disimpan juga oleh webapp menggunakan cookie. Access token ini pada dasarnya sama saja seperti session yang menyimpan state.
+3. Pada sistem kami token dibangkitkan menggunakan algoritma random string 32 byte. Refresh token juga dibangkitkan dengan cara yang sama.
+4. Dengan mengembangkan sistem menggunakan microservice, proses pengerjaan dapat dilakukan secara terpisah karena setiap service pada umumnya 
+loosly coupled atau tidak terlalu bergantung dengan service lainnya. Model pengerjaan seperti ini juga memepermudah pengembangan sistem karena 
+satu buah service hanya memiliki satu tanggung jawab saja sehingga mudah memanage-nya.
+
+### Pembagian Tugas
+"Gaji buta dilarang dalam tugas ini. Bila tak mengerti, luangkan waktu belajar lebih banyak. Bila belum juga mengerti, belajarlah bersama-sama kelompokmu. Bila Anda sekelompok bingung, bertanyalah (bukan menyontek) ke teman seangkatanmu. Bila seangkatan bingung, bertanyalah pada asisten manapun."
+
+*Harap semua anggota kelompok mengerjakan SOAP dan REST API kedua-duanya*. Tuliskan pembagian tugas seperti berikut ini.
+
+REST :
+1. RegisterServlet : 13515097
+2. Validasi Registrasi : 13515097
+3. Identity Service : 13515049, 13515112, 13515097
+4. Identity Servlet : 13515049, 13515112
+5. Refresh Token : 13515049
+6. Validation Servlet : 13515049
+
+SOAP :
+1. UserDAO : 1351097
+2. OrderDAO : 13515112
+3. LocationDAO : 13515112, 13515049
+4. ConfigLoader : 1351097
+5. IdentityServiceLoader : 13515097
+6. UserService : 13515097
+7. OrderService : 13515112
+8. LocationService : 13515112, 13515049
+
+Web app (JSP) :
+1. Halaman Register : 13515097 
+2. Halaman Profile : 13515097
+3. Halaman Order : 13515097
+4. Halaman History : 13515112
+5. Halaman Login : 13515049
+6. SOAPServlet : 13515097
+7. WebappServlet : 13515049
+
+## About
+
+Asisten IF3110 2017
+
+Ade | Johan | Kristianto | Micky | Michael | Rangga | Raudi | Robert | Sashi 
+
+Dosen : Yudistira Dwi Wardhana | Riza Satria Perdana | Muhammad Zuhri Catur Candra
diff --git a/PrOjek/arsitektur_umum.png b/PrOjek/arsitektur_umum.png
new file mode 100644
index 0000000000000000000000000000000000000000..941b40bb165a7e064634c8611c14ed0211c1a4d4
Binary files /dev/null and b/PrOjek/arsitektur_umum.png differ
diff --git a/PrOjek/build.gradle b/PrOjek/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..dd6ad26a7d4c22530d04200ccf92428087c41c59
--- /dev/null
+++ b/PrOjek/build.gradle
@@ -0,0 +1,6 @@
+apply plugin: 'java'
+apply plugin: 'idea'
+
+repositories {
+	mavenCentral()
+}
\ No newline at end of file
diff --git a/PrOjek/common/build.gradle b/PrOjek/common/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..8a92d1e79220438abd46b73d90af193918739795
--- /dev/null
+++ b/PrOjek/common/build.gradle
@@ -0,0 +1,13 @@
+apply plugin: 'java'
+apply plugin: 'idea'
+
+repositories {
+	mavenCentral()
+}
+
+dependencies {
+	compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.6'
+	compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5'
+	compile group: 'org.apache.commons', name: 'commons-io', version: '1.3.2'
+	testCompile group: 'junit', name: 'junit', version: '4.12'
+}
\ No newline at end of file
diff --git a/PrOjek/common/src/main/java/com/ojek/common/Location.java b/PrOjek/common/src/main/java/com/ojek/common/Location.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b7c83be66906aa53d11d5b207c9f7f11da4b948
--- /dev/null
+++ b/PrOjek/common/src/main/java/com/ojek/common/Location.java
@@ -0,0 +1,56 @@
+package com.ojek.common;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+public class Location {
+    Integer id;
+    String location;
+    Integer userId;
+    Integer prefNum;
+
+    public Location() {
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public void setLocation(String location) {
+        this.location = location;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getPrefNum() {
+        return prefNum;
+    }
+
+    public void setPrefNum(Integer prefNum) {
+        this.prefNum = prefNum;
+    }
+
+    @Override
+    public String toString() {
+        return "Location{" +
+                "id=" + id +
+                ", location='" + location + '\'' +
+                ", userId=" + userId +
+                ", prefNum=" + prefNum +
+                '}';
+    }
+}
diff --git a/PrOjek/common/src/main/java/com/ojek/common/MysqlDAO.java b/PrOjek/common/src/main/java/com/ojek/common/MysqlDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8a04bc61f236aac0d1929e1e07bfc258113920e
--- /dev/null
+++ b/PrOjek/common/src/main/java/com/ojek/common/MysqlDAO.java
@@ -0,0 +1,361 @@
+package com.ojek.common;
+
+import java.sql.*;
+import java.util.*;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import static com.ojek.common.util.StringUtil.string;
+
+public abstract class MysqlDAO {
+
+    private String url;
+    private String user;
+    private String password;
+
+    private LinkedBlockingQueue<Connection> connectionPool = new LinkedBlockingQueue<>();
+
+    public MysqlDAO(Connection connection) {
+        if (connection != null) {
+            try {
+                DatabaseMetaData metaData = connection.getMetaData();
+                this.url = metaData.getURL();
+                this.user = null;
+                this.password = null;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            connectionPool.add(connection);
+        }
+    }
+
+    public MysqlDAO(String dbhost, String dbuser, String dbpass) throws ClassNotFoundException, SQLException {
+        this.url = dbhost;
+        this.user = dbuser;
+        this.password = dbpass;
+
+        Class.forName("com.mysql.jdbc.Driver");
+    }
+
+    private Connection makeNewConnection() {
+        try {
+            Connection connection = null;
+            if (url != null && user == null)
+                connection = DriverManager.getConnection(url);
+            else
+                connection = DriverManager.getConnection(url, user, string(password));
+            return new ConnectionWrapper(connection, connectionPool);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    protected synchronized Connection getConnection() {
+        while (connectionPool != null && !connectionPool.isEmpty()) {
+            Connection connection = null;
+            try {
+                connection = connectionPool.poll((long) 100, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            if (connection == null)
+                continue;
+            try {
+                if (connection.isClosed())
+                    continue;
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+            return connection;
+        }
+        if (connectionPool == null)
+            connectionPool = new LinkedBlockingQueue<>();
+        
+        return makeNewConnection();
+    }
+
+    private static class ConnectionWrapper implements java.sql.Connection {
+
+        private Connection connection;
+        private Queue<Connection> queue;
+
+        private ConnectionWrapper(Connection connection, Queue<Connection> queue) {
+            this.connection = connection;
+            this.queue = queue;
+        }
+
+        @Override
+        public Statement createStatement() throws SQLException {
+            return connection.createStatement();
+        }
+
+        @Override
+        public PreparedStatement prepareStatement(String s) throws SQLException {
+            return connection.prepareStatement(s);
+        }
+
+        @Override
+        public CallableStatement prepareCall(String s) throws SQLException {
+            return connection.prepareCall(s);
+        }
+
+        @Override
+        public String nativeSQL(String s) throws SQLException {
+            return connection.nativeSQL(s);
+        }
+
+        @Override
+        public void setAutoCommit(boolean b) throws SQLException {
+            connection.setAutoCommit(b);
+        }
+
+        @Override
+        public boolean getAutoCommit() throws SQLException {
+            return connection.getAutoCommit();
+        }
+
+        @Override
+        public void commit() throws SQLException {
+            connection.commit();
+        }
+
+        @Override
+        public void rollback() throws SQLException {
+            connection.rollback();
+        }
+
+        @Override
+        public void close() throws SQLException {
+            queue.offer(this);
+        }
+
+        @Override
+        public boolean isClosed() throws SQLException {
+            return connection.isClosed();
+        }
+
+        @Override
+        public DatabaseMetaData getMetaData() throws SQLException {
+            return connection.getMetaData();
+        }
+
+        @Override
+        public void setReadOnly(boolean b) throws SQLException {
+            connection.setReadOnly(b);
+        }
+
+        @Override
+        public boolean isReadOnly() throws SQLException {
+            return connection.isReadOnly();
+        }
+
+        @Override
+        public void setCatalog(String s) throws SQLException {
+            connection.setCatalog(s);
+        }
+
+        @Override
+        public String getCatalog() throws SQLException {
+            return connection.getCatalog();
+        }
+
+        @Override
+        public void setTransactionIsolation(int i) throws SQLException {
+            connection.setTransactionIsolation(i);
+        }
+
+        @Override
+        public int getTransactionIsolation() throws SQLException {
+            return connection.getTransactionIsolation();
+        }
+
+        @Override
+        public SQLWarning getWarnings() throws SQLException {
+            return connection.getWarnings();
+        }
+
+        @Override
+        public void clearWarnings() throws SQLException {
+            connection.clearWarnings();
+        }
+
+        @Override
+        public Statement createStatement(int i, int i1) throws SQLException {
+            return connection.createStatement(i, i1);
+        }
+
+        @Override
+        public PreparedStatement prepareStatement(String s, int i, int i1) throws SQLException {
+            return connection.prepareStatement(s,i,i1);
+        }
+
+        @Override
+        public CallableStatement prepareCall(String s, int i, int i1) throws SQLException {
+            return connection.prepareCall(s,i,i1);
+        }
+
+        @Override
+        public Map<String, Class<?>> getTypeMap() throws SQLException {
+            return connection.getTypeMap();
+        }
+
+        @Override
+        public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
+            connection.setTypeMap(map);
+        }
+
+        @Override
+        public void setHoldability(int i) throws SQLException {
+            connection.setHoldability(i);
+        }
+
+        @Override
+        public int getHoldability() throws SQLException {
+            return connection.getHoldability();
+        }
+
+        @Override
+        public Savepoint setSavepoint() throws SQLException {
+            return connection.setSavepoint();
+        }
+
+        @Override
+        public Savepoint setSavepoint(String s) throws SQLException {
+            return connection.setSavepoint(s);
+        }
+
+        @Override
+        public void rollback(Savepoint savepoint) throws SQLException {
+            connection.rollback(savepoint);
+        }
+
+        @Override
+        public void releaseSavepoint(Savepoint savepoint) throws SQLException {
+            connection.releaseSavepoint(savepoint);
+        }
+
+        @Override
+        public Statement createStatement(int i, int i1, int i2) throws SQLException {
+            return connection.createStatement(i,i1,i2);
+        }
+
+        @Override
+        public PreparedStatement prepareStatement(String s, int i, int i1, int i2) throws SQLException {
+            return connection.prepareStatement(s,i,i1,i2);
+        }
+
+        @Override
+        public CallableStatement prepareCall(String s, int i, int i1, int i2) throws SQLException {
+            return connection.prepareCall(s,i,i1,i2);
+        }
+
+        @Override
+        public PreparedStatement prepareStatement(String s, int i) throws SQLException {
+            return connection.prepareStatement(s,i);
+        }
+
+        @Override
+        public PreparedStatement prepareStatement(String s, int[] ints) throws SQLException {
+            return connection.prepareStatement(s, ints);
+        }
+
+        @Override
+        public PreparedStatement prepareStatement(String s, String[] strings) throws SQLException {
+            return connection.prepareStatement(s, strings);
+        }
+
+        @Override
+        public Clob createClob() throws SQLException {
+            return connection.createClob();
+        }
+
+        @Override
+        public Blob createBlob() throws SQLException {
+            return connection.createBlob();
+        }
+
+        @Override
+        public NClob createNClob() throws SQLException {
+            return connection.createNClob();
+        }
+
+        @Override
+        public SQLXML createSQLXML() throws SQLException {
+            return connection.createSQLXML();
+        }
+
+        @Override
+        public boolean isValid(int i) throws SQLException {
+            return connection.isValid(i);
+        }
+
+        @Override
+        public void setClientInfo(String s, String s1) throws SQLClientInfoException {
+            connection.setClientInfo(s, s1);
+        }
+
+        @Override
+        public void setClientInfo(Properties properties) throws SQLClientInfoException {
+            connection.setClientInfo(properties);
+        }
+
+        @Override
+        public String getClientInfo(String s) throws SQLException {
+            return connection.getClientInfo(s);
+        }
+
+        @Override
+        public Properties getClientInfo() throws SQLException {
+            return connection.getClientInfo();
+        }
+
+        @Override
+        public Array createArrayOf(String s, Object[] objects) throws SQLException {
+            return connection.createArrayOf(s, objects);
+        }
+
+        @Override
+        public Struct createStruct(String s, Object[] objects) throws SQLException {
+            return connection.createStruct(s, objects);
+        }
+
+        @Override
+        public void setSchema(String s) throws SQLException {
+            connection.setSchema(s);
+        }
+
+        @Override
+        public String getSchema() throws SQLException {
+            return connection.getSchema();
+        }
+
+        @Override
+        public void abort(Executor executor) throws SQLException {
+            connection.abort(executor);
+        }
+
+        @Override
+        public void setNetworkTimeout(Executor executor, int i) throws SQLException {
+            connection.setNetworkTimeout(executor, i);
+        }
+
+        @Override
+        public int getNetworkTimeout() throws SQLException {
+            return connection.getNetworkTimeout();
+        }
+
+        @Override
+        public <T> T unwrap(Class<T> aClass) throws SQLException {
+            return connection.unwrap(aClass);
+        }
+
+        @Override
+        public boolean isWrapperFor(Class<?> aClass) throws SQLException {
+            return connection.isWrapperFor(aClass);
+        }
+    }
+
+}
diff --git a/PrOjek/common/src/main/java/com/ojek/common/Order.java b/PrOjek/common/src/main/java/com/ojek/common/Order.java
new file mode 100644
index 0000000000000000000000000000000000000000..72dda943469dc3d917d002e1022de185c8f0a365
--- /dev/null
+++ b/PrOjek/common/src/main/java/com/ojek/common/Order.java
@@ -0,0 +1,116 @@
+package com.ojek.common;
+
+import java.util.Date;
+
+public class Order {
+
+    Integer id;
+    Integer driverId;
+    Integer customerId;
+    Boolean customerShow;
+    Boolean driverShow;
+    Integer locationId;
+    Integer destinationId;
+    Date time;
+    Integer rate;
+    String comment;
+
+    public Order() {
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getCustomerId() {
+        return customerId;
+    }
+
+    public void setCustomerId(Integer customerId) {
+        this.customerId = customerId;
+    }
+
+    public Boolean getCustomerShow() {
+        return customerShow;
+    }
+
+    public void setCustomerShow(Boolean customerShow) {
+        this.customerShow = customerShow;
+    }
+
+    public Boolean getDriverShow() {
+        return driverShow;
+    }
+
+    public void setDriverShow(Boolean driverShow) {
+        this.driverShow = driverShow;
+    }
+
+    public Integer getLocationId() {
+        return locationId;
+    }
+
+    public void setLocationId(Integer locationId) {
+        this.locationId = locationId;
+    }
+
+    public Integer getDestinationId() {
+        return destinationId;
+    }
+
+    public void setDestinationId(Integer destinationId) {
+        this.destinationId = destinationId;
+    }
+
+    public Date getTime() {
+        return time;
+    }
+
+    public void setTime(Date time) {
+        this.time = time;
+    }
+
+    public Integer getRate() {
+        return rate;
+    }
+
+    public void setRate(Integer rate) {
+        this.rate = rate;
+    }
+
+    public String getComment() {
+        return comment;
+    }
+
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+
+    @Override
+    public String toString() {
+        return "Order{" +
+                "id=" + id +
+                ", driverId=" + driverId +
+                ", customerId=" + customerId +
+                ", customerShow=" + customerShow +
+                ", driverShow=" + driverShow +
+                ", locationId=" + locationId +
+                ", destinationId=" + destinationId +
+                ", time=" + time +
+                ", rate=" + rate +
+                ", comment='" + comment + '\'' +
+                '}';
+    }
+}
diff --git a/PrOjek/common/src/main/java/com/ojek/common/Token.java b/PrOjek/common/src/main/java/com/ojek/common/Token.java
new file mode 100644
index 0000000000000000000000000000000000000000..58f6ad73d742618ca8df8fae95bdec189083f0ca
--- /dev/null
+++ b/PrOjek/common/src/main/java/com/ojek/common/Token.java
@@ -0,0 +1,76 @@
+package com.ojek.common;
+
+import java.sql.Timestamp;
+
+public class Token {
+
+    private Integer id;
+    private String token;
+    private String refresh;
+    private Timestamp expired;
+    private Integer userId;
+    private User user;
+
+    public Token() {
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public String getRefresh() {
+        return refresh;
+    }
+
+    public void setRefresh(String refresh) {
+        this.refresh = refresh;
+    }
+
+    public Timestamp getExpired() {
+        return expired;
+    }
+
+    public void setExpired(Timestamp expired) {
+        this.expired = expired;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    @Override
+    public String toString() {
+        return "Token{" +
+                "id=" + id +
+                ", token='" + token + '\'' +
+                ", refresh='" + refresh + '\'' +
+                ", expired=" + expired +
+                ", userId=" + userId +
+                ", user=" + user +
+                '}';
+    }
+}
diff --git a/PrOjek/common/src/main/java/com/ojek/common/User.java b/PrOjek/common/src/main/java/com/ojek/common/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..21ed56cce577175802f7517a601c82553dbc12f8
--- /dev/null
+++ b/PrOjek/common/src/main/java/com/ojek/common/User.java
@@ -0,0 +1,117 @@
+package com.ojek.common;
+
+/**
+ * @since 10/30/2017.
+ */
+public class User {
+
+  private Integer id;
+  private String username;
+  private String password;
+  private String email;
+  private String name;
+  private String phone;
+  private String profpicUrl;
+  private Boolean driver;
+  private Integer rating;
+  private Integer votes;
+
+  public User() {
+  }
+
+  public Integer getId() {
+    return id;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+
+  public String getEmail() {
+    return email;
+  }
+
+  public void setEmail(String email) {
+    this.email = email;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getPhone() {
+    return phone;
+  }
+
+  public void setPhone(String phone) {
+    this.phone = phone;
+  }
+
+  public String getProfpicUrl() {
+    return profpicUrl;
+  }
+
+  public void setProfpicUrl(String profpicUrl) {
+    this.profpicUrl = profpicUrl;
+  }
+
+  public Boolean getDriver() {
+    return driver;
+  }
+
+  public void setDriver(Boolean driver) {
+    this.driver = driver;
+  }
+
+  public Integer getRating() {
+    return rating;
+  }
+
+  public void setRating(Integer rating) {
+    this.rating = rating;
+  }
+
+  public Integer getVotes() {
+    return votes;
+  }
+
+  public void setVotes(Integer votes) {
+    this.votes = votes;
+  }
+
+  @Override
+  public String toString() {
+    return "{\"User\":{"
+        + "\"id\":\"" + id + "\""
+        + ", \"username\":\"" + username + "\""
+        + ", \"password\":\"" + password + "\""
+        + ", \"email\":\"" + email + "\""
+        + ", \"name\":\"" + name + "\""
+        + ", \"phone\":\"" + phone + "\""
+        + ", \"profpicUrl\":\"" + profpicUrl + "\""
+        + ", \"driver\":\"" + driver + "\""
+        + ", \"rating\":\"" + rating + "\""
+        + ", \"votes\":\"" + votes + "\""
+        + "}}";
+  }
+}
diff --git a/PrOjek/common/src/main/java/com/ojek/common/util/RestUtil.java b/PrOjek/common/src/main/java/com/ojek/common/util/RestUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..2c4baf1035d8f1e62e2e3f394e7b58547ffd154e
--- /dev/null
+++ b/PrOjek/common/src/main/java/com/ojek/common/util/RestUtil.java
@@ -0,0 +1,44 @@
+package com.ojek.common.util;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class RestUtil {
+
+    public static String httpPost(String url, Map<String,String> parameters) {
+        try {
+            HttpPost request = new HttpPost(url);
+            CloseableHttpClient httpclient = HttpClients.createDefault();
+
+            List<NameValuePair> nvps = new ArrayList<>();
+            for (Map.Entry<String,String> entry : parameters.entrySet())
+                nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
+            request.setEntity(new UrlEncodedFormEntity(nvps));
+
+            CloseableHttpResponse response = httpclient.execute(request);
+
+            HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                InputStream inputStream = entity.getContent();
+                if (inputStream != null)
+                    return IOUtils.toString(inputStream);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}
diff --git a/PrOjek/common/src/main/java/com/ojek/common/util/StringUtil.java b/PrOjek/common/src/main/java/com/ojek/common/util/StringUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..436bf04c4bd096331032b1a75efd60b305e2ddfe
--- /dev/null
+++ b/PrOjek/common/src/main/java/com/ojek/common/util/StringUtil.java
@@ -0,0 +1,54 @@
+package com.ojek.common.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static java.lang.StrictMath.abs;
+
+public class StringUtil {
+
+    public static String randomToken(int length) {
+        Random rand = new Random();
+        String permitted = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+
+        StringBuilder stringBuilder = new StringBuilder();
+        while (length > 0) {
+            stringBuilder.append(permitted.charAt(abs(rand.nextInt())%permitted.length()));
+            length--;
+        }
+
+        return stringBuilder.toString();
+    }
+
+    public static String string(String str) {
+        if (str == null) {
+            return "";
+        }
+        return str;
+    }
+
+    public static Boolean validateEmail(String email) {
+        Pattern pattern = Pattern.compile("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*" +
+                "@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");
+        Matcher matcher = pattern.matcher(email);
+        return matcher.matches();
+    }
+
+    public static String dateToString(Date date) {
+        SimpleDateFormat format = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
+        return format.format(date);
+    }
+
+    public static Date stringToDate(String date) {
+        SimpleDateFormat format = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
+        try {
+            return format.parse(date);
+        } catch (ParseException e) {
+            return new Date();
+        }
+    }
+
+}
diff --git a/PrOjek/common/src/test/java/com/ojek/common/util/EmailTest.java b/PrOjek/common/src/test/java/com/ojek/common/util/EmailTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a0ec33aa899e983cb40b0390d7cec35dfa8a39a
--- /dev/null
+++ b/PrOjek/common/src/test/java/com/ojek/common/util/EmailTest.java
@@ -0,0 +1,15 @@
+package com.ojek.common.util;
+
+import org.junit.Test;
+
+import static com.ojek.common.util.StringUtil.validateEmail;
+import static junit.framework.TestCase.assertTrue;
+
+public class EmailTest {
+
+    @Test
+    public void testEmail() {
+        assertTrue(validateEmail("jauhar@gmail.com"));
+    }
+
+}
diff --git a/PrOjek/identity-cmpt/build.gradle b/PrOjek/identity-cmpt/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..0d6f9e3841c8eb4192e18a182508f5923fe916ee
--- /dev/null
+++ b/PrOjek/identity-cmpt/build.gradle
@@ -0,0 +1,10 @@
+apply plugin: 'java'
+apply plugin: 'idea'
+
+repositories {
+	mavenCentral()
+}
+
+dependencies {
+	compile project(':common')
+}
\ No newline at end of file
diff --git a/PrOjek/identity-cmpt/src/main/java/com/jauharteam/ojek/identity/IdentityService.java b/PrOjek/identity-cmpt/src/main/java/com/jauharteam/ojek/identity/IdentityService.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a5fa2622ab81a9912d1fd90fc0ee9899bb5f99a
--- /dev/null
+++ b/PrOjek/identity-cmpt/src/main/java/com/jauharteam/ojek/identity/IdentityService.java
@@ -0,0 +1,17 @@
+package com.jauharteam.ojek.identity;
+
+import com.ojek.common.User;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+
+@WebService
+@SOAPBinding(style = SOAPBinding.Style.RPC)
+public interface IdentityService {
+
+    @WebMethod public User getUserByToken(String token);
+
+    @WebMethod public Boolean isTokenValid(String token);
+
+}
diff --git a/PrOjek/identity/build.gradle b/PrOjek/identity/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..d55e0d9cdcc9f70edc88b0e52a4f80e7471e92ec
--- /dev/null
+++ b/PrOjek/identity/build.gradle
@@ -0,0 +1,16 @@
+apply plugin: 'java'
+apply plugin: 'idea'
+apply plugin: 'war'
+
+repositories {
+	mavenCentral()
+}
+
+dependencies {
+	compile project(':common')
+	compile project(':identity-cmpt')
+	compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.0.1'
+	compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.6'
+	compile 'javax.servlet:javax.servlet-api:3.1.0'
+	compile group: 'com.sun.xml.ws', name: 'servlet', version: '2.2.8'
+}
\ No newline at end of file
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/Config.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/Config.java
new file mode 100644
index 0000000000000000000000000000000000000000..6951c5855b1acb2adb9cf6eb2dafc54d797d7af9
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/Config.java
@@ -0,0 +1,76 @@
+package com.jauharteam.ojek.identity;
+
+public class Config {
+
+    public static class JdbcConfig {
+        private String url;
+        private String username;
+        private String password;
+
+        public JdbcConfig() {
+        }
+
+        public String getUrl() {
+            return url;
+        }
+
+        public void setUrl(String url) {
+            this.url = url;
+        }
+
+        public String getUsername() {
+            return username;
+        }
+
+        public void setUsername(String username) {
+            this.username = username;
+        }
+
+        public String getPassword() {
+            return password;
+        }
+
+        public void setPassword(String password) {
+            this.password = password;
+        }
+
+        @Override
+        public String toString() {
+            return "JdbcConfig{" +
+                    "url='" + url + '\'' +
+                    ", username='" + username + '\'' +
+                    ", password='" + password + '\'' +
+                    '}';
+        }
+    }
+
+    private JdbcConfig jdbc;
+    private Integer tokenAge;
+
+    public Config() {
+    }
+
+    public JdbcConfig getJdbc() {
+        return jdbc;
+    }
+
+    public void setJdbc(JdbcConfig jdbc) {
+        this.jdbc = jdbc;
+    }
+
+    public Integer getTokenAge() {
+        return tokenAge;
+    }
+
+    public void setTokenAge(Integer tokenAge) {
+        this.tokenAge = tokenAge;
+    }
+
+    @Override
+    public String toString() {
+        return "{\"Config\":{"
+            + "\"jdbc\":" + jdbc
+            + ", \"tokenAge\":\"" + tokenAge + "\""
+            + "}}";
+    }
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/IdentityServiceImpl.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/IdentityServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..43be8bc78267f5c38a00901248c596428ac15989
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/IdentityServiceImpl.java
@@ -0,0 +1,68 @@
+package com.jauharteam.ojek.identity;
+
+import com.jauharteam.ojek.identity.token.TokenMysqlDAO;
+import com.jauharteam.ojek.identity.user.UserDAO;
+import com.jauharteam.ojek.identity.user.UserMysqlDAO;
+import com.jauharteam.ojek.identity.token.TokenDAO;
+import com.ojek.common.User;
+
+import javax.annotation.Resource;
+import javax.jws.WebService;
+import javax.servlet.ServletContext;
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.handler.MessageContext;
+
+@WebService(endpointInterface = "com.jauharteam.ojek.identity.IdentityService")
+public class IdentityServiceImpl implements IdentityService {
+
+    @Resource
+    private WebServiceContext context;
+
+    private UserDAO userDAO;
+    private TokenDAO tokenDAO;
+
+    private TokenDAO getTokenDAO() {
+        try {
+            ServletContext servletContext = (ServletContext) context.getMessageContext()
+                    .get(MessageContext.SERVLET_CONTEXT);
+            Config config = (Config) servletContext.getAttribute("identityConfig");
+            if (config != null && config.getJdbc() != null) {
+                Config.JdbcConfig jdbcConfig = config.getJdbc();
+                tokenDAO = new TokenMysqlDAO(jdbcConfig.getUrl(), jdbcConfig.getUsername(),
+                        jdbcConfig.getPassword());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return tokenDAO;
+    }
+
+    private UserDAO getUserDAO() {
+        try {
+            ServletContext servletContext = (ServletContext) context.getMessageContext()
+                    .get(MessageContext.SERVLET_CONTEXT);
+            Config config = (Config) servletContext.getAttribute("identityConfig");
+            if (config != null && config.getJdbc() != null) {
+                Config.JdbcConfig jdbcConfig = config.getJdbc();
+                userDAO = new UserMysqlDAO(jdbcConfig.getUrl(), jdbcConfig.getUsername(),
+                        jdbcConfig.getPassword());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return userDAO;
+    }
+
+    @Override
+    public User getUserByToken(String token) {
+        User user = getUserDAO().getUserByToken(token);
+        if (user == null)
+            return new User();
+        return user;
+    }
+
+    @Override
+    public Boolean isTokenValid(String token) {
+        return getTokenDAO().isTokenValid(token);
+    }
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/IdentityServlet.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/IdentityServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..b0b354ff1c8d7c027cb309229487444b14f7d65c
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/IdentityServlet.java
@@ -0,0 +1,36 @@
+package com.jauharteam.ojek.identity;
+
+import com.jauharteam.ojek.identity.user.UserDAO;
+import com.jauharteam.ojek.identity.user.UserMysqlDAO;
+import com.jauharteam.ojek.identity.token.TokenDAO;
+import com.jauharteam.ojek.identity.token.TokenMysqlDAO;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServlet;
+
+public abstract class IdentityServlet extends HttpServlet {
+
+  protected UserDAO userDAO;
+  protected TokenDAO tokenDAO;
+
+  protected ServletContext servletContext;
+
+  @Override
+  public void init(ServletConfig servletConfig) {
+    try {
+      servletContext = servletConfig.getServletContext();
+      Config config = (Config) servletContext.getAttribute("identityConfig");
+      if (config != null && config.getJdbc() != null) {
+        Config.JdbcConfig jdbcConfig = config.getJdbc();
+        userDAO = new UserMysqlDAO(jdbcConfig.getUrl(), jdbcConfig.getUsername(),
+            jdbcConfig.getPassword());
+        tokenDAO = new TokenMysqlDAO(jdbcConfig.getUrl(), jdbcConfig.getUsername(),
+            jdbcConfig.getPassword());
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/IdentityServletBootstrapper.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/IdentityServletBootstrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2ac1225435fefdd05cc6f054733d79a3681b46a
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/IdentityServletBootstrapper.java
@@ -0,0 +1,30 @@
+package com.jauharteam.ojek.identity;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import java.io.File;
+
+public class IdentityServletBootstrapper implements ServletContextListener {
+  @Override
+  public void contextInitialized(ServletContextEvent sce) {
+    ServletContext servletContext = sce.getServletContext();
+
+    String configFile = servletContext.getRealPath("/WEB-INF/classes/config.json");
+
+    ObjectMapper objectMapper = new ObjectMapper();
+    try {
+      Config config = objectMapper.readValue(new File(configFile), Config.class);
+      servletContext.setAttribute("identityConfig", config);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Override
+  public void contextDestroyed(ServletContextEvent sce) {
+
+  }
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/LoginServlet.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/LoginServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..432e1feff4044e6818aa1766d4f33d040ab2f3b9
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/LoginServlet.java
@@ -0,0 +1,101 @@
+package com.jauharteam.ojek.identity;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ojek.common.User;
+import com.ojek.common.util.StringUtil;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.Writer;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class LoginServlet extends IdentityServlet {
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        req.getRequestDispatcher("/login.jsp").forward(req, resp);
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+        String username = req.getParameter("username");
+        String password = req.getParameter("password");
+
+        //===================================================//
+        String userAgent = req.getParameter("User-Agent");
+        String ipAddress = req.getParameter("Ip-Address");
+
+        System.out.println("Log - identity-user " + userAgent);
+        System.out.println("Log - identity-ip " + ipAddress);
+        //===================================================//
+
+        boolean success = true;
+        String errorMessage = "";
+        String token = "";
+        String refreshToken = "";
+        Date tokenExpired = null;
+        
+        Config config = (Config) servletContext.getAttribute("identityConfig");
+        Integer tokenAge = config != null ? config.getTokenAge() : 3600000;
+        if (tokenAge == null)
+            tokenAge = 3600000;
+
+        if (username != null && password != null) {
+            User user = userDAO.getUserByUsername(username);
+            if (user != null && user.getPassword().equals(password)) {
+
+                // token = StringUtil.randomToken(32);
+                // refreshToken = StringUtil.randomToken(32);
+
+                //=============================================================//
+                token = StringUtil.randomToken(10)+"#"+userAgent+"#"+ipAddress;
+                refreshToken = StringUtil.randomToken(10)+"#"+userAgent+"#"+ipAddress;
+                //=============================================================//
+
+                tokenExpired = new Date(new Date().getTime() + tokenAge);
+                Timestamp expired = new Timestamp(tokenExpired.getTime());
+                if (!tokenDAO.insertNewToken(token, refreshToken, expired, user)) {
+                    success = false;
+                    errorMessage = "Internal server error : cannot insert token to database";
+                }
+            } else {
+                success = false;
+                errorMessage = "Wrong username and password";
+            }
+        } else {
+            success = false;
+            errorMessage = "Invalid username or password";
+        }
+
+        Map<String,Object> response = new HashMap<>();
+        if (success) {
+            response.put("success", new Boolean(true));
+            response.put("status", "success");
+            response.put("accessToken", token);
+            response.put("refreshToken", refreshToken);
+            response.put("expired", StringUtil.dateToString(tokenExpired));
+
+            // =========================================== //
+            System.out.println("log id > wapp - accessToken :" + token);
+            System.out.println("log id > wapp - refreshToken :" + refreshToken);
+            // =========================================== //
+
+        } else {
+            response.put("success", new Boolean(false));
+            response.put("status", "error");
+            response.put("errorMessage", errorMessage);
+        }
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonString = objectMapper.writeValueAsString(response);
+
+        resp.setContentType("application/json");
+        Writer writer = resp.getWriter();
+        writer.write(jsonString);
+        writer.flush();
+    }
+}
\ No newline at end of file
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/LogoutServlet.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/LogoutServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..01f358499e36fb0fbb49e422b7cafc9884e5e463
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/LogoutServlet.java
@@ -0,0 +1,46 @@
+package com.jauharteam.ojek.identity;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ojek.common.Token;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.Map;
+
+public class LogoutServlet extends IdentityServlet {
+
+  @Override
+  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+    String token = req.getParameter("token");
+    if (token == null)
+      token = req.getParameter("access_token");
+    if (token == null)
+      token = req.getParameter("accessToken");
+
+    Map<String,Object> response = new HashMap<>();
+    Token tokenDB = tokenDAO.getToken(token);
+    if (tokenDB != null) {
+      if (tokenDAO.deleteToken(tokenDB.getToken())) {
+        response.put("success", new Boolean(true));
+        response.put("status", "success");
+      } else {
+        response.put("success", new Boolean(false));
+        response.put("status", "error");
+        response.put("errorMessage", "Invalid token");
+      }
+    } else {
+      response.put("success", new Boolean(false));
+      response.put("status", "error");
+      response.put("errorMessage", "Invalid token");
+    }
+
+    ObjectMapper objectMapper = new ObjectMapper();
+    resp.setContentType("application/json");
+    Writer writer = resp.getWriter();
+    writer.write(objectMapper.writeValueAsString(response));
+    writer.flush();
+  }
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/RefreshServlet.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/RefreshServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a5a70d6d34e95b1ad01f306f5ff85329a9fa79b
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/RefreshServlet.java
@@ -0,0 +1,81 @@
+package com.jauharteam.ojek.identity;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ojek.common.Token;
+import com.ojek.common.User;
+import com.ojek.common.util.StringUtil;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.Writer;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class RefreshServlet extends IdentityServlet {
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        req.getRequestDispatcher("/refresh.jsp").forward(req, resp);
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+        String oldToken = req.getParameter("token");
+        String oldRefresh = req.getParameter("refresh");
+
+        boolean success = true;
+        String errorMessage = "";
+        String token = "";
+        String refreshToken = "";
+        Date tokenExpired = null;
+        
+        Config config = (Config) servletContext.getAttribute("identityConfig");
+        Integer tokenAge = config != null ? config.getTokenAge() : 3600000;
+        if (tokenAge == null)
+            tokenAge = 3600000;
+
+        if (oldToken != null && oldRefresh != null) {
+            Token temp = tokenDAO.getToken(oldToken);
+            if (temp != null && temp.getRefresh() != null && temp.getRefresh().equals(oldRefresh)) {
+                token = StringUtil.randomToken(32);
+                refreshToken = StringUtil.randomToken(32);
+                tokenExpired = new Date(new Date().getTime() + tokenAge);
+                Timestamp expired = new Timestamp(tokenExpired.getTime());
+                if (!tokenDAO.insertNewToken(token, refreshToken, expired, temp.getUserId())) {
+                    success = false;
+                    errorMessage = "Internal server error : cannot insert token to database";
+                }
+            } else {
+                success = false;
+                errorMessage = "Wrong username and password";
+            }
+        } else {
+            success = false;
+            errorMessage = "Invalid username or password";
+        }
+
+        Map<String,Object> response = new HashMap<>();
+        if (success) {
+            response.put("success", new Boolean(true));
+            response.put("status", "success");
+            response.put("accessToken", token);
+            response.put("refreshToken", refreshToken);
+            response.put("expired", StringUtil.dateToString(tokenExpired));
+        } else {
+            response.put("success", new Boolean(false));
+            response.put("status", "error");
+            response.put("errorMessage", errorMessage);
+        }
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonString = objectMapper.writeValueAsString(response);
+
+        resp.setContentType("application/json");
+        Writer writer = resp.getWriter();
+        writer.write(jsonString);
+        writer.flush();
+    }
+}
\ No newline at end of file
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/RegisterServlet.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/RegisterServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..fba9ca7ca69b879a83c461fd8585c794bc34a846
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/RegisterServlet.java
@@ -0,0 +1,140 @@
+package com.jauharteam.ojek.identity;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ojek.common.User;
+import com.ojek.common.util.StringUtil;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.Writer;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.ojek.common.util.StringUtil.validateEmail;
+
+/**
+ * Created by dery on 11/3/17.
+ */
+public class RegisterServlet extends IdentityServlet {
+
+    private boolean success = false;
+    private String errorMessage = "";
+    private String token = "";
+    private String refreshToken = "";
+    private Date tokenExpired = null;
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        req.getRequestDispatcher("/register.jsp").forward(req, resp);
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        String name = req.getParameter("name");
+        String username = req.getParameter("username");
+        String email = req.getParameter("email");
+        String password = req.getParameter("password");
+        String confirmPassword = req.getParameter("confirm_password");
+        String phone = req.getParameter("phone");
+        String driverStr = req.getParameter("driver");
+
+        //===================================================//
+        String userAgent = req.getParameter("User-Agent");
+        String ipAddress = req.getParameter("Ip-Address");
+
+        System.out.println("Reg - identity-user " + userAgent);
+        System.out.println("Reg - identity-ip " + ipAddress);
+        //===================================================//
+
+        Boolean isDriver = false;
+        if (driverStr != null && driverStr.length() > 0)
+            isDriver = driverStr.equals("1");
+
+        Config config = (Config) servletContext.getAttribute("identityConfig");
+        Integer tokenAge = config != null ? config.getTokenAge() : 3600000;
+        if (tokenAge == null)
+            tokenAge = 3600000;
+
+        if(isValid(name, username, email, password, confirmPassword, phone)){
+            User user = new User();
+            user.setName(name);
+            user.setUsername(username);
+            user.setEmail(email);
+            user.setPassword(password);
+            user.setPhone(phone);
+            user.setDriver(isDriver);
+
+            if(userDAO.createUser(user)){
+
+                token = StringUtil.randomToken(32);
+                refreshToken = StringUtil.randomToken(32);
+
+                //=============================================================//
+                // token = StringUtil.randomToken(10)+"#"+userAgent+"#"+ipAddress;
+                // refreshToken = StringUtil.randomToken(10)+"#"+userAgent+"#"+ipAddress;
+                //=============================================================//
+
+                tokenExpired = new Date(new Date().getTime() + tokenAge);
+                Timestamp expired = new Timestamp(tokenExpired.getTime());
+                if (!tokenDAO.insertNewToken(token, refreshToken, expired, user)) {
+                    success = false;
+                    errorMessage = "Internal server error : Register success but cannot login to system";
+                } else
+                    success = true;
+            } else {
+                success = false;
+                errorMessage = "Internal server error : cannot insert new user to database";
+            }
+        }
+
+        Map<String,Object> response = new HashMap<>();
+        if (success) {
+            response.put("success", new Boolean(true));
+            response.put("status", "success");
+            response.put("accessToken", token);
+            response.put("refreshToken", refreshToken);
+            response.put("expired", tokenExpired);
+        } else {
+            response.put("success", new Boolean(false));
+            response.put("status", "error");
+            response.put("errorMessage", errorMessage);
+        }
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonString = objectMapper.writeValueAsString(response);
+
+        resp.setContentType("application/json");
+        Writer writer = resp.getWriter();
+        writer.write(jsonString);
+        writer.flush();
+    }
+
+    private boolean isValid(String name, String username, String email, String password, String confirmPassword,
+                            String phone) {
+        if (name == null || name.length() < 3 || username == null || email == null || password == null ||
+                confirmPassword == null) {
+            success = false;
+            errorMessage = "Username, email and password field is required.";
+            return false;
+        }
+        if(userDAO.getUserByEmail(email) != null || userDAO.getUserByUsername(username) != null){
+            success = false;
+            errorMessage = "Username or email already taken.";
+            return false;
+        }
+        if (!validateEmail(email)) {
+            success = false;
+            errorMessage = "Email format is invalid.";
+            return false;
+        }
+        if(!password.equals(confirmPassword)){
+            success = false;
+            errorMessage = "Password and confirm password doesn't match.";
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/ValidationServlet.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/ValidationServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b3deeca626770cdf09ff6549107712f7d586292
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/ValidationServlet.java
@@ -0,0 +1,57 @@
+package com.jauharteam.ojek.identity;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ojek.common.util.StringUtil;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ValidationServlet extends IdentityServlet {
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        String username = req.getParameter("username");
+        String password = req.getParameter("password");
+        String email = req.getParameter("email");
+        String name = req.getParameter("name");
+        // String phone = req.getParameter("phone");
+        // String driver = req.getParameter("driver");
+
+        resp.setContentType("application/json");
+        Map<String,Object> responseJson = new HashMap<>();
+
+        // validate
+        responseJson.put("success", false);
+        responseJson.put("status", "error");
+        if (username == null || password == null || email == null || name == null)
+            responseJson.put("errorMessage", "Username, password, email and name is required.");
+        else if (username.length() < 4 || username.length() > 32)
+            responseJson.put("errorMessage", "Username should between 4 and 32 characters");
+        else if (password.length() < 4 || password.length() > 100)
+            responseJson.put("errorMessage", "Password should between 4 and 100 characters");
+        else if (email.length() < 4 || email.length() > 100)
+            responseJson.put("errorMessage", "Email should between 4 and 100 characters");
+        else if (name.length() < 4 || name.length() > 100)
+            responseJson.put("errorMessage", "Name should between 4 and 100 characters");
+        else if (!StringUtil.validateEmail(email))
+            responseJson.put("errorMessage", "Malformed email");
+        else if (userDAO.getUserByEmail(email) != null)
+            responseJson.put("errorMessage", "Email already used");
+        else if (userDAO.getUserByUsername(username) != null)
+            responseJson.put("errorMessage", "Username already taken");
+        else {
+            responseJson.put("success", true);
+            responseJson.put("status", "success");
+        }
+
+        PrintWriter writer = resp.getWriter();
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.writeValue(writer, responseJson);
+    }
+
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/token/TokenDAO.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/token/TokenDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..fea750e304d5d28c3202bc9c3bd5618fc6c2b58f
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/token/TokenDAO.java
@@ -0,0 +1,21 @@
+package com.jauharteam.ojek.identity.token;
+
+import com.ojek.common.Token;
+import com.ojek.common.User;
+
+import java.sql.Timestamp;
+
+public interface TokenDAO {
+
+    public Boolean insertNewToken(String token, String refresh, Timestamp expired, User user);
+
+    public Boolean insertNewToken(String token, String refresh, Timestamp expired, Integer userId);
+
+    public Boolean insertNewToken(Token token);
+
+    public Token getToken(String token);
+
+    public Boolean deleteToken(String token);
+
+    public Boolean isTokenValid(String token);
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/token/TokenMysqlDAO.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/token/TokenMysqlDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e34f8beebb2573726f551071fa0072ee444c282
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/token/TokenMysqlDAO.java
@@ -0,0 +1,182 @@
+package com.jauharteam.ojek.identity.token;
+
+import com.ojek.common.MysqlDAO;
+import com.ojek.common.Token;
+import com.ojek.common.User;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.Date;
+
+public class TokenMysqlDAO extends MysqlDAO implements TokenDAO {
+
+    public TokenMysqlDAO(Connection connection) {
+        super(connection);
+    }
+
+    public TokenMysqlDAO(String dbhost, String dbuser, String dbpass) throws ClassNotFoundException, SQLException {
+        super(dbhost, dbuser, dbpass);
+    }
+
+    @Override
+    public Boolean insertNewToken(String token, String refresh, Timestamp expired, User user) {
+        if (token == null || refresh == null || user == null || user.getId() == null)
+            return false;
+        return insertNewToken(token, refresh, expired, user.getId());
+    }
+
+    @Override
+    public Boolean insertNewToken(String token, String refresh, Timestamp expired, Integer userId) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("INSERT INTO tokens (token, refresh, expired, user_id) VALUES (?,?,?,?)");
+            stmt.setString(1, token);
+            stmt.setString(2, refresh);
+            stmt.setTimestamp(3, expired);
+            stmt.setInt(4, userId);
+
+            return stmt.executeUpdate() > 0;
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean insertNewToken(Token token) {
+        if (token == null)
+            return false;
+        return insertNewToken(token.getToken(), token.getRefresh(), token.getExpired(), token.getUserId());
+    }
+
+    @Override
+    public Token getToken(String token) {
+        PreparedStatement stmt = null;
+        Connection connection  = null;
+        try {
+            connection = getConnection();
+            stmt = connection.prepareStatement("SELECT * FROM tokens WHERE token=?");
+            stmt.setString(1, token);
+
+            ResultSet result = stmt.executeQuery();
+
+            if (result.next()) {
+                Token tokenObject = new Token();
+                tokenObject.setId(result.getInt("id"));
+                tokenObject.setUserId(result.getInt("user_id"));
+                tokenObject.setExpired(result.getTimestamp("expired"));
+                tokenObject.setToken(result.getString("token"));
+                tokenObject.setRefresh(result.getString("refresh"));
+
+                return tokenObject;
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (connection != null)
+                try {
+                    connection.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return null;
+    }
+
+    @Override
+    public Boolean deleteToken(String token) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("DELETE FROM tokens where token=?");
+            stmt.setString(1, token);
+            stmt.execute();
+            return stmt.getUpdateCount() > 0;
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if(conn!=null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean isTokenValid(String token) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("SELECT * FROM tokens WHERE token=?");
+            stmt.setString(1, token);
+
+            ResultSet result = stmt.executeQuery();
+
+            if (result.next()) {
+                Timestamp now = new Timestamp(new Date().getTime());
+                Timestamp expired = result.getTimestamp("expired");
+
+                if (expired == null)
+                    return false;
+
+                if (now.before(expired))
+                    return true;
+                else
+                    deleteToken(token);
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/user/UserDAO.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/user/UserDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..0ca19b5356ae8f665d72d13225015454a147723e
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/user/UserDAO.java
@@ -0,0 +1,14 @@
+package com.jauharteam.ojek.identity.user;
+
+import com.ojek.common.User;
+
+public interface UserDAO {
+
+    public User getUserByUsername(String username);
+
+    public User getUserByEmail(String email);
+
+    public Boolean createUser(User user);
+
+    public User getUserByToken(String token);
+}
diff --git a/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/user/UserMysqlDAO.java b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/user/UserMysqlDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..eda7d1bfeb1b11c1fda90857fad0ef399eb5b4d8
--- /dev/null
+++ b/PrOjek/identity/src/main/java/com/jauharteam/ojek/identity/user/UserMysqlDAO.java
@@ -0,0 +1,186 @@
+package com.jauharteam.ojek.identity.user;
+
+import com.ojek.common.MysqlDAO;
+import com.ojek.common.User;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.Date;
+
+public class UserMysqlDAO extends MysqlDAO implements UserDAO {
+
+    public UserMysqlDAO(Connection connection) {
+        super(connection);
+    }
+
+    public UserMysqlDAO(String dbhost, String dbuser, String dbpass) throws ClassNotFoundException, SQLException {
+        super(dbhost, dbuser, dbpass);
+    }
+
+    @Override
+    public User getUserByUsername(String username) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("SELECT * FROM users WHERE username=?");
+            stmt.setString(1, username);
+
+            ResultSet result = stmt.executeQuery();
+
+            if (result.next()) {
+                User user = new User();
+                user.setId(result.getInt("id"));
+                user.setUsername(result.getString("username"));
+                user.setPassword(result.getString("password"));
+                user.setEmail(result.getString("email"));
+
+                return user;
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return null;
+    }
+
+    @Override
+    public User getUserByEmail(String email) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("SELECT * FROM users WHERE email=?");
+            stmt.setString(1, email);
+
+            ResultSet result = stmt.executeQuery();
+
+            if (result.next()) {
+                User user = new User();
+                user.setId(result.getInt("id"));
+                user.setUsername(result.getString("username"));
+                user.setPassword(result.getString("password"));
+                user.setEmail(result.getString("email"));
+
+                return user;
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return null;
+    }
+
+    @Override
+    public Boolean createUser(User user) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement(
+                    "INSERT INTO users(username, password, email) " +
+                    "VALUES (?,?,?)"
+            );
+            stmt.setString(1, user.getUsername());
+            stmt.setString(2, user.getPassword());
+            stmt.setString(3, user.getEmail());
+
+            int affected = stmt.executeUpdate();
+            if (affected <= 0)
+                return false;
+
+            try (ResultSet generatedKeys = stmt.getGeneratedKeys()) {
+                if (generatedKeys.next()) {
+                    user.setId(generatedKeys.getInt(1));
+                    return true;
+                } else
+                    throw new SQLException("Creating user failed, no ID obtained.");
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+            return true;
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                    return false;
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+    }
+
+    @Override
+    public User getUserByToken(String token) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("SELECT users.* FROM users INNER JOIN tokens ON " +
+                    "tokens.user_id=users.id WHERE tokens.token=? AND tokens.expired > ?");
+            stmt.setString(1, token);
+            stmt.setTimestamp(2, new Timestamp(new Date().getTime()));
+
+            ResultSet result = stmt.executeQuery();
+
+            if (result.next()) {
+                User user = new User();
+                user.setId(result.getInt("id"));
+                user.setUsername(result.getString("username"));
+                user.setPassword(result.getString("password"));
+                user.setEmail(result.getString("email"));
+
+                return user;
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return null;
+    }
+}
diff --git a/PrOjek/identity/src/main/resources/.gitignore b/PrOjek/identity/src/main/resources/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..0cffcb348ff9cec9cd41492a9e5c5a41d86ce96e
--- /dev/null
+++ b/PrOjek/identity/src/main/resources/.gitignore
@@ -0,0 +1 @@
+config.json
\ No newline at end of file
diff --git a/PrOjek/identity/src/main/resources/config.json.example b/PrOjek/identity/src/main/resources/config.json.example
new file mode 100644
index 0000000000000000000000000000000000000000..c4d0f034a154a1a16dee8ea05a888a2968f25d68
--- /dev/null
+++ b/PrOjek/identity/src/main/resources/config.json.example
@@ -0,0 +1,8 @@
+{
+  "jdbc": {
+    "url": "",
+    "username": "",
+    "password": ""
+  },
+  "tokenAge": 3600
+}
\ No newline at end of file
diff --git a/PrOjek/identity/src/main/webapp/WEB-INF/sun-jaxws.xml b/PrOjek/identity/src/main/webapp/WEB-INF/sun-jaxws.xml
new file mode 100644
index 0000000000000000000000000000000000000000..32b436ce90f0fa0a6eaa3e25cb1e60e6a5acf229
--- /dev/null
+++ b/PrOjek/identity/src/main/webapp/WEB-INF/sun-jaxws.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
+           version="2.0">
+    <endpoint name="Service"
+              implementation="com.jauharteam.ojek.identity.IdentityServiceImpl"
+              url-pattern="/service"/>
+</endpoints>
\ No newline at end of file
diff --git a/PrOjek/identity/src/main/webapp/WEB-INF/web.xml b/PrOjek/identity/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fc3b899f1666ae4e8c8fc75cd6e700c4d8099a92
--- /dev/null
+++ b/PrOjek/identity/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+
+<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
+         version="2.4">
+
+    <listener>
+        <listener-class>
+            com.sun.xml.ws.transport.http.servlet.WSServletContextListener
+        </listener-class>
+    </listener>
+    <servlet>
+        <servlet-name>Service</servlet-name>
+        <servlet-class>
+            com.sun.xml.ws.transport.http.servlet.WSServlet
+        </servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+
+    <listener>
+        <listener-class>
+            com.jauharteam.ojek.identity.IdentityServletBootstrapper
+        </listener-class>
+    </listener>
+
+    <servlet>
+        <servlet-name>LoginServlet</servlet-name>
+        <servlet-class>com.jauharteam.ojek.identity.LoginServlet</servlet-class>
+    </servlet>
+
+    <servlet>
+        <servlet-name>LogoutServlet</servlet-name>
+        <servlet-class>com.jauharteam.ojek.identity.LogoutServlet</servlet-class>
+    </servlet>
+
+    <servlet>
+        <servlet-name>RegisterServlet</servlet-name>
+        <servlet-class>com.jauharteam.ojek.identity.RegisterServlet</servlet-class>
+    </servlet>
+
+    <servlet>
+        <servlet-name>RefreshServlet</servlet-name>
+        <servlet-class>com.jauharteam.ojek.identity.RefreshServlet</servlet-class>
+    </servlet>
+
+    <servlet>
+        <servlet-name>ValidationServlet</servlet-name>
+        <servlet-class>com.jauharteam.ojek.identity.ValidationServlet</servlet-class>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>LoginServlet</servlet-name>
+        <url-pattern>/login</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>LogoutServlet</servlet-name>
+        <url-pattern>/logout</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>RegisterServlet</servlet-name>
+        <url-pattern>/register</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>Service</servlet-name>
+        <url-pattern>/service</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>RefreshServlet</servlet-name>
+        <url-pattern>/refresh</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>ValidationServlet</servlet-name>
+        <url-pattern>/validation</url-pattern>
+    </servlet-mapping>
+
+</web-app>
\ No newline at end of file
diff --git a/PrOjek/identity/src/main/webapp/login.jsp b/PrOjek/identity/src/main/webapp/login.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..a5601d734c661dfae03aebc7403648f4135350f9
--- /dev/null
+++ b/PrOjek/identity/src/main/webapp/login.jsp
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Login</title>
+    </head>
+    <body>
+        <h1>Login</h1>
+        <p>Login service, use POST method in this url with two parameter: username and password. Service will return
+        json that contain access token if success</p>
+        <ul>
+            <li>
+                <pre>curl localhost:8081/identity/login -X POST \
+--data "username=jauhar" \
+--data "password=jauhar"
+                </pre>
+            </li>
+        </ul>
+    </body>
+</html>
\ No newline at end of file
diff --git a/PrOjek/identity/src/main/webapp/register.jsp b/PrOjek/identity/src/main/webapp/register.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..6341db0b54f60ac8b993486893c681ded089fb8f
--- /dev/null
+++ b/PrOjek/identity/src/main/webapp/register.jsp
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Register</title>
+</head>
+<body>
+    <h1>Register</h1>
+    <p>Register service, use POST method in this url with 7 parameters: name, username, email, password, confirm_password, phone, and driver. Service will return json that contain access token if success</p>
+    <ul>
+        <li>
+                <pre>curl localhost:8081/identity/register -X POST \
+--data "username=jauhar" \
+--data "name=jauhar" \
+--data "password=jauhar" \
+--data "confirm_password=jauhar" \
+--data "email=jauhar@jauhar.com" \
+--data "phone=08211111111" \
+--data "driver=1"
+                </pre>
+        </li>
+    </ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/PrOjek/identity/src/test/java/TestIdentityService.java b/PrOjek/identity/src/test/java/TestIdentityService.java
new file mode 100644
index 0000000000000000000000000000000000000000..54179b96f0824fa3b64311928279db8e83c9ac7e
--- /dev/null
+++ b/PrOjek/identity/src/test/java/TestIdentityService.java
@@ -0,0 +1,28 @@
+import com.jauharteam.ojek.identity.IdentityService;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import java.net.URL;
+
+public class TestIdentityService {
+
+    public static void main(String[] args) throws Exception {
+        URL url = new URL("http://localhost:8080/identity/service?wsdl");
+
+        //1st argument service URI, refer to wsdl document above
+        //2nd argument is service name, refer to wsdl document above
+        QName qname = new QName("http://identity.ojek.jauharteam.com/", "IdentityServiceImplService");
+        Service service = Service.create(url, qname);
+        IdentityService hello = service.getPort(IdentityService.class);
+        String token = "jdwTQE1ehTKExOqDxS23FnbeShJ0hof4";
+        System.out.println(hello.isTokenValid(token));
+        if(hello.getUserByToken(token).getId() != null){
+            System.out.println(hello.getUserByToken(token).getId());
+            System.out.println(hello.getUserByToken(token).getUsername());
+            System.out.println(hello.getUserByToken(token).getPassword());
+            System.out.println(hello.getUserByToken(token).getEmail());
+        }else{
+            System.out.println("getUserByToken() == null");
+        }
+    }
+}
diff --git a/PrOjek/ojek-cmpt/build.gradle b/PrOjek/ojek-cmpt/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..026a0451b6ffdceb6f07d5ec7d54d5f40273b8ed
--- /dev/null
+++ b/PrOjek/ojek-cmpt/build.gradle
@@ -0,0 +1,10 @@
+apply plugin: 'java'
+apply plugin: 'idea'
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    compile project(':common')
+}
diff --git a/PrOjek/ojek-cmpt/src/main/java/com/jauharteam/ojek/ojek/LocationService.java b/PrOjek/ojek-cmpt/src/main/java/com/jauharteam/ojek/ojek/LocationService.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6ea34ca6c9915d78aeb2ed0e304d8fcd926af99
--- /dev/null
+++ b/PrOjek/ojek-cmpt/src/main/java/com/jauharteam/ojek/ojek/LocationService.java
@@ -0,0 +1,33 @@
+package com.jauharteam.ojek.ojek;
+
+import com.ojek.common.Location;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+@WebService
+@SOAPBinding(style = SOAPBinding.Style.RPC)
+public interface LocationService {
+
+    @WebMethod
+    public Boolean addLocation(String token, Location location);
+
+    @WebMethod
+    public Boolean deleteLocation(String token, Integer id);
+
+    @WebMethod
+    public Location[] getAllLocation(String token);
+
+    @WebMethod
+    public Boolean editLocation(String token, Location pastLocation, Location newLocation);
+
+    @WebMethod
+    public Location getLocation(String token, String location);
+
+    @WebMethod
+    public Location getLocationById(String token, Integer locId);
+}
diff --git a/PrOjek/ojek-cmpt/src/main/java/com/jauharteam/ojek/ojek/OrderService.java b/PrOjek/ojek-cmpt/src/main/java/com/jauharteam/ojek/ojek/OrderService.java
new file mode 100644
index 0000000000000000000000000000000000000000..c28790ca19801674dbf1f909fedb41a68a7e4b09
--- /dev/null
+++ b/PrOjek/ojek-cmpt/src/main/java/com/jauharteam/ojek/ojek/OrderService.java
@@ -0,0 +1,33 @@
+package com.jauharteam.ojek.ojek;
+
+import com.ojek.common.Order;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+import java.util.ArrayList;
+import java.util.Collection;
+
+@WebService
+@SOAPBinding(style = SOAPBinding.Style.RPC)
+public interface OrderService {
+
+    @WebMethod
+    public Boolean addOrder(String token, Order order);
+
+    @WebMethod
+    public Order getOrder(String token, Integer id);
+
+    @WebMethod
+    public Order[] getAllOrderCustomer(String token);
+
+    @WebMethod
+    public Order[] getAllOrderDriver(String token);
+
+    @WebMethod
+    public Boolean hideOrderCustomer(String token, int orderID);
+
+    @WebMethod
+    public Boolean hideOrderDriver(String token, int orderID);
+
+}
diff --git a/PrOjek/ojek-cmpt/src/main/java/com/jauharteam/ojek/ojek/UserService.java b/PrOjek/ojek-cmpt/src/main/java/com/jauharteam/ojek/ojek/UserService.java
new file mode 100644
index 0000000000000000000000000000000000000000..f010f4e790e1e8b2c9a746ba7ba2d04022e789dd
--- /dev/null
+++ b/PrOjek/ojek-cmpt/src/main/java/com/jauharteam/ojek/ojek/UserService.java
@@ -0,0 +1,37 @@
+package com.jauharteam.ojek.ojek;
+
+import com.ojek.common.User;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+
+@WebService
+@SOAPBinding(style = SOAPBinding.Style.RPC)
+public interface UserService {
+
+    @WebMethod
+    public Boolean addUser(User user);
+
+    @WebMethod
+    public Boolean deleteUser(String token);
+
+    @WebMethod
+    public User getUser(String token);
+
+    @WebMethod
+    public User getUserById(String token, Integer id);
+
+    @WebMethod
+    public Boolean editUser(String token, User user);
+
+    @WebMethod
+    public User[] getPrefDriver(String token, String driverName, String pickLoc, String destLoc);
+
+    @WebMethod
+    public User[] getDriver(String token, String driverName, String pickLoc, String destLoc);
+
+    @WebMethod
+    public User getDriverById(String token, Integer driverId);
+
+}
diff --git a/PrOjek/ojek/build.gradle b/PrOjek/ojek/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..879ab191f433323379270b827e50ff92583344f7
--- /dev/null
+++ b/PrOjek/ojek/build.gradle
@@ -0,0 +1,17 @@
+apply plugin: 'java'
+apply plugin: 'idea'
+apply plugin: 'war'
+
+repositories {
+	mavenCentral()
+}
+
+dependencies {
+	compile project(':common')
+	compile project(':ojek-cmpt')
+	compile project(':identity-cmpt')
+	compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.0.1'
+	compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.6'
+	compile 'javax.servlet:javax.servlet-api:3.1.0'
+	compile group: 'com.sun.xml.ws', name: 'servlet', version: '2.2.8'
+}
\ No newline at end of file
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/Config.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/Config.java
new file mode 100644
index 0000000000000000000000000000000000000000..344ca0acb5373f085d0c90a679cc5b7807c94fd2
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/Config.java
@@ -0,0 +1,88 @@
+package com.jauharteam.ojek.ojek;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+
+public class Config {
+    private String identityServicePath;
+    public String getIdentityServicePath() {
+        return identityServicePath;
+    }
+
+    public void setIdentityServicePath(String identityServicePath) {
+        this.identityServicePath = identityServicePath;
+    }
+    public class JdbcConfig {
+        private String url;
+        private String username;
+        private String password;
+
+        public JdbcConfig() {
+        }
+
+        public String getUrl() {
+            return url;
+        }
+
+        public void setUrl(String url) {
+            this.url = url;
+        }
+
+        public String getUsername() {
+            return username;
+        }
+
+        public void setUsername(String username) {
+            this.username = username;
+        }
+
+        public String getPassword() {
+            return password;
+        }
+
+        public void setPassword(String password) {
+            this.password = password;
+        }
+
+        @Override
+        public String toString() {
+            return "JdbcConfig{" +
+                    "url='" + url + '\'' +
+                    ", username='" + username + '\'' +
+                    ", password='" + password + '\'' +
+                    '}';
+        }
+    }
+
+    private JdbcConfig jdbc;
+
+    public Config() {
+    }
+
+    public JdbcConfig getJdbc() {
+        return jdbc;
+    }
+
+    public void setJdbc(JdbcConfig jdbc) {
+        this.jdbc = jdbc;
+    }
+
+    @Override
+    public String toString() {
+        return "Config{" +
+                "identityServicePath='" + identityServicePath + '\'' +
+                ", jdbc=" + jdbc +
+                '}';
+    }
+
+    private String defaultProfPicUrl;
+
+    public String getDefaultProfPicUrl() {
+        return defaultProfPicUrl;
+    }
+
+    public void setDefaultProfPicUrl(String defaultProfPicUrl) {
+        this.defaultProfPicUrl = defaultProfPicUrl;
+    }
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/ConfigLoader.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/ConfigLoader.java
new file mode 100644
index 0000000000000000000000000000000000000000..6cd702fb7cfb8124bf330d3566d12364806e23b3
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/ConfigLoader.java
@@ -0,0 +1,48 @@
+package com.jauharteam.ojek.ojek;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Scanner;
+
+/**
+ * Created by dery on 11/5/17.
+ */
+public class ConfigLoader {
+
+    private ObjectMapper objectMapper = new ObjectMapper();
+    private String configJSON;
+    private static Config config = null;
+
+    public Config getConfig() {
+        if(config!=null) return config;
+        configJSON = getConfigFile("config.json");
+        try {
+            config = objectMapper.readValue(configJSON, Config.class);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return config;
+    }
+
+    private String getConfigFile(String fileName){
+
+        StringBuilder result = new StringBuilder("");
+
+        ClassLoader classLoader = getClass().getClassLoader();
+        System.out.println(classLoader.getResource(fileName).getFile());
+        File file = new File(classLoader.getResource(fileName).getFile());
+
+        try (Scanner scanner = new Scanner(file)) {
+            while (scanner.hasNextLine()) {
+                String line = scanner.nextLine();
+                result.append(line).append("\n");
+            }
+            scanner.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return result.toString();
+    }
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/IdentityServiceLoader.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/IdentityServiceLoader.java
new file mode 100644
index 0000000000000000000000000000000000000000..f213553874a1afc428dc0e78cd41cd1db6e63c13
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/IdentityServiceLoader.java
@@ -0,0 +1,28 @@
+package com.jauharteam.ojek.ojek;
+
+import com.jauharteam.ojek.identity.IdentityService;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * Created by dery on 11/5/17.
+ */
+public class IdentityServiceLoader {
+    private static IdentityService identityService = null;
+    public static IdentityService getIdentityService() {
+        if(identityService!=null) return identityService;
+        try {
+            ConfigLoader configLoader = new ConfigLoader();
+            URL url = new URL(configLoader.getConfig().getIdentityServicePath());
+            QName qname = new QName("http://identity.ojek.jauharteam.com/", "IdentityServiceImplService");
+            Service service = Service.create(url, qname);
+            identityService = service.getPort(IdentityService.class);
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        }
+        return identityService;
+    }
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/location/LocationDAO.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/location/LocationDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..92469cb2a3a5cfca75bddc63c36ce6e9d48ac1f4
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/location/LocationDAO.java
@@ -0,0 +1,24 @@
+package com.jauharteam.ojek.ojek.location;
+
+import com.ojek.common.Location;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+public interface LocationDAO {
+
+    public Boolean addLocation(Integer userId, Location location);
+
+    public Boolean deleteLocation(Integer userId, Integer locationId);
+
+    public ArrayList<Location> getAllLocation(Integer userId);
+
+    public Boolean editLocation(Integer userId, Location location, Location newLoc);
+
+    public Location getLocation(String location);
+
+    public Location getLocationById(Integer locId);
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/location/LocationMysqlDAOImpl.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/location/LocationMysqlDAOImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..461e9b9b2ff6121c07fc38764e8834b69ae3237d
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/location/LocationMysqlDAOImpl.java
@@ -0,0 +1,288 @@
+package com.jauharteam.ojek.ojek.location;
+
+import com.ojek.common.Location;
+import com.ojek.common.MysqlDAO;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+public class LocationMysqlDAOImpl extends MysqlDAO implements LocationDAO {
+
+    public LocationMysqlDAOImpl(Connection connection) {
+        super(connection);
+    }
+
+    public LocationMysqlDAOImpl(String dbhost, String dbuser, String dbpass) throws ClassNotFoundException, SQLException {
+        super(dbhost, dbuser, dbpass);
+    }
+
+    @Override
+    public Boolean addLocation(Integer userId, Location location) {
+        Connection conn = null;
+        PreparedStatement stmt2 = null;
+        PreparedStatement stmt3 = null;
+        try {
+            conn = getConnection();
+            Location location1 = getLocation(location.getLocation());
+            if (location1.getId() == null) {
+                stmt2 = conn.prepareStatement("INSERT INTO locations(location) VALUES (?)");
+                stmt2.setString(1, location.getLocation());
+                int affected = stmt2.executeUpdate();
+                if (affected <= 0) return false;
+            }
+            Location newLocation = getLocation(location.getLocation());
+
+            stmt3 = conn.prepareStatement("INSERT INTO user_location(user_id,location_id,preference_number) " +
+                    "VALUES (?,?,?)");
+            stmt3.setInt(1, userId);
+            stmt3.setInt(2, newLocation.getId());
+            stmt3.setInt(3, getLastPref(userId) + 1);
+
+            int affected = stmt3.executeUpdate();
+            if (affected <= 0) return false;
+            return true;
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (stmt2 != null) stmt2.close();
+                if (stmt3 != null) stmt3.close();
+                if(conn != null) conn.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean deleteLocation(Integer userId, Integer locationId) {
+        PreparedStatement stmt1 = null;
+        Connection conn = null;
+        try {
+            conn = getConnection();
+            stmt1 = conn.prepareStatement("DELETE FROM user_location WHERE user_id=? AND location_id=?");
+            stmt1.setInt(1, userId);
+            stmt1.setInt(2, locationId);
+            int affected = stmt1.executeUpdate();
+
+            if (affected > 0) {
+                return true;
+            }
+
+            return false;
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+    @Override
+    public ArrayList<Location> getAllLocation(Integer userId) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            stmt1 = conn.prepareStatement("SELECT locations.*, user_location.preference_number FROM locations INNER JOIN user_location ON locations.id=user_location.location_id WHERE user_location.user_id=?");
+            stmt1.setInt(1, userId);
+            ResultSet result = stmt1.executeQuery();
+
+            ArrayList<Location> ret = new ArrayList<>();
+
+            while (result.next()) {
+                Location location = new Location();
+                location.setId(result.getInt("ID"));
+                location.setLocation(result.getString("location"));
+                location.setUserId(userId);
+                location.setPrefNum(result.getInt("preference_number"));
+                ret.add(location);
+            }
+            return ret;
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (stmt1 != null) stmt1.close();
+                if(conn != null) conn.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    public Boolean editLocation(Integer userId, Location pastLocation, Location newLocation) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            Location pastLoc = getLocation(pastLocation.getLocation());
+            if (getLocation(newLocation.getLocation()).getId() == null) {
+                // new location is not registered, then register location
+                stmt1 = conn.prepareStatement("INSERT INTO locations(location) VALUES (?)");
+                stmt1.setString(1, newLocation.getLocation());
+                int affected = stmt1.executeUpdate();
+
+                if (affected <= 0) return false;
+            }
+
+            PreparedStatement stmt2 = null;
+            try {
+                stmt2 = conn.prepareStatement("UPDATE user_location SET location_id=? WHERE user_id=? AND " +
+                        "location_id=?");
+                stmt2.setInt(1, getLocation(newLocation.getLocation()).getId());
+                stmt2.setInt(2, userId);
+                stmt2.setInt(3, pastLoc.getId());
+                int affected = stmt2.executeUpdate();
+
+                if (affected > 0) {
+                    return true;
+                }
+
+                return false;
+
+            } catch (SQLException e) {
+                e.printStackTrace();
+            } finally {
+                if (stmt2 != null)
+                    try {
+                        stmt2.close();
+                    } catch (SQLException e) {
+                        e.printStackTrace();
+                    }
+            }
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+    public Location getLocation(String location) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            stmt1 = conn.prepareStatement("SELECT * FROM locations WHERE location=?");
+            stmt1.setString(1, location);
+            ResultSet result = stmt1.executeQuery();
+
+            Location ret = new Location();
+
+            if (result.next()) {
+                ret.setLocation(result.getString("location"));
+                ret.setId(result.getInt("id"));
+            }
+
+            return ret;
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return new Location();
+    }
+
+    @Override
+    public Location getLocationById(Integer locId) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            stmt1 = conn.prepareStatement("SELECT * FROM locations WHERE id=?");
+            stmt1.setInt(1, locId);
+            ResultSet result = stmt1.executeQuery();
+
+            Location ret = new Location();
+
+            if (result.next()) {
+                ret.setLocation(result.getString("location"));
+                ret.setId(result.getInt("id"));
+            }
+
+            return ret;
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return new Location();
+    }
+
+    private int getLastPref(int userId) {
+        int last = 0;
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("SELECT MAX(preference_number) as preference_number FROM user_location WHERE user_id=?");
+            stmt.setInt(1, userId);
+            ResultSet result = stmt.executeQuery();
+            result.next();
+
+            return result.getInt("preference_number");
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        return last;
+    }
+
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/location/LocationServiceImpl.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/location/LocationServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..711cbd814c21fffc922ef8f3d5d96abf89a3dd30
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/location/LocationServiceImpl.java
@@ -0,0 +1,93 @@
+package com.jauharteam.ojek.ojek.location;
+
+import com.jauharteam.ojek.identity.IdentityService;
+import com.jauharteam.ojek.ojek.Config;
+import com.jauharteam.ojek.ojek.ConfigLoader;
+import com.jauharteam.ojek.ojek.IdentityServiceLoader;
+import com.jauharteam.ojek.ojek.LocationService;
+import com.ojek.common.Location;
+import com.ojek.common.User;
+
+import javax.jws.WebService;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+
+@WebService(endpointInterface = "com.jauharteam.ojek.ojek.LocationService")
+public class LocationServiceImpl implements LocationService {
+
+    private LocationDAO locationDAO;
+
+    private IdentityService getIdentityService() {
+        return IdentityServiceLoader.getIdentityService();
+    }
+
+    public LocationServiceImpl(){
+        Config config = new ConfigLoader().getConfig();
+        try {
+            locationDAO = new LocationMysqlDAOImpl(config.getJdbc().getUrl(), config.getJdbc().getUsername(), config.getJdbc().getPassword());
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public Boolean addLocation(String token, Location location) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            return locationDAO.addLocation(user.getId(), location);
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean deleteLocation(String token, Integer id) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            return locationDAO.deleteLocation(user.getId(), id);
+        }
+        return false;
+    }
+
+    @Override
+    public Location[] getAllLocation(String token) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            ArrayList<Location> locations = locationDAO.getAllLocation(user.getId());
+            return locations.toArray(new Location[locations.size()]);
+        }
+        return new Location[0];
+    }
+
+    @Override
+    public Boolean editLocation(String token, Location pastLocation, Location newLocation) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            return locationDAO.editLocation(user.getId(), pastLocation, newLocation);
+        }
+        return false;
+    }
+
+    @Override
+    public Location getLocation(String token, String location) {
+        if(getIdentityService().isTokenValid(token)) {
+            return locationDAO.getLocation(location);
+        }
+        return new Location();
+    }
+
+    @Override
+    public Location getLocationById(String token, Integer locId) {
+        if(getIdentityService().isTokenValid(token)) {
+            return locationDAO.getLocationById(locId);
+        }
+        return new Location();
+    }
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/order/OrderDAO.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/order/OrderDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..07700ead65dbb86f59507f5be96d677b2fec1588
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/order/OrderDAO.java
@@ -0,0 +1,24 @@
+package com.jauharteam.ojek.ojek.order;
+
+import com.ojek.common.Order;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+public interface OrderDAO {
+
+    public Boolean addOrder(Order order);
+
+    public Order getOrder(Integer id);
+
+    public ArrayList<Order> getAllOrderCustomer(Integer userId);
+
+    public ArrayList<Order> getAllOrderDriver(Integer driverId);
+
+    public Boolean hideOrderCustomer(Integer orderID);
+
+    public Boolean hideOrderDriver(Integer orderID);
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/order/OrderMysqlDAOImpl.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/order/OrderMysqlDAOImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..9aecc7de5921e64041e9ca95a4f4c06eec51ba6c
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/order/OrderMysqlDAOImpl.java
@@ -0,0 +1,270 @@
+package com.jauharteam.ojek.ojek.order;
+
+import com.ojek.common.MysqlDAO;
+import com.ojek.common.Order;
+
+import java.sql.*;
+import java.util.ArrayList;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+public class OrderMysqlDAOImpl extends MysqlDAO implements OrderDAO {
+
+    public OrderMysqlDAOImpl(Connection connection) {
+        super(connection);
+    }
+
+    public OrderMysqlDAOImpl(String dbhost, String dbuser, String dbpass) throws ClassNotFoundException, SQLException {
+        super(dbhost, dbuser, dbpass);
+    }
+
+    @Override
+    public Boolean addOrder(Order order) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("INSERT INTO orders(driver_id,customer_id,customer_show,driver_show," +
+                    "location_id,destination_id,time,rate,comment) VALUES (?,?,1,1,?,?,?,?,?)");
+            stmt.setInt(1,order.getDriverId());
+            stmt.setInt(2,order.getCustomerId());
+            stmt.setInt(3,order.getLocationId());
+            stmt.setInt(4,order.getDestinationId());
+            stmt.setTimestamp(5,new Timestamp(order.getTime().getTime()));
+            stmt.setInt(6,order.getRate());
+            stmt.setString(7,order.getComment());
+
+            int affected = stmt.executeUpdate();
+
+            if (affected > 0){
+                return true;
+            }
+
+            return false;
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+    @Override
+    public Order getOrder(Integer id) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("SELECT * FROM orders WHERE ID=?");
+            stmt.setInt(1,id);
+
+            ResultSet result = stmt.executeQuery();
+
+            Order ret = new Order();
+            if (result.next()){
+                ret.setId(id);
+                ret.setDriverId(result.getInt("driver_id"));
+                ret.setCustomerId(result.getInt("customer_id"));
+                ret.setCustomerShow(result.getBoolean("customer_show"));
+                ret.setDriverShow(result.getBoolean("driver_show"));
+                ret.setLocationId(result.getInt("location_id"));
+                ret.setDestinationId(result.getInt("destination_id"));
+                ret.setTime(result.getDate("time"));
+                ret.setRate(result.getInt("rate"));
+                ret.setComment(result.getString("comment"));
+            }
+
+            return ret;
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return new Order();
+    }
+
+    @Override
+    public ArrayList<Order> getAllOrderCustomer(Integer userId) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            stmt1 = conn.prepareStatement("SELECT * FROM orders WHERE customer_id=? AND customer_show=1");
+            stmt1.setInt(1,userId);
+            ResultSet result = stmt1.executeQuery();
+
+            ArrayList<Order> retu = new ArrayList<>();
+
+            while (result.next()){
+                Order ret = new Order();
+                ret.setId(result.getInt("ID"));
+                ret.setDriverId(result.getInt("driver_id"));
+                ret.setCustomerId(result.getInt("customer_id"));
+                ret.setCustomerShow(result.getBoolean("customer_show"));
+                ret.setDriverShow(result.getBoolean("driver_show"));
+                ret.setLocationId(result.getInt("location_id"));
+                ret.setDestinationId(result.getInt("destination_id"));
+                ret.setTime(result.getDate("time"));
+                ret.setRate(result.getInt("rate"));
+                ret.setComment(result.getString("comment"));
+                retu.add(ret);
+            }
+
+            return retu;
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    public ArrayList<Order> getAllOrderDriver(Integer driverId) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            stmt1 = conn.prepareStatement("SELECT * FROM orders WHERE driver_id=? AND driver_show=1");
+            stmt1.setInt(1,driverId);
+            ResultSet result = stmt1.executeQuery();
+
+            ArrayList<Order> retu = new ArrayList<>();
+
+            while (result.next()){
+                Order ret = new Order();
+                ret.setId(result.getInt("ID"));
+                ret.setDriverId(result.getInt("driver_id"));
+                ret.setCustomerId(result.getInt("customer_id"));
+                ret.setCustomerShow(result.getBoolean("customer_show"));
+                ret.setDriverShow(result.getBoolean("driver_show"));
+                ret.setLocationId(result.getInt("location_id"));
+                ret.setDestinationId(result.getInt("destination_id"));
+                ret.setTime(result.getDate("time"));
+                ret.setRate(result.getInt("rate"));
+                ret.setComment(result.getString("comment"));
+                retu.add(ret);
+            }
+
+            return retu;
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    public Boolean hideOrderCustomer(Integer orderID) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            stmt1 = conn.prepareStatement("UPDATE orders SET customer_show=0 WHERE ID=? AND customer_show=1");
+            stmt1.setInt(1,orderID);
+            if (stmt1.executeUpdate() > 0) {
+                return true;
+            }
+            return false;
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean hideOrderDriver(Integer orderID) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            stmt1 = conn.prepareStatement("UPDATE orders SET driver_show=0 WHERE ID=? AND driver_show=1");
+            stmt1.setInt(1,orderID);
+            int affected = stmt1.executeUpdate();
+
+            if (affected > 0) {
+                return true;
+            }
+
+            return false;
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/order/OrderServiceImpl.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/order/OrderServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7c4eb6c3212420c385e420cd84084a83a786ac5
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/order/OrderServiceImpl.java
@@ -0,0 +1,100 @@
+package com.jauharteam.ojek.ojek.order;
+
+import com.jauharteam.ojek.identity.IdentityService;
+import com.jauharteam.ojek.ojek.Config;
+import com.jauharteam.ojek.ojek.ConfigLoader;
+import com.jauharteam.ojek.ojek.IdentityServiceLoader;
+import com.jauharteam.ojek.ojek.OrderService;
+import com.ojek.common.Order;
+import com.ojek.common.User;
+
+import javax.jws.WebService;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+@WebService(endpointInterface = "com.jauharteam.ojek.ojek.OrderService")
+public class OrderServiceImpl implements OrderService {
+
+    private OrderDAO orderDAO;
+
+    private IdentityService getIdentityService() {
+        return IdentityServiceLoader.getIdentityService();
+    }
+
+    public OrderServiceImpl(){
+        Config config = new ConfigLoader().getConfig();
+        try {
+            orderDAO = new OrderMysqlDAOImpl(config.getJdbc().getUrl(), config.getJdbc().getUsername(), config.getJdbc().getPassword());
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+    }
+    @Override
+    public Boolean addOrder(String token, Order order) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            if(order != null && order.getCustomerId() != null && order.getCustomerId().equals(user.getId()))
+                return orderDAO.addOrder(order);
+        }
+        return false;
+    }
+
+    @Override
+    public Order getOrder(String token, Integer id) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            Order order = orderDAO.getOrder(id);
+            if(order.getCustomerId()==user.getId()){
+                return order;
+            }
+        }
+        return new Order();
+    }
+
+    @Override
+    public Order[] getAllOrderCustomer(String token) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            ArrayList<Order> orders = orderDAO.getAllOrderCustomer(user.getId());
+            return orders.toArray(new Order[orders.size()]);
+        }
+        return new Order[0];
+    }
+
+    @Override
+    public Order[] getAllOrderDriver(String token) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            ArrayList<Order> orders = orderDAO.getAllOrderDriver(user.getId());
+            return orders.toArray(new Order[orders.size()]);
+        }
+        return new Order[0];
+    }
+
+    @Override
+    public Boolean hideOrderCustomer(String token, int orderID) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            Order order = orderDAO.getOrder(orderID);
+            if (order.getCustomerId() == user.getId())
+                return orderDAO.hideOrderCustomer(orderID);
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean hideOrderDriver(String token, int orderID) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            Order order = orderDAO.getOrder(orderID);
+            if (order.getDriverId() == user.getId())
+                return orderDAO.hideOrderDriver(orderID);
+        }
+        return false;
+    }
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/user/UserDAO.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/user/UserDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..32c1312c304f9b5d400c93b85a29c92fc8296f7f
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/user/UserDAO.java
@@ -0,0 +1,25 @@
+package com.jauharteam.ojek.ojek.user;
+
+import com.ojek.common.User;
+
+import java.util.ArrayList;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+public interface UserDAO {
+
+    public Boolean addUser(User user);
+
+    public Boolean deleteUser(Integer id);
+
+    public User getUserById(Integer id);
+
+    public User getUserByUsername(String username);
+
+    public Boolean editUser(User user);
+
+    public ArrayList<User> getPrefDriver(Integer userId, String driverName, String pickLoc, String destLoc);
+
+    public ArrayList<User> getDriver(Integer userId, String driverName, String pickLoc, String destLoc);
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/user/UserMysqlDAOImpl.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/user/UserMysqlDAOImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a796c37334ada2c893c45bbcc8b3f57d8cb46b66
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/user/UserMysqlDAOImpl.java
@@ -0,0 +1,347 @@
+package com.jauharteam.ojek.ojek.user;
+
+import com.ojek.common.MysqlDAO;
+import com.ojek.common.User;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+public class UserMysqlDAOImpl extends MysqlDAO implements UserDAO {
+
+    public UserMysqlDAOImpl(String dbhost, String dbuser, String dbpass) throws ClassNotFoundException, SQLException {
+        super(dbhost, dbuser, dbpass);
+    }
+
+    public UserMysqlDAOImpl(Connection connection) {
+        super(connection);
+    }
+
+    @Override
+    public Boolean addUser(User user) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("INSERT INTO users (ID, username, password, name, phone, email, profile_pic_url, driver) VALUES (?,?,?,?,?,?,?,?);");
+            stmt.setInt(1, user.getId());
+            stmt.setString(2, user.getUsername());
+            stmt.setString(3, user.getPassword());
+            stmt.setString(4, user.getName());
+            stmt.setString(5, user.getPhone());
+            stmt.setString(6, user.getEmail());
+            stmt.setString(7, user.getProfpicUrl());
+            stmt.setBoolean(8, user.getDriver());
+
+            int affected = stmt.executeUpdate();
+            if (affected <= 0) return false;
+
+            return true;
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean deleteUser(Integer id) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("DELETE FROM users WHERE users.id = ?");
+            stmt.setInt(1, id);
+
+            int affected = stmt.executeUpdate();
+            if (affected <= 0) return false;
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+    @Override
+    public User getUserById(Integer id) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("SELECT * FROM users WHERE id=?");
+            stmt.setInt(1, id);
+
+            ResultSet result = stmt.executeQuery();
+
+            if (result.next()) {
+                User user = new User();
+                user.setId(result.getInt("id"));
+                user.setUsername(result.getString("username"));
+                user.setPassword(result.getString("password"));
+                user.setEmail(result.getString("email"));
+                user.setName(result.getString("name"));
+                user.setPhone(result.getString("phone"));
+                user.setProfpicUrl(result.getString("profile_pic_url"));
+                user.setDriver((result.getInt("driver")==1?true:false));
+                user.setRating(result.getInt("rating"));
+                user.setVotes(result.getInt("votes"));
+
+                return user;
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return null;
+    }
+
+    @Override
+    public User getUserByUsername(String username) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("SELECT * FROM users WHERE username=?");
+            stmt.setString(1, username);
+
+            ResultSet result = stmt.executeQuery();
+
+            if (result.next()) {
+                User user = new User();
+                user.setId(result.getInt("id"));
+                user.setUsername(result.getString("username"));
+                user.setPassword(result.getString("password"));
+                user.setEmail(result.getString("email"));
+                user.setName(result.getString("name"));
+                user.setPhone(result.getString("phone"));
+                user.setProfpicUrl(result.getString("profile_pic_url"));
+                user.setDriver((result.getInt("driver")==1?true:false));
+                user.setRating(result.getInt("rating"));
+                user.setVotes(result.getInt("votes"));
+
+                return user;
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return null;
+    }
+
+    @Override
+    public Boolean editUser(User user) {
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        try {
+            conn = getConnection();
+            stmt = conn.prepareStatement("UPDATE users " +
+                    "SET password = ?, name = ?, phone = ?, email = ?, profile_pic_url = ?, driver = ?, rating = ?, votes = ? " +
+                    "WHERE users.id = ?;");
+            stmt.setString(1, user.getPassword());
+            stmt.setString(2, user.getName());
+            stmt.setString(3, user.getPhone());
+            stmt.setString(4, user.getEmail());
+            stmt.setString(5, user.getProfpicUrl());
+            stmt.setInt(6, user.getDriver() ? 1 : 0);
+            stmt.setInt(7, user.getRating());
+            stmt.setInt(8, user.getVotes());
+            stmt.setInt(9, user.getId());
+
+            int affected = stmt.executeUpdate();
+            if (affected <= 0) return false;
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null)
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return false;
+    }
+
+    @Override
+    public ArrayList<User> getPrefDriver(Integer userId, String driverName, String pickLoc, String destLoc) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            stmt1 = conn.prepareStatement("SELECT * FROM users JOIN (" +
+                    "SELECT DISTINCT user_location.user_id AS iddriver FROM user_location JOIN " +
+                    "(SELECT locations.ID FROM locations WHERE locations.location=? OR locations.location=?) " +
+                    "AS idloc ON user_location.location_id=idloc.id ) AS driver ON users.ID=driver.iddriver " +
+                    "WHERE (users.username LIKE ? OR users.name LIKE ?) AND users.ID<>? AND users.driver=1");
+            stmt1.setString(1,pickLoc);
+            stmt1.setString(2,destLoc);
+            stmt1.setString(3,"%" + driverName + "%");
+            stmt1.setString(4,"%" + driverName + "%");
+            stmt1.setInt(5,userId);
+            ResultSet result = stmt1.executeQuery();
+
+            ArrayList<User> retu = new ArrayList<>();
+
+            while (result.next()){
+                User user = new User();
+                user.setId(result.getInt("id"));
+                user.setUsername(result.getString("username"));
+                user.setPassword(result.getString("password"));
+                user.setEmail(result.getString("email"));
+                user.setName(result.getString("name"));
+                user.setPhone(result.getString("phone"));
+                user.setProfpicUrl(result.getString("profile_pic_url"));
+                user.setDriver((result.getInt("driver") == 1));
+                user.setRating(result.getInt("rating"));
+                user.setVotes(result.getInt("votes"));
+                retu.add(user);
+            }
+
+            return retu;
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    public ArrayList<User> getDriver(Integer userId, String driverName, String pickLoc, String destLoc) {
+        Connection conn = null;
+        PreparedStatement stmt1 = null;
+        try {
+            conn = getConnection();
+            if (driverName == null || driverName.equals("")) {
+                stmt1 = conn.prepareStatement("SELECT * FROM users JOIN (" +
+                        "SELECT DISTINCT user_location.user_id AS iddriver FROM user_location JOIN " +
+                        "(SELECT locations.ID FROM locations WHERE locations.location=? OR locations.location=?) " +
+                        "AS idloc ON user_location.location_id=idloc.id ) AS driver ON users.ID=driver.iddriver WHERE " +
+                        "users.driver=1 AND users.ID<>?");
+                stmt1.setString(1, pickLoc);
+                stmt1.setString(2, destLoc);
+                stmt1.setInt(3, userId);
+            } else {
+                stmt1 = conn.prepareStatement("SELECT * FROM users JOIN (" +
+                        "SELECT DISTINCT user_location.user_id AS iddriver FROM user_location JOIN " +
+                        "(SELECT locations.ID FROM locations WHERE locations.location=? OR locations.location=?) " +
+                        "AS idloc ON user_location.location_id=idloc.id ) AS driver ON users.ID=driver.iddriver " +
+                        "WHERE users.username NOT LIKE ? AND users.name NOT LIKE ? AND users.driver=1 AND users.ID<>?");
+                stmt1.setString(1, pickLoc);
+                stmt1.setString(2, destLoc);
+                stmt1.setString(3,"%" + driverName + "%");
+                stmt1.setString(4,"%" + driverName + "%");
+                stmt1.setInt(5, userId);
+            }
+
+            ResultSet result = stmt1.executeQuery();
+
+            ArrayList<User> retu = new ArrayList<>();
+
+            while (result.next()){
+                User user = new User();
+                user.setId(result.getInt("id"));
+                user.setUsername(result.getString("username"));
+                user.setPassword(result.getString("password"));
+                user.setEmail(result.getString("email"));
+                user.setName(result.getString("name"));
+                user.setPhone(result.getString("phone"));
+                user.setProfpicUrl(result.getString("profile_pic_url"));
+                user.setDriver((result.getInt("driver") == 1));
+                user.setRating(result.getInt("rating"));
+                user.setVotes(result.getInt("votes"));
+                retu.add(user);
+            }
+
+            return retu;
+
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt1 != null)
+                try {
+                    stmt1.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            if (conn != null)
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+        }
+        return new ArrayList<>();
+    }
+}
diff --git a/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/user/UserServiceImpl.java b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/user/UserServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2e5f85af48167cbe4c21e2d25c1ac768ca00158
--- /dev/null
+++ b/PrOjek/ojek/src/main/java/com/jauharteam/ojek/ojek/user/UserServiceImpl.java
@@ -0,0 +1,108 @@
+package com.jauharteam.ojek.ojek.user;
+
+import com.jauharteam.ojek.identity.IdentityService;
+import com.jauharteam.ojek.ojek.*;
+import com.ojek.common.User;
+
+import javax.jws.WebService;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+@WebService(endpointInterface = "com.jauharteam.ojek.ojek.UserService")
+public class UserServiceImpl implements UserService {
+
+    private UserDAO userDAO;
+
+    private IdentityService getIdentityService() {
+        return IdentityServiceLoader.getIdentityService();
+    }
+
+    public UserServiceImpl(){
+        Config config = new ConfigLoader().getConfig();
+        try {
+            userDAO = new UserMysqlDAOImpl(config.getJdbc().getUrl(), config.getJdbc().getUsername(), config.getJdbc().getPassword());
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public Boolean addUser(User user) {
+        System.out.print(user);
+        if(user.getProfpicUrl() == null){
+            String prof_pic_url = new ConfigLoader().getConfig().getDefaultProfPicUrl();
+            user.setProfpicUrl(prof_pic_url);
+        }
+        return userDAO.addUser(user);
+    }
+
+    @Override
+    public Boolean deleteUser(String token) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            return userDAO.deleteUser(user.getId());
+        }
+        return false;
+    }
+
+    @Override
+    public User getUser(String token) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user = getIdentityService().getUserByToken(token);
+            User userProfile = userDAO.getUserByUsername(user.getUsername());
+            if (userProfile == null)
+                return user;
+            return userProfile;
+        }
+        return new User();
+    }
+
+    @Override
+    public Boolean editUser(String token, User user) {
+        if(getIdentityService().isTokenValid(token)) {
+            User userOld = getIdentityService().getUserByToken(token);
+            if(userOld != null && userOld.getId() != null && userOld.getId().equals(user.getId()))
+                return userDAO.editUser(user);
+        }
+        return false;
+    }
+
+    @Override
+    public User getUserById(String token, Integer id) {
+        if(getIdentityService().isTokenValid(token)) {
+            User userProfile = userDAO.getUserById(id);
+            return userProfile;
+        }
+        return new User();
+    }
+
+    @Override
+    public User[] getPrefDriver(String token, String driverName, String pickLoc, String destLoc) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user= getIdentityService().getUserByToken(token);
+            ArrayList<User> users = userDAO.getPrefDriver(user.getId(), driverName, pickLoc, destLoc);
+            return users.toArray(new User[users.size()]);
+        }
+        return new User[0];
+    }
+
+    @Override
+    public User[] getDriver(String token, String driverName, String pickLoc, String destLoc) {
+        if(getIdentityService().isTokenValid(token)) {
+            User user= getIdentityService().getUserByToken(token);
+            ArrayList<User> users = userDAO.getDriver(user.getId(), driverName, pickLoc, destLoc);
+            return users.toArray(new User[users.size()]);
+        }
+        return new User[0];
+    }
+
+    @Override
+    public User getDriverById(String token, Integer driverId) {
+        if(getIdentityService().isTokenValid(token)) {
+            return userDAO.getUserById(driverId);
+        }
+        return new User();
+    }
+}
diff --git a/PrOjek/ojek/src/main/resources/.gitignore b/PrOjek/ojek/src/main/resources/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..0cffcb348ff9cec9cd41492a9e5c5a41d86ce96e
--- /dev/null
+++ b/PrOjek/ojek/src/main/resources/.gitignore
@@ -0,0 +1 @@
+config.json
\ No newline at end of file
diff --git a/PrOjek/ojek/src/main/resources/config.json.example b/PrOjek/ojek/src/main/resources/config.json.example
new file mode 100644
index 0000000000000000000000000000000000000000..34e388b32d1d7cb6569b2aa9003c9240284f829c
--- /dev/null
+++ b/PrOjek/ojek/src/main/resources/config.json.example
@@ -0,0 +1,9 @@
+{
+  "identityServicePath": "",
+  "jdbc": {
+    "url": "",
+    "username": "",
+    "password": ""
+  }
+  "defaultProfPicUrl": ""
+}
\ No newline at end of file
diff --git a/PrOjek/ojek/src/main/webapp/WEB-INF/sun-jaxws.xml b/PrOjek/ojek/src/main/webapp/WEB-INF/sun-jaxws.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bbbc4e2cb66c021e8990215584a29e284a5aa6b9
--- /dev/null
+++ b/PrOjek/ojek/src/main/webapp/WEB-INF/sun-jaxws.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
+        version="2.0">
+    <endpoint name="User"
+              implementation="com.jauharteam.ojek.ojek.user.UserServiceImpl"
+              url-pattern="/user"/>
+    <endpoint name="Order"
+              implementation="com.jauharteam.ojek.ojek.order.OrderServiceImpl"
+              url-pattern="/order"/>
+    <endpoint name="Location"
+              implementation="com.jauharteam.ojek.ojek.location.LocationServiceImpl"
+              url-pattern="/location"/>
+</endpoints>
\ No newline at end of file
diff --git a/PrOjek/ojek/src/main/webapp/WEB-INF/web.xml b/PrOjek/ojek/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d1ff95bdd3f42520c006c5cbd94d8dfff68971a4
--- /dev/null
+++ b/PrOjek/ojek/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+         version="3.1">
+    <listener>
+        <listener-class>
+            com.sun.xml.ws.transport.http.servlet.WSServletContextListener
+        </listener-class>
+    </listener>
+    <servlet>
+        <servlet-name>UserServlet</servlet-name>
+        <servlet-class>
+            com.sun.xml.ws.transport.http.servlet.WSServlet
+        </servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>UserServlet</servlet-name>
+        <url-pattern>/user</url-pattern>
+    </servlet-mapping>
+
+
+    <servlet>
+        <servlet-name>OrderServlet</servlet-name>
+        <servlet-class>
+            com.sun.xml.ws.transport.http.servlet.WSServlet
+        </servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>OrderServlet</servlet-name>
+        <url-pattern>/order</url-pattern>
+    </servlet-mapping>
+
+
+    <servlet>
+        <servlet-name>LocationServlet</servlet-name>
+        <servlet-class>
+            com.sun.xml.ws.transport.http.servlet.WSServlet
+        </servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>LocationServlet</servlet-name>
+        <url-pattern>/location</url-pattern>
+    </servlet-mapping>
+</web-app>
\ No newline at end of file
diff --git a/PrOjek/ojek/src/main/webapp/img/default.png b/PrOjek/ojek/src/main/webapp/img/default.png
new file mode 100644
index 0000000000000000000000000000000000000000..0038205c2c213ff042cb7835a0f5a96044bf0fcf
Binary files /dev/null and b/PrOjek/ojek/src/main/webapp/img/default.png differ
diff --git a/PrOjek/ojek/src/test/java/TestUserService.java b/PrOjek/ojek/src/test/java/TestUserService.java
new file mode 100644
index 0000000000000000000000000000000000000000..efa2d9753e1192820b3fcc68d993501b7ffa607f
--- /dev/null
+++ b/PrOjek/ojek/src/test/java/TestUserService.java
@@ -0,0 +1,23 @@
+import com.jauharteam.ojek.ojek.UserService;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import java.net.URL;
+
+/**
+ * Created by dery on 11/4/17.
+ */
+public class TestUserService {
+
+    public static void main(String[] args) throws Exception {
+        URL url = new URL("http://localhost:8081/user?wsdl");
+
+        //1st argument service URI, refer to wsdl document above
+        //2nd argument is service name, refer to wsdl document above
+        QName qname = new QName("http://service.ojek.ojek.jauharteam.com/", "UserServiceImplService");
+        Service service = Service.create(url, qname);
+        UserService userService = service.getPort(UserService.class);
+        String token = "jdwTQE1ehTKExOqDxS23FnbeShJ0hof4";
+        System.out.println(userService.getUser(token));
+    }
+}
diff --git a/PrOjek/settings.gradle b/PrOjek/settings.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..96fb66e9cacef24d1cd466b809543064b409477a
--- /dev/null
+++ b/PrOjek/settings.gradle
@@ -0,0 +1,7 @@
+include 'common'
+include 'ojek'
+include 'ojek-cmpt'
+include 'webapp'
+include 'identity'
+include 'identity-cmpt'
+
diff --git a/PrOjek/webapp/build.gradle b/PrOjek/webapp/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..45ea0da123c143baf8612e92932db9fd54b61071
--- /dev/null
+++ b/PrOjek/webapp/build.gradle
@@ -0,0 +1,18 @@
+apply plugin: 'java'
+apply plugin: 'idea'
+apply plugin: 'war'
+
+repositories {
+	mavenCentral()
+}
+
+dependencies {
+	compile project(':common')
+	compile project(':identity-cmpt')
+	compile project(':ojek-cmpt')
+	compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.0.1'
+	compile 'javax.servlet:javax.servlet-api:3.1.0'
+	compile group: 'com.sun.xml.ws', name: 'servlet', version: '2.2.8'
+	compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3'
+	compile group: 'commons-io', name: 'commons-io', version: '2.5'
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/index.jsp b/PrOjek/webapp/index.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..a74b2f45194173f0e8442a746611bb47ee10353a
--- /dev/null
+++ b/PrOjek/webapp/index.jsp
@@ -0,0 +1,3 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<jsp:include page="views/login_view.jsp" />
\ No newline at end of file
diff --git a/PrOjek/webapp/resources/css/element.css b/PrOjek/webapp/resources/css/element.css
new file mode 100644
index 0000000000000000000000000000000000000000..916fc87b443e076a3f9142d0cc0401189281d88d
--- /dev/null
+++ b/PrOjek/webapp/resources/css/element.css
@@ -0,0 +1,235 @@
+.input-standard {
+    background: white;
+    border: 1px solid gray;
+}
+.input-standard-v2 {
+    height: 25px;
+    width: 100%;
+    padding: 0 5px;
+}
+.button {
+    border: 1px solid black;
+    padding: 5px;
+    color: #000;
+    text-align: center;
+    text-decoration: none;
+    cursor: pointer;
+}
+.button-success,
+.button-fail,
+.button-green {
+    border-radius: 10%;
+    padding: 10px;
+}
+.button-fail {
+    background: #CD0428;
+}
+.button-fail:hover {
+    background: #fee6ea;
+}
+.button-plain {
+    background: white;
+}
+.button-plain {
+    color: black;
+    background: white;
+}
+.button-success {
+    background: #2BAC2F;
+}
+.button-success:hover {
+    background: #ebfaeb;
+}
+.button-green {
+    border-radius: 10%;
+    background: #82D800;
+    font-family: Rockwell;
+    border: 2px solid black;
+}
+.button-progress-now {
+    background: #FFFF9D;
+    color: #666;
+}
+.button-disable {
+    cursor: default;
+}
+.button-upload {
+    background-color: #ccc;
+    border: 1px solid gray;
+    text-align: center;
+    text-decoration: none;
+    display: inline-block;
+    font-size: 11px;
+    line-height: 25px;
+    height: 25px;
+    padding: 0;
+}
+.button-add {
+    margin: 0 auto;
+    padding: 0 10px !important;
+    text-align: center;
+    line-height: 25px;
+    height: 25px;
+}
+.circle-numbering {
+    color: #222;
+    background: gray;
+    border-radius: 50%;
+    text-align: center;
+}
+.switch {
+    position: relative;
+    float: right;
+    display: inline-block;
+    width: 40px;
+    height: 24px;
+}
+.switch input {
+    display: none;
+}
+.slider {
+    position: absolute;
+    cursor: pointer;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: #ccc;
+    -webkit-transition: .4s;
+    transition: .4s;
+    border-radius: 12px;
+}
+.slider:before {
+    position: absolute;
+    content: "";
+    height: 16px;
+    width: 16px;
+    left: 4px;
+    bottom: 4px;
+    background-color: white;
+    -webkit-transition: .4s;
+    transition: .4s;
+    border-radius: 50%;
+}
+input:checked + .slider {
+    background-color: #035503;
+}
+input:checked + .slider:before {
+    -webkit-transform: translateX(14px);
+    -ms-transform: translateX(14px);
+    transform: translateX(14px);
+}
+.rating-list {
+    list-style: none;
+    width: 60%;
+    margin: 0px auto;
+    text-align: center;
+}
+.rating-element {
+    width: 20%;
+    float: left;
+    color: gray;
+    cursor: pointer;
+    transition: color 0.5s ease-out;
+    -webkit-transition: color 0.5s ease-out;
+    -moz-transition: color 0.5s ease-out;
+    -o-transition: color 0.5s ease-out;
+}
+
+.warning {
+    color: #ff0000;
+}
+
+.no-border {
+    border: 0px !important;
+}
+
+.form-order {
+    display: none;
+}
+.form-order-default {
+    display: block;
+}
+.error{
+    border: 2px solid red;
+    border-radius: 4px;
+}
+
+/* The Modal (background) */
+.modalview {
+    display: none; /* Hidden by default */
+    position: fixed; /* Stay in place */
+    z-index: 1; /* Sit on top */
+    padding-top: 100px; /* Location of the box */
+    left: 0;
+    top: 0;
+    width: 100%; /* Full width */
+    height: 100%; /* Full height */
+    overflow: auto; /* Enable scroll if needed */
+    background-color: rgb(0,0,0); /* Fallback color */
+    background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
+}
+
+/* Modal Content */
+.modal-content {
+    background-color: #fefefe;
+    margin: auto;
+    padding: 20px;
+    border: 1px solid #888;
+    width: 75%;
+}
+
+.scrollable {
+    max-height: 200px;
+    overflow: auto;
+}
+
+/* The Close Button */
+.closemodal {
+    color: #aaaaaa;
+    float: right;
+    font-size: 28px;
+    font-weight: bold;
+}
+
+.close:hover,
+.close:focus {
+    color: #000;
+    text-decoration: none;
+    cursor: pointer;
+}
+.buttonmodal {
+	border : 2px solid black;
+}
+.modal-text{
+	font-size : 20pt;
+	font-family :Rockwell;
+	color :gray;
+	text-align: center;
+}
+.modal-options{
+	text-align:center;
+	margin-top : 20px;
+}
+
+.warning-box{
+    padding: 10px;
+    background-color: #f44336;
+    color: white;
+    transition: 0.2s;
+}
+
+.closebtn {
+    margin-left: 15px;
+    color: white;
+    font-weight: bold;
+    float: right;
+    font-size: 22px;
+    line-height: 20px;
+    cursor: pointer;
+    transition: 0.3s;
+}
+
+.closebtn:hover {
+    color: black;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/resources/css/order.css b/PrOjek/webapp/resources/css/order.css
new file mode 100644
index 0000000000000000000000000000000000000000..8e9e2a7cf4c78faf58e01cfa192a3a9db6fad2a3
--- /dev/null
+++ b/PrOjek/webapp/resources/css/order.css
@@ -0,0 +1,10 @@
+.form-order {
+    display: none;
+}
+.form-order-default {
+    display: block;
+}
+.error{
+    border: 2px solid red;
+    border-radius: 4px;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/resources/css/select_driver.css b/PrOjek/webapp/resources/css/select_driver.css
new file mode 100644
index 0000000000000000000000000000000000000000..94122a509aa2363f186dfebbc3c3d7abad9a39e3
--- /dev/null
+++ b/PrOjek/webapp/resources/css/select_driver.css
@@ -0,0 +1,45 @@
+#no-pref, #no-other-driver {
+    font-size: 13pt;
+    color: gray;
+    text-align: center;
+}
+
+div.image-container{
+    width: 100px;
+    height: 100px;
+    overflow: hidden;
+    position: relative;
+}
+
+img.driver-image{
+    position: absolute;
+    left: -1000%;
+    right: -1000%;
+    top: -1000%;
+    bottom: -1000%;
+    margin: auto;
+    height: 100px;
+    min-width: auto;
+}
+
+.driver-name{
+    font-size: 15pt;
+}
+
+.driver-rating{
+    font-size: 8pt;
+}
+
+.rating{
+    color: orange;
+}
+
+.choose-button{
+    float: right;
+}
+
+.driver-detail{
+    vertical-align: center;
+    height: 100px;
+}
+
diff --git a/PrOjek/webapp/resources/css/style.css b/PrOjek/webapp/resources/css/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..c06f769fe37ab82ea4ade7b22e7c3ebd509b961b
--- /dev/null
+++ b/PrOjek/webapp/resources/css/style.css
@@ -0,0 +1,424 @@
+/* css reset */
+
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+}
+li {
+    list-style: none;
+}
+html {
+    font-family: "Times New Roman", Times, serif;
+    font-size: 14px;
+    line-height: 20px;
+}
+/* typography */
+@font-face {
+  font-family: 'Material Icons';
+  font-style: normal;
+  font-weight: 400;
+  src: url('../fonts/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2') format('woff2');
+}
+
+.material-icons {
+  font-family: 'Material Icons';
+  font-weight: normal;
+  font-style: normal;
+  font-size: 24px;
+  line-height: 1;
+  letter-spacing: normal;
+  text-transform: none;
+  display: inline-block;
+  white-space: nowrap;
+  word-wrap: normal;
+  direction: ltr;
+  -moz-font-feature-settings: 'liga';
+  -moz-osx-font-smoothing: grayscale;
+}
+
+@font-face {
+    font-family: Oswald;
+    src: url('../fonts/Oswald-Regular.ttf');
+}
+@font-face {
+    font-family: Oswald;
+    font-weight: bold;
+    src: url('../fonts/Oswald-Medium.ttf');
+}
+a:link {
+    color: #000;
+    text-decoration: none;
+}
+a:visited {
+    color: #000;
+    text-decoration: none;
+}
+a:hover {
+    color: #ff0000;
+    text-decoration: underline;
+}
+a:active {
+    color: yellow;
+    text-decoration: underline;
+}
+
+a:hover {
+    cursor: pointer;
+}
+p {
+    margin: 3px;
+}
+.logo {
+    font-family: "Times New Roman", Times, serif;
+}
+.tagline {
+    font-family: "Times New Roman", Times, serif;
+    font-size: 8pt;
+    font-weight: lighter;
+    text-transform: none;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+    margin: 10px 0;
+    font-family: Oswald, sans-serif;
+    font-weight: bold;
+    text-transform: uppercase;
+}
+h1 {
+    font-size: 30px;
+}
+h2 {
+    font-size: 26px;
+}
+h3 {
+    font-size: 20px;
+}
+h4 {
+    font-size: 18px;
+}
+h5 {
+    font-size: 16px;
+}
+h6 {
+    font-size: 14px;
+}
+.align-left {
+    text-align: left;
+}
+.align-right {
+    text-align: right;
+}
+.align-center {
+    text-align: center;
+}
+/* 12 grid system */
+
+.row:after {
+    content: "";
+    display: table;
+    clear: both;
+}
+.col-1,
+.col-2,
+.col-3,
+.col-4,
+.col-5,
+.col-6,
+.col-7,
+.col-8,
+.col-9,
+.col-10,
+.col-11,
+.col-12 {
+    float: left;
+    padding: 5px;
+}
+.col-1 {
+    width: 8.333333333%;
+}
+.col-2 {
+    width: 16.666666666%;
+}
+.col-3 {
+    width: 25%;
+}
+.col-4 {
+    width: 33.333333333%;
+}
+.col-5 {
+    width: 41.666666667%;
+}
+.col-6 {
+    width: 50%;
+}
+.col-7 {
+    width: 58.333333333%;
+}
+.col-8 {
+    width: 66.666666667%;
+}
+.col-9 {
+    width: 75%;
+}
+.col-10 {
+    width: 83.333333333%;
+}
+.col-11 {
+    width: 91.666666667%;
+}
+.col-12 {
+    width: 100%;
+}
+/* login page */
+
+h3.headstyle {
+    margin: 0;
+    color: #02702c;
+    font-size: 38px;
+}
+.loginform {
+    font-family: Rockwell;
+    font-size: 11pt;
+    color: #02702c;
+}
+.loginformup {
+    font-family: Calibri;
+    font-size: 15pt;
+    color: #02702c;
+}
+.logincontainer {
+    margin-top: 75px;
+}
+.signupcontainer {
+    margin-top: 25px;
+}
+hr.loginhr {
+    margin: 10px;
+    border: 0;
+    border-top: 2px solid #02702c;
+    width: 80px;
+}
+#username-ok, #email-ok{
+    color: black;
+    display: none;
+}
+
+#username-no, #email-no{
+    color: red;
+    display: none;
+}
+/* header */
+
+.navbar {
+    font-family: Arial, Helvetica, sans-serif;
+    text-transform: uppercase;
+}
+.navbar a {
+    text-decoration: none;
+    color: #000;
+    font-weight: bold;
+}
+.navbar li:hover {
+    background-color: #e6fee6;
+}
+.active {
+    background-color: #035503;
+}
+.active a {
+    color: #fff;
+}
+li.active:hover {
+    background-color: #047b04;
+}
+/* login page */
+
+.login-extern-container {
+    width: 400px;
+    min-height: 450px;
+    border: 10px solid #02702c;
+    border-radius: 60px;
+    background: #8bbd3c;
+    margin: 20px auto;
+    padding: 40px 20px;
+    box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
+    transition: 0.3s;
+}
+/* main page */
+
+.default-extern-container {
+    width: 400px;
+    min-height: 500px;
+    box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
+    transition: 0.3s;
+    margin: 20px auto;
+    padding: 15px;
+}
+
+.default-extern-container:hover, .login-extern-container:hover {
+    box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
+}
+
+.container {
+    margin: 5px 0;
+    padding: 5px;
+}
+/* misc */
+
+.standard-border {
+    border: 1px solid black;
+}
+.rounded-border {
+    border: 1px solid black;
+    border-radius: 5px;
+}
+.margin-top {
+    margin-top: 30px;
+}
+.center {
+    margin: 0px auto;
+}
+.right {
+    float: right;
+}
+.edit-icon {
+    color:#F78B07 !important;
+}
+.delete-icon {
+    color: #E31508 !important;
+}
+.edit-icon:hover {
+    color:#fddcb5 !important;
+}
+.delete-icon:hover {
+    color:#fb8c84 !important;
+}
+/* order page & history */
+
+#no-history, #no-previous {
+    font-size: 13pt;
+    color: gray;
+    text-align: center;
+}
+.date {
+    line-height: 100%;
+    font-family: Rockwell;
+    font-size: 10pt;
+    color: gray;
+}
+.driver-detail {
+    vertical-align: center;
+    height: 100px;
+}
+.driver-name {
+    line-height: 100%;
+    font-family: Rockwell;
+    font-size: 12pt;
+    color: black;
+}
+.driver-username{
+    font-size: 18px;
+    text-align: center;
+    font-weight: bold;
+}
+
+/*
+.driver-name{
+    font-size: 15px;
+    text-align: center;
+}
+*/
+.text {
+    font-size: 8pt;
+    margin-bottom: 3px;
+    line-height: 110%;
+    font-family: Rockwell;
+    color: black;
+}
+.rating {
+    color: orange;
+    font-family: Rockwell;
+    font-size: 10pt;
+}
+.comment {
+    line-height: 115%;
+    margin-left: 10px;
+    color: black;
+    font-family: Calibri;
+    font-size: 8pt;
+}
+#comment-area {
+    width: 100%;
+    resize: none;
+    padding: 5px;
+    font-family: "Times New Roman", Times, serif;
+}
+#no-pref,
+#no-other-driver {
+    font-size: 13pt;
+    color: gray;
+    text-align: center;
+}
+/* picture */
+
+.picture {
+    width: 100px;
+    height: 100px;
+    overflow: hidden;
+    border: 1px solid #000;
+}
+.driver-picture {
+    width: 85px;
+    height: 85px;
+}
+.profile-picture {
+    border: 5px solid #444;
+    border-radius: 50%;
+}
+.edit-picture img, .picture img {
+    min-height: 100%;
+    max-width: 100%;
+    /* margin-left: -50%; */
+}
+/* .driver-picture img {
+     max-height: 100px;
+ } */
+.profile-info .username {
+    font-weight: bold;
+}
+.profile-info {
+    font-family: "Trebuchet MS", Helvetica, sans-serif;
+    text-align: center;
+    margin: 10px 0;
+}
+/* profile page */
+.upload-bar {
+    height: 25px;
+}
+.file-upload {
+    position: relative;
+    overflow: hidden;
+}
+.file-upload input.upload {
+    position: absolute;
+    top: 0;
+    right: 0;
+    width: 100%;
+    height: 25px;
+    cursor: pointer;
+    opacity: 0;
+    filter: alpha(opacity=0);
+}
+table.location_table {
+    width: 100%;
+    border-collapse: collapse;
+}
+.location_table th,
+.location_table td {
+    border: 1px solid black;
+    padding: 0px 10px;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/resources/fonts/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2 b/PrOjek/webapp/resources/fonts/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..1a6c76f548e312c872d9013e62019bee5e85b4ea
Binary files /dev/null and b/PrOjek/webapp/resources/fonts/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2 differ
diff --git a/PrOjek/webapp/resources/fonts/Oswald-Medium.ttf b/PrOjek/webapp/resources/fonts/Oswald-Medium.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..f476c60cac157cc7d6dd787e3183f22800fe9dc6
Binary files /dev/null and b/PrOjek/webapp/resources/fonts/Oswald-Medium.ttf differ
diff --git a/PrOjek/webapp/resources/fonts/Oswald-Regular.ttf b/PrOjek/webapp/resources/fonts/Oswald-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..47b964383884a63f6826ad362f25b0673eeea038
Binary files /dev/null and b/PrOjek/webapp/resources/fonts/Oswald-Regular.ttf differ
diff --git a/PrOjek/webapp/resources/images/pikachu.png b/PrOjek/webapp/resources/images/pikachu.png
new file mode 100644
index 0000000000000000000000000000000000000000..0038205c2c213ff042cb7835a0f5a96044bf0fcf
Binary files /dev/null and b/PrOjek/webapp/resources/images/pikachu.png differ
diff --git a/PrOjek/webapp/resources/images/togepi.png b/PrOjek/webapp/resources/images/togepi.png
new file mode 100644
index 0000000000000000000000000000000000000000..68343df12fa387b88132b5d44baf2e696c7785c3
Binary files /dev/null and b/PrOjek/webapp/resources/images/togepi.png differ
diff --git a/PrOjek/webapp/resources/js/ajax.js b/PrOjek/webapp/resources/js/ajax.js
new file mode 100644
index 0000000000000000000000000000000000000000..da5d425f8cb532dc633637c412e3b74025980ee8
--- /dev/null
+++ b/PrOjek/webapp/resources/js/ajax.js
@@ -0,0 +1,26 @@
+function getAjax(url, success) {
+    var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+    xhr.open('GET', url);
+    xhr.onreadystatechange = function() {
+        if (xhr.readyState>3 && xhr.status==200) success(xhr.responseText);
+    };
+    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+    xhr.send();
+    return xhr;
+}
+
+function postAjax(url, data, success) {
+    var params = typeof data == 'string' ? data : Object.keys(data).map(
+            function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) }
+        ).join('&');
+
+    var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
+    xhr.open('POST', url);
+    xhr.onreadystatechange = function() {
+        if (xhr.readyState>3 && xhr.status==200) { success(xhr.responseText); }
+    };
+    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+    xhr.send(params);
+    return xhr;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/resources/js/edit_location.js b/PrOjek/webapp/resources/js/edit_location.js
new file mode 100644
index 0000000000000000000000000000000000000000..adea05e6e425eb5fd5f534de50e62d012edc8d43
--- /dev/null
+++ b/PrOjek/webapp/resources/js/edit_location.js
@@ -0,0 +1,98 @@
+function deleteLocation(id, pref){
+    var delElmt = document.getElementById("row-"+pref);
+    var location = delElmt.getElementsByClassName('location-name')[0].textContent;
+    var url = 'helpers/ajax/delete_location.php';
+    console.log(id);
+    postAjax(url, {id: id, loc: location}, function(data){
+        console.log(data);
+    });
+    delElmt.parentNode.removeChild(delElmt);  
+    for(var i = pref+1; i <= nbPref; i++){
+        console.log(i)
+        var row = document.getElementById("row-"+i).getElementsByClassName('location-pref')[0];
+        var prefNow = row.innerHTML - 1;
+        row.innerHTML = prefNow;
+        document.getElementById("row-"+i).setAttribute("id", "row-" + prefNow);
+        var deleteElmt = document.getElementById('delete-link-'+i);
+        deleteElmt.setAttribute("id", "delete-link-"+prefNow);
+        deleteElmt.setAttribute("onclick", "deleteLocation("+id+","+prefNow+")");
+        var editElmt = document.getElementById('edit-link-'+i);
+        editElmt.setAttribute("id", "edit-link-"+prefNow);
+        editElmt.setAttribute("onclick", "editLocation("+id+","+prefNow+")");
+    }
+    nbPref--;
+    if(nbPref == 0){
+        document.getElementById('no-data-row').style.display = 'table-row';
+    }
+}
+
+document.getElementById('location').onkeyup = function(event){
+    var character = event.which;
+    if (character>40 || character <37){
+        var locNow = document.getElementById('location').value;
+        var suggestTag = document.getElementById('suggestLoc');
+        if(locNow.length > 0){
+            var url = "helpers/ajax/location_searcher.php?location=" + locNow;
+            getAjax(url, function(data){
+                suggestTag.innerHTML = '';
+                var suggestion = JSON.parse(data);
+                for(var i = 0; i < suggestion.length; i++){
+                    var option = document.createElement("option");
+                    option.setAttribute("value", suggestion[i]);
+                    suggestTag.appendChild(option);
+                }
+            });
+        } else {
+            suggestTag.innerHTML = '';
+        }
+    }
+}
+
+document.getElementById('submit-add-location').onclick = function(){
+    var location = document.getElementById('location').value;
+    var suggestList = document.getElementById('suggestLoc').childNodes;
+    var found = false;
+    var i = 0;
+    while(!found && i < suggestList.length){
+        if(location == suggestList[i].value){
+            found = true;
+        } else {
+            i++;
+        }
+    } if (found){
+        var url = 'add_preferred_location.php';
+        postAjax(url, {id: id, loc: location, pref: nbPref+1}, function(data){
+            console.log(data);
+            if(data == true){
+                var addRow = "<td class='number'>"+(nbPref+1)+"</td><td class='location'>"+location+"</td>";
+                addRow += "<td class='option'><div class='row'><div class='col-6'><a class='edit-icon' id='edit-"+(nbPref+1)+" onclick='editLocation("+id+","+(nbPref+1)+")'><i class='material-icons md-36'>edit</i></a>";
+                addRow += "</div><div class='col-6'>"+"<a class='delete-icon' id='delete-"+(nbPref+1)+" onclick='deleteLocation("+id+","+(nbPref+1)+")'><i class='material-icons md-36'>clear</i></a>";
+                addRow += "</div></div></td>";
+                var createElement = document.createElement('tr');
+                createElement.setAttribute("id", "row-"+(nbPref+1));
+                createElement.innerHTML = addRow;
+                document.getElementById('location_table').appendChild(createElement);
+                nbPref++;
+            } else {
+                console.log('nooo');
+            }
+        });
+    }
+}
+
+function editLocation(id, pref){
+    var editElmt = document.getElementById("row-"+pref);
+    var location = editElmt.getElementsByClassName('location')[0].textContent;
+    var pref_num = editElmt.getElementsByClassName('number')[0].textContent;
+    var delete_box = document.getElementById('delete-'+pref);
+    document.getElementById('edit-link-'+pref).style.display='none';
+    document.getElementById('delete-link-'+pref).style.display='none';
+    document.getElementById('submit-edited-location-'+pref).style.display='block';
+    // editElmt.getElementsByClassName('location-name')[0].innerHTML = ""
+    // document.getElementById('loc-row-'+pref).style.display = "block"
+    editElmt.getElementsByClassName('location-pref')[0].innerHTML = ""
+    document.getElementById('pref-row-'+pref).style.display = "block"
+    // var new_loc = document.getElementById('loc-row-'+pref).value
+    // var new_pref = document.getElementById('num-row-'+pref).value
+    delete_box.innerHTML = ""
+}
diff --git a/PrOjek/webapp/resources/js/edit_profile.js b/PrOjek/webapp/resources/js/edit_profile.js
new file mode 100644
index 0000000000000000000000000000000000000000..e3450cd53dff2eea1f28cfca8260fd6578e04caf
--- /dev/null
+++ b/PrOjek/webapp/resources/js/edit_profile.js
@@ -0,0 +1,25 @@
+function validate(element){
+    document.getElementById('warning-msg').innerHTML = '<span class="closebtn" onclick="this.parentElement.style.display = &quot;none&quot;;">&times;</span>';
+	var name = document.getElementById('name').value;
+	var phone = document.getElementById('phone').value;
+
+	var nameOK = (name.length <= 20);
+	var regexPhone = /^[0-9].{8,11}$/;
+    var phoneOK = regexPhone.test(phone);
+    if (!nameOK){
+        document.getElementById('warning-msg').style.display = 'block';
+    	document.getElementById('name').style.border = 'solid 1px red';
+        document.getElementById('warning-msg').innerHTML += '<div>Please enter name with no more than 20 char</div>';
+    } else {
+    	document.getElementById('name').style.border = 'solid 0.5px gray';
+    }
+
+    if (!phoneOK){
+        document.getElementById('warning-msg').style.display = 'block';
+    	document.getElementById('phone').style.border = 'solid 1px red';
+        document.getElementById('warning-msg').innerHTML += '<div>Please enter correct value for phone number</div>';
+    } else {
+    	document.getElementById('phone').style.border = 'solid 0.5px gray';
+    }
+	return (nameOK && phoneOK);
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/resources/js/history.js b/PrOjek/webapp/resources/js/history.js
new file mode 100644
index 0000000000000000000000000000000000000000..7308600f44f2e7b8d241a6f4331ffbce0be42520
--- /dev/null
+++ b/PrOjek/webapp/resources/js/history.js
@@ -0,0 +1,46 @@
+window.onload = function(){
+    document.getElementById("previous-order").style.display = "block";
+    document.getElementById("driver-history").style.display = "none";
+}
+
+function hideDriverHistory(id){
+    var url = "helpers/ajax/hide_driver_history.php";
+    postAjax(url, {id : id}, function(data){
+        if (data == true){
+            document.getElementById('history-' + id).style.display = "none";
+            nbDriver--;
+            if(nbDriver==0){
+                document.getElementById('history-exist').style.display = "none";
+                document.getElementById("no-history").style.display = "block";
+            }
+        }
+    })
+}
+
+function hidePreviousHistory(id){
+    var url = "helpers/ajax/hide_previous_history.php";
+    postAjax(url, {id : id}, function(data){
+        if (data == true){
+            document.getElementById('previous-' + id).style.display = "none";
+            nbMyPrev--;
+            if (nbMyPrev == 0) {
+                document.getElementById('previous-exist').style.display = "none";
+                document.getElementById("no-previous").style.display = "block";
+            }
+        }
+    })
+}
+
+function toDriverHistory(){
+    document.getElementById("driver-history").style.display = "block";
+    document.getElementById("driver-history-tab").className = "col-6 align-center standard-border active";
+    document.getElementById("previous-order").style.display = "none";
+    document.getElementById("previous-order-tab").className = "col-6 align-center standard-border";
+}
+
+function toPreviousOrder(){
+    document.getElementById("previous-order").style.display = "block";
+    document.getElementById("previous-order-tab").className = "col-6 align-center standard-border active";
+    document.getElementById("driver-history").style.display = "none";
+    document.getElementById("driver-history-tab").className = "col-6 align-center standard-border";
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/resources/js/order.js b/PrOjek/webapp/resources/js/order.js
new file mode 100644
index 0000000000000000000000000000000000000000..775b7ad6619228a8809600be1715b2c0e83e1e42
--- /dev/null
+++ b/PrOjek/webapp/resources/js/order.js
@@ -0,0 +1,246 @@
+var rating = 0;
+var destination = null;;
+var pickingpoint = null;
+var idDriver = 0;
+var comment = null;
+var driver
+function changeTo(element){
+    var id = Number(element.id.charAt(7));
+    for(var i = 1; i <= 5; i++){
+        if(i<=id){
+            document.getElementById("rating-"+i).style.color = "orange";
+        } else {
+            document.getElementById("rating-"+i).style.color = "gray";
+        }
+    }
+}
+
+function changeBack(){
+    for(var i=1; i <= 5; i++){
+        if(i<=rating){
+            document.getElementById("rating-"+i).style.color = "orange";
+        } else {
+            document.getElementById("rating-"+i).style.color = "gray";
+        }
+    }
+}
+
+function rateThis(element){
+    var id = Number(element.id.charAt(7));
+    rating = id;
+    for(var i = 1; i <= 5; i++){
+        if(i<=rating){
+            document.getElementById("rating-"+i).style.color = "orange";
+        } else {
+            document.getElementById("rating-"+i).style.color = "gray";
+        }
+    }
+}
+
+function openOrder(step) {
+    var i, taborder, tablinks,active,tabchosen;
+    tablinks = document.getElementsByClassName("form-order-default");
+    for (i = 0; i < tablinks.length; i++) {
+        tablinks[i].className = tablinks[i].className.replace("form-order-default", "form-order");
+    }
+    active=document.getElementById(step);
+	active.className=document.getElementById(step).className.replace("form-order","form-order-default");
+	taborder = document.getElementsByClassName("taborder");
+	for (i = 0; i < taborder.length; i++) {
+		taborder[i].className=taborder[i].className.replace("button-progress-now","button-plain");
+	}
+    tabchosen = document.getElementById("tab-"+step);
+	tabchosen.className=tabchosen.className.replace("button-plain","button-progress-now");
+}
+
+document.getElementById('buttonnext').onclick = function(){
+    pickingpoint = document.getElementById('pickingpoint').value;
+    destination = document.getElementById('destination').value;
+	var url = "helpers/ajax/location_validation.php";
+	postAjax(url, {dest:destination, loc: pickingpoint}, function(data){
+		console.log(data);
+		if((data!="salah")&&(pickingpoint!=destination)){
+			var preferreddriver = document.getElementById('preferreddriver').value;
+			var prefer = document.getElementById('prefer');
+			var url1 = 'helpers/ajax/getprefdriver.php?id_active='+idCustomer;
+			var url2 = 'helpers/ajax/getdriver.php?id_active='+idCustomer;
+			postAjax(url1, {dest:destination, loc: pickingpoint, pref:preferreddriver}, function(data1){
+				var createElement = document.getElementById('prefer-driver');
+				var prefdetail = JSON.parse(data1);
+				var addRow="";
+				if(prefdetail.hasOwnProperty('answer')){
+					addRow+= "<div id='no-pref'>Nothing to display :(</div>";
+				} else {
+					if(prefdetail.length>0){
+						for(var i = 0; i < prefdetail.length; i++){
+							addRow +=  "<div class='row'>";
+							addRow += "<div class='col-4'>";
+							addRow += "<div class='picture driver-picture'>";
+							addRow += "<img src='"+prefdetail[i]['profile_pic_url']+"'>";
+							addRow += "</div>";
+							addRow += "</div>";
+							addRow += "<div class='col-8 driver-detail'>";
+							addRow += "<div class='driver-name'>";
+							addRow += prefdetail[i]['name'];
+							addRow += "</div>";
+							addRow += "<div class='driver-rating'>";
+							addRow += "<span style='color:orange'>&#9734;</span><span class='rating'>"+prefdetail[i]['rating']+"</span>("+prefdetail[i]['votes']+" votes)";
+							addRow += "</div>";
+							addRow += "<div class='row'>";
+							addRow += "<a href='#' class='button button-success right' id='"+prefdetail[i]['ID']+"' onclick='selectDriver(this)'>I CH0OSE YOU!</a>";
+							addRow += "</div></div></div>";
+						}
+					}else{
+						addRow+= "<div id='no-pref'>Nothing to display :(</div>";
+					}
+				}
+				createElement.innerHTML=addRow;
+			});
+			postAjax(url2, {dest:destination, loc: pickingpoint, pref:preferreddriver}, function(data2){
+				console.log(data2);
+				var driversdetail = JSON.parse(data2);
+				var createElement = document.getElementById('other-driver');
+				var addRow="";
+				if(driversdetail.hasOwnProperty('answer')){
+					addRow+= "<div id='no-other-driver'>Nothing to display :(</div>";
+				} else {
+					if(driversdetail.length>0){
+						for(var i = 0; i < driversdetail.length; i++){
+							addRow +=  "<div class='row'>";
+							addRow += "<div class='col-4'>";
+							addRow += "<div class='picture driver-picture'>";
+							addRow += "<img src='"+driversdetail[i]['profile_pic_url']+"'>";
+							addRow += "</div>";
+							addRow += "</div>";
+							addRow += "<div class='col-8 driver-detail'>";
+							addRow += "<div class='driver-name'>";
+							addRow += driversdetail[i]['name'];
+							addRow += "</div>";
+							addRow += "<div class='driver-rating'>";
+							addRow += "<span style='color:orange'>&#9734;</span><span class='rating'>"+driversdetail[i]['rating']+"</span>("+driversdetail[i]['votes']+" votes)";
+							addRow += "</div>";
+							addRow += "<div class='row'>";
+							addRow += "<a href='#' class='button button-success right' id='"+driversdetail[i]['ID']+"' onclick='selectDriver(this)'>I CH0OSE YOU!</a>";
+							addRow += "</div></div></div>";
+						}
+					}else{
+						addRow+= "<div id='no-other-driver'>Nothing to display :(</div>";
+					}
+				}
+				createElement.innerHTML=addRow;
+			});
+			openOrder('select-driver');
+		}else{
+			var d1 = document.getElementById("pickingpoint");
+			d1.className+=" error";
+			var d2 = document.getElementById("destination");
+			d2.className+=" error";
+			document.getElementById('warning-msg-loc').innerHTML = '<span class="closebtn" onclick="this.parentElement.style.display = &quot;none&quot;;">&times;</span>Location can\'t be found';
+			document.getElementById('warning-msg-loc').style.display = 'block';
+		}
+	});
+}
+
+document.getElementById('pickingpoint').onkeyup = function(event){
+    var character = event.which;
+    if (character>40 || character <37){
+        var locNow = document.getElementById('pickingpoint').value;
+        var suggestTag = document.getElementById('suggest-pickingpoint');
+        if(locNow.length > 0){
+            var url = "helpers/ajax/location_searcher.php?location=" + locNow;
+            getAjax(url, function(data){
+                suggestTag.innerHTML = '';
+                var suggestion = JSON.parse(data);
+                for(var i = 0; i < suggestion.length; i++){
+                    var option = document.createElement("option");
+                    option.setAttribute("value", suggestion[i]);
+                    suggestTag.appendChild(option);
+                }
+            });
+        } else {
+            suggestTag.innerHTML = '';
+        }
+    }
+}
+document.getElementById('destination').onkeyup = function(event){
+    var character = event.which;
+    if (character>40 || character <37){
+        var locNow = document.getElementById('destination').value;
+        var suggestTag = document.getElementById('suggest-destination');
+        if(locNow.length > 0){
+            var url = "helpers/ajax/location_searcher.php?location=" + locNow;
+            getAjax(url, function(data){
+                suggestTag.innerHTML = '';
+                var suggestion = JSON.parse(data);
+                for(var i = 0; i < suggestion.length; i++){
+                    var option = document.createElement("option");
+                    option.setAttribute("value", suggestion[i]);
+                    suggestTag.appendChild(option);
+                }
+            });
+        } else {
+            suggestTag.innerHTML = '';
+        }
+    }
+}
+
+function selectDriver(element){
+    idDriver = element.id;
+	document.getElementById('modalverifyorder').style.display = "block";
+}
+// When the user clicks on <span> (x), close the modal
+document.getElementById("no-order").onclick = function() {
+    document.getElementById('modalverifyorder').style.display = "none";
+}
+document.getElementById("yes-order").onclick = function() {
+    document.getElementById('modalverifyorder').style.display = "none";
+	var url= "helpers/ajax/getdriverbyid.php";
+	postAjax(url, {iddriver:idDriver}, function(data){
+		console.log(data);
+		var elementdriverpict = document.getElementById('driver-pict').getElementsByTagName('img')[0];
+		var elementdriveruname = document.getElementById('driver-username');
+		var elementdrivername = document.getElementById('driver-fullname');
+		var driverdetail = JSON.parse(data);
+		if(driverdetail.hasOwnProperty('answer')){
+			
+		} else {
+			if(driverdetail.length>0){
+				for(var i = 0; i < driverdetail.length; i++){
+					elementdriverpict.src = driverdetail[i]['profile_pic_url'];
+					elementdriveruname.innerHTML = '@'+driverdetail[i]['username'];
+					elementdrivername.innerHTML = driverdetail[i]['name'];
+				}
+			}
+		}
+	});
+    openOrder("complete-order");
+}
+// When the user clicks anywhere outside of the modal, close it
+window.onclick = function(event) {
+    if (event.target == document.getElementById('modalverifyorder')) {
+        document.getElementById('modalverifyorder').style.display = "none";
+    }
+}
+document.getElementById('submit-order').onclick = function(){
+	var url = "helpers/ajax/submit_order.php";
+	if(rating> 0){
+		comment = document.getElementById('comment-area').value;
+		postAjax(url, {iddriver:idDriver, idcust:idCustomer, dest:destination, loc:pickingpoint, rate:rating, comm:comment}, function(data){
+			if(data == "ok"){
+				document.getElementById('modalsubmit').style.display = "block";
+			} else {
+				document.getElementById('warning-msg-submit').innerHTML = '<span class="closebtn" onclick="this.parentElement.style.display = &quot;none&quot;;">&times;</span>Sorry, an error occured!';
+				document.getElementById('warning-msg-submit').style.display = 'block';
+			}
+		});
+	} else {
+		document.getElementById('warning-msg-submit').innerHTML = '<span class="closebtn" onclick="this.parentElement.style.display = &quot;none&quot;;">&times;</span>Please enter rating for our driver';
+		document.getElementById('warning-msg-submit').style.display = 'block';
+	}
+}
+
+// When the user clicks on OK, close the modal
+document.getElementById("verifysubmit").onclick = function() {
+    document.getElementById('modalsubmit').style.display = "none";
+	window.location = "order.php?id_active="+idCustomer;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/resources/js/signup.js b/PrOjek/webapp/resources/js/signup.js
new file mode 100644
index 0000000000000000000000000000000000000000..302b99d780af67c5a1da4592d00d808c31b2d8ef
--- /dev/null
+++ b/PrOjek/webapp/resources/js/signup.js
@@ -0,0 +1,147 @@
+window.onload = function(){
+    var inputs = document.getElementsByTagName("input");
+    Array.prototype.forEach.call(inputs, function(element) {
+        if(element.name!="submit"){
+            element.value = "";
+        }
+    });
+}
+
+var nameOK = false;
+var userOK = false;
+var passOK = false;
+var emailOK = false;
+var phoneOK = false;
+
+var arr = {
+            "name" : nameOK,
+            "email" : emailOK,
+            "username" : userOK,
+            "phone" : phoneOK,
+            "password" : passOK
+        };
+function validateEmail(email, ){
+    var emailRegEx = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+    return emailRegEx.test(email);
+}
+
+function validateName(name){
+    return (name.length <= 20);
+}
+
+function validatePhoneNo(phone){
+    var regexPhone = /^[0-9].{8,11}$/;
+    return regexPhone.test(phone);
+}
+
+for(var item in arr){
+    console.log(item);
+    document.getElementById(item).onclick = function(){
+        document.getElementById("status").innerHTML = "";
+        document.getElementById(this.id).style.border = "solid 0.5px gray";
+    }
+}
+
+document.getElementById("name").onkeyup = function(){
+    var name = document.getElementById("name").value;
+    if(validateName(name)){
+        nameOK = true;
+        document.getElementById("name").style.border = "solid 0.5px gray";
+    } else {
+        nameOK = false;
+        document.getElementById("name").style.border = "solid 2px red";
+    }
+}
+
+document.getElementById("username").onkeyup = function(){
+    var username = document.getElementById("username").value;
+    var validUser = document.getElementById("username-ok");
+    var notValidUser = document.getElementById("username-no"); 
+    if (username.length > 0){
+        var url = "helpers/ajax/validation.php?username=" + username;
+        getAjax(url, function(data){
+            if(data == "available"){
+                validUser.style.display = "inline";
+                notValidUser.style.display = "none";
+                userOK = true;
+            }
+            else {
+                notValidUser.style.display = "inline";
+                validUser.style.display = "none";
+                userOK = false;
+            }
+        })
+    } else {
+        notValidUser.style.display = "none";
+        validUser.style.display = "none";
+        userOK = false;
+    }
+};
+
+document.getElementById("email").onkeyup = function(){
+    var email = document.getElementById("email").value;
+    var validEmail = document.getElementById("email-ok");
+    var notValidEmail = document.getElementById("email-no");
+    
+    if (validateEmail(email)){
+        var url = "helpers/ajax/validation.php?email=" + email;
+        getAjax(url, function(data){
+            if(data == "available"){
+                validEmail.style.display = "inline";
+                notValidEmail.style.display = "none";
+                emailOK = true;
+            }
+            else {
+                validEmail.style.display = "none";
+                notValidEmail.style.display = "inline";
+                emailOK = false;
+            }
+        });
+    } else {
+        validEmail.style.display = "none";
+        notValidEmail.style.display = "inline";
+        emailOK = false;
+    }
+}
+
+document.getElementById("phone").onkeyup = function(){
+    var phone = document.getElementById("phone").value;
+    if(validatePhoneNo(phone)){
+        phoneOK = true;
+        document.getElementById("phone").style.border = "solid 0.5px gray";
+    } else {
+        phoneOK = false;
+        document.getElementById("phone").style.border = "solid 2px red";
+    }
+}
+
+document.getElementById("confirm-password").onkeyup = function() {
+    var pass = document.getElementById("password").value;
+    var confirmedPass = document.getElementById("confirm-password").value;
+    if (confirmedPass != pass){
+        passOK = false;
+        document.getElementById("confirm-password").style.border = "solid 2px red";
+    } else {
+        passOK = true;
+        document.getElementById("confirm-password").style.border = "solid 0.5px gray";
+    }
+}
+
+document.getElementById("signup-form").onsubmit = function (){
+    if (nameOK && emailOK && userOK && phoneOK && passOK){
+        console.log("form can be submitted");
+        return true;
+    } else {
+        for(var key in arr){
+            if(!arr[key]){
+                document.getElementById(key).style.border = "solid 2px red";
+            }
+        }
+        document.getElementById("confirm-password").style.border = "solid 0.5px gray";
+        document.getElementById("confirm-password").value = "";
+        document.getElementById("status").innerHTML = "field must be set";
+        console.log("something wrong");
+        console.log(nameOK + " " + emailOK + " " + userOK + " " + phoneOK + " " + passOK);
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/resources/js/upload_profile_picture.js b/PrOjek/webapp/resources/js/upload_profile_picture.js
new file mode 100644
index 0000000000000000000000000000000000000000..2b4aa0d997d604b7bcf61ea7218628104b47e6f1
--- /dev/null
+++ b/PrOjek/webapp/resources/js/upload_profile_picture.js
@@ -0,0 +1,4 @@
+function uploadFinish(){
+	var filename = document.getElementById("uploadBtn");
+	document.getElementById('uploadFile').value = filename.files[0].name;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/Config.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/Config.java
new file mode 100644
index 0000000000000000000000000000000000000000..8ab8cccc6a261d538a8af382919213e7f690e81e
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/Config.java
@@ -0,0 +1,74 @@
+package com.jauharteam.ojek.webapp;
+
+public class Config {
+
+    private String identityRestPath;
+    private String identityServicePath;
+    private String userServicePath;
+    private String orderServicePath;
+    private String locationServicePath;
+    private String baseUrl;
+
+    public Config() {
+    }
+
+    public String getIdentityServicePath() {
+        return identityServicePath;
+    }
+
+    public void setIdentityServicePath(String identityServicePath) {
+        this.identityServicePath = identityServicePath;
+    }
+
+    public String getIdentityRestPath() {
+        return identityRestPath;
+    }
+
+    public void setIdentityRestPath(String identityRestPath) {
+        this.identityRestPath = identityRestPath;
+    }
+
+    public String getBaseUrl() {
+        return baseUrl;
+    }
+
+    public void setBaseUrl(String baseUrl) {
+        this.baseUrl = baseUrl;
+    }
+
+    public String getUserServicePath() {
+        return userServicePath;
+    }
+
+    public void setUserServicePath(String userServicePath) {
+        this.userServicePath = userServicePath;
+    }
+
+    public String getOrderServicePath() {
+        return orderServicePath;
+    }
+
+    public void setOrderServicePath(String orderServicePath) {
+        this.orderServicePath = orderServicePath;
+    }
+
+    public String getLocationServicePath() {
+        return locationServicePath;
+    }
+
+    public void setLocationServicePath(String locationServicePath) {
+        this.locationServicePath = locationServicePath;
+    }
+
+    @Override
+    public String toString() {
+        return "Config{" +
+                "identityRestPath='" + identityRestPath + '\'' +
+                ", identityServicePath='" + identityServicePath + '\'' +
+                ", userServicePath='" + userServicePath + '\'' +
+                ", orderServicePath='" + orderServicePath + '\'' +
+                ", locationServicePath='" + locationServicePath + '\'' +
+                ", baseUrl='" + baseUrl + '\'' +
+                '}';
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/EditLocationServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/EditLocationServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..9aecf1ad81029a2713c866de70832f89af998d3c
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/EditLocationServlet.java
@@ -0,0 +1,35 @@
+package com.jauharteam.ojek.webapp;
+
+import com.ojek.common.Location;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+public class EditLocationServlet extends WebappServlet{
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if(!checkIsLoggedIn(req)) {
+            resp.sendRedirect(config.getBaseUrl() + "login");
+            return;
+        }
+        try {
+            String accessToken = getCookie(req, "accessToken");
+            req.setAttribute("accessToken", accessToken);
+            req.setAttribute("userService", getOjekUserService());
+            req.setAttribute("locationService", getOjekLocationService());
+            req.setAttribute("config", config);
+        } catch (Exception e) {
+            e.printStackTrace();
+//            req.setAttribute("user", new User());
+        }
+        req.getRequestDispatcher("/editlocation.jsp").forward(req, resp);
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if(!checkIsLoggedIn(req)) return;
+        resp.sendRedirect(config.getBaseUrl() +"editlocation");
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/EditProfileServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/EditProfileServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..39be6bfc066b29c6255be1b784dfafa5b41f3d2f
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/EditProfileServlet.java
@@ -0,0 +1,96 @@
+package com.jauharteam.ojek.webapp;
+
+import com.ojek.common.User;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by dery on 11/8/17.
+ */
+public class EditProfileServlet extends WebappServlet {
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if(!checkIsLoggedIn(req)) {
+            resp.sendRedirect(config.getBaseUrl() + "login");
+            return;
+        }
+
+        try {
+            String accessToken = getCookie(req, "accessToken");
+            req.setAttribute("accessToken", accessToken);
+            req.setAttribute("userService", getOjekUserService());
+            req.setAttribute("config", config);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        req.getRequestDispatcher("/editprofile.jsp").forward(req, resp);
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        DiskFileItemFactory fileFactory = new DiskFileItemFactory();
+        File filesDir = new File(servletContext.getRealPath("/data"));
+        File photosDir = new File(servletContext.getRealPath("/photos"));
+        if (!filesDir.exists())
+            filesDir.mkdir();
+        if (!photosDir.exists())
+            photosDir.mkdir();
+        fileFactory.setRepository(filesDir);
+        ServletFileUpload uploader = new ServletFileUpload(fileFactory);
+        Map<String,String> parameters = new HashMap<>();
+        Map<String,FileItem> fileItemMap = new HashMap<>();
+        try {
+            List<FileItem> fileItemList = uploader.parseRequest(req);
+            for (FileItem item : fileItemList) {
+                fileItemMap.put(item.getFieldName(), item);
+                if (item.getContentType() == null || item.getContentType().equals("field-data"))
+                    parameters.put(item.getFieldName(), item.getString());
+            }
+        } catch (FileUploadException e) {
+            e.printStackTrace();
+            return;
+        }
+
+        String accessToken = getCookie(req, "accessToken");
+        String name = parameters.get("name");
+        String phone = parameters.get("phone");
+        String driverStr = parameters.get("driver");
+        Boolean isDriver = false;
+        if (driverStr != null && driverStr.length() > 0)
+            isDriver = driverStr.equals("on");
+
+        if(!checkIsLoggedIn(req)) return;
+
+        User user = getOjekUserService().getUser(accessToken);
+        user.setName(name);
+        user.setPhone(phone);
+        user.setDriver(isDriver);
+
+        FileItem photo = fileItemMap.get("uploaded_file");
+        if (photo != null && photo.getSize() > 0)
+            try {
+                photo.write(new File(photosDir + File.separator + user.getUsername()));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        user.setProfpicUrl(config.getBaseUrl() + "photos/" + user.getUsername());
+
+        if(!getOjekUserService().editUser(accessToken, user)){
+            req.setAttribute("errorMessage", "Internal server error.");
+        }
+        resp.sendRedirect(config.getBaseUrl() + "profile");
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/HistoryServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/HistoryServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..805c00146c28c7768721d21389e54ded10d237f5
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/HistoryServlet.java
@@ -0,0 +1,31 @@
+package com.jauharteam.ojek.webapp;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * Created by dery on 11/7/17.
+ */
+public class HistoryServlet extends WebappServlet{
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if(!checkIsLoggedIn(req)) {
+            resp.sendRedirect(config.getBaseUrl() + "login");
+            return;
+        }
+        try {
+            String accessToken = getCookie(req, "accessToken");
+            req.setAttribute("accessToken", accessToken);
+            req.setAttribute("userService", getOjekUserService());
+            req.setAttribute("orderService", getOjekOrderService());
+            req.setAttribute("locationService", getOjekLocationService());
+            req.setAttribute("config", config);
+        } catch (Exception e) {
+            e.printStackTrace();
+//            req.setAttribute("user", new User());
+        }
+        req.getRequestDispatcher("/history.jsp").forward(req, resp);
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/LoginServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/LoginServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..4c8e2bd0984b99a3dcdc151f2a338ae56e210220
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/LoginServlet.java
@@ -0,0 +1,97 @@
+package com.jauharteam.ojek.webapp;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.ojek.common.util.RestUtil.httpPost;
+
+public class LoginServlet extends WebappServlet {
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if (checkIsLoggedIn(req)) {
+            req.setAttribute("errorMessage", "User already logged in");
+            resp.sendRedirect(config.getBaseUrl() +"profile");
+            return;
+        }
+
+        req.getRequestDispatcher("/login.jsp").forward(req, resp);
+    }
+
+    /**
+     * TODO : check if user already logged in, set redirect URL
+     */
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        String username = req.getParameter("username");
+        String password = req.getParameter("password");
+
+        //===================================================//
+        String userAgent = req.getHeader("User-Agent");
+        String ipAddress = req.getRemoteAddr();
+
+        System.out.println("webapp-user " + userAgent);
+        System.out.println("webapp-ip " + ipAddress);
+        //===================================================//
+
+        if (checkIsLoggedIn(req)) {
+            req.setAttribute("errorMessage", "User already logged in");
+            resp.sendRedirect(config.getBaseUrl() +"profile");
+            return;
+        }
+
+        if (username == null || password == null) {
+            req.setAttribute("errorMessage", "Username and password is required.");
+        } else if (config != null) {
+            String loginUrl = config.getIdentityRestPath() + "login";
+
+            Map<String,String> parameters = new HashMap<>();
+            parameters.put("username", username);
+            parameters.put("password", password);
+            parameters.put("User-Agent", userAgent);
+            parameters.put("Ip-Address", ipAddress);
+            String responseStr = httpPost(loginUrl, parameters);
+
+            if (responseStr == null)
+                req.setAttribute("errorMessage", "Internal server error.");
+            else {
+                ObjectMapper objectMapper = new ObjectMapper();
+                JsonNode responseNode = objectMapper.readTree(responseStr);
+                if (responseNode != null && responseNode.get("success").asBoolean()) {
+                    String accessToken = responseNode.get("accessToken").asText();
+                    String refreshToken = responseNode.get("refreshToken").asText();
+                    String expiredToken = responseNode.get("expired").asText();
+
+                    // =========================================== //
+                    System.out.println("log in wapp - accessToken :" + accessToken);
+                    System.out.println("log in wapp - refreshToken :" + refreshToken);
+                    // =========================================== //
+
+                    resp.addCookie(new Cookie("accessToken", accessToken));
+                    resp.addCookie(new Cookie("refreshToken", refreshToken));
+                    resp.addCookie(new Cookie("tokenExpired", expiredToken));
+
+                    resp.sendRedirect(config.getBaseUrl() +"profile");
+                    return;
+                } else {
+                    String errorMessage = responseNode.get("errorMessage").asText();
+                    if (errorMessage == null)
+                        errorMessage = "Wrong username and password";
+                    req.setAttribute("errorMessage", errorMessage);
+                }
+            }
+        } else {
+            req.setAttribute("errorMessage", "Internal server error.");
+        }
+
+        req.getRequestDispatcher("/login.jsp").forward(req, resp);
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/LogoutServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/LogoutServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..6752549ae68635c44eeb8d96a1a4bf486c3c05f1
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/LogoutServlet.java
@@ -0,0 +1,51 @@
+package com.jauharteam.ojek.webapp;
+
+import javax.annotation.Resource;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.handler.MessageContext;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+/**
+ * Created by dery on 11/7/17.
+ */
+public class LogoutServlet extends WebappServlet {
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        ServletContext context = req.getSession().getServletContext();
+        Config config = (Config) context.getAttribute("webappConfig");
+
+        if (!checkIsLoggedIn(req)) {
+            resp.sendRedirect(config.getBaseUrl() + "login");
+            return;
+        }
+
+        URL url = new URL(config.getIdentityRestPath() + "/logout");
+
+        // Prepare to do post request
+        HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
+        httpCon.setDoOutput(true);
+        httpCon.setRequestMethod("POST");
+        DataOutputStream wr = new DataOutputStream(httpCon.getOutputStream());
+
+        // get token
+        String accessToken = getCookie(req, "accessToken");
+        wr.writeBytes("token=" + accessToken);
+        wr.flush();
+        wr.close();
+
+        System.out.println(httpCon.getResponseCode());
+        System.out.println(httpCon.getResponseMessage());
+        System.out.println();
+        if (httpCon.getResponseCode() == 200) {
+            resp.sendRedirect(config.getBaseUrl() + "login");
+        }
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/OrderServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/OrderServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..58cb4fea175f9c15bdca2d44fe92638f6b34e6e6
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/OrderServlet.java
@@ -0,0 +1,66 @@
+package com.jauharteam.ojek.webapp;
+
+import com.jauharteam.ojek.ojek.LocationService;
+import com.jauharteam.ojek.ojek.OrderService;
+import com.jauharteam.ojek.ojek.UserService;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Date;
+
+/**
+ * Created by dery on 11/7/17.
+ */
+public class OrderServlet extends WebappServlet{
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if(!checkIsLoggedIn(req)) {
+            resp.sendRedirect(config.getBaseUrl() + "/login");
+            return;
+        }
+
+        try {
+            String accessToken = getCookie(req, "accessToken");
+            req.setAttribute("accessToken", accessToken);
+            req.setAttribute("userService", getOjekUserService());
+            req.setAttribute("locationService", getOjekLocationService());
+            req.setAttribute("orderService", getOjekOrderService());
+            req.setAttribute("config", config);
+        } catch (Exception e) {
+            e.printStackTrace();
+//            req.setAttribute("user", new User());
+        }
+        req.getRequestDispatcher("/order.jsp").forward(req, resp);
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if(!checkIsLoggedIn(req)) {
+            resp.sendRedirect(config.getBaseUrl() +"/login");
+            return;
+        }
+
+        String accessToken = getCookie(req, "accessToken");
+        UserService userService = getOjekUserService();
+        LocationService locationService= getOjekLocationService();
+        OrderService orderService = getOjekOrderService();
+
+        Integer customerId = userService.getUser(accessToken).getId();
+        String pickLoc = req.getParameter("picking");
+        String destination = req.getParameter("destination");
+        Boolean customer_show = true;
+        Boolean driver_show = true;
+        Integer location_id = locationService.getLocation(accessToken,pickLoc).getId();
+        Integer destination_id = locationService.getLocation(accessToken,destination).getId();;
+        Timestamp time = new Timestamp(new Date().getTime());
+
+        Integer driver_id;
+        Integer rate;
+        String comment;
+
+
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/ProfileServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/ProfileServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..15ab7ed076ceb7dda77e0ae58f3a88c425145e1c
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/ProfileServlet.java
@@ -0,0 +1,41 @@
+package com.jauharteam.ojek.webapp;
+
+import com.ojek.common.User;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+import static javax.swing.text.html.CSS.getAttribute;
+
+/**
+ * Created by dery on 11/7/17.
+ */
+public class ProfileServlet extends WebappServlet {
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if(!checkIsLoggedIn(req)) {
+            // Debug===============================
+            System.out.println("Profile - accessToken " + getCookie(req, "accessToken"));
+            //=====================================
+            resp.sendRedirect(config.getBaseUrl() + "login");
+            return;
+        }
+
+        try {
+            String accessToken = getCookie(req, "accessToken");
+            req.setAttribute("accessToken", accessToken);
+            req.setAttribute("userService", getOjekUserService());
+            req.setAttribute("locationService", getOjekLocationService());
+            req.setAttribute("config", config);
+        } catch (Exception e) {
+            e.printStackTrace();
+//            req.setAttribute("user", new User());
+        }
+        req.getRequestDispatcher("/profile.jsp").forward(req, resp);
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/RegisterServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/RegisterServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..c83226d37b2a142833d7b0256e60f54b507c49a3
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/RegisterServlet.java
@@ -0,0 +1,97 @@
+package com.jauharteam.ojek.webapp;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.jauharteam.ojek.ojek.UserService;
+import com.ojek.common.User;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Map;
+
+import static com.ojek.common.util.RestUtil.httpPost;
+
+/**
+ * Created by dery on 11/7/17.
+ */
+public class RegisterServlet extends WebappServlet {
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if (checkIsLoggedIn(req)) {
+            resp.sendRedirect(config.getBaseUrl() + "/profile");
+            return;
+        }
+        req.getRequestDispatcher("/signup.jsp").forward(req, resp);
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        String name = req.getParameter("name");
+        String phone = req.getParameter("phone");
+        String driverStr = req.getParameter("driver");
+
+        //===================================================//
+        String userAgent = req.getHeader("User-Agent");
+        String ipAddress = req.getRemoteAddr();
+
+        System.out.println("webapp-user " + userAgent);
+        System.out.println("webapp-ip " + ipAddress);
+
+        Map<String, String> newReq = getAllParam(req);
+        newReq.put("User-Agent", userAgent);
+        newReq.put("Ip-Address", ipAddress);
+        //===================================================//
+
+        Boolean isDriver = false;
+        if (driverStr != null && driverStr.length() > 0)
+            isDriver = driverStr.equals("1");
+
+        if (checkIsLoggedIn(req)) {
+            req.setAttribute("errorMessage", "User already logged in");
+            resp.sendRedirect(config.getBaseUrl() + "profile");
+            return;
+        }
+
+        if (config != null) {
+            // Do post request
+            String responseStr = httpPost(config.getIdentityRestPath() + "/register", newReq);
+            if (responseStr == null)
+                req.setAttribute("errorMessage", "Internal server error.");
+            else {
+                ObjectMapper objectMapper = new ObjectMapper();
+                JsonNode responseNode = objectMapper.readTree(responseStr);
+                if (responseNode != null && responseNode.get("success").asBoolean()) {
+                    String accessToken = responseNode.get("accessToken").asText();
+                    String refreshToken = responseNode.get("refreshToken").asText();
+                    String expiredToken = responseNode.get("expired").asText();
+
+                    resp.addCookie(new Cookie("accessToken", accessToken));
+                    resp.addCookie(new Cookie("refreshToken", refreshToken));
+                    resp.addCookie(new Cookie("tokenExpired", expiredToken));
+
+                    UserService userService = getOjekUserService();
+                    User user = getIdentityService().getUserByToken(accessToken);
+                    user.setName(name);
+                    user.setPhone(phone);
+                    user.setDriver(isDriver);
+                    if(userService.addUser(user)) {
+                        resp.sendRedirect(config.getBaseUrl() + "profile");
+                        return;
+                    } else {
+                        req.setAttribute("errorMessage", "Internal server error.");
+                    }
+                } else {
+                    String errorMessage = responseNode.get("errorMessage").asText();
+                    if (errorMessage == null)
+                        errorMessage = "Please fill the correct data";
+                    req.setAttribute("errorMessage", errorMessage);
+                }
+            }
+        } else {
+            req.setAttribute("errorMessage", "Internal server error.");
+        }
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/SOAPServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/SOAPServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..6dc7f1c1036561f9917d03a45275a9a6e523ee57
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/SOAPServlet.java
@@ -0,0 +1,204 @@
+package com.jauharteam.ojek.webapp;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.jauharteam.ojek.ojek.UserService;
+import com.ojek.common.Location;
+import com.ojek.common.Order;
+import com.ojek.common.User;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.*;
+
+public class SOAPServlet extends WebappServlet {
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        Map<String,String> params = getAllParam(req);
+        String name = params.get("name");
+        switch (name){
+            case "delete-location":
+                deleteLocation(req);
+                break;
+            case "add-location":
+                addLocation(req,resp);
+                break;
+            case "edit-location":
+                editLocation(req,resp);
+                break;
+            case "get-driver":
+                getDriver(req,resp);
+                break;
+            case "submit-order":
+                submitOrder(req,resp);
+                break;
+            case "get-driver-by-id":
+                getDriverById(req,resp);
+                break;
+            case "hide-driver-history":
+                hideOrderDriver(req, resp);
+                break;
+            case "hide-customer-history":
+                hideOrderCustomer(req, resp);
+                break;
+            case "get-pref-driver":
+                getPrefDriver(req);
+                break;
+        }
+    }
+
+    private void getDriverById(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+        String accessToken = getCookie(req, "accessToken");
+        String idDriver = req.getParameter("iddriver");
+        System.out.println(idDriver);
+        User driver = getOjekUserService().getDriverById(accessToken, Integer.valueOf(idDriver));
+        driver.setPassword("");
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonString = objectMapper.writeValueAsString(driver);
+
+        resp.setContentType("application/json");
+        Writer writer = resp.getWriter();
+        writer.write(jsonString);
+        writer.flush();
+    }
+
+    private void submitOrder(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+        String accessToken = getCookie(req, "accessToken");
+        String idDriver = req.getParameter("iddriver");
+        String idCustomer = req.getParameter("idcust");
+        String destination = req.getParameter("dest");
+        String location = req.getParameter("loc");
+        String rate = req.getParameter("rate");
+        String comment = req.getParameter("comm");
+
+        System.out.println(idDriver);
+        System.out.println(idCustomer);
+        System.out.println(destination);
+        System.out.println(location);
+        System.out.println(rate);
+        System.out.println(comment);
+
+        Order order = new Order();
+        order.setDriverId(Integer.valueOf(idDriver));
+        order.setDriverShow(true);
+        order.setCustomerId(Integer.valueOf(idCustomer));
+        order.setCustomerShow(true);
+        order.setDestinationId(getOjekLocationService().getLocation(accessToken, destination).getId());
+        order.setLocationId(getOjekLocationService().getLocation(accessToken, location).getId());
+        order.setRate(Integer.valueOf(rate));
+        order.setComment(comment);
+        order.setTime(Calendar.getInstance().getTime());
+
+        if(getOjekOrderService().addOrder(accessToken,order)){
+            System.out.println("MASUK");
+            resp.setContentType("text/plain");
+            Writer writer = resp.getWriter();
+            writer.write("ok");
+            writer.flush();
+        }
+    }
+
+    private void getDriver(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+        String accessToken = getCookie(req, "accessToken");
+        String location = req.getParameter("loc");
+        String destination = req.getParameter("dest");
+        String prefDriver = req.getParameter("prefDriver");
+        User[] drivers;
+        if(prefDriver==null) {
+            drivers = getOjekUserService().getDriver(accessToken, "", location, destination);
+        } else {
+            drivers  = getOjekUserService().getPrefDriver(accessToken, prefDriver, location, destination);
+        }
+
+        List<User> driversArray = new ArrayList<>();
+        for (User driver : drivers) {
+            driver.setPassword("");
+            driversArray.add(driver);
+        }
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonString = objectMapper.writeValueAsString(driversArray);
+
+        resp.setContentType("application/json");
+        Writer writer = resp.getWriter();
+        writer.write(jsonString);
+        writer.flush();
+    }
+
+    private void editLocation(HttpServletRequest req, HttpServletResponse resp) {
+        String accessToken = getCookie(req, "accessToken");
+        String locationPrefStr = req.getParameter("location-pref");
+        String locationStr = req.getParameter("loc-" + locationPrefStr);
+        String locationLastStr = req.getParameter("loc-last-" + locationPrefStr);
+
+        Location locationLast = new Location(), locationNew = new Location();
+        locationLast.setLocation(locationLastStr);
+        locationNew.setLocation(locationStr);
+
+        if(!getOjekLocationService().editLocation(accessToken, locationLast, locationNew)){
+            req.setAttribute("errorMessage", "Internal server error.");
+        }
+
+        try {
+            resp.sendRedirect(config.getBaseUrl() + "editlocation");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void addLocation(HttpServletRequest req, HttpServletResponse resp) {
+        String accessToken = getCookie(req, "accessToken");
+        String locationStr = req.getParameter("location");
+
+        Location location = new Location();
+        location.setLocation(locationStr);
+
+        if(!getOjekLocationService().addLocation(accessToken, location)){
+            req.setAttribute("errorMessage", "Internal server error.");
+        }
+
+        try {
+            resp.sendRedirect(config.getBaseUrl() + "editlocation");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void deleteLocation(HttpServletRequest req) {
+        String accessToken = getCookie(req, "accessToken");
+        Integer locId = Integer.valueOf(req.getParameter("loc_id"));
+
+        if(!getOjekLocationService().deleteLocation(accessToken, locId)){
+            req.setAttribute("errorMessage", "Internal server error.");
+        }
+    }
+
+    private void hideOrderDriver(HttpServletRequest req, HttpServletResponse resp) {
+        String accessToken = getCookie(req, "accessToken");
+        String id = req.getParameter("id");
+        if(!getOjekOrderService().hideOrderDriver(accessToken, Integer.valueOf(id))){
+            req.setAttribute("errorMessage", "Internal server error.");
+        }
+    }
+
+    private void hideOrderCustomer(HttpServletRequest req, HttpServletResponse resp) {
+        String accessToken = getCookie(req, "accessToken");
+        String id = req.getParameter("id");
+        if(!getOjekOrderService().hideOrderCustomer(accessToken, Integer.valueOf(id))){
+            req.setAttribute("errorMessage", "Internal server error.");
+        }
+    }
+
+
+    private User[] getPrefDriver(HttpServletRequest req){
+        String accessToken = getCookie(req, "accessToken");
+        String destLoc= req.getParameter( "loc");
+        String pickLoc= req.getParameter("dest");
+        String driverName= req.getParameter("pref");
+
+        UserService userService = getOjekUserService();
+        User[] driverList = userService.getPrefDriver(accessToken, driverName, pickLoc, destLoc);
+        return driverList;
+    }
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/WebappServlet.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/WebappServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f77fd9c1f96421cba721529ff88fd33a684d85f
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/WebappServlet.java
@@ -0,0 +1,182 @@
+package com.jauharteam.ojek.webapp;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.jauharteam.ojek.identity.IdentityService;
+import com.jauharteam.ojek.ojek.LocationService;
+import com.jauharteam.ojek.ojek.OrderService;
+import com.jauharteam.ojek.ojek.UserService;
+import com.ojek.common.util.RestUtil;
+import com.ojek.common.util.StringUtil;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public abstract class WebappServlet extends HttpServlet {
+
+    protected Config config;
+    protected ServletContext servletContext;
+
+    public IdentityService getIdentityService() {
+        try {
+            URL url = new URL(config.getIdentityServicePath());
+            QName qname = new QName("http://identity.ojek.jauharteam.com/", "IdentityServiceImplService");
+            Service service = Service.create(url, qname);
+            IdentityService serviceInterface = service.getPort(IdentityService.class);
+            return serviceInterface;
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public UserService getOjekUserService() {
+        try {
+            URL url = new URL(config.getUserServicePath());
+            QName qname = new QName("http://user.ojek.ojek.jauharteam.com/", "UserServiceImplService");
+            Service service = Service.create(url, qname);
+            UserService serviceInterface = service.getPort(UserService.class);
+            return serviceInterface;
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public LocationService getOjekLocationService() {
+        try {
+            URL url = new URL(config.getLocationServicePath());
+            QName qname = new QName("http://location.ojek.ojek.jauharteam.com/", "LocationServiceImplService");
+            Service service = Service.create(url, qname);
+            LocationService serviceInterface = service.getPort(LocationService.class);
+            return serviceInterface;
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public OrderService getOjekOrderService() {
+        try {
+            URL url = new URL(config.getOrderServicePath());
+            QName qname = new QName("http://order.ojek.ojek.jauharteam.com/", "OrderServiceImplService");
+            Service service = Service.create(url, qname);
+            OrderService serviceInterface = service.getPort(OrderService.class);
+            return serviceInterface;
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Override
+    public void init(ServletConfig servletConfig) {
+        servletContext = servletConfig.getServletContext();
+        config = (Config) servletContext.getAttribute("webappConfig");
+    }
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        System.out.println(req.getMethod() + ":" + req.getServletPath());
+        String tokenExpiredString = getCookie(req,"tokenExpired");
+        if (tokenExpiredString != null) {
+            Date expired = StringUtil.stringToDate(getCookie(req, "tokenExpired"));
+            if (new Date().after(expired)) {
+                Map<String, String> params = new HashMap<>();
+                params.put("token", getCookie(req, "accessToken"));
+                params.put("refresh", getCookie(req, "refreshToken"));
+                String responseStr = RestUtil.httpPost(config.getIdentityRestPath() + "refresh", params);
+
+                if (responseStr == null)
+                    req.setAttribute("errorMessage", "Internal server error.");
+                else {
+                    ObjectMapper objectMapper = new ObjectMapper();
+                    JsonNode responseNode = objectMapper.readTree(responseStr);
+                    if (responseNode != null && responseNode.get("success").asBoolean()) {
+                        String accessToken = responseNode.get("accessToken").asText();
+                        String refreshToken = responseNode.get("refreshToken").asText();
+                        String expiredToken = responseNode.get("expired").asText();
+
+                        resp.addCookie(new Cookie("accessToken", accessToken));
+                        resp.addCookie(new Cookie("refreshToken", refreshToken));
+                        resp.addCookie(new Cookie("tokenExpired", expiredToken));
+                        setCookie(req, "accessToken", accessToken);
+                        setCookie(req, "refreshToken", refreshToken);
+                        setCookie(req, "tokenExpired", expiredToken);
+
+                        resp.sendRedirect(config.getBaseUrl() + "profile");
+                        return;
+                    } else {
+                        String errorMessage = responseNode.get("errorMessage").asText();
+                        if (errorMessage == null)
+                            errorMessage = "Wrong username and password";
+                        req.setAttribute("errorMessage", errorMessage);
+                    }
+                }
+            }
+        }
+        req.setAttribute("identityService", getIdentityService());
+        req.setAttribute("userService", getOjekUserService());
+        req.setAttribute("orderService", getOjekOrderService());
+        req.setAttribute("locationService", getOjekLocationService());
+
+        System.out.println("call servlet");
+        super.service(req, resp);
+    }
+
+    protected String getCookie(HttpServletRequest request, String name) {
+        if (name == null || request == null || request.getCookies() == null)
+            return null;
+        for (Cookie cookie : request.getCookies())
+            if (name.equals(cookie.getName()))
+                return cookie.getValue();
+        return null;
+    }
+
+    protected void setCookie(HttpServletRequest request, String name, String value) {
+        if (name == null || request == null || request.getCookies() == null)
+            return;
+        for (Cookie cookie : request.getCookies())
+            if (name.equals(cookie.getName())) {
+                cookie.setValue(value);
+                break;
+            }
+        return;
+    }
+
+    protected Boolean checkIsLoggedIn(HttpServletRequest request) {
+        String token = getCookie(request, "accessToken");
+        if (token == null)
+            return false;
+        return getIdentityService().isTokenValid(token);
+    }
+
+    public Map<String, String> getAllParam(HttpServletRequest req) throws IOException {
+        Map params = req.getParameterMap();
+        Map<String, String> res = new HashMap<>();
+        Iterator i = params.keySet().iterator();
+
+        while (i.hasNext()){
+            String key = (String) i.next();
+            String value = ((String[]) params.get(key))[0];
+            res.put(key,value);
+        }
+        return res;
+
+    }
+
+}
diff --git a/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/WebappServletBootstrapper.java b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/WebappServletBootstrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..fde8b40737ea1775899aa061e334a4b53145ae02
--- /dev/null
+++ b/PrOjek/webapp/src/main/java/com/jauharteam/ojek/webapp/WebappServletBootstrapper.java
@@ -0,0 +1,34 @@
+package com.jauharteam.ojek.webapp;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import java.io.File;
+
+public class WebappServletBootstrapper implements ServletContextListener {
+  @Override
+  public void contextInitialized(ServletContextEvent sce) {
+    ServletContext servletContext = sce.getServletContext();
+
+    String configFile = servletContext.getRealPath("/WEB-INF/classes/config.json");
+
+    ObjectMapper objectMapper = new ObjectMapper();
+    try {
+      Config config = objectMapper.readValue(new File(configFile), Config.class);
+      servletContext.setAttribute("webappConfig", config);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Override
+  public void contextDestroyed(ServletContextEvent sce) {
+    ServletContext servletContext = sce.getServletContext();
+    servletContext.setAttribute("webappIdentityService", null);
+    servletContext.setAttribute("webappOjekUserService", null);
+    servletContext.setAttribute("webappOjekOrderService", null);
+    servletContext.setAttribute("webappOjekLocationService", null);
+  }
+}
diff --git a/PrOjek/webapp/src/main/resources/.gitignore b/PrOjek/webapp/src/main/resources/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..0cffcb348ff9cec9cd41492a9e5c5a41d86ce96e
--- /dev/null
+++ b/PrOjek/webapp/src/main/resources/.gitignore
@@ -0,0 +1 @@
+config.json
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/resources/config.json.example b/PrOjek/webapp/src/main/resources/config.json.example
new file mode 100644
index 0000000000000000000000000000000000000000..a7b8129ae07862d816039273b166982cbad07de7
--- /dev/null
+++ b/PrOjek/webapp/src/main/resources/config.json.example
@@ -0,0 +1,8 @@
+{
+  "identityRestPath": "http://localhost:8080/identity/",
+  "identityServicePath": "http://localhost:8080/identity/service?wsdl",
+  "userServicePath": "http://localhost:8080/ojek/user?wsdl",
+  "orderServicePath": "http://localhost:8080/ojek/order?wsdl",
+  "locationServicePath": "http://localhost:8080/ojek/location?wsdl",
+  "baseUrl": "http://localhost:8080/webapp/"
+}
diff --git a/PrOjek/webapp/src/main/webapp/WEB-INF/web.xml b/PrOjek/webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..331a599ea9a27de85ed924951c657f5ee8ca586b
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+         version="3.1">
+
+    <listener>
+        <listener-class>
+            com.jauharteam.ojek.webapp.WebappServletBootstrapper
+        </listener-class>
+    </listener>
+
+    <servlet>
+        <servlet-name>index</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.IndexServlet</servlet-class>
+    </servlet>
+    <servlet>
+        <servlet-name>login</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.LoginServlet</servlet-class>
+    </servlet>
+    <servlet>
+        <servlet-name>logout</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.LogoutServlet</servlet-class>
+    </servlet>
+    <servlet>
+        <servlet-name>signup</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.RegisterServlet</servlet-class>
+    </servlet>
+    <servlet>
+        <servlet-name>profile</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.ProfileServlet</servlet-class>
+    </servlet>
+    <servlet>
+        <servlet-name>order</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.OrderServlet</servlet-class>
+    </servlet>
+    <servlet>
+        <servlet-name>history</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.HistoryServlet</servlet-class>
+    </servlet>
+    <servlet>
+        <servlet-name>editlocation</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.EditLocationServlet</servlet-class>
+    </servlet>
+    <servlet>
+        <servlet-name>editprofile</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.EditProfileServlet</servlet-class>
+    </servlet>
+    <servlet>
+        <servlet-name>SOAPServlet</servlet-name>
+        <servlet-class>com.jauharteam.ojek.webapp.SOAPServlet</servlet-class>
+    </servlet>
+
+    <welcome-file-list>
+        <welcome-file>/login</welcome-file>
+    </welcome-file-list>
+
+    <servlet-mapping>
+        <servlet-name>login</servlet-name>
+        <url-pattern>/login</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>logout</servlet-name>
+        <url-pattern>/logout</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>signup</servlet-name>
+        <url-pattern>/signup</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>profile</servlet-name>
+        <url-pattern>/profile</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>order</servlet-name>
+        <url-pattern>/order</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>history</servlet-name>
+        <url-pattern>/history</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>editlocation</servlet-name>
+        <url-pattern>/editlocation</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>editprofile</servlet-name>
+        <url-pattern>/editprofile</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>SOAPServlet</servlet-name>
+        <url-pattern>/soapservlet</url-pattern>
+    </servlet-mapping>
+</web-app>
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/editlocation.jsp b/PrOjek/webapp/src/main/webapp/editlocation.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..ce161e02d02744ffdbcb9a490498ed2c237ed451
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/editlocation.jsp
@@ -0,0 +1,7 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<jsp:include page="/views/header.jsp" />
+
+<jsp:include page="/views/edit_location.jsp" />
+
+<jsp:include page="/views/footer.jsp" />
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/editprofile.jsp b/PrOjek/webapp/src/main/webapp/editprofile.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..e7cafaf274e60ccb21fa7149bf0fa5df2551ed58
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/editprofile.jsp
@@ -0,0 +1,7 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<jsp:include page="/views/header.jsp" />
+
+<jsp:include page="/views/edit_profile.jsp" />
+
+<jsp:include page="/views/footer.jsp" />
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/history.jsp b/PrOjek/webapp/src/main/webapp/history.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..1983d5f5a1252fc9c309366952ac81f671a94793
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/history.jsp
@@ -0,0 +1,7 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<jsp:include page="/views/header.jsp" />
+
+<jsp:include page="/views/history_view.jsp" />
+
+<jsp:include page="/views/footer.jsp" />
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/index.jsp b/PrOjek/webapp/src/main/webapp/index.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..a74b2f45194173f0e8442a746611bb47ee10353a
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/index.jsp
@@ -0,0 +1,3 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<jsp:include page="views/login_view.jsp" />
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/login.jsp b/PrOjek/webapp/src/main/webapp/login.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..74b940fd2433a54338207c51583d2b76d64eb318
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/login.jsp
@@ -0,0 +1,3 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<jsp:include page="/views/login_view.jsp" />
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/order.jsp b/PrOjek/webapp/src/main/webapp/order.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..4356b316f6bf90074c172de3eee50e48e63f562b
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/order.jsp
@@ -0,0 +1,7 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<jsp:include page="/views/header.jsp" />
+
+<jsp:include page="/views/order_view.jsp" />
+
+<jsp:include page="/views/footer.jsp" />
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/profile.jsp b/PrOjek/webapp/src/main/webapp/profile.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..5a89f952bb0c5459ee56b8a082a4245858d2c2d2
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/profile.jsp
@@ -0,0 +1,7 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<jsp:include page="/views/header.jsp" />
+
+<jsp:include page="/views/profile_view.jsp" />
+
+<jsp:include page="/views/footer.jsp" />
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/resources/css/element.css b/PrOjek/webapp/src/main/webapp/resources/css/element.css
new file mode 100644
index 0000000000000000000000000000000000000000..916fc87b443e076a3f9142d0cc0401189281d88d
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/css/element.css
@@ -0,0 +1,235 @@
+.input-standard {
+    background: white;
+    border: 1px solid gray;
+}
+.input-standard-v2 {
+    height: 25px;
+    width: 100%;
+    padding: 0 5px;
+}
+.button {
+    border: 1px solid black;
+    padding: 5px;
+    color: #000;
+    text-align: center;
+    text-decoration: none;
+    cursor: pointer;
+}
+.button-success,
+.button-fail,
+.button-green {
+    border-radius: 10%;
+    padding: 10px;
+}
+.button-fail {
+    background: #CD0428;
+}
+.button-fail:hover {
+    background: #fee6ea;
+}
+.button-plain {
+    background: white;
+}
+.button-plain {
+    color: black;
+    background: white;
+}
+.button-success {
+    background: #2BAC2F;
+}
+.button-success:hover {
+    background: #ebfaeb;
+}
+.button-green {
+    border-radius: 10%;
+    background: #82D800;
+    font-family: Rockwell;
+    border: 2px solid black;
+}
+.button-progress-now {
+    background: #FFFF9D;
+    color: #666;
+}
+.button-disable {
+    cursor: default;
+}
+.button-upload {
+    background-color: #ccc;
+    border: 1px solid gray;
+    text-align: center;
+    text-decoration: none;
+    display: inline-block;
+    font-size: 11px;
+    line-height: 25px;
+    height: 25px;
+    padding: 0;
+}
+.button-add {
+    margin: 0 auto;
+    padding: 0 10px !important;
+    text-align: center;
+    line-height: 25px;
+    height: 25px;
+}
+.circle-numbering {
+    color: #222;
+    background: gray;
+    border-radius: 50%;
+    text-align: center;
+}
+.switch {
+    position: relative;
+    float: right;
+    display: inline-block;
+    width: 40px;
+    height: 24px;
+}
+.switch input {
+    display: none;
+}
+.slider {
+    position: absolute;
+    cursor: pointer;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: #ccc;
+    -webkit-transition: .4s;
+    transition: .4s;
+    border-radius: 12px;
+}
+.slider:before {
+    position: absolute;
+    content: "";
+    height: 16px;
+    width: 16px;
+    left: 4px;
+    bottom: 4px;
+    background-color: white;
+    -webkit-transition: .4s;
+    transition: .4s;
+    border-radius: 50%;
+}
+input:checked + .slider {
+    background-color: #035503;
+}
+input:checked + .slider:before {
+    -webkit-transform: translateX(14px);
+    -ms-transform: translateX(14px);
+    transform: translateX(14px);
+}
+.rating-list {
+    list-style: none;
+    width: 60%;
+    margin: 0px auto;
+    text-align: center;
+}
+.rating-element {
+    width: 20%;
+    float: left;
+    color: gray;
+    cursor: pointer;
+    transition: color 0.5s ease-out;
+    -webkit-transition: color 0.5s ease-out;
+    -moz-transition: color 0.5s ease-out;
+    -o-transition: color 0.5s ease-out;
+}
+
+.warning {
+    color: #ff0000;
+}
+
+.no-border {
+    border: 0px !important;
+}
+
+.form-order {
+    display: none;
+}
+.form-order-default {
+    display: block;
+}
+.error{
+    border: 2px solid red;
+    border-radius: 4px;
+}
+
+/* The Modal (background) */
+.modalview {
+    display: none; /* Hidden by default */
+    position: fixed; /* Stay in place */
+    z-index: 1; /* Sit on top */
+    padding-top: 100px; /* Location of the box */
+    left: 0;
+    top: 0;
+    width: 100%; /* Full width */
+    height: 100%; /* Full height */
+    overflow: auto; /* Enable scroll if needed */
+    background-color: rgb(0,0,0); /* Fallback color */
+    background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
+}
+
+/* Modal Content */
+.modal-content {
+    background-color: #fefefe;
+    margin: auto;
+    padding: 20px;
+    border: 1px solid #888;
+    width: 75%;
+}
+
+.scrollable {
+    max-height: 200px;
+    overflow: auto;
+}
+
+/* The Close Button */
+.closemodal {
+    color: #aaaaaa;
+    float: right;
+    font-size: 28px;
+    font-weight: bold;
+}
+
+.close:hover,
+.close:focus {
+    color: #000;
+    text-decoration: none;
+    cursor: pointer;
+}
+.buttonmodal {
+	border : 2px solid black;
+}
+.modal-text{
+	font-size : 20pt;
+	font-family :Rockwell;
+	color :gray;
+	text-align: center;
+}
+.modal-options{
+	text-align:center;
+	margin-top : 20px;
+}
+
+.warning-box{
+    padding: 10px;
+    background-color: #f44336;
+    color: white;
+    transition: 0.2s;
+}
+
+.closebtn {
+    margin-left: 15px;
+    color: white;
+    font-weight: bold;
+    float: right;
+    font-size: 22px;
+    line-height: 20px;
+    cursor: pointer;
+    transition: 0.3s;
+}
+
+.closebtn:hover {
+    color: black;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/resources/css/order.css b/PrOjek/webapp/src/main/webapp/resources/css/order.css
new file mode 100644
index 0000000000000000000000000000000000000000..c83515d7006b3febc3cae73e76fe4e2064a3bbd7
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/css/order.css
@@ -0,0 +1,16 @@
+.form-order {
+    display: none;
+}
+.form-order-default {
+    display: block;
+}
+.error{
+    border: 2px solid red;
+    border-radius: 4px;
+}
+.show-step{
+    display: block;
+}
+.hidden-step{
+    display: none;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/resources/css/select_driver.css b/PrOjek/webapp/src/main/webapp/resources/css/select_driver.css
new file mode 100644
index 0000000000000000000000000000000000000000..94122a509aa2363f186dfebbc3c3d7abad9a39e3
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/css/select_driver.css
@@ -0,0 +1,45 @@
+#no-pref, #no-other-driver {
+    font-size: 13pt;
+    color: gray;
+    text-align: center;
+}
+
+div.image-container{
+    width: 100px;
+    height: 100px;
+    overflow: hidden;
+    position: relative;
+}
+
+img.driver-image{
+    position: absolute;
+    left: -1000%;
+    right: -1000%;
+    top: -1000%;
+    bottom: -1000%;
+    margin: auto;
+    height: 100px;
+    min-width: auto;
+}
+
+.driver-name{
+    font-size: 15pt;
+}
+
+.driver-rating{
+    font-size: 8pt;
+}
+
+.rating{
+    color: orange;
+}
+
+.choose-button{
+    float: right;
+}
+
+.driver-detail{
+    vertical-align: center;
+    height: 100px;
+}
+
diff --git a/PrOjek/webapp/src/main/webapp/resources/css/style.css b/PrOjek/webapp/src/main/webapp/resources/css/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..c06f769fe37ab82ea4ade7b22e7c3ebd509b961b
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/css/style.css
@@ -0,0 +1,424 @@
+/* css reset */
+
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+}
+li {
+    list-style: none;
+}
+html {
+    font-family: "Times New Roman", Times, serif;
+    font-size: 14px;
+    line-height: 20px;
+}
+/* typography */
+@font-face {
+  font-family: 'Material Icons';
+  font-style: normal;
+  font-weight: 400;
+  src: url('../fonts/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2') format('woff2');
+}
+
+.material-icons {
+  font-family: 'Material Icons';
+  font-weight: normal;
+  font-style: normal;
+  font-size: 24px;
+  line-height: 1;
+  letter-spacing: normal;
+  text-transform: none;
+  display: inline-block;
+  white-space: nowrap;
+  word-wrap: normal;
+  direction: ltr;
+  -moz-font-feature-settings: 'liga';
+  -moz-osx-font-smoothing: grayscale;
+}
+
+@font-face {
+    font-family: Oswald;
+    src: url('../fonts/Oswald-Regular.ttf');
+}
+@font-face {
+    font-family: Oswald;
+    font-weight: bold;
+    src: url('../fonts/Oswald-Medium.ttf');
+}
+a:link {
+    color: #000;
+    text-decoration: none;
+}
+a:visited {
+    color: #000;
+    text-decoration: none;
+}
+a:hover {
+    color: #ff0000;
+    text-decoration: underline;
+}
+a:active {
+    color: yellow;
+    text-decoration: underline;
+}
+
+a:hover {
+    cursor: pointer;
+}
+p {
+    margin: 3px;
+}
+.logo {
+    font-family: "Times New Roman", Times, serif;
+}
+.tagline {
+    font-family: "Times New Roman", Times, serif;
+    font-size: 8pt;
+    font-weight: lighter;
+    text-transform: none;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+    margin: 10px 0;
+    font-family: Oswald, sans-serif;
+    font-weight: bold;
+    text-transform: uppercase;
+}
+h1 {
+    font-size: 30px;
+}
+h2 {
+    font-size: 26px;
+}
+h3 {
+    font-size: 20px;
+}
+h4 {
+    font-size: 18px;
+}
+h5 {
+    font-size: 16px;
+}
+h6 {
+    font-size: 14px;
+}
+.align-left {
+    text-align: left;
+}
+.align-right {
+    text-align: right;
+}
+.align-center {
+    text-align: center;
+}
+/* 12 grid system */
+
+.row:after {
+    content: "";
+    display: table;
+    clear: both;
+}
+.col-1,
+.col-2,
+.col-3,
+.col-4,
+.col-5,
+.col-6,
+.col-7,
+.col-8,
+.col-9,
+.col-10,
+.col-11,
+.col-12 {
+    float: left;
+    padding: 5px;
+}
+.col-1 {
+    width: 8.333333333%;
+}
+.col-2 {
+    width: 16.666666666%;
+}
+.col-3 {
+    width: 25%;
+}
+.col-4 {
+    width: 33.333333333%;
+}
+.col-5 {
+    width: 41.666666667%;
+}
+.col-6 {
+    width: 50%;
+}
+.col-7 {
+    width: 58.333333333%;
+}
+.col-8 {
+    width: 66.666666667%;
+}
+.col-9 {
+    width: 75%;
+}
+.col-10 {
+    width: 83.333333333%;
+}
+.col-11 {
+    width: 91.666666667%;
+}
+.col-12 {
+    width: 100%;
+}
+/* login page */
+
+h3.headstyle {
+    margin: 0;
+    color: #02702c;
+    font-size: 38px;
+}
+.loginform {
+    font-family: Rockwell;
+    font-size: 11pt;
+    color: #02702c;
+}
+.loginformup {
+    font-family: Calibri;
+    font-size: 15pt;
+    color: #02702c;
+}
+.logincontainer {
+    margin-top: 75px;
+}
+.signupcontainer {
+    margin-top: 25px;
+}
+hr.loginhr {
+    margin: 10px;
+    border: 0;
+    border-top: 2px solid #02702c;
+    width: 80px;
+}
+#username-ok, #email-ok{
+    color: black;
+    display: none;
+}
+
+#username-no, #email-no{
+    color: red;
+    display: none;
+}
+/* header */
+
+.navbar {
+    font-family: Arial, Helvetica, sans-serif;
+    text-transform: uppercase;
+}
+.navbar a {
+    text-decoration: none;
+    color: #000;
+    font-weight: bold;
+}
+.navbar li:hover {
+    background-color: #e6fee6;
+}
+.active {
+    background-color: #035503;
+}
+.active a {
+    color: #fff;
+}
+li.active:hover {
+    background-color: #047b04;
+}
+/* login page */
+
+.login-extern-container {
+    width: 400px;
+    min-height: 450px;
+    border: 10px solid #02702c;
+    border-radius: 60px;
+    background: #8bbd3c;
+    margin: 20px auto;
+    padding: 40px 20px;
+    box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
+    transition: 0.3s;
+}
+/* main page */
+
+.default-extern-container {
+    width: 400px;
+    min-height: 500px;
+    box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
+    transition: 0.3s;
+    margin: 20px auto;
+    padding: 15px;
+}
+
+.default-extern-container:hover, .login-extern-container:hover {
+    box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
+}
+
+.container {
+    margin: 5px 0;
+    padding: 5px;
+}
+/* misc */
+
+.standard-border {
+    border: 1px solid black;
+}
+.rounded-border {
+    border: 1px solid black;
+    border-radius: 5px;
+}
+.margin-top {
+    margin-top: 30px;
+}
+.center {
+    margin: 0px auto;
+}
+.right {
+    float: right;
+}
+.edit-icon {
+    color:#F78B07 !important;
+}
+.delete-icon {
+    color: #E31508 !important;
+}
+.edit-icon:hover {
+    color:#fddcb5 !important;
+}
+.delete-icon:hover {
+    color:#fb8c84 !important;
+}
+/* order page & history */
+
+#no-history, #no-previous {
+    font-size: 13pt;
+    color: gray;
+    text-align: center;
+}
+.date {
+    line-height: 100%;
+    font-family: Rockwell;
+    font-size: 10pt;
+    color: gray;
+}
+.driver-detail {
+    vertical-align: center;
+    height: 100px;
+}
+.driver-name {
+    line-height: 100%;
+    font-family: Rockwell;
+    font-size: 12pt;
+    color: black;
+}
+.driver-username{
+    font-size: 18px;
+    text-align: center;
+    font-weight: bold;
+}
+
+/*
+.driver-name{
+    font-size: 15px;
+    text-align: center;
+}
+*/
+.text {
+    font-size: 8pt;
+    margin-bottom: 3px;
+    line-height: 110%;
+    font-family: Rockwell;
+    color: black;
+}
+.rating {
+    color: orange;
+    font-family: Rockwell;
+    font-size: 10pt;
+}
+.comment {
+    line-height: 115%;
+    margin-left: 10px;
+    color: black;
+    font-family: Calibri;
+    font-size: 8pt;
+}
+#comment-area {
+    width: 100%;
+    resize: none;
+    padding: 5px;
+    font-family: "Times New Roman", Times, serif;
+}
+#no-pref,
+#no-other-driver {
+    font-size: 13pt;
+    color: gray;
+    text-align: center;
+}
+/* picture */
+
+.picture {
+    width: 100px;
+    height: 100px;
+    overflow: hidden;
+    border: 1px solid #000;
+}
+.driver-picture {
+    width: 85px;
+    height: 85px;
+}
+.profile-picture {
+    border: 5px solid #444;
+    border-radius: 50%;
+}
+.edit-picture img, .picture img {
+    min-height: 100%;
+    max-width: 100%;
+    /* margin-left: -50%; */
+}
+/* .driver-picture img {
+     max-height: 100px;
+ } */
+.profile-info .username {
+    font-weight: bold;
+}
+.profile-info {
+    font-family: "Trebuchet MS", Helvetica, sans-serif;
+    text-align: center;
+    margin: 10px 0;
+}
+/* profile page */
+.upload-bar {
+    height: 25px;
+}
+.file-upload {
+    position: relative;
+    overflow: hidden;
+}
+.file-upload input.upload {
+    position: absolute;
+    top: 0;
+    right: 0;
+    width: 100%;
+    height: 25px;
+    cursor: pointer;
+    opacity: 0;
+    filter: alpha(opacity=0);
+}
+table.location_table {
+    width: 100%;
+    border-collapse: collapse;
+}
+.location_table th,
+.location_table td {
+    border: 1px solid black;
+    padding: 0px 10px;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/resources/fonts/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2 b/PrOjek/webapp/src/main/webapp/resources/fonts/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..1a6c76f548e312c872d9013e62019bee5e85b4ea
Binary files /dev/null and b/PrOjek/webapp/src/main/webapp/resources/fonts/2fcrYFNaTjcS6g4U3t-Y5ZjZjT5FdEJ140U2DJYC3mY.woff2 differ
diff --git a/PrOjek/webapp/src/main/webapp/resources/fonts/Oswald-Medium.ttf b/PrOjek/webapp/src/main/webapp/resources/fonts/Oswald-Medium.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..f476c60cac157cc7d6dd787e3183f22800fe9dc6
Binary files /dev/null and b/PrOjek/webapp/src/main/webapp/resources/fonts/Oswald-Medium.ttf differ
diff --git a/PrOjek/webapp/src/main/webapp/resources/fonts/Oswald-Regular.ttf b/PrOjek/webapp/src/main/webapp/resources/fonts/Oswald-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..47b964383884a63f6826ad362f25b0673eeea038
Binary files /dev/null and b/PrOjek/webapp/src/main/webapp/resources/fonts/Oswald-Regular.ttf differ
diff --git a/PrOjek/webapp/src/main/webapp/resources/images/pikachu.png b/PrOjek/webapp/src/main/webapp/resources/images/pikachu.png
new file mode 100644
index 0000000000000000000000000000000000000000..0038205c2c213ff042cb7835a0f5a96044bf0fcf
Binary files /dev/null and b/PrOjek/webapp/src/main/webapp/resources/images/pikachu.png differ
diff --git a/PrOjek/webapp/src/main/webapp/resources/images/togepi.png b/PrOjek/webapp/src/main/webapp/resources/images/togepi.png
new file mode 100644
index 0000000000000000000000000000000000000000..68343df12fa387b88132b5d44baf2e696c7785c3
Binary files /dev/null and b/PrOjek/webapp/src/main/webapp/resources/images/togepi.png differ
diff --git a/PrOjek/webapp/src/main/webapp/resources/js/ajax.js b/PrOjek/webapp/src/main/webapp/resources/js/ajax.js
new file mode 100644
index 0000000000000000000000000000000000000000..da5d425f8cb532dc633637c412e3b74025980ee8
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/js/ajax.js
@@ -0,0 +1,26 @@
+function getAjax(url, success) {
+    var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+    xhr.open('GET', url);
+    xhr.onreadystatechange = function() {
+        if (xhr.readyState>3 && xhr.status==200) success(xhr.responseText);
+    };
+    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+    xhr.send();
+    return xhr;
+}
+
+function postAjax(url, data, success) {
+    var params = typeof data == 'string' ? data : Object.keys(data).map(
+            function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) }
+        ).join('&');
+
+    var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
+    xhr.open('POST', url);
+    xhr.onreadystatechange = function() {
+        if (xhr.readyState>3 && xhr.status==200) { success(xhr.responseText); }
+    };
+    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+    xhr.send(params);
+    return xhr;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/resources/js/edit_location.js b/PrOjek/webapp/src/main/webapp/resources/js/edit_location.js
new file mode 100644
index 0000000000000000000000000000000000000000..55898acf083c1c54d3cde31e85eff87b71a66da4
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/js/edit_location.js
@@ -0,0 +1,98 @@
+function deleteLocation(id, pref, locId){
+    var delElmt = document.getElementById("row-"+pref);
+    // var locId = delElmt.getElementsByClassName('location-name')[0].textContent;
+    var url = '/soapservlet';
+    console.log(locId)
+    postAjax(url, {id: id, name: "delete-location", loc_id: locId}, function(data){
+        console.log(data);
+    });
+    delElmt.parentNode.removeChild(delElmt);  
+    for(var i = pref+1; i <= nbPref; i++){
+        console.log(i)
+        var row = document.getElementById("row-"+i).getElementsByClassName('location-pref')[0];
+        var prefNow = row.innerHTML - 1;
+        row.innerHTML = prefNow;
+        document.getElementById("row-"+i).setAttribute("id", "row-" + prefNow);
+        var deleteElmt = document.getElementById('delete-link-'+i);
+        deleteElmt.setAttribute("id", "delete-link-"+prefNow);
+        deleteElmt.setAttribute("onclick", "deleteLocation("+id+","+prefNow+")");
+        var editElmt = document.getElementById('edit-link-'+i);
+        editElmt.setAttribute("id", "edit-link-"+prefNow);
+        editElmt.setAttribute("onclick", "editLocation("+id+","+prefNow+")");
+    }
+    nbPref--;
+    if(nbPref == 0){
+        document.getElementById('no-data-row').style.display = 'table-row';
+    }
+}
+
+document.getElementById('location').onkeyup = function(event){
+    var character = event.which;
+    if (character>40 || character <37){
+        var locNow = document.getElementById('location').value;
+        var suggestTag = document.getElementById('suggestLoc');
+        if(locNow.length > 0){
+            var url = "helpers/ajax/location_searcher.php?location=" + locNow;
+            getAjax(url, function(data){
+                suggestTag.innerHTML = '';
+                var suggestion = JSON.parse(data);
+                for(var i = 0; i < suggestion.length; i++){
+                    var option = document.createElement("option");
+                    option.setAttribute("value", suggestion[i]);
+                    suggestTag.appendChild(option);
+                }
+            });
+        } else {
+            suggestTag.innerHTML = '';
+        }
+    }
+}
+
+document.getElementById('submit-add-location').onclick = function(){
+    var location = document.getElementById('location').value;
+    var suggestList = document.getElementById('suggestLoc').childNodes;
+    var found = false;
+    var i = 0;
+    while(!found && i < suggestList.length){
+        if(location == suggestList[i].value){
+            found = true;
+        } else {
+            i++;
+        }
+    } if (found){
+        var url = 'add_preferred_location.php';
+        postAjax(url, {id: id, loc: location, pref: nbPref+1}, function(data){
+            console.log(data);
+            if(data == true){
+                var addRow = "<td class='number'>"+(nbPref+1)+"</td><td class='location'>"+location+"</td>";
+                addRow += "<td class='option'><div class='row'><div class='col-6'><a class='edit-icon' id='edit-"+(nbPref+1)+" onclick='editLocation("+id+","+(nbPref+1)+")'><i class='material-icons md-36'>edit</i></a>";
+                addRow += "</div><div class='col-6'>"+"<a class='delete-icon' id='delete-"+(nbPref+1)+" onclick='deleteLocation("+id+","+(nbPref+1)+")'><i class='material-icons md-36'>clear</i></a>";
+                addRow += "</div></div></td>";
+                var createElement = document.createElement('tr');
+                createElement.setAttribute("id", "row-"+(nbPref+1));
+                createElement.innerHTML = addRow;
+                document.getElementById('location_table').appendChild(createElement);
+                nbPref++;
+            } else {
+                console.log('nooo');
+            }
+        });
+    }
+}
+
+function editLocation(id, pref){
+    var editElmt = document.getElementById("row-"+pref);
+    var location = editElmt.getElementsByClassName('location')[0].textContent;
+    var pref_num = editElmt.getElementsByClassName('number')[0].textContent;
+    var delete_box = document.getElementById('delete-'+pref);
+    document.getElementById('edit-link-'+pref).style.display='none';
+    document.getElementById('delete-link-'+pref).style.display='none';
+    document.getElementById('submit-edited-location-'+pref).style.display='block';
+    editElmt.getElementsByClassName('location-name')[0].innerHTML = ""
+    document.getElementById('loc-row-'+pref).style.display = "block"
+    // editElmt.getElementsByClassName('location-pref')[0].innerHTML = ""
+    // document.getElementById('pref-row-'+pref).style.display = "block"
+    // var new_loc = document.getElementById('loc-row-'+pref).value
+    // var new_pref = document.getElementById('num-row-'+pref).value
+    delete_box.innerHTML = ""
+}
diff --git a/PrOjek/webapp/src/main/webapp/resources/js/edit_profile.js b/PrOjek/webapp/src/main/webapp/resources/js/edit_profile.js
new file mode 100644
index 0000000000000000000000000000000000000000..e3450cd53dff2eea1f28cfca8260fd6578e04caf
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/js/edit_profile.js
@@ -0,0 +1,25 @@
+function validate(element){
+    document.getElementById('warning-msg').innerHTML = '<span class="closebtn" onclick="this.parentElement.style.display = &quot;none&quot;;">&times;</span>';
+	var name = document.getElementById('name').value;
+	var phone = document.getElementById('phone').value;
+
+	var nameOK = (name.length <= 20);
+	var regexPhone = /^[0-9].{8,11}$/;
+    var phoneOK = regexPhone.test(phone);
+    if (!nameOK){
+        document.getElementById('warning-msg').style.display = 'block';
+    	document.getElementById('name').style.border = 'solid 1px red';
+        document.getElementById('warning-msg').innerHTML += '<div>Please enter name with no more than 20 char</div>';
+    } else {
+    	document.getElementById('name').style.border = 'solid 0.5px gray';
+    }
+
+    if (!phoneOK){
+        document.getElementById('warning-msg').style.display = 'block';
+    	document.getElementById('phone').style.border = 'solid 1px red';
+        document.getElementById('warning-msg').innerHTML += '<div>Please enter correct value for phone number</div>';
+    } else {
+    	document.getElementById('phone').style.border = 'solid 0.5px gray';
+    }
+	return (nameOK && phoneOK);
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/resources/js/history.js b/PrOjek/webapp/src/main/webapp/resources/js/history.js
new file mode 100644
index 0000000000000000000000000000000000000000..6cee68bb626e82e3d704cc19e9f7e791143eae82
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/js/history.js
@@ -0,0 +1,48 @@
+window.onload = function(){
+    document.getElementById("previous-order").style.display = "block";
+    document.getElementById("driver-history").style.display = "none";
+}
+
+function hideDriverHistory(baseurl, id){
+    postAjax(baseurl+'soapservlet', {name:"hide-driver-history", id : id}, function(data){
+        console.log(data)
+        window.location = baseurl + 'history';
+//        if (data == true){
+//            document.getElementById('history-' + id).style.display = "none";
+//            nbDriver--;
+//            if(nbDriver==0){
+//                document.getElementById('history-exist').style.display = "none";
+//                document.getElementById("no-history").style.display = "block";
+//            }
+//        }
+    })
+}
+
+function hidePreviousHistory(baseurl, id){
+    postAjax(baseurl+'soapservlet', {name:"hide-customer-history", id : id}, function(data){
+        console.log(data)
+        window.location = baseurl + 'history';
+//        if (data == true){
+//            document.getElementById('previous-' + id).style.display = "none";
+//            nbMyPrev--;
+//            if (nbMyPrev == 0) {
+//                document.getElementById('previous-exist').style.display = "none";
+//                document.getElementById("no-previous").style.display = "block";
+//            }
+//        }
+    })
+}
+
+function toDriverHistory(){
+    document.getElementById("driver-history").style.display = "block";
+    document.getElementById("driver-history-tab").className = "col-6 align-center standard-border active";
+    document.getElementById("previous-order").style.display = "none";
+    document.getElementById("previous-order-tab").className = "col-6 align-center standard-border";
+}
+
+function toPreviousOrder(){
+    document.getElementById("previous-order").style.display = "block";
+    document.getElementById("previous-order-tab").className = "col-6 align-center standard-border active";
+    document.getElementById("driver-history").style.display = "none";
+    document.getElementById("driver-history-tab").className = "col-6 align-center standard-border";
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/resources/js/order.js b/PrOjek/webapp/src/main/webapp/resources/js/order.js
new file mode 100644
index 0000000000000000000000000000000000000000..cb49bfb2bf1a1142291a51e7a12701a13b6106c8
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/js/order.js
@@ -0,0 +1,252 @@
+var rating = 0;
+var destination = null;;
+var pickingpoint = null;
+var idDriver = 0;
+var comment = null;
+var driver
+
+
+function nextToSelectDriver() {
+    var prev = 'select-destination'
+    var next = 'select-driver'
+    document.getElementById(prev).style.display = 'none';
+    document.getElementById(next).style.display = 'block';
+    document.getElementById("tab-"+prev).classList.remove("button-progress-now");
+    document.getElementById("tab-"+next).classList.add("button-progress-now");
+}
+function nextToCompleteOrder(){
+    var prev = 'select-driver'
+    var next = 'complete-order'
+	console.log('NENE')
+    document.getElementById(prev).style.display = 'none';
+    document.getElementById(next).style.display = 'block';
+    document.getElementById("tab-"+prev).classList.remove("button-progress-now");
+    document.getElementById("tab-"+next).classList.add("button-progress-now");
+}
+
+function changeTo(element){
+    var id = Number(element.id.charAt(7));
+    for(var i = 1; i <= 5; i++){
+        if(i<=id){
+            document.getElementById("rating-"+i).style.color = "orange";
+        } else {
+            document.getElementById("rating-"+i).style.color = "gray";
+        }
+    }
+}
+
+function changeBack(){
+    for(var i=1; i <= 5; i++){
+        if(i<=rating){
+            document.getElementById("rating-"+i).style.color = "orange";
+        } else {
+            document.getElementById("rating-"+i).style.color = "gray";
+        }
+    }
+}
+
+function rateThis(element){
+    var id = Number(element.id.charAt(7));
+    rating = id;
+    for(var i = 1; i <= 5; i++){
+        if(i<=rating){
+            document.getElementById("rating-"+i).style.color = "orange";
+        } else {
+            document.getElementById("rating-"+i).style.color = "gray";
+        }
+    }
+}
+
+function openOrder(step) {
+    var i, taborder, tablinks,active,tabchosen;
+    tablinks = document.getElementsByClassName("form-order-default");
+    for (i = 0; i < tablinks.length; i++) {
+        tablinks[i].className = tablinks[i].className.replace("form-order-default", "form-order");
+    }
+    active=document.getElementById(step);
+	active.className=document.getElementById(step).className.replace("form-order","form-order-default");
+	taborder = document.getElementsByClassName("taborder");
+	for (i = 0; i < taborder.length; i++) {
+		taborder[i].className=taborder[i].className.replace("button-progress-now","button-plain");
+	}
+    tabchosen = document.getElementById("tab-"+step);
+	tabchosen.className=tabchosen.className.replace("button-plain","button-progress-now");
+}
+
+function grabDriver(){
+    pickingpoint = document.getElementById('pickingpoint').value;
+    destination = document.getElementById('destination').value;
+    var preferreddriver = document.getElementById('preferreddriver').value;
+	var url = "/soapservlet";
+	if (preferreddriver != "") {
+        postAjax(url, {name: "get-driver", dest: destination, loc: pickingpoint, prefDriver: preferreddriver}, function (data1) {
+            console.log(data1);
+            var createElement = document.getElementById('prefer-driver');
+            var prefdetail = JSON.parse(data1);
+            var addRow = "";
+            if (prefdetail.hasOwnProperty('answer')) {
+                addRow += "<div id='no-pref'>Nothing to display :(</div>";
+            } else {
+                if (prefdetail.length > 0) {
+                    for (var i = 0; i < prefdetail.length; i++) {
+                        addRow += "<div class='row'>";
+                        addRow += "<div class='col-4'>";
+                        addRow += "<div class='picture driver-picture'>";
+                        addRow += "<img src='" + prefdetail[i]['profile_pic_url'] + "'>";
+                        addRow += "</div>";
+                        addRow += "</div>";
+                        addRow += "<div class='col-8 driver-detail'>";
+                        addRow += "<div class='driver-name'>";
+                        addRow += prefdetail[i]['name'];
+                        addRow += "</div>";
+                        addRow += "<div class='driver-rating'>";
+                        addRow += "<span style='color:orange'>&#9734;</span><span class='rating'>" + prefdetail[i]['rating'] + "</span>(" + prefdetail[i]['votes'] + " votes)";
+                        addRow += "</div>";
+                        addRow += "<div class='row'>";
+                        addRow += "<a href='#' class='button button-success right' id='" + prefdetail[i]['ID'] + "' onclick='selectDriver(this)'>I CH0OSE YOU!</a>";
+                        addRow += "</div></div></div>";
+                    }
+                } else {
+                    addRow += "<div id='no-pref'>Nothing to display :(</div>";
+                }
+            }
+            createElement.innerHTML = addRow;
+            nextToSelectDriver()
+        });
+    } else {
+        postAjax(url, {name: "get-driver", dest: destination, loc: pickingpoint}, function (data2) {
+            var driversdetail = JSON.parse(data2);
+            var createElement = document.getElementById('other-driver');
+            var addRow = "";
+            if (driversdetail.hasOwnProperty('answer')) {
+                addRow += "<div id='no-other-driver'>Nothing to display :(</div>";
+            } else {
+                if (driversdetail.length > 0) {
+                    for (var i = 0; i < driversdetail.length; i++) {
+                        addRow += "<div class='row'>";
+                        addRow += "<div class='col-4'>";
+                        addRow += "<div class='picture driver-picture'>";
+                        addRow += "<img src='" + driversdetail[i]['profile_pic_url'] + "'>";
+                        addRow += "</div>";
+                        addRow += "</div>";
+                        addRow += "<div class='col-8 driver-detail'>";
+                        addRow += "<div class='driver-name'>";
+                        addRow += driversdetail[i]['name'];
+                        addRow += "</div>";
+                        addRow += "<div class='driver-rating'>";
+                        addRow += "<span style='color:orange'>&#9734;</span><span class='rating'>" + driversdetail[i]['rating'] + "</span>(" + driversdetail[i]['votes'] + " votes)";
+                        addRow += "</div>";
+                        addRow += "<div class='row'>";
+                        addRow += "<a href='#' class='button button-success right' id='" + driversdetail[i]['id'] + "' onclick='selectDriver(this)'>I CH0OSE YOU!</a>";
+                        addRow += "</div></div></div>";
+                    }
+                } else {
+                    addRow += "<div id='no-other-driver'>Nothing to display :(</div>";
+                }
+            }
+            createElement.innerHTML = addRow;
+            nextToSelectDriver()
+        });
+	}
+}
+
+document.getElementById('pickingpoint').onkeyup = function(event){
+    var character = event.which;
+    if (character>40 || character <37){
+        var locNow = document.getElementById('pickingpoint').value;
+        var suggestTag = document.getElementById('suggest-pickingpoint');
+        if(locNow.length > 0){
+            var url = "helpers/ajax/location_searcher.php?location=" + locNow;
+            getAjax(url, function(data){
+                suggestTag.innerHTML = '';
+                var suggestion = JSON.parse(data);
+                for(var i = 0; i < suggestion.length; i++){
+                    var option = document.createElement("option");
+                    option.setAttribute("value", suggestion[i]);
+                    suggestTag.appendChild(option);
+                }
+            });
+        } else {
+            suggestTag.innerHTML = '';
+        }
+    }
+}
+document.getElementById('destination').onkeyup = function(event){
+    var character = event.which;
+    if (character>40 || character <37){
+        var locNow = document.getElementById('destination').value;
+        var suggestTag = document.getElementById('suggest-destination');
+        if(locNow.length > 0){
+            var url = "helpers/ajax/location_searcher.php?location=" + locNow;
+            getAjax(url, function(data){
+                suggestTag.innerHTML = '';
+                var suggestion = JSON.parse(data);
+                for(var i = 0; i < suggestion.length; i++){
+                    var option = document.createElement("option");
+                    option.setAttribute("value", suggestion[i]);
+                    suggestTag.appendChild(option);
+                }
+            });
+        } else {
+            suggestTag.innerHTML = '';
+        }
+    }
+}
+
+function selectDriver(element){
+    idDriver = element.id
+    console.log(idDriver)
+	document.getElementById('modalverifyorder').style.display = "block";
+}
+// When the user clicks on <span> (x), close the modal
+document.getElementById("no-order").onclick = function() {
+    document.getElementById('modalverifyorder').style.display = "none";
+}
+document.getElementById("yes-order").onclick = function() {
+    document.getElementById('modalverifyorder').style.display = "none";
+	var url= "/soapservlet";
+    console.log(idDriver)
+	postAjax(url, {name: "get-driver-by-id", iddriver:idDriver}, function(data){
+		console.log(data);
+		var elementdriverpict = document.getElementById('driver-pict').getElementsByTagName('img')[0];
+		var elementdriveruname = document.getElementById('driver-username');
+		var elementdrivername = document.getElementById('driver-fullname');
+		var driverdetail = JSON.parse(data);
+        console.log(driverdetail)
+		elementdriverpict.src = driverdetail['profpicUrl'];
+		elementdriveruname.innerHTML = '@'+driverdetail['username'];
+		elementdrivername.innerHTML = driverdetail['name'];
+        nextToCompleteOrder();
+	});
+    openOrder("complete-order");
+}
+// When the user clicks anywhere outside of the modal, close it
+window.onclick = function(event) {
+    if (event.target == document.getElementById('modalverifyorder')) {
+        document.getElementById('modalverifyorder').style.display = "none";
+    }
+}
+document.getElementById('submit-order').onclick = function(){
+	var url = "/soapservlet";
+	if(rating> 0){
+		comment = document.getElementById('comment-area').value;
+		postAjax(url, {name: "submit-order", iddriver:idDriver, idcust:idCustomer, dest:destination, loc:pickingpoint, rate:rating, comm:comment}, function(data){
+			console.log(data)
+			if(data == "ok"){
+				document.getElementById('modalsubmit').style.display = "block";
+			} else {
+				document.getElementById('warning-msg-submit').innerHTML = '<span class="closebtn" onclick="this.parentElement.style.display = &quot;none&quot;;">&times;</span>Sorry, an error occured!';
+				document.getElementById('warning-msg-submit').style.display = 'block';
+			}
+		});
+	} else {
+		document.getElementById('warning-msg-submit').innerHTML = '<span class="closebtn" onclick="this.parentElement.style.display = &quot;none&quot;;">&times;</span>Please enter rating for our driver';
+		document.getElementById('warning-msg-submit').style.display = 'block';
+	}
+}
+
+// When the user clicks on OK, close the modal
+document.getElementById("verifysubmit").onclick = function() {
+    document.getElementById('modalsubmit').style.display = "none";
+	window.location = "order";
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/resources/js/signup.js b/PrOjek/webapp/src/main/webapp/resources/js/signup.js
new file mode 100644
index 0000000000000000000000000000000000000000..302b99d780af67c5a1da4592d00d808c31b2d8ef
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/js/signup.js
@@ -0,0 +1,147 @@
+window.onload = function(){
+    var inputs = document.getElementsByTagName("input");
+    Array.prototype.forEach.call(inputs, function(element) {
+        if(element.name!="submit"){
+            element.value = "";
+        }
+    });
+}
+
+var nameOK = false;
+var userOK = false;
+var passOK = false;
+var emailOK = false;
+var phoneOK = false;
+
+var arr = {
+            "name" : nameOK,
+            "email" : emailOK,
+            "username" : userOK,
+            "phone" : phoneOK,
+            "password" : passOK
+        };
+function validateEmail(email, ){
+    var emailRegEx = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+    return emailRegEx.test(email);
+}
+
+function validateName(name){
+    return (name.length <= 20);
+}
+
+function validatePhoneNo(phone){
+    var regexPhone = /^[0-9].{8,11}$/;
+    return regexPhone.test(phone);
+}
+
+for(var item in arr){
+    console.log(item);
+    document.getElementById(item).onclick = function(){
+        document.getElementById("status").innerHTML = "";
+        document.getElementById(this.id).style.border = "solid 0.5px gray";
+    }
+}
+
+document.getElementById("name").onkeyup = function(){
+    var name = document.getElementById("name").value;
+    if(validateName(name)){
+        nameOK = true;
+        document.getElementById("name").style.border = "solid 0.5px gray";
+    } else {
+        nameOK = false;
+        document.getElementById("name").style.border = "solid 2px red";
+    }
+}
+
+document.getElementById("username").onkeyup = function(){
+    var username = document.getElementById("username").value;
+    var validUser = document.getElementById("username-ok");
+    var notValidUser = document.getElementById("username-no"); 
+    if (username.length > 0){
+        var url = "helpers/ajax/validation.php?username=" + username;
+        getAjax(url, function(data){
+            if(data == "available"){
+                validUser.style.display = "inline";
+                notValidUser.style.display = "none";
+                userOK = true;
+            }
+            else {
+                notValidUser.style.display = "inline";
+                validUser.style.display = "none";
+                userOK = false;
+            }
+        })
+    } else {
+        notValidUser.style.display = "none";
+        validUser.style.display = "none";
+        userOK = false;
+    }
+};
+
+document.getElementById("email").onkeyup = function(){
+    var email = document.getElementById("email").value;
+    var validEmail = document.getElementById("email-ok");
+    var notValidEmail = document.getElementById("email-no");
+    
+    if (validateEmail(email)){
+        var url = "helpers/ajax/validation.php?email=" + email;
+        getAjax(url, function(data){
+            if(data == "available"){
+                validEmail.style.display = "inline";
+                notValidEmail.style.display = "none";
+                emailOK = true;
+            }
+            else {
+                validEmail.style.display = "none";
+                notValidEmail.style.display = "inline";
+                emailOK = false;
+            }
+        });
+    } else {
+        validEmail.style.display = "none";
+        notValidEmail.style.display = "inline";
+        emailOK = false;
+    }
+}
+
+document.getElementById("phone").onkeyup = function(){
+    var phone = document.getElementById("phone").value;
+    if(validatePhoneNo(phone)){
+        phoneOK = true;
+        document.getElementById("phone").style.border = "solid 0.5px gray";
+    } else {
+        phoneOK = false;
+        document.getElementById("phone").style.border = "solid 2px red";
+    }
+}
+
+document.getElementById("confirm-password").onkeyup = function() {
+    var pass = document.getElementById("password").value;
+    var confirmedPass = document.getElementById("confirm-password").value;
+    if (confirmedPass != pass){
+        passOK = false;
+        document.getElementById("confirm-password").style.border = "solid 2px red";
+    } else {
+        passOK = true;
+        document.getElementById("confirm-password").style.border = "solid 0.5px gray";
+    }
+}
+
+document.getElementById("signup-form").onsubmit = function (){
+    if (nameOK && emailOK && userOK && phoneOK && passOK){
+        console.log("form can be submitted");
+        return true;
+    } else {
+        for(var key in arr){
+            if(!arr[key]){
+                document.getElementById(key).style.border = "solid 2px red";
+            }
+        }
+        document.getElementById("confirm-password").style.border = "solid 0.5px gray";
+        document.getElementById("confirm-password").value = "";
+        document.getElementById("status").innerHTML = "field must be set";
+        console.log("something wrong");
+        console.log(nameOK + " " + emailOK + " " + userOK + " " + phoneOK + " " + passOK);
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/resources/js/upload_profile_picture.js b/PrOjek/webapp/src/main/webapp/resources/js/upload_profile_picture.js
new file mode 100644
index 0000000000000000000000000000000000000000..2b4aa0d997d604b7bcf61ea7218628104b47e6f1
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/resources/js/upload_profile_picture.js
@@ -0,0 +1,4 @@
+function uploadFinish(){
+	var filename = document.getElementById("uploadBtn");
+	document.getElementById('uploadFile').value = filename.files[0].name;
+}
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/signup.jsp b/PrOjek/webapp/src/main/webapp/signup.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..35987cc01d7cc14c81414c8749543d7287ff042b
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/signup.jsp
@@ -0,0 +1,3 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+<jsp:include page="/views/signup_view.jsp" />
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/views/edit_location.jsp b/PrOjek/webapp/src/main/webapp/views/edit_location.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..96401722966918b33f54614397e31803051150d6
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/views/edit_location.jsp
@@ -0,0 +1,98 @@
+<%@ page import="com.ojek.common.User" %>
+<%@ page import="com.jauharteam.ojek.webapp.Config" %>
+<%@ page import="com.jauharteam.ojek.ojek.UserService" %>
+<%@ page import="com.jauharteam.ojek.ojek.LocationService" %>
+<%@ page import="com.ojek.common.Location" %>
+<%@ page import="java.util.Date" %>
+<%
+    String accessToken = (String) request.getAttribute("accessToken");
+    UserService userService = (UserService) request.getAttribute("userService");
+    LocationService locationService = (LocationService) request.getAttribute("locationService");
+    Config conf = (Config) request.getAttribute("config");
+
+    User user = userService.getUser(accessToken);
+    Location[] locations = locationService.getAllLocation(accessToken);
+%>
+            <div class="row margin-top">
+                <h2>Edit Preferred Locations</h2>
+                <div class="row">
+                    <% int nb = 0; %>
+                    <table class="location_table" id='location_table'>
+                        <tr>
+                            <th style="width: 25px">No</th>
+                            <th>Location</th>
+                            <th style="width: 90px">Actions</th>
+                        </tr>
+                        <%
+                            for (Location location : locations) {
+                                nb+=1;
+                        %>
+                        <% int prefNum = location.getPrefNum(); %>
+                        <tr id='row-<%= prefNum %>'>
+                        <form action="/soapservlet" method="post" accept-charset="utf-8">
+                            <input type="text" name="name" value="edit-location" hidden>
+                            <td class='number'>
+                                <input type='text' id="pref-row-<%= prefNum %>" class='input-standard input-standard-v2' name="pref-<%= prefNum %>" value="<%= prefNum %>" style="display:none;">
+                                <span class='location-pref'><%= nb %></span>
+                            </td>
+                            <td class='location'>
+                                <input type="text" name="loc-last-<%= prefNum %>" value="<%= location.getLocation() %>" hidden>
+                                <input type="text" name="location-pref" value="<%= prefNum %>" hidden>
+                                <input type='text' id="loc-row-<%= prefNum %>" class='input-standard input-standard-v2' name="loc-<%= prefNum %>" value="<%= location.getLocation() %>" style="display:none;">
+                                <span class='location-name'><%= location.getLocation() %></span>
+                            </td>
+                            <td class='option'>
+                                <div class="row">
+                                    <div class="col-6" id="edit-<%= prefNum %>">
+                                        <a href="#" class="edit-icon" id="edit-link-<%= prefNum %>" onclick="editLocation(<%= user.getId() %> , <%= prefNum %>)"><i class="material-icons md-36">edit</i></a>
+                                        <button class="save-" id='submit-edited-location-<%= prefNum %>' value='submit-edited-location-<%= prefNum %>' style="display:none;"><i class='material-icons md-36'>save</i></button>
+                                    </div>
+                                    <div class="col-6" id="delete-<%= prefNum %>">
+                                        <a href="#" class="delete-icon" id="delete-link-<%= prefNum %>" onclick="
+                                            deleteLocation(<%= user.getId() %>, <%= prefNum %>, <%= location.getId() %>)
+                                            "><i class="material-icons md-36">clear</i></a>
+                                    </div>
+                                </div>
+                            </td>
+                        </form>
+                        </tr>
+                        <%
+                            }
+                        %>
+                        <tr id='no-data-row' style="display: <% if(nb < 1){%> table-row <%}else{%> none <%}%>">
+                            <td colspan='3' style='text-align: center;'> No data to display </td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+            <div class="row margin-top">
+                <h3>Add New Location : </h3>
+                <form action="/soapservlet" method="POST" accept-charset="utf-8">
+                <input name="name" type="hidden" value="add-location">
+                <label class="col-10">
+                    <input class="input-standard input-standard-v2" autocorrect="off" autocomplete="off" type="text" id="location" name="location" list="suggestLoc">
+                    <datalist id="suggestLoc"></datalist>
+                </label>
+                <label class="col-2 ">
+                <input class="button button-success button-add" id='submit-add-location' name="submit" type="submit" value="Add"></button>
+                </label>
+                </form>
+            </div>
+            <?php if(is_string($msg)) { ?>
+            <div class="row warning-box" id="warning-msg">
+                <span class="closebtn" onclick="">&times;</span>
+                <?php echo $msg;?>
+            </div>
+            <?php } ?>
+            <div class="row margin-top">
+                <a href="<%= conf.getBaseUrl() %>profile" class="button button-fail">Back</a>
+            </div>
+
+            <script>
+                var id = <%= user.getId() %>;
+                var nbPref = <%= nb %>;
+            </script>
+
+            <% long ts = (new Date()).getTime(); //Used to prevent JS/CSS caching %>
+            <script type="text/javascript" src="./resources/js/ajax.js?<%= ts %>"></script>
+            <script type="text/javascript" src="./resources/js/edit_location.js?<%= ts %>"></script>
diff --git a/PrOjek/webapp/src/main/webapp/views/edit_profile.jsp b/PrOjek/webapp/src/main/webapp/views/edit_profile.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..ed82be896c8c2ee410ffd7e198bca73c3a1954f8
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/views/edit_profile.jsp
@@ -0,0 +1,84 @@
+<%@ page import="com.jauharteam.ojek.ojek.UserService" %>
+<%@ page import="com.jauharteam.ojek.webapp.Config" %>
+<%@ page import="com.ojek.common.User" %>
+<%
+    String accessToken = (String) request.getAttribute("accessToken");
+    UserService userService = (UserService) request.getAttribute("userService");
+    Config conf = (Config) request.getAttribute("config");
+
+    User user = userService.getUser(accessToken);
+    if (user == null)
+        user = new User();
+%>
+            <div class="row profile">
+                <h2>Edit Profile Information</h2>
+                <form action="" method="POST" accept-charset="utf-8" enctype="multipart/form-data">
+                    <div class="row">
+                        <div class="col-4">
+                            <div class="row">
+                                <div class="picture edit-picture">
+                                    <img src="<%= user.getProfpicUrl() %>" alt="<%= user.getName() %>"/>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-8 margin-top">
+                            Update profile picture :
+                            <div class="row">
+                                <input class="col-8 input-standard upload-bar" id="uploadFile" placeholder="Choose File" disabled="disabled" />
+                                <div class="file-upload col-4 button-upload">
+                                    <span>Browse..</span>
+                                    <input id="uploadBtn" name="uploaded_file" type="file" class="upload" />
+                                </div>
+                                <span class="warning"><?php echo $status; ?></span>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row margin-top">
+                        <div class="row">
+                            <div class="col-4">
+                                Your Name
+                            </div>
+                            <div class="col-8">
+                                <input class="input-standard input-standard-v2" type="text" name="name" id='name' placeholder="Your name..." value="<%= user.getName() %>">
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="col-4">
+                                Phone
+                            </div>
+                            <div class="col-8">
+                                <input class="input-standard input-standard-v2" type="text" name="phone" id='phone' placeholder="Your phone.." value="<%= user.getPhone() %>">
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="col-4">
+                                Status Driver
+                            </div>
+                            <div class="col-8">
+                                <label class="switch">
+                                <input type="checkbox" name="driver" <% if(user.getDriver() != null && user.getDriver()){ %>checked<% } %> >
+                                <span class="slider"></span>
+                                </label>
+                            </div>
+                        </div>
+                        <div class="row margin-top">
+                            <div class="col-2">
+                                <a href="<%= conf.getBaseUrl() %>profile" class="button button-fail">Back</a>
+                            </div>
+                            <div class="col-8">
+                            </div>
+                            <div class="col-2">
+                                <input class="button button-success" type="submit" name="submit" value="Save">
+                            </div>
+                        </div>
+                        <div class="row warning-box" id="warning-msg" style='display: none;'>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <script> 
+//                var id = <?php echo $ID; ?>;
+            </script>
+            <%--<script type='text/javascript' src='../assets/js/ajax.js'></script>--%>
+            <%--<script type='text/javascript' src='../assets/js/upload_profile_picture.js'></script>--%>
+            <%--<script type="text/javascript" src="http://<?php echo $_SERVER['HTTP_HOST']; ?>/assets/js/edit_profile.js"></script>--%>
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/views/footer.jsp b/PrOjek/webapp/src/main/webapp/views/footer.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..c4b43d0f7fd65031e350c3c8ae47488daae136bf
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/views/footer.jsp
@@ -0,0 +1,4 @@
+
+        </div>
+    </body>
+</html>
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/views/header.jsp b/PrOjek/webapp/src/main/webapp/views/header.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..d6d8f0d85661b832f85be7825ca7e8d5d5827651
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/views/header.jsp
@@ -0,0 +1,40 @@
+<%@ page import="com.jauharteam.ojek.webapp.Config" %>
+<%@ page import="com.ojek.common.User" %>
+<%@ page import="com.jauharteam.ojek.ojek.UserService" %>
+<%@ page import="java.util.Date" %>
+<%
+    String accessToken = (String) request.getAttribute("accessToken");
+    Config conf = (Config) request.getAttribute("config");
+    UserService userService = (UserService) request.getAttribute("userService");
+    User user = userService.getUser(accessToken);
+    String path = request.getRequestURI();
+    path = path.replaceAll("\\/([a-zA-Z0-9]+)\\.jsp", "$1");
+%>
+<%
+    long ts = (new Date()).getTime(); //Used to prevent JS/CSS caching
+%>
+
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Order PR-Ojek</title>
+        <link rel="stylesheet" href="./resources/css/style.css?<%= ts %>" >
+        <link rel="stylesheet" href="./resources/css/element.css?<%= ts %>">
+    </head>
+    <body>
+        <div class="default-extern-container">
+            <div class="row">
+                <div class="col-6">
+                    <h1 class="logo"><span style="color: #034E03;">PR</span>-<span style="color:red;">OJEK</span></h1>
+                    <h2 class="tagline" style="color: #468D03;">wushh... wushh... ngeeeeeenggg...</h2>
+                </div>
+                <div class="col-6 align-right">
+                    <p>Hello, <%= user.getUsername() %> !</p>
+                    <a href="<%= conf.getBaseUrl() %>logout">Logout</a>
+                </div>
+            </div>
+            <ul class="row navbar">
+                <li class="col-4 align-center standard-border <% if(path.equals("order")) {%>active<%}%>"><a href="<%= conf.getBaseUrl() %>order">Order</a></li>
+                <li class="col-4 align-center standard-border <% if(path.equals("history")) {%>active<%}%>"><a href="<%= conf.getBaseUrl() %>history">History</a></li>
+                <li class="col-4 align-center standard-border <% if(path.equals("profile") || path.equals("editprofile") || path.equals("editlocation")) {%>active<%}%>"><a href="<%= conf.getBaseUrl() %>profile">My Profile</a></li>
+            </ul>
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/views/history_view.jsp b/PrOjek/webapp/src/main/webapp/views/history_view.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..90479f109fdd2b14e507cfbbdddd58f7dce48fd7
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/views/history_view.jsp
@@ -0,0 +1,143 @@
+<%@ page import="java.util.Date" %>
+<%@ page import="com.ojek.common.User" %>
+<%@ page import="com.ojek.common.util.StringUtil" %>
+<%@ page import="com.jauharteam.ojek.webapp.Config" %>
+<%@ page import="com.jauharteam.ojek.ojek.UserService" %>
+<%@ page import="com.jauharteam.ojek.ojek.OrderService" %>
+<%@ page import="com.jauharteam.ojek.ojek.LocationService" %>
+<%@ page import="com.ojek.common.Order" %>
+<%
+    String accessToken = (String) request.getAttribute("accessToken");
+    OrderService orderService = (OrderService) request.getAttribute("orderService");
+    UserService userService = (UserService) request.getAttribute("userService");
+    LocationService locationService = (LocationService) request.getAttribute("locationService");
+    Config conf = (Config) request.getAttribute("config");
+
+    User user = userService.getUser(accessToken);
+    Order[] historyDriver = orderService.getAllOrderDriver(accessToken);
+    Order[] historyCustomer= orderService.getAllOrderCustomer(accessToken);
+%>
+
+            <div class="row">
+                <h3>Transaction History</h3>
+                <ul class="row navbar">
+                    <li class="col-6 align-center standard-border active" id="previous-order-tab">
+                        <a onclick="toPreviousOrder()">My Previous Order</a>
+                    </li>
+                    <li class="col-6 align-center standard-border" id="driver-history-tab">
+                        <a onclick="toDriverHistory()">Driver History</a>
+                    </li>
+                </ul>
+            </div>
+            <section id="driver-history">
+
+                <% int driverHistory = 0; %>
+
+                <div id="history-exist" style="display: <%= historyDriver.length>0?"block":"none" %>" class="scrollable">
+
+                    <% for (Order order1 : historyDriver ){ %>
+                    <% driverHistory++; %>
+
+                    <div id="history-<%= order1.getId()%>" class="row" style="<%= order1.getDriverShow()?"block":"none" %>">
+                        <div class='col-3'>
+                            <div class='picture driver-picture'>
+                                <img src="<%= userService.getUserById(accessToken, order1.getCustomerId()).getProfpicUrl() %>" alt='no file'>
+                            </div>
+                        </div>
+
+                         <div class='col-8 driver-detail'>
+                            <div class='date'>
+                                <%= order1.getTime().getTime() %>
+                            </div>
+                            <div class='driver-name'>
+                                <%= userService.getUserById(accessToken, order1.getCustomerId()).getName()%>
+                            </div>
+                            <div class="text">
+                                gave <span class="rating"> <%= order1.getRate() %> </span> stars for this order
+                            </div>
+                            <div class="text">
+                                <span class="text"> <%= locationService.getLocationById(accessToken, order1.getLocationId()).getLocation()%> </span>&rarr;<span class="text"> <%= locationService.getLocationById(accessToken, order1.getDestinationId()).getLocation()%> </span>
+                            </div>
+                            <div class="text">
+                                and left comment:
+                            </div>
+                            <div class="comment">
+                                <%= order1.getComment() %>
+                            </div>
+                        </div>
+                        <div class="col-1 ">
+                            <button class="button button-fail right" onclick="hideDriverHistory('<%= conf.getBaseUrl() %>', <%= order1.getId() %>)">HIDE!</button>
+                        </div>
+                    <% } %>
+
+                </div>
+                <div id="no-history" class="margin-top" style="display : <%= driverHistory<=0?"block":"none"%>">
+                    No transaction yet!
+                </div>
+            </section>
+
+            <section id="previous-order">
+
+                <%int customerHistory = 0; %>
+
+                <div id="previous-exist" style="display: <%= historyCustomer.length>0?"block":"none"%>" class="scrollable">
+
+                <% for (Order order2 : historyCustomer ){ %>
+                <% System.out.println("order2 : " + order2); %>
+                <% customerHistory++; %>
+
+                    <div id="previous-<%= order2.getId() %>" class="row" style="<%= order2.getCustomerShow()?"block":"none" %>">
+                        <div class='col-3'>
+                            <div class='picture driver-picture'>
+                                <img src="<%= userService.getUserById(accessToken, order2.getDriverId()).getProfpicUrl() %>" alt='no file'>
+                            </div>
+                        </div>
+                        <div class='col-8 driver-detail'>
+                            <div class='date'>
+                                <%= order2.getTime().getTime() %>
+                                <%--<?php echo date('l, F j Y', strtotime($row['time'])); ?>--%>
+                            </div>
+                            <div class='driver-name'>
+                                <%= userService.getUserById(accessToken, order2.getDriverId()).getName() %>
+                                <%--<?php echo $row['driver_name']; ?>--%>
+                            </div>
+                            <div class="text">
+                                <span class="text"> <%= locationService.getLocationById(accessToken, order2.getLocationId()).getLocation()%> </span>&rarr;<span class="text"> <%= locationService.getLocationById(accessToken, order2.getDestinationId()).getLocation()%> </span>
+                            </div>
+                            <div class="row">
+                                <div class="col-3" style="padding-left:0px;" >
+                                    <div class="text">You rated:</div>
+                                </div>
+                                <% for (int i = 0; i < order2.getRate(); i++){ %>
+                                    <span class="rating" id="driverrating">&#9734;</span>
+                                <% } %>
+                            </div>
+                            <div class="text">
+                                You commented:
+                            </div>
+                            <div class="comment">
+                                <%= order2.getComment() %>
+                            </div>
+                        </div>
+                        <div class="col-1 ">
+                            <button class="button button-fail right" onclick="hidePreviousHistory('<%= conf.getBaseUrl() %>',<%= order2.getId()%>)">HIDE!</button>
+                        </div>
+                    </div>
+                <% } %>
+
+                </div>
+                <div id="no-previous" class="margin-top" style="display: <%= historyCustomer.length<=0?"block":"none"%>">
+                    No transaction yet!
+                </div>
+            </section>
+
+            <% long ts = (new Date()).getTime(); //Used to prevent JS/CSS caching %>
+            <script type="text/javascript" src="./resources/js/history.js?<%=ts%>"></script>
+            <script type="text/javascript" src="./resources/js/ajax.js?<%=ts%>"></script>
+
+            <%--<script>--%>
+                <%--var nbDriver = <?php echo $nbHistory; ?>;--%>
+                <%--var nbMyPrev = <?php echo $nbPrev; ?>;--%>
+            <%--</script>--%>
+            <%--<script type="text/javascript" src="assets/js/ajax.js"></script>--%>
+            <%--<script type="text/javascript" src="assets/js/history.js"></script>--%>
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/views/login_view.jsp b/PrOjek/webapp/src/main/webapp/views/login_view.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..47254b5f1aea98775188a99b41ece863e604608e
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/views/login_view.jsp
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Login</title>
+        <link rel="stylesheet" href="./resources/css/style.css">
+        <link rel="stylesheet" href="./resources/css/element.css">
+    </head>
+    <body>
+        <div class="login-extern-container">
+            <div class="row">
+                <div class="col-4 align-center">
+                    <hr class="loginhr">
+                </div>
+                <div class="col-4 align-center">
+                    <h3 class="headstyle">LOGIN</h3>
+                </div>
+                <div class="col-4 align-center">
+                    <hr class="loginhr">
+                </div>
+            </div>
+            <div class="logincontainer">
+                <div class="row">
+                    <form action="" method="post" accept-charset="utf-8">
+                        <div class="row">
+                            <div class="col-5">
+                                <p class="loginformup">Username</p>
+                            </div>
+                            <input class="col-7 input-standard" name="username">
+                        </div>
+                        <div class="row">
+                            <div class="col-5">
+                                <p class="loginformup">Password</p>
+                            </div>
+                            <input class="col-7 input-standard" name="password" type="password">
+                        </div>
+                        <div class="row margin-top">
+                            <div class="col-8">
+                                <%--<a href="http://<?php echo $_SERVER['HTTP_HOST']?>/signup.php"> <u>Don't an have account?</u></a>--%>
+                            </div>
+                            <div class="col-4">
+                                <input class="button button-green right" name="submit" type="submit" value="GO!">
+                            </div>
+                        </div>
+                        <% if (request.getAttribute("errorMessage") != null) { %>
+                        <div class="row warning-box" id="warning-msg">
+                            <span class="closebtn" onclick="this.parentElement.style.display = &quot;none&quot;;">&times;</span>
+                            <%= request.getAttribute("errorMessage") %>
+                        </div>
+                        <% } %>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </body>
+</html>
+
diff --git a/PrOjek/webapp/src/main/webapp/views/order_view.jsp b/PrOjek/webapp/src/main/webapp/views/order_view.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..aed5754669f4ecbafbdc8fc050a5adb2f36c5e1d
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/views/order_view.jsp
@@ -0,0 +1,159 @@
+<%@ page import="java.util.Date" %>
+<%@ page import="com.jauharteam.ojek.ojek.UserService" %>
+<%@ page import="com.ojek.common.User" %>
+<%
+	String accessToken = (String) request.getAttribute("accessToken");
+	UserService userService = (UserService) request.getAttribute("userService");
+	User user = userService.getUser(accessToken);
+%>
+            <div>
+                <h3>MAKE AN ORDER</h3>
+                <ul class="row">
+                    <li class="col-4">
+                        <button id="tab-select-destination" class="taborder button button-progress-now row button-disable" disabled>
+                            <div class="circle-numbering col-3">1</div>
+                            Select Destination
+                        </button>
+                    </li>
+                    <li class="col-4">
+                        <button id="tab-select-driver" class="taborder button button-plain row button-disable" disabled>
+                            <div class="circle-numbering col-3">2</div>
+                            Select a Driver
+                        </button>
+                    </li>
+                    <li class="col-4">
+                        <button id="tab-complete-order" class="taborder button button-plain row button-disable" disabled>
+                            <div class="circle-numbering col-3">3</div>
+                            Complete your order
+                        </button>
+                    </li>
+                </ul>
+            </div>
+            <form action="" method="post" accept-charset="utf-8">
+                <div class="container" id="select-destination" style="display: block">
+    				<div class="form-order-default">
+    					<div class="row">
+    						<div class="col-5">
+    							Picking Point
+    						</div>
+                            <label>
+        						<input class="col-7 input-standard" autocorrect="off" autocomplete="off" name="pickingpoint" placeholder="Fill A Place"
+        									id="pickingpoint" type="text" size="30" list="suggest-pickingpoint">
+                                <datalist id="suggest-pickingpoint"></datalist>
+                            </label>
+    					</div>
+    					<div class="row">
+    						<div class="col-5">
+    								Destination
+    						</div>
+                            <label>
+        						<input class="col-7 input-standard" autocorrect="off" autocomplete="off" name="destination" placeholder="Fill A Place"
+        									id="destination"  type="text" size="30" list="suggest-destination">
+                                <datalist id="suggest-destination"></datalist>
+                            </label>
+    					</div>
+    					<div class="row">
+    						<div class="col-5">
+    							Preferred Driver
+    						</div>
+    						<input class="col-7 input-standard" name="preferreddriver" placeholder="(optional)"
+    									id="preferreddriver"  type="text" size="30">
+    					</div>
+    					<div style="text-align: center; margin: 15px 0px;">
+    						<div class="button button-success" onclick="grabDriver()">NEXT!</div>
+    					</div>
+                        <div class="row warning-box" id="warning-msg-loc" style='display: none;'>
+                        </div>
+                    </div>
+                </div>
+    			<div class="form-order" id="select-driver" style="display: none">
+    				<div class="container rounded-border" id="thereprefdriver">
+    					<h2>PREFERRED DRIVERS:</h2>
+                        <div id="prefer-driver">
+                        <!-- display preferred driver after button next clicked--> 
+                        </div>
+    				</div>
+    				<div class="container rounded-border">
+    				    <h2>OTHER DRIVERS:</h2>
+                        <div id="other-driver">
+                        <!-- display drivers w/ our picking point as preferred loc after button next clicked-->
+                        </div>
+    				</div>
+					<div id="modalverifyorder" class="modalview">
+							  <!-- Modal content -->
+						<div class="modal-content">
+							<div class="modal-text">Are you sure?</div>
+							<div class="modal-options">
+								<a class="button button-fail" id="no-order">NO</a>
+								<a class="button button-success" id="yes-order">YES</a>
+							</div>
+						</div>
+					</div>
+    			</div>
+    			<div class="form-order" id="complete-order" style="display: none">
+    				<h3>HOW WAS IT?</h3>
+    				<div class="row">
+                        <div class="col-4">
+                        </div>
+                        <div class="col-4">
+                            <div class="row">
+                                <div class="picture center profile-picture" id="driver-pict">
+                                    <img src="assets/images/pikachu.png" alt="Pikachuu">
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-4">
+                        </div>
+                    </div>
+    				<div class="row profile-info">
+    					<div class="row">
+    						<span class="username" id="driver-username">
+    							boom
+    						</span>
+    					</div>
+    					<div class="row">
+    						<span class="full-name" id="driver-fullname">
+    							boom
+    						</span>
+    					</div>
+    				</div>
+    				<div class="container">
+                        <div class="container">
+                            <ul class="rating-list row">
+                                <li class="rating-element" id="rating-1" onmouseover="changeTo(this)" onmouseout="changeBack()" onclick="rateThis(this)"><i class="material-icons">star_rate</i></li>
+                                <li class="rating-element" id="rating-2" onmouseover="changeTo(this)" onmouseout="changeBack()" onclick="rateThis(this)"><i class="material-icons">star_rate</i></li>
+                                <li class="rating-element" id="rating-3" onmouseover="changeTo(this)" onmouseout="changeBack()" onclick="rateThis(this)"><i class="material-icons">star_rate</i></li>
+                                <li class="rating-element" id="rating-4" onmouseover="changeTo(this)" onmouseout="changeBack()" onclick="rateThis(this)"><i class="material-icons">star_rate</i></li>
+                                <li class="rating-element" id="rating-5" onmouseover="changeTo(this)" onmouseout="changeBack()" onclick="rateThis(this)"><i class="material-icons">star_rate</i></li>
+                             </ul>
+                        </div>
+    					<div class="container">
+    						<textarea rows="4" cols="50" id="comment-area" placeholder="Your comment..."></textarea>
+    					</div>
+    					<div class="container row">
+    						<a class="button button-success" id="submit-order" type="submit" name="submit" style="float: right;">COMPLETE ORDER</a>
+    					</div>
+                        <div class="row warning-box" id="warning-msg-submit" style='display: none;'>
+                        </div>
+    				</div>
+                </div>
+            </form>
+			<div id="modalsubmit" class="modalview">
+							  <!-- Modal content -->
+				<div class="modal-content">
+					<div class="modal-text">ORDER SUCCESS!!!! YEAY!!!!</div>
+					<div class="modal-options">
+						<a class="button button-success" id="verifysubmit" >OK</a>
+					</div>
+				</div>
+			</div>
+
+			<script>
+				var idCustomer = <%= user.getId() %>
+			</script>
+            <% long ts = (new Date()).getTime(); //Used to prevent JS/CSS caching %>
+			<script type="text/javascript" src="./resources/js/order.js?<%=ts%>"></script>
+			<script type="text/javascript" src="./resources/js/ajax.js?<%= ts %>"></script>
+
+            <%--<script type="text/javascript" src="assets/js/ajax.js"></script>--%>
+            <%--<script type="text/javascript" src="assets/js/order.js"></script>--%>
\ No newline at end of file
diff --git a/PrOjek/webapp/src/main/webapp/views/profile_view.jsp b/PrOjek/webapp/src/main/webapp/views/profile_view.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..eff42611dc108e689276fdcff82b60fc44666f26
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/views/profile_view.jsp
@@ -0,0 +1,92 @@
+<%@ page import="com.ojek.common.User" %>
+<%@ page import="com.jauharteam.ojek.webapp.Config" %>
+<%@ page import="com.ojek.common.Location" %>
+<%@ page import="java.util.ArrayList" %>
+<%@ page import="com.jauharteam.ojek.ojek.UserService" %>
+<%@ page import="com.jauharteam.ojek.ojek.LocationService" %>
+<%
+    String accessToken = (String) request.getAttribute("accessToken");
+    UserService userService = (UserService) request.getAttribute("userService");
+    LocationService locationService = (LocationService) request.getAttribute("locationService");
+    Config conf = (Config) request.getAttribute("config");
+
+    User user = userService.getUser(accessToken);
+    if (user == null)
+        user = new User();
+%>
+<div class="row profile">
+    <h3>My Profile</h3>
+    <div class="row">
+        <div class="col-4">
+        </div>
+        <div class="col-4">
+            <div class="row">
+                <div class="picture center profile-picture">
+                    <img src="<%= user.getProfpicUrl() %>" alt="<%= user.getName() %>"/>
+                </div>
+            </div>
+        </div>
+        <div class="col-4">
+            <div class="right">
+                <a href="<%= conf.getBaseUrl() %>editprofile" class="edit-icon"><i
+                        class="material-icons">&#xE254;</i></a>
+            </div>
+        </div>
+    </div>
+    <div class="row profile-info">
+        <div class="row">
+            <span class="username">
+                <%= user.getUsername() %>
+            </span>
+        </div>
+        <div class="row">
+            <span class="full-name">
+                <%= user.getName() %>
+            </span>
+        </div>
+        <div class="row">
+            <% if (user.getDriver() != null && user.getDriver()) {%>
+            <span class="status">Driver</span> | <span style="color:orange">&#9734;</span><span
+                class="rating"><%= user.getRating() %></span>
+            (<span class="votes"><%= user.getVotes() %></span>)
+            <% } %>
+        </div>
+        <div class="row">
+            <span class="material-icons" style="font-size: 10pt">&#xe0e1;</span>
+            <span> </span><span class="email"><%= user.getEmail() %></span>
+        </div>
+        <div class="row">
+            <span>&#9742;</span><span> </span><span class="phone"><%= user.getPhone() %></span>
+        </div>
+    </div>
+    <% if (user.getDriver() != null && user.getDriver()) { %>
+    <div class="row">
+        <div class="right">
+            <a href="<%= conf.getBaseUrl() %>editlocation"
+               class="edit-icon"><i class="material-icons">&#xE254;</i></a>
+        </div>
+        <h4>Preferred Locations :</h4>
+        <ul class="scrollable">
+            <%
+                int margin_left = 0;
+                Location[] locations = locationService.getAllLocation(accessToken);
+                if (locations.length > 0) {
+                    for (Location location : locations) {
+            %>
+            <li style="margin-left:<%= margin_left+=10 %>px">
+                <i class="material-icons" style="font-size:16px">navigate_next</i>
+                <%= location.getLocation() %>
+            </li>
+            <%
+                    }
+                } else {
+            %>
+            <li>You have no preferred location yet :(</li>
+            <%
+                }
+            %>
+        </ul>
+    </div>
+    <% } %>
+</div>
+
diff --git a/PrOjek/webapp/src/main/webapp/views/signup_view.jsp b/PrOjek/webapp/src/main/webapp/views/signup_view.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..d95484d0e0cbb3d62f08542b5d144d03afdeec22
--- /dev/null
+++ b/PrOjek/webapp/src/main/webapp/views/signup_view.jsp
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title> Sign Up</title>
+        <link rel="stylesheet" href="./resources/css/style.css">
+        <link rel="stylesheet" href="./resources/css/element.css">
+    </head>
+    <body>
+        <div class="login-extern-container">
+        <div class="row">
+            <div class="col-4 align-center">
+                <hr class="loginhr">
+            </div>
+            <div class="col-4 align-center">
+                <h3 class="headstyle">Signup</h3>
+            </div>
+            <div class="col-4 align-center">
+                <hr class="loginhr">
+            </div>
+        </div>
+        <div class="signupcontainer">
+            <div class="row">
+                <form action="" method="POST" accept-charset="utf-8" id="signup-form">
+                    <div  class="row standard" >
+                        <div class="col-5">
+                            <p class="loginform">Your Name</p>
+                        </div>
+                        <input id="name" class="col-7 input-standard" name="name">
+                    </div>
+                    <div  class="row standard" >
+                        <div class="col-5">
+                            <p class="loginform">Username</p>
+                        </div>
+                        <input id="username" class="col-6 input-standard" name="username">
+                        <span id="username-ok"><i class="material-icons">&#xE5CA;</i></span>
+                        <span id="username-no"><i class="material-icons">&#xE14C;</i></span>
+
+                    </div>
+                    <div  class="row standard" >
+                        <div class="col-5">
+                            <p class="loginform">Email</p>
+                        </div>
+                        <input id="email" class="col-6 input-standard" name="email">
+                        <span id="email-ok"><i class="material-icons">&#xE5CA;</i></span>
+                        <span id="email-no"><i class="material-icons">&#xE14C;</i></span>
+
+                    </div>
+                    <div class="row standard" >
+                        <div class="col-5">
+                            <p class="loginform">Password</p>
+                        </div>
+                        <input id="password" class="col-7 input-standard" name="password" type="password">
+                    </div>
+                    <div class="row standard">
+                        <div class="col-5">
+                            <p class="loginform">Confirm Password</p>
+                        </div>
+                        <input id="confirm-password" class="col-7 input-standard" name="confirm_password" type="password">
+                    </div>
+                    <div class="row standard">
+                        <div class="col-5">
+                            <p class="loginform">Phone Number</p>
+                        </div>
+                        <input id="phone" class="col-7 input-standard" name="phone">
+                    </div>
+                    <div class="row standard">
+                        <div class="col-12 loginform">
+                            <input type="checkbox" name="driver" value="driver"> Also sign me up as driver!<br>
+                        </div>
+                    </div>
+                    <div class="row margin-top">
+                        <div class="col-6">
+                            <%--<a href="http://<?php echo $_SERVER['HTTP_HOST']?>/login.php"> <u>Already have an account?</u></a>--%>
+                            <br><span class="warning" id="status"></span>
+                        </div>
+                        <div class="col-6">
+                            <input class="button button-green right" type="submit" name="submit" value="REGISTER">
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </body>
+</html>
+