diff --git a/TugasBesar2_2017/WebService/build.gradle b/TugasBesar2_2017/WebService/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..06603644342c36e684eea0a34ef635dcb40fcafd
--- /dev/null
+++ b/TugasBesar2_2017/WebService/build.gradle
@@ -0,0 +1,23 @@
+plugins {
+    id 'java'
+    id 'war'
+    id 'org.akhikhl.gretty'
+}
+
+dependencies {
+    compile fileTree(include: ['*.jar'], dir: 'libs')
+
+    compile project(':SharedLibrary')
+
+    // https://mvnrepository.com/artifact/junit/junit
+    testCompile 'junit:junit:4.12'
+    // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
+    providedCompile 'javax.servlet:javax.servlet-api:4.0.0'
+    // https://mvnrepository.com/artifact/com.google.code.gson/gson
+    compile 'com.google.code.gson:gson:2.8.2'
+
+    // https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-ri
+    gretty 'com.sun.xml.ws:jaxws-ri:2.3.0'
+    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
+    gretty 'mysql:mysql-connector-java:8.0.8-dmr'
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/OjekOnline.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/OjekOnline.java
new file mode 100644
index 0000000000000000000000000000000000000000..a8a3a6f7aba3270a7a11b609b43628fbe40f019c
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/OjekOnline.java
@@ -0,0 +1,129 @@
+package com.adaapa.ojekservice;
+
+import com.adaapa.ojekservice.handlers.DriverHandler;
+import com.adaapa.ojekservice.handlers.OrderHandler;
+import com.adaapa.ojekservice.handlers.ProfileHandler;
+import com.google.gson.Gson;
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+
+@SOAPBinding(style = SOAPBinding.Style.RPC)
+@WebService()
+public class OjekOnline {
+  private Gson gson = new Gson();
+  @WebMethod(operationName = "getProfile")
+  public String getProfile(@WebParam(name = "access_token") String access_token)
+  {
+    return ProfileHandler.doGetProfile(access_token);
+  }
+
+  @WebMethod
+  public String addUser(
+      @WebParam(name = "access_token") String access_token,
+      @WebParam(name = "user") String user) {
+    //Redone registering user here, without password but with isdriver status
+    return ProfileHandler.doAddUser(access_token, user);
+  }
+
+  @WebMethod
+  public String getDriverProfile(@WebParam(name = "access_token") String access_token) {
+    return DriverHandler.doGetDriverProfile(access_token);
+  }
+
+  @WebMethod(operationName = "getPreferredLocation")
+  public String getPreferredLocations(
+      @WebParam(name = "access_token") String access_token) {
+    return DriverHandler.doGetPreferredLocation(access_token);
+  }
+
+  @WebMethod
+  public String addPreferredLocation(
+      @WebParam(name = "access_token") String access_token,
+      @WebParam(name = "location") String location) {
+    return DriverHandler.doAddPreferredLocation(access_token, location);
+  }
+
+  @WebMethod
+  public String editProfile(
+      @WebParam(name = "access_token") String access_token,
+      @WebParam(name = "user") String user) {
+    return ProfileHandler.doEditProfile(access_token,user);
+  }
+
+  @WebMethod
+  public String findDriver (
+      @WebParam(name = "access_token") String access_token,
+      @WebParam(name = "driver_name") String driver_name) {
+      return OrderHandler.doFindDriver(access_token, driver_name);
+  }
+
+  @WebMethod
+  public String findDriverByPreferredLocation (
+      @WebParam(name ="access_token") String access_token,
+      @WebParam(name = "pickup") String pickup,
+      @WebParam(name = "destination") String destination){
+      return OrderHandler.doFindDriverByPreferredLocation(access_token, pickup, destination);
+  }
+
+  @WebMethod
+  public String completeOrder(
+      @WebParam(name = "access_token") String access_token,
+      @WebParam(name = "order") String order) {
+        return OrderHandler.doCompleteOrder(access_token, order);
+  }
+
+  @WebMethod
+  public String getUserHistory(
+      @WebParam(name = "access_token") String access_token
+  ) {
+        return OrderHandler.doGetUserHistory(access_token);
+  }
+
+  @WebMethod
+  public String getDriverHistory(
+      @WebParam(name = "access_token") String access_token
+  ) {
+        return OrderHandler.doGetDriverHistory(access_token);
+  }
+
+  @WebMethod
+  public String hideDriverHistory(
+      @WebParam(name = "access_token") String access_token,
+      @WebParam(name = "order_id") Integer order_id) {
+    return OrderHandler.doDriverHideHistory(access_token, order_id);
+
+  }
+
+  @WebMethod
+  public String hideUserHistory(
+      @WebParam(name = "access_token") String access_token,
+      @WebParam(name = "order_id") Integer order_id) {
+    return OrderHandler.doUserHideHistory(access_token, order_id);
+  }
+
+  @WebMethod
+  public String deletePreferredLocation(
+      @WebParam(name = "access_token") String access_token,
+      @WebParam(name = "position") Integer position
+  ) {
+        return DriverHandler.doDeletePreferredLocation(access_token,position);
+  }
+
+  @WebMethod
+  public String editPreferredLocation(
+      @WebParam(name = "access_token") String access_token,
+      @WebParam(name = "position") Integer position,
+      @WebParam(name = "location") String location
+  ) {
+        return DriverHandler.doUpdatePreferredLocation(access_token, position, location);
+  }
+
+  @WebMethod
+  public String findDriverByUsername(String access_token, String username) {
+        return DriverHandler.doFindDriverByUsername(access_token, username);
+  }
+}
+
+
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/DriverHandler.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/DriverHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..13592f2fa8f40bf106bc8549d61018e7c1504a8b
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/DriverHandler.java
@@ -0,0 +1,145 @@
+package com.adaapa.ojekservice.handlers;
+
+import com.adaapa.bean.DriverBean;
+import com.adaapa.bean.PreferredLocationBean;
+import com.adaapa.bean.UserBean;
+import com.adaapa.bean.WebServiceBean;
+import com.adaapa.ojekservice.models.DriverModel;
+import com.adaapa.ojekservice.models.UserModel;
+import com.adaapa.ojekservice.services.TokenVerificationService;
+import com.google.gson.Gson;
+import java.sql.ResultSet;
+import java.util.ArrayList;
+
+public class DriverHandler {
+  public static String doGetPreferredLocation(String access_token) {
+    try {
+      WebServiceBean response = new WebServiceBean();
+      UserModel userModel = new UserModel();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if(validUser != null) {
+        DriverModel driverModel = new DriverModel();
+        ArrayList<PreferredLocationBean> preferredLocationArray = driverModel.findPreferredLocation(validUser.getUsername());
+        response.setStatus(WebServiceBean.STATUS_VALID);
+        response.setBody(new Gson().toJson(preferredLocationArray));
+      } else {
+        response.setStatus(WebServiceBean.STATUS_INVALID);
+      }
+      return new Gson().toJson(response);
+    }catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  public static String doGetDriverProfile(String access_token) {
+    try {
+      WebServiceBean response = new WebServiceBean();
+      UserModel userModel = new UserModel();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if(validUser != null) {
+        DriverModel driverModel = new DriverModel();
+        DriverBean driverBean = new DriverBean();
+        driverBean.setVote(driverModel.countVote(validUser.username));
+        driverBean.setName(validUser.getName());
+        driverBean.setRating(driverModel.calculateRating(validUser.username));
+        response.setStatus(WebServiceBean.STATUS_VALID);
+        response.setBody(new Gson().toJson(driverBean));
+      } else {
+        response.setStatus(WebServiceBean.STATUS_INVALID);
+      }
+      return new Gson().toJson(response);
+    }catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  public static String doAddPreferredLocation(String access_token, String location) {
+    try {
+      WebServiceBean response = new WebServiceBean();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if(validUser == null) {
+        response.setStatus(WebServiceBean.STATUS_INVALID);
+      } else {
+        response.setStatus(WebServiceBean.STATUS_VALID);
+        UserModel userModel = new UserModel();
+        DriverModel driverModel = new DriverModel();
+        UserBean wsUser = userModel.findUserByUsername(validUser.username);
+        ResultSet rs = driverModel.query(String.format("SELECT MAX(position) as max FROM preferred_locations WHERE id= %d",wsUser.getId()));
+        int curr = rs.next() ? rs.getInt("max") + 1 : 1;
+        driverModel.queryUpdate(
+            String.format("INSERT INTO preferred_locations VALUES (%d,%d,'%s')",
+                wsUser.getId(), curr,location));
+      }
+      return new Gson().toJson(response);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+  }
+
+  public static String doDeletePreferredLocation(String access_token, Integer position) {
+    try {
+      WebServiceBean response = new WebServiceBean();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if(validUser == null) {
+        response.setStatus(WebServiceBean.STATUS_INVALID);
+      } else {
+        response.setStatus(WebServiceBean.STATUS_VALID);
+        UserModel userModel = new UserModel();
+        DriverModel driverModel = new DriverModel();
+        UserBean wsUser = userModel.findUserByUsername(validUser.getUsername());
+        ResultSet rs = driverModel.queryUpdate(String.format(
+            "DELETE FROM preferred_locations WHERE id=%d and position=%d",
+            wsUser.getId(),position
+        ));
+      }
+      return new Gson().toJson(response);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+  }
+
+  public static String doUpdatePreferredLocation(String access_token, Integer position, String location) {
+    try {
+      WebServiceBean response = new WebServiceBean();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if(validUser == null) {
+        response.setStatus(WebServiceBean.STATUS_INVALID);
+      } else {
+        response.setStatus(WebServiceBean.STATUS_VALID);
+        UserModel userModel = new UserModel();
+        DriverModel driverModel = new DriverModel();
+        UserBean wsUser = userModel.findUserByUsername(validUser.getUsername());
+        ResultSet rs = driverModel.queryUpdate(String.format(
+            "UPDATE preferred_locations SET location = '%s' WHERE id=%d AND position=%d",
+            location,wsUser.getId(),position
+        ));
+      }
+      return new Gson().toJson(response);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+  }
+  public static String doFindDriverByUsername(String access_token, String username) {
+    try {
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      Gson gson =  new Gson();
+      WebServiceBean response = new WebServiceBean();
+      if(validUser != null) {
+        response.setStatus(WebServiceBean.STATUS_VALID);
+        response.setBody(gson.toJson(new UserModel().findUserByUsername(username)));
+      } else {
+        response.setStatus(WebServiceBean.STATUS_INVALID);
+      }
+      return gson.toJson(response);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+
+  }
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/OrderHandler.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/OrderHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..0de1e08bc3d3bb126bdda7097de50248eb2a7dd6
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/OrderHandler.java
@@ -0,0 +1,161 @@
+package com.adaapa.ojekservice.handlers;
+
+import com.adaapa.bean.DriverBean;
+import com.adaapa.bean.OrderBean;
+import com.adaapa.bean.UserBean;
+import com.adaapa.bean.WebServiceBean;
+import com.adaapa.ojekservice.models.DriverModel;
+import com.adaapa.ojekservice.models.UserModel;
+import com.adaapa.ojekservice.services.TokenVerificationService;
+import com.google.gson.Gson;
+import java.util.ArrayList;
+
+/**
+ * Created by ireneedriadr on 11/5/17.
+ */
+public class OrderHandler {
+  public static String doGetUserHistory(String access_token) {
+    try {
+      WebServiceBean response = new WebServiceBean();
+      UserModel userModel = new UserModel();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if(validUser != null) {
+        ArrayList<OrderBean> userHistoryArray = userModel.findPrevOrder(userModel.findOrderByUsername(validUser.getUsername()));
+        response.setStatus(WebServiceBean.STATUS_VALID);
+        response.setBody(new Gson().toJson(userHistoryArray));
+      } else {
+        response.setStatus(WebServiceBean.STATUS_INVALID);
+      }
+      return new Gson().toJson(response);
+    }catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+    public static String doFindDriver(String access_token, String driver_name){
+        try {
+            Gson gson = new Gson();
+            WebServiceBean webServiceBean = new WebServiceBean();
+            UserBean validUser = TokenVerificationService.verifyToken(access_token);
+            if (validUser == null) {
+                webServiceBean.setStatus(WebServiceBean.STATUS_INVALID);
+                return gson.toJson(webServiceBean);
+            } else {
+                webServiceBean.setStatus(WebServiceBean.STATUS_VALID);
+                UserModel userModel = new UserModel();
+                DriverModel driverModel = new DriverModel();
+                ArrayList<DriverBean> driverBeans = driverModel.findDriverByName(validUser.getUsername(),driver_name);
+                webServiceBean.setBody(gson.toJson(driverBeans));
+                return gson.toJson(webServiceBean);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+  public static String doGetDriverHistory(String access_token) {
+    try {
+      WebServiceBean response = new WebServiceBean();
+      UserModel userModel = new UserModel();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if(validUser != null) {
+        ArrayList<OrderBean> userHistoryArray = userModel.findPrevDriverOrder(userModel.findOrderByUsername(validUser.getUsername()));
+        response.setStatus(WebServiceBean.STATUS_VALID);
+        response.setBody(new Gson().toJson(userHistoryArray));
+      } else {
+        response.setStatus(WebServiceBean.STATUS_INVALID);
+      }
+      return new Gson().toJson(response);
+    }catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  public static String doFindDriverByPreferredLocation(String access_token, String pickup, String destination){
+    try {
+      Gson gson = new Gson();
+      WebServiceBean webServiceBean = new WebServiceBean();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if (validUser == null) {
+        webServiceBean.setStatus(WebServiceBean.STATUS_INVALID);
+        return gson.toJson(webServiceBean);
+      } else {
+        webServiceBean.setStatus(WebServiceBean.STATUS_VALID);
+        UserModel userModel = new UserModel();
+        DriverModel driverModel = new DriverModel();
+        ArrayList<DriverBean> driverBeans = driverModel.findDriverByPreferredLocation(validUser.getUsername(), pickup, destination);
+        webServiceBean.setBody(gson.toJson(driverBeans));
+        return gson.toJson(webServiceBean);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  public static String doCompleteOrder(String access_token, String order) {
+    try{
+      Gson gson = new Gson();
+      WebServiceBean webServiceBean = new WebServiceBean();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if (validUser == null) {
+        webServiceBean.setStatus(WebServiceBean.STATUS_INVALID);
+      } else {
+        webServiceBean.setStatus(WebServiceBean.STATUS_VALID);
+        OrderBean orderBean = gson.fromJson(order, OrderBean.class);
+        DriverModel driverModel = new DriverModel();
+        driverModel.queryUpdate(String.format(
+            "INSERT INTO orders (user_id,driver_id,pickup,destination,rating,comment) VALUES"
+                + "(%d,%d,'%s','%s','%d','%s')",
+            validUser.getId(),orderBean.getDriverId(),orderBean.getPickup(),orderBean.getDestination(),
+            orderBean.getRating().intValue(), orderBean.getComment()
+        ));
+      }
+      return gson.toJson(webServiceBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  public static String doUserHideHistory(String access_token, Integer orderId) {
+    try{
+      Gson gson = new Gson();
+      WebServiceBean webServiceBean = new WebServiceBean();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if (validUser == null) {
+        webServiceBean.setStatus(WebServiceBean.STATUS_INVALID);
+      } else {
+        webServiceBean.setStatus(WebServiceBean.STATUS_VALID);
+        UserModel userModel = new UserModel();
+        userModel.queryUpdate(String.format("UPDATE orders SET user_hidden=1 WHERE id=%d",orderId));
+      }
+      return gson.toJson(webServiceBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  public static String doDriverHideHistory(String access_token, Integer orderId) {
+    try{
+      Gson gson = new Gson();
+      WebServiceBean webServiceBean = new WebServiceBean();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if (validUser == null) {
+        webServiceBean.setStatus(WebServiceBean.STATUS_INVALID);
+      } else {
+        webServiceBean.setStatus(WebServiceBean.STATUS_VALID);
+        UserModel userModel = new UserModel();
+        userModel.queryUpdate(String.format("UPDATE orders SET driver_hidden=1 WHERE id=%d",orderId));
+      }
+      return gson.toJson(webServiceBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/ProfileHandler.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/ProfileHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ecb290df990a3417f7db49b2a20fb7838fc113b
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/handlers/ProfileHandler.java
@@ -0,0 +1,74 @@
+package com.adaapa.ojekservice.handlers;
+
+import com.adaapa.bean.UserBean;
+import com.adaapa.bean.WebServiceBean;
+import com.adaapa.ojekservice.models.UserModel;
+import com.adaapa.ojekservice.services.TokenVerificationService;
+import com.google.gson.Gson;
+
+public class ProfileHandler {
+  static Gson gson = new Gson();
+  public static String doGetProfile(String access_token){
+    try {
+      WebServiceBean webServiceBean = new WebServiceBean();
+      UserBean resUser = TokenVerificationService.verifyToken(access_token);
+      if (resUser == null) {
+        webServiceBean.setStatus(WebServiceBean.STATUS_INVALID);
+        return gson.toJson(webServiceBean);
+      } else {
+        webServiceBean.setStatus(WebServiceBean.STATUS_VALID);
+        UserModel userModel = new UserModel();
+        UserBean user = userModel.findUserByUsername(resUser.getUsername());
+        if (user == null) {
+          resUser.isDriver = false;
+          userModel.saveUser(resUser);
+          webServiceBean.setBody(gson.toJson(resUser));
+        } else {
+          webServiceBean.setBody(gson.toJson(user));
+        }
+        return gson.toJson(webServiceBean);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+  public static String doEditProfile(String access_token, String user) {
+    try {
+      WebServiceBean webServiceBean = new WebServiceBean();
+      UserBean resUser = TokenVerificationService.verifyToken(access_token);
+      if (resUser == null) {
+        webServiceBean.setStatus(WebServiceBean.STATUS_INVALID);
+      } else {
+        UserBean userBean = gson.fromJson(user, UserBean.class);
+        userBean.username = resUser.username;
+        UserModel userModel = new UserModel();
+        userModel.updateUser(userBean);
+        webServiceBean.setStatus(WebServiceBean.STATUS_VALID);
+      }
+      return gson.toJson(webServiceBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  public static String doAddUser(String access_token, String user) {
+    try {
+      WebServiceBean webServiceBean = new WebServiceBean();
+      UserBean validUser = TokenVerificationService.verifyToken(access_token);
+      if (validUser == null) {
+        webServiceBean.setStatus(WebServiceBean.STATUS_INVALID);
+      } else {
+        UserBean userBean = gson.fromJson(user, UserBean.class);
+        UserModel userModel = new UserModel();
+        userModel.saveUser(userBean);
+        webServiceBean.setStatus(WebServiceBean.STATUS_VALID);
+      }
+      return gson.toJson(webServiceBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+  }
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/DriverModel.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/DriverModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..88ad284985facecb0ce626317f071168688e3d43
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/DriverModel.java
@@ -0,0 +1,121 @@
+package com.adaapa.ojekservice.models;
+
+import com.adaapa.bean.DriverBean;
+import com.adaapa.bean.PreferredLocationBean;
+import com.adaapa.models.BaseModel;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Base64;
+
+public class DriverModel extends BaseModel {
+  public static String ORDER_TABLE = "orders";
+  public static String USER_TABLE = "users";
+  public static String PREFERRED_TABLE = "preferred_locations";
+  public DriverModel() {
+    super("users","id");
+  }
+  public Integer countVote(String username) {
+    try {
+      ResultSet rs = query(String.format(
+          "SELECT COUNT(rating) as vote FROM  %s inner join %s on (%s.driver_id = %s.id) where users.username = '%s'",
+          ORDER_TABLE, USER_TABLE, ORDER_TABLE, USER_TABLE, username));
+      if(rs.next()) {
+        return rs.getInt("vote");
+      } else {
+        return 0;
+      }
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      return 0;
+    }
+  }
+
+  public DriverBean parseDriverBean(ResultSet resultSet) throws SQLException {
+    String username = resultSet.getString("username");
+    DriverBean driverBean = new DriverBean();
+    driverBean.setRating(calculateRating(username));
+    driverBean.setName(resultSet.getString("name"));
+    driverBean.setVote(countVote(username));
+    driverBean.setId(resultSet.getInt("id"));
+    driverBean.setUsername(username);
+    try {
+      driverBean.setImage("data:image/jpeg;charset=utf-8;base64,"+ Base64.getEncoder().encodeToString(resultSet.getBytes("image")));
+    } catch (Exception e){
+      System.out.println("User has no profile image");
+    }
+    return driverBean;
+  }
+  public Double calculateRating (String username) {
+    try {
+      ResultSet rs = query(String.format(
+          "SELECT AVG(rating) as rating FROM  %s inner join %s on (%s.driver_id = %s.id) where users.username = '%s'",
+          ORDER_TABLE, USER_TABLE, ORDER_TABLE, USER_TABLE, username));
+      if(rs.next()) {
+        return rs.getDouble("rating");
+      } else {
+        return 0.0;
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return 0.0;
+    }
+  }
+
+  public ArrayList<PreferredLocationBean> findPreferredLocation (String username ) {
+    ArrayList<PreferredLocationBean> preferredLocationBeanArray = new ArrayList<>();
+    try {
+      ResultSet rs = query(String.format(
+          "SELECT position,location FROM %s NATURAL JOIN %s WHERE users.username = '%s'",
+          PREFERRED_TABLE,USER_TABLE, username
+      ));
+      while (rs.next()) {
+        PreferredLocationBean preferredLocationBean = new PreferredLocationBean();
+        preferredLocationBean.setLocation(rs.getString("location"));
+        preferredLocationBean.setPosition(rs.getInt("position"));
+        preferredLocationBeanArray.add(preferredLocationBean);
+      }
+      return preferredLocationBeanArray;
+    } catch (Exception e) {
+      e.printStackTrace();
+      return preferredLocationBeanArray;
+    }
+  }
+
+  public ArrayList<DriverBean> findDriverByName(String username, String name) {
+    ResultSet resultSet = null;
+    ArrayList<DriverBean> driverBeans = new ArrayList<>();
+    int i = 0;
+    try {
+      resultSet = query("SELECT * FROM users WHERE username != '"+username+"' AND name LIKE '%"+name+"%' and is_driver=1");
+      while (resultSet.next()) {
+        driverBeans.add(parseDriverBean(resultSet));
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return driverBeans;
+  }
+
+
+  public ArrayList<DriverBean> findDriverByPreferredLocation(String username, String pickup, String destination) {
+    ResultSet resultSet = null;
+    ArrayList<DriverBean> driverBeans = new ArrayList<>();
+    int i = 0;
+    try {
+      resultSet = query(String.format(
+          "SELECT DISTINCT users.name, users.username, users.id, users.image "
+              + "FROM users NATURAL JOIN preferred_locations WHERE username!= '%s' and (location='%s' or location='%s')",
+          username,pickup,destination
+      ));
+      while (resultSet.next()) {
+        driverBeans.add(parseDriverBean(resultSet));
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return driverBeans;
+  }
+
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/UserModel.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/UserModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..d90d8cfcef0c2256e10648e813480e46731e18e3
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/models/UserModel.java
@@ -0,0 +1,149 @@
+package com.adaapa.ojekservice.models;
+
+import com.adaapa.bean.OrderBean;
+import com.adaapa.bean.UserBean;
+import com.adaapa.models.BaseModel;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Base64;
+
+public class UserModel extends BaseModel{
+  public UserModel(){
+    super("users","id");
+  }
+
+  public UserBean parseUserBean(ResultSet resultSet)throws SQLException {
+    UserBean ubean = new UserBean();
+    ubean.id = resultSet.getInt("id");
+    ubean.email = resultSet.getString("email");
+    ubean.phoneNumber = resultSet.getString("phone");
+    ubean.name = resultSet.getString("name");
+    ubean.isDriver = resultSet.getBoolean("is_driver");
+    ubean.username = resultSet.getString("username");
+    try {
+      ubean.image = "data:image/jpeg;charset=utf-8;base64,"+Base64.getEncoder().encodeToString(resultSet.getBytes("image"));
+    } catch (Exception e) {
+      System.out.println("User has no image");
+    }
+    return ubean;
+  }
+
+  public OrderBean parseUserOrder(ResultSet resultSet)throws SQLException {
+    OrderBean obean = new OrderBean();
+    obean.setId(resultSet.getInt("id"));
+    obean.setUserId(resultSet.getInt("user_id"));
+    obean.setDriverId(resultSet.getInt("driver_id"));
+    obean.setPickup(resultSet.getString("pickup"));
+    obean.setDestination(resultSet.getString("destination"));
+    obean.setRating(resultSet.getDouble("rating"));
+    obean.setComment(resultSet.getString("comment"));
+    obean.setName(resultSet.getString("name"));
+    obean.setTimestamp(resultSet.getTimestamp("timestamp"));
+    try {
+      obean.setImage("data:image/jpeg;charset=utf-8;base64,"+Base64.getEncoder().encodeToString(resultSet.getBytes("image")));
+    } catch (Exception e) {
+      System.out.println("User has no image");
+    }
+    return obean;
+  }
+
+  public UserBean findUserByUsername(String username) {
+    UserBean userBean = null;
+    ResultSet resultSet = null;
+    try {
+      resultSet = query(String.format("SELECT * FROM %s WHERE username='%s'", tableName, username));
+      if(resultSet.next()) {
+        userBean = parseUserBean(resultSet);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return userBean;
+  }
+
+  public OrderBean findOrderByUsername(String username) {
+    OrderBean orderBean = null;
+    ResultSet resultSet = null;
+    try {
+      resultSet = query(String.format(
+          "SELECT * FROM orders JOIN users ON  users.id = orders.driver_id WHERE username='%s'",
+          username));
+      if (resultSet.next()) {
+        orderBean = parseUserOrder(resultSet);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return orderBean;
+  }
+
+  public Boolean saveUser(UserBean userBean) {
+    ResultSet resultSet = null;
+    try {
+      resultSet = queryUpdate(String.format(
+          "INSERT INTO %s (name,email,phone,username,is_driver)"
+              + "VALUES ('%s','%s','%s','%s','%d')",
+          tableName,userBean.name,userBean.email,userBean.phoneNumber,userBean.username,userBean.isDriver ? 1 : 0
+
+      ));
+      return true;
+    } catch (Exception e) {
+      e.printStackTrace();
+      return false;
+    }
+
+  }
+  public void updateImage(String username, String image) throws SQLException {
+    PreparedStatement statement = db
+        .prepareStatement("UPDATE users SET image=? WHERE username = ?");
+    statement.setBytes(1, Base64.getDecoder().decode(image));
+    statement.setString(2,username);
+    statement.executeUpdate();
+  }
+  public void updateUser(UserBean updatedUser) {
+    try {
+      PreparedStatement statement = db
+          .prepareStatement("UPDATE users SET name=?, phone=?,is_driver=? WHERE username = ?");
+      statement.setString(1, updatedUser.getName());
+      statement.setString(2, updatedUser.phoneNumber);
+      statement.setBoolean(3,updatedUser.isDriver);
+      statement.setString(4, updatedUser.getUsername());
+      statement.executeUpdate();
+      if(updatedUser.getImage() != null) {
+        updateImage(updatedUser.username, updatedUser.image);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  public ArrayList<OrderBean> findPrevOrder(OrderBean driver) {
+    ArrayList<OrderBean> res = new ArrayList<>();
+
+    try {
+      ResultSet rs = query(String.format("SELECT * FROM orders JOIN users ON users.id = orders.driver_id WHERE user_id = '%s' and not user_hidden ORDER BY timestamp desc",driver.getDriverId()));
+      while (rs.next()) {
+          res.add(parseUserOrder(rs));
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return res;
+  }
+
+  public ArrayList<OrderBean> findPrevDriverOrder(OrderBean driver) {
+    ArrayList<OrderBean> res = new ArrayList<>();
+
+    try {
+      ResultSet rs = query(String.format("SELECT * FROM orders JOIN users ON users.id = orders.user_id WHERE driver_id = '%s' and not driver_hidden ORDER BY timestamp desc",driver.getDriverId()));
+      while (rs.next()) {
+        res.add(parseUserOrder(rs));
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return res;
+  }
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/DomainConfig.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/DomainConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..69367b53cd7a2cb8849cf17a27107dceebea9e81
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/DomainConfig.java
@@ -0,0 +1,26 @@
+package com.adaapa.ojekservice.services;
+
+import java.io.InputStream;
+import java.util.Properties;
+
+public class DomainConfig {
+  public static String IS_DOMAIN;
+  private final String file_name = "/config/domain.properties";
+
+  public DomainConfig() {
+    try {
+      Properties prop = new Properties();
+      InputStream inp = this.getClass().getResourceAsStream(file_name);
+      prop.load(inp);
+      IS_DOMAIN = prop.getProperty("IDSERVICE_DOMAIN");
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+  public static String getISDomain() {
+    if(IS_DOMAIN == null) {
+      new DomainConfig();
+    }
+    return IS_DOMAIN;
+  }
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/TokenVerificationService.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/TokenVerificationService.java
new file mode 100644
index 0000000000000000000000000000000000000000..cca774d906928ee8c0dbb1f4505ddb1efc8dfdf7
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/ojekservice/services/TokenVerificationService.java
@@ -0,0 +1,36 @@
+package com.adaapa.ojekservice.services;
+
+import com.adaapa.bean.TokenVerificationResponse;
+import com.adaapa.bean.UserBean;
+import com.adaapa.bean.WebServiceBean;
+import com.adaapa.tokenverifier.TokenVerifier;
+import com.google.gson.Gson;
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+
+public class TokenVerificationService {
+  private final String TOKEN_VERIFIER_PATH = "/verifytoken";
+  private final String WSDL_PATH = "?wsdl";
+  private static TokenVerifier serviceClass;
+  TokenVerificationService() throws MalformedURLException {
+    URL url = new URL(DomainConfig.getISDomain()+TOKEN_VERIFIER_PATH+WSDL_PATH);
+    QName qname = new QName("tokenverifier.adaapa.com", "TokenVerifierService");
+    Service service = Service.create(url, qname);
+    serviceClass = service.getPort(TokenVerifier.class);
+  }
+  public static UserBean verifyToken(String access_token) throws MalformedURLException {
+    if(serviceClass == null) {
+      new TokenVerificationService();
+    }
+    String result = serviceClass.verifyToken(access_token);
+    TokenVerificationResponse resultObj = new Gson().fromJson(result,TokenVerificationResponse.class);
+    WebServiceBean response = new WebServiceBean();
+    if(resultObj.getStatus().equals(TokenVerificationResponse.TOKEN_VALID)) {
+      return resultObj.getUser();
+    } else {
+      return null;
+    }
+  }
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/ObjectFactory.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/ObjectFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9f1faa1b3689a182aedf5eba5050f6805d9577e
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/ObjectFactory.java
@@ -0,0 +1,71 @@
+
+package com.adaapa.tokenverifier;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each 
+ * Java content interface and Java element interface 
+ * generated in the com.adaapa.tokenverifier package. 
+ * <p>An ObjectFactory allows you to programatically 
+ * construct new instances of the Java representation 
+ * for XML content. The Java representation of XML 
+ * content can consist of schema derived interfaces 
+ * and classes representing the binding of schema 
+ * type definitions, element declarations and model 
+ * groups.  Factory methods for each of these are 
+ * provided in this class.
+ * 
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _VerifyToken_QNAME = new QName("tokenverifier.adaapa.com", "verifyToken");
+    private final static QName _VerifyTokenResponse_QNAME = new QName("tokenverifier.adaapa.com", "verifyTokenResponse");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.adaapa.tokenverifier
+     * 
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link VerifyToken }
+     * 
+     */
+    public VerifyToken createVerifyToken() {
+        return new VerifyToken();
+    }
+
+    /**
+     * Create an instance of {@link VerifyTokenResponse }
+     * 
+     */
+    public VerifyTokenResponse createVerifyTokenResponse() {
+        return new VerifyTokenResponse();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link VerifyToken }{@code >}}
+     * 
+     */
+    @XmlElementDecl(namespace = "tokenverifier.adaapa.com", name = "verifyToken")
+    public JAXBElement<VerifyToken> createVerifyToken(VerifyToken value) {
+        return new JAXBElement<VerifyToken>(_VerifyToken_QNAME, VerifyToken.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link VerifyTokenResponse }{@code >}}
+     * 
+     */
+    @XmlElementDecl(namespace = "tokenverifier.adaapa.com", name = "verifyTokenResponse")
+    public JAXBElement<VerifyTokenResponse> createVerifyTokenResponse(VerifyTokenResponse value) {
+        return new JAXBElement<VerifyTokenResponse>(_VerifyTokenResponse_QNAME, VerifyTokenResponse.class, null, value);
+    }
+
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifier.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifier.java
new file mode 100644
index 0000000000000000000000000000000000000000..dbfe06ba3c4bbe66c3ea41db89853ceda1cb024f
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifier.java
@@ -0,0 +1,42 @@
+
+package com.adaapa.tokenverifier;
+
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebResult;
+import javax.jws.WebService;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import javax.xml.ws.Action;
+import javax.xml.ws.RequestWrapper;
+import javax.xml.ws.ResponseWrapper;
+
+
+/**
+ * This class was generated by the JAX-WS RI.
+ * JAX-WS RI 2.2.9-b130926.1035
+ * Generated source version: 2.2
+ * 
+ */
+@WebService(name = "TokenVerifier", targetNamespace = "tokenverifier.adaapa.com")
+@XmlSeeAlso({
+    ObjectFactory.class
+})
+public interface TokenVerifier {
+
+
+    /**
+     * 
+     * @param accessToken
+     * @return
+     *     returns java.lang.String
+     */
+    @WebMethod
+    @WebResult(name = "userObjectInJSON", targetNamespace = "")
+    @RequestWrapper(localName = "verifyToken", targetNamespace = "tokenverifier.adaapa.com", className = "com.adaapa.tokenverifier.VerifyToken")
+    @ResponseWrapper(localName = "verifyTokenResponse", targetNamespace = "tokenverifier.adaapa.com", className = "com.adaapa.tokenverifier.VerifyTokenResponse")
+    @Action(input = "tokenverifier.adaapa.com/TokenVerifier/verifyTokenRequest", output = "tokenverifier.adaapa.com/TokenVerifier/verifyTokenResponse")
+    public String verifyToken(
+        @WebParam(name = "access_token", targetNamespace = "")
+        String accessToken);
+
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifierService.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifierService.java
new file mode 100644
index 0000000000000000000000000000000000000000..78b39f9ad7a40449456fef44c219f6ecb369ff23
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/TokenVerifierService.java
@@ -0,0 +1,94 @@
+
+package com.adaapa.tokenverifier;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import javax.xml.ws.WebEndpoint;
+import javax.xml.ws.WebServiceClient;
+import javax.xml.ws.WebServiceException;
+import javax.xml.ws.WebServiceFeature;
+
+
+/**
+ * This class was generated by the JAX-WS RI.
+ * JAX-WS RI 2.2.9-b130926.1035
+ * Generated source version: 2.2
+ * 
+ */
+@WebServiceClient(name = "TokenVerifierService", targetNamespace = "tokenverifier.adaapa.com", wsdlLocation = "http://localhost:8001/verifytoken?wsdl")
+public class TokenVerifierService
+    extends Service
+{
+
+    private final static URL TOKENVERIFIERSERVICE_WSDL_LOCATION;
+    private final static WebServiceException TOKENVERIFIERSERVICE_EXCEPTION;
+    private final static QName TOKENVERIFIERSERVICE_QNAME = new QName("tokenverifier.adaapa.com", "TokenVerifierService");
+
+    static {
+        URL url = null;
+        WebServiceException e = null;
+        try {
+            url = new URL("http://localhost:8001/verifytoken?wsdl");
+        } catch (MalformedURLException ex) {
+            e = new WebServiceException(ex);
+        }
+        TOKENVERIFIERSERVICE_WSDL_LOCATION = url;
+        TOKENVERIFIERSERVICE_EXCEPTION = e;
+    }
+
+    public TokenVerifierService() {
+        super(__getWsdlLocation(), TOKENVERIFIERSERVICE_QNAME);
+    }
+
+    public TokenVerifierService(WebServiceFeature... features) {
+        super(__getWsdlLocation(), TOKENVERIFIERSERVICE_QNAME, features);
+    }
+
+    public TokenVerifierService(URL wsdlLocation) {
+        super(wsdlLocation, TOKENVERIFIERSERVICE_QNAME);
+    }
+
+    public TokenVerifierService(URL wsdlLocation, WebServiceFeature... features) {
+        super(wsdlLocation, TOKENVERIFIERSERVICE_QNAME, features);
+    }
+
+    public TokenVerifierService(URL wsdlLocation, QName serviceName) {
+        super(wsdlLocation, serviceName);
+    }
+
+    public TokenVerifierService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) {
+        super(wsdlLocation, serviceName, features);
+    }
+
+    /**
+     * 
+     * @return
+     *     returns TokenVerifier
+     */
+    @WebEndpoint(name = "TokenVerifierPort")
+    public TokenVerifier getTokenVerifierPort() {
+        return super.getPort(new QName("tokenverifier.adaapa.com", "TokenVerifierPort"), TokenVerifier.class);
+    }
+
+    /**
+     * 
+     * @param features
+     *     A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
+     * @return
+     *     returns TokenVerifier
+     */
+    @WebEndpoint(name = "TokenVerifierPort")
+    public TokenVerifier getTokenVerifierPort(WebServiceFeature... features) {
+        return super.getPort(new QName("tokenverifier.adaapa.com", "TokenVerifierPort"), TokenVerifier.class, features);
+    }
+
+    private static URL __getWsdlLocation() {
+        if (TOKENVERIFIERSERVICE_EXCEPTION!= null) {
+            throw TOKENVERIFIERSERVICE_EXCEPTION;
+        }
+        return TOKENVERIFIERSERVICE_WSDL_LOCATION;
+    }
+
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyToken.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyToken.java
new file mode 100644
index 0000000000000000000000000000000000000000..230c4a2a89fc3f17c385671eb26cd164409529ae
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyToken.java
@@ -0,0 +1,62 @@
+
+package com.adaapa.tokenverifier;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for verifyToken complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="verifyToken">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="access_token" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "verifyToken", propOrder = {
+    "accessToken"
+})
+public class VerifyToken {
+
+    @XmlElement(name = "access_token")
+    protected String accessToken;
+
+    /**
+     * Gets the value of the accessToken property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    /**
+     * Sets the value of the accessToken property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setAccessToken(String value) {
+        this.accessToken = value;
+    }
+
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyTokenResponse.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyTokenResponse.java
new file mode 100644
index 0000000000000000000000000000000000000000..553c4c5c8ce4a8b8c8603ef2e589c3f221fd1180
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/VerifyTokenResponse.java
@@ -0,0 +1,60 @@
+
+package com.adaapa.tokenverifier;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for verifyTokenResponse complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="verifyTokenResponse">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="userObjectInJSON" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "verifyTokenResponse", propOrder = {
+    "userObjectInJSON"
+})
+public class VerifyTokenResponse {
+
+    protected String userObjectInJSON;
+
+    /**
+     * Gets the value of the userObjectInJSON property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getUserObjectInJSON() {
+        return userObjectInJSON;
+    }
+
+    /**
+     * Sets the value of the userObjectInJSON property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setUserObjectInJSON(String value) {
+        this.userObjectInJSON = value;
+    }
+
+}
diff --git a/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/package-info.java b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..557e7d7845a07c7e6e1d5190bc142a8ccd0d2916
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/java/com/adaapa/tokenverifier/package-info.java
@@ -0,0 +1,2 @@
+@javax.xml.bind.annotation.XmlSchema(namespace = "tokenverifier.adaapa.com")
+package com.adaapa.tokenverifier;
diff --git a/TugasBesar2_2017/WebService/src/main/resources/config/db.properties.example b/TugasBesar2_2017/WebService/src/main/resources/config/db.properties.example
new file mode 100644
index 0000000000000000000000000000000000000000..d4c28255313d72c4c8701d14f5ab9a1149c00457
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/resources/config/db.properties.example
@@ -0,0 +1,4 @@
+DB_HOST = localhost
+DB_USER = wbd
+DB_PASS = wbd123
+DB_NAME = wbd_ojekservice
\ No newline at end of file
diff --git a/TugasBesar2_2017/WebService/src/main/resources/config/domain.properties.example b/TugasBesar2_2017/WebService/src/main/resources/config/domain.properties.example
new file mode 100644
index 0000000000000000000000000000000000000000..533f27bb11a4c4ae88aa980b8d1823b3c23fd1bb
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/resources/config/domain.properties.example
@@ -0,0 +1 @@
+IDSERVICE_DOMAIN = localhost:8001
diff --git a/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/sun-jaxws.xml b/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/sun-jaxws.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8e026514c7b55dcb9f613bea25b5bf5cc17382e4
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/sun-jaxws.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<endpoints
+  xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
+  version="2.0">
+
+  <endpoint
+    name="OjekOnline"
+    implementation="com.adaapa.ojekservice.OjekOnline"
+    url-pattern="/ojekonline"/>
+</endpoints>
diff --git a/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/web.xml b/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d004022fad19e303b981743d94f3cdf124340dc8
--- /dev/null
+++ b/TugasBesar2_2017/WebService/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
+  version="4.0">
+
+  <listener>
+    <listener-class>
+      com.sun.xml.ws.transport.http.servlet.WSServletContextListener
+    </listener-class>
+  </listener>
+
+  <servlet>
+    <servlet-name>web-jaxws</servlet-name>
+    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>web-jaxws</servlet-name>
+    <url-pattern>/soap</url-pattern>
+  </servlet-mapping>
+</web-app>