diff --git a/TugasBesar2_2017/SharedLibrary/build.gradle b/TugasBesar2_2017/SharedLibrary/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..b58448d9561e44bcf4f4b7ae78804e26d56aaf0c
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/build.gradle
@@ -0,0 +1,13 @@
+plugins {
+    id 'java'
+    id 'war'
+}
+
+dependencies {
+    compile fileTree(include: ['*.jar'], dir: 'libs')
+
+    // 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'
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/DriverBean.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/DriverBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc9bea91c8794733f830f06cf5a8bf1a795e3f49
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/DriverBean.java
@@ -0,0 +1,61 @@
+package com.adaapa.bean;
+
+import java.io.Serializable;
+
+public class DriverBean implements Serializable{
+  private Integer id;
+  private String name;
+  private Double rating;
+  private Integer vote;
+  private String image;
+  private String username;
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getImage() {
+    return image;
+  }
+
+  public Integer getId() {
+    return id;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public void setImage(String image) {
+    this.image = image;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public Double getRating() {
+    return rating;
+  }
+
+  public Integer getVote() {
+    return vote;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public void setVote(Integer vote) {
+    this.vote = vote;
+  }
+
+  public void setRating(Double rating) {
+    this.rating = rating;
+  }
+
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/LoginRequestBean.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/LoginRequestBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9f14ee5d8bffcc41b5d0a6b8c73c28bc58f5ea6
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/LoginRequestBean.java
@@ -0,0 +1,23 @@
+package com.adaapa.bean;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+public class LoginRequestBean implements Serializable {
+  private String username;
+  private String password;
+
+  public LoginRequestBean (String username, String password) {
+    this.username = username;
+    this.password = password;
+  }
+
+  public String getURLParameter() throws UnsupportedEncodingException {
+    return String.format(
+        "username=%s&password=%s",
+        URLEncoder.encode(username, "UTF-8"),
+        URLEncoder.encode(password, "UTF-8")
+    );
+  }
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/LoginResponseBean.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/LoginResponseBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca76bf60551a4ed4e67bdb6e8a9a3671ee2e0488
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/LoginResponseBean.java
@@ -0,0 +1,43 @@
+package com.adaapa.bean;
+
+import java.io.Serializable;
+
+public class LoginResponseBean implements Serializable {
+  public static Integer TOKEN_AGE_DEFAULT = 60*60*24*365;
+  private String status;
+  private String access_token;
+  private UserBean user_bean;
+  private Integer age;
+  public LoginResponseBean(String status, String access_token,Integer age, UserBean userBean) {
+    setStatus(status);
+    setAge(age);
+    setAccessToken(access_token);
+    setUserBean(userBean);
+  }
+
+  public Integer getAge() {
+    return age;
+  }
+
+  public void setAge(Integer age) {
+    this.age = age;
+  }
+  public void setStatus(String status) {
+    this.status = status;
+  }
+  public void setAccessToken(String access_token) {
+    this.access_token = access_token;
+  }
+  public void setUserBean(UserBean userBean) {
+    this.user_bean = userBean;
+  }
+  public String getStatus() {
+    return status;
+  }
+  public String getAccessToken() {
+    return access_token;
+  }
+  public UserBean getUserBean() {
+    return user_bean;
+  }
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/LogoutResponseBean.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/LogoutResponseBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..96b38b10ada70bcba5c01fabc339390ed50ffb79
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/LogoutResponseBean.java
@@ -0,0 +1,23 @@
+package com.adaapa.bean;
+
+import java.io.Serializable;
+
+public class LogoutResponseBean implements Serializable {
+  private String status;
+
+  public LogoutResponseBean() {
+    this.status = status;
+  }
+
+  public LogoutResponseBean(String status) {
+    this.status = status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/OrderBean.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/OrderBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..8de2a3554ba95375e745294948edf0497bf1f47a
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/OrderBean.java
@@ -0,0 +1,93 @@
+package com.adaapa.bean;
+
+import java.sql.Timestamp;
+
+public class OrderBean {
+  private Integer id;
+  private Integer userId;
+  private Integer driverId;
+  private Double rating;
+  private String pickup;
+  private String destination;
+  private String comment;
+  private String image;
+  private String name;
+  private String username;
+  private Timestamp timestamp;
+
+  public Timestamp getTimestamp() {
+    return timestamp;
+  }
+
+  public Integer getId() {
+    return id;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public void setTimestamp(Timestamp timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  public Double getRating() {
+    return rating;
+  }
+
+  public Integer getDriverId() {
+    return driverId;
+  }
+
+  public Integer getUserId() {
+    return userId;
+  }
+
+  public String getComment() {
+    return comment;
+  }
+
+  public String getDestination() {
+    return destination;
+  }
+
+  public String getPickup() {
+    return pickup;
+  }
+
+  public String getImage() { return image; }
+
+  public String getName() { return name; }
+
+  public String getUsername() { return username; }
+
+  public void setRating(Double rating) {
+    this.rating = rating;
+  }
+
+  public void setComment(String comment) {
+    this.comment = comment;
+  }
+
+  public void setDestination(String destination) {
+    this.destination = destination;
+  }
+
+  public void setDriverId(Integer driverId) {
+    this.driverId = driverId;
+  }
+
+  public void setPickup(String pickup) {
+    this.pickup = pickup;
+  }
+
+  public void setUserId(Integer userId) {
+    this.userId = userId;
+  }
+
+  public void setImage(String image) { this.image = image;}
+
+  public void setName(String name) { this.name = name;}
+
+  public void setUsername(String name) { this.username = username;}
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/PreferredLocationBean.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/PreferredLocationBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b7449f524e5e4a9be30e8b48dfcd3a496126049
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/PreferredLocationBean.java
@@ -0,0 +1,24 @@
+package com.adaapa.bean;
+
+import java.io.Serializable;
+
+public class PreferredLocationBean implements Serializable {
+  Integer position;
+  String location;
+
+  public Integer getPosition() {
+    return position;
+  }
+
+  public String getLocation() {
+    return location;
+  }
+
+  public void setLocation(String location) {
+    this.location = location;
+  }
+
+  public void setPosition(Integer position) {
+    this.position = position;
+  }
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/TokenVerificationResponse.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/TokenVerificationResponse.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a9f5de00cba1ab6db1b95362ad3eba0ae9844d1
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/TokenVerificationResponse.java
@@ -0,0 +1,25 @@
+package com.adaapa.bean;
+
+public class TokenVerificationResponse {
+  public static final String TOKEN_VALID = "valid";
+  public static final String TOKEN_INVALID = "invalid";
+
+  private String status;
+  private UserBean user;
+
+  public String getStatus() {
+    return status;
+  }
+
+  public UserBean getUser() {
+    return user;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public void setUser(UserBean user) {
+    this.user = user;
+  }
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/UserBean.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/UserBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..d9a0b48b34d9355ff661734f2c823d999323eff1
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/UserBean.java
@@ -0,0 +1,39 @@
+package com.adaapa.bean;
+
+import java.io.Serializable;
+
+public class UserBean implements Serializable{
+  public Integer id;
+  public String name;
+  public String email;
+  public String username;
+  public String phoneNumber;
+
+  public Boolean isDriver;
+  public String image;
+
+  public String getName() {
+    return name;
+  }
+  public String getUsername(){
+    return username;
+  }
+  public String getPhoneNumber(){
+    return phoneNumber;
+  }
+
+  public Boolean getIsDriver() { return isDriver; }
+
+  public String getEmail() {
+    return email;
+  }
+
+
+  public String getImage() {
+    return image;
+  }
+
+  public Integer getId() {
+    return id;
+  }
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/WebServiceBean.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/WebServiceBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9eda1d3646f34c2b13043166de3e73a933b02d4
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/bean/WebServiceBean.java
@@ -0,0 +1,34 @@
+package com.adaapa.bean;
+
+import java.io.Serializable;
+
+public class WebServiceBean implements Serializable{
+  public static final String STATUS_VALID = "valid" ;
+  public static final String STATUS_INVALID = "invalid";
+  private String status;
+  private String body;
+
+  public WebServiceBean(String status, String body) {
+    setBody(body);
+    setStatus(status);
+  }
+  public WebServiceBean(){
+    //do nothing
+  }
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public void setBody(String body) {
+    this.body = body;
+  }
+
+  public String getStatus() {
+    return status;
+
+  }
+
+  public String getBody() {
+    return body;
+  }
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/databases/DatabaseConfiguration.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/databases/DatabaseConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..0af20899c9a665ced22ce9da7852e44ce4cbeaf0
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/databases/DatabaseConfiguration.java
@@ -0,0 +1,40 @@
+package com.adaapa.databases;
+
+import java.io.InputStream;
+import java.util.Properties;
+
+public class DatabaseConfiguration {
+  private String db_name;
+  private String db_host;
+  private String db_user;
+  private String db_pass;
+  public DatabaseConfiguration() {
+    try {
+      Properties prop = new Properties();
+      InputStream inp = this.getClass().getResourceAsStream("/config/db.properties");
+      prop.load(inp);
+      db_name = prop.getProperty("DB_NAME");
+      db_host = prop.getProperty("DB_HOST");
+      db_pass = prop.getProperty("DB_PASS");
+      db_user = prop.getProperty("DB_USER");
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  public String getHost() {
+    return db_host;
+  }
+
+  public String getName() {
+    return db_name;
+  }
+
+  public String getPass() {
+    return db_pass;
+  }
+
+  public String getUser() {
+    return db_user;
+  }
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/databases/DatabaseConnector.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/databases/DatabaseConnector.java
new file mode 100644
index 0000000000000000000000000000000000000000..fb97b8b8505786d68ee0405e2aba287bb3b774a9
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/databases/DatabaseConnector.java
@@ -0,0 +1,32 @@
+package com.adaapa.databases;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+
+public class DatabaseConnector {
+  private static DatabaseConnector _instance;
+  private Connection conn =null;
+
+  private DatabaseConnector() {
+    DatabaseConfiguration config;
+    config = new DatabaseConfiguration();
+    try {
+      Class.forName("com.mysql.jdbc.Driver").newInstance();
+      conn = DriverManager.getConnection(
+          "jdbc:mysql://"+config.getHost()+"/"+config.getName(),config.getUser(),config.getPass());
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+  }
+  public static DatabaseConnector getInstance() {
+    if(_instance == null) {
+      _instance =  new DatabaseConnector();
+    }
+    return _instance;
+  }
+
+  public Connection getConn() {
+    return conn;
+  }
+}
diff --git a/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/models/BaseModel.java b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/models/BaseModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..310884a42b7fdd1b9b059685c846f873aa1755e2
--- /dev/null
+++ b/TugasBesar2_2017/SharedLibrary/src/main/java/com/adaapa/models/BaseModel.java
@@ -0,0 +1,36 @@
+package com.adaapa.models;
+
+import com.adaapa.databases.DatabaseConnector;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public abstract class BaseModel {
+  protected Connection db;
+  protected String tableName;
+  protected String primaryKey;
+
+  public
+  BaseModel(String tableName, String primaryKey) {
+    db = DatabaseConnector.getInstance().getConn();
+    this.tableName = tableName;
+    this.primaryKey = primaryKey;
+  }
+
+  public ResultSet query(String query) throws SQLException {
+    Statement stm = db.createStatement();
+    stm.executeQuery(query);
+    return stm.getResultSet();
+  }
+  public ResultSet queryUpdate(String query) throws SQLException {
+    Statement stm = db.createStatement();
+    stm.executeUpdate(query);
+    return stm.getResultSet();
+  }
+
+  public ResultSet find(Integer id) throws SQLException
+  {
+    return query(String.format("SELECT * FROM %s WHERE %s = %d", tableName, primaryKey, id));
+  }
+}