diff --git a/TugasBesar2_2017/IdentityService/build.gradle b/TugasBesar2_2017/IdentityService/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..06603644342c36e684eea0a34ef635dcb40fcafd
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/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/IdentityService/src/main/java/com/adaapa/identityservice/models/UserModel.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/models/UserModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..30cf9b8f4d8ba9309dc067b375afc5f1cb191f0e
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/models/UserModel.java
@@ -0,0 +1,189 @@
+package com.adaapa.identityservice.models;
+
+import com.adaapa.bean.UserBean;
+import com.adaapa.models.BaseModel;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+
+public class UserModel extends BaseModel {
+  Connection conn;
+  public UserModel(){
+    super("users","id");
+  }
+
+  public UserBean parseResultSet(ResultSet rs) throws SQLException {
+    UserBean res = new UserBean();
+    res.id = rs.getInt("id");
+    res.name = rs.getString("name");
+    res.email = rs.getString("email");
+    res.username = rs.getString("username");
+    res.phoneNumber = rs.getString("phone_number");
+    return res;
+  }
+
+  public UserBean findUser(Integer id) {
+    UserBean res = null;
+
+    try {
+      ResultSet rs = find(id);
+      if (rs.next()) {
+        res = parseResultSet(rs);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return res;
+  }
+  public UserBean findUser(String username) {
+    UserBean res = null;
+    try {
+      ResultSet rs = query(String.format("SELECT * FROM %s WHERE username = '%s'", tableName, username ));;
+      if (rs.next()) {
+        res = parseResultSet(rs);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return res;
+  }
+  public UserBean findUserByEmail(String email) {
+    UserBean res = null;
+    try {
+      ResultSet rs = query(String.format("SELECT * FROM %s WHERE email = '%s'", tableName, email));
+      ;
+      if (rs.next()) {
+        res = parseResultSet(rs);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return res;
+  }
+
+  /**
+   *
+   * @param username Username yang diterima oleh servlet
+   * @param password Password yang diterima oleh servlet
+   * @return UserBean object jika terautentikasi, null jika tidak
+   */
+  public UserBean authenticate(String username, String password) {
+    UserBean ubean = null;
+    try {
+      ResultSet rs = query(String.format(
+          "SELECT * FROM %s WHERE username = '%s' and password = '%s'",
+          tableName, username, password));
+      if(rs.next()) {
+        ubean = parseResultSet(rs);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    } finally {
+      return ubean;
+
+    }
+  }
+
+  /**
+   * Menyimpan token yang telah digenerate
+   * @param token token yang sudah digenerate oleh generate token
+   * @return true jika token berhasil disimpan, false jika tidak berhasil
+   */
+  public Boolean saveToken(Integer userId, String token) {
+    try {
+      ResultSet rs = queryUpdate(String.format(
+          "UPDATE %s SET last_token='%s',token_expire=DATE_ADD(now(), INTERVAL 7 DAY) where id=%d", this.tableName, token, userId
+      ));
+    } catch (SQLException e) {
+      e.printStackTrace();
+    }
+    return true;
+  }
+
+  public Boolean deleteToken(String token) {
+    try {
+      ResultSet rs = queryUpdate(String.format(
+         "UPDATE %s SET last_token=%s,token_expire=%s WHERE last_token='%s'",this.tableName,null,null,token
+      ));
+    } catch (SQLException e) {
+      e.printStackTrace();
+      return false;
+    }
+    return true;
+  }
+
+
+  /**
+   *
+   * @return Userbean dimana token ditemukan, null validasi gagal
+   */
+  public UserBean validateToken() {
+    return null;
+
+  }
+
+  /**
+   * Fungsi untuk menyimpan data user yang akan diregister ke database
+   * @param user bean dari servlet
+   * @param password password yang diterima oleh servlet
+   * @return id yang didapatkan oleh user yang teregister, null jika register gagal
+   */
+  public Integer register(UserBean user, String password) {
+    UserBean ubean = null;
+    Integer res = null;
+    UserBean ubeanuname = findUser(user.getUsername());
+    UserBean ubeanemail = findUserByEmail(user.getEmail());
+    if(ubeanuname == null && ubeanemail == null) {
+      ResultSet resultSet = null;
+      try {
+        resultSet = queryUpdate(String.format(
+                "INSERT INTO %s (name,email,username,password,phone_number)"
+                        + "VALUES ('%s','%s','%s','%s','%s')",
+                tableName,user.name,user.email,user.username, password, user.phoneNumber
+        ));
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+
+      try {
+        ResultSet temp = query(String.format(
+                "SELECT * FROM %s WHERE username = '%s'", this.tableName, user.getUsername()));
+        if(temp.next()) {
+          ubean = parseResultSet(temp);
+        }
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+      res = ubean.getId();
+    }
+
+    return res;
+  }
+
+  public UserBean findUserByToken(String token) {
+    UserBean res = null;
+    try {
+      ResultSet rs = query(String.format("SELECT * FROM %s WHERE last_token = '%s'", tableName, token ));;
+      if (rs.next()) {
+        Timestamp timestamp = rs.getTimestamp("token_expire");
+        Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis());
+        if(timestamp.after(currentTimestamp)) {
+          res = parseResultSet(rs);
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    return res;
+  }
+  public void updateTokenLifetime(Integer userId) {
+    try {
+      ResultSet rs = queryUpdate(String.format(
+          "UPDATE %s SET token_expire=DATE_ADD(now(), INTERVAL 7 DAY) where id=%d", this.tableName, userId
+      ));
+    } catch (SQLException e) {
+      e.printStackTrace();
+    }
+  }
+}
\ No newline at end of file
diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/services/TokenService.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/services/TokenService.java
new file mode 100644
index 0000000000000000000000000000000000000000..bfcede3ee40fec3750f2e9127b860ea907cf864c
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/services/TokenService.java
@@ -0,0 +1,23 @@
+package com.adaapa.identityservice.services;
+
+import java.util.Base64;
+import java.util.Random;
+
+public class TokenService {
+
+  //TODO: generate Token
+
+  /**
+   * Generate token menghasilkan token string random
+   * @return token yang telah digenerate
+   */
+  //TODO:Generate Token, validate token, regenerate token(bonus)
+  public String generateToken(){
+    byte [] r = new byte[96];
+    Random rand = new Random();
+    rand.nextBytes(r);
+    String s = Base64.getEncoder().encodeToString(r);
+    return s;
+  }
+
+}
diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LoginServlet.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LoginServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f96df8e973ce7b81e54bb9313301d9a67dc886c
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LoginServlet.java
@@ -0,0 +1,47 @@
+package com.adaapa.identityservice.servlets;
+
+import com.adaapa.bean.LoginResponseBean;
+import com.adaapa.bean.UserBean;
+import com.adaapa.identityservice.models.UserModel;
+import com.adaapa.identityservice.services.TokenService;
+import com.google.gson.Gson;
+import java.io.IOException;
+import java.io.PrintWriter;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Created by kennethhalim on 10/26/17.
+ */
+
+public class LoginServlet extends HttpServlet {
+  private String message;
+
+
+  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+      throws ServletException, IOException {
+    TokenService tokenService = new TokenService();
+    String username = req.getParameter("username");
+    String password = req.getParameter("password");
+    PrintWriter out = resp.getWriter();
+    Gson gson = new Gson();
+    UserModel userModel = new UserModel();
+    UserBean user= userModel.authenticate(username, password);
+    UserBean responseUser = new UserBean();
+    if(user != null) {
+      //Call Generate token here, then save it to database via usermodel;
+      responseUser.username = user.username;
+      String access_token = tokenService.generateToken();
+      userModel.saveToken(user.id, access_token);
+      out.println(gson.toJson(new LoginResponseBean("accepted",access_token, LoginResponseBean.TOKEN_AGE_DEFAULT, responseUser)));
+    } else  {
+      out.println(gson.toJson(new LoginResponseBean("failed","",0,null)));
+    }
+  }
+
+  public void destroy() {
+    // do nothing.
+  }
+}
diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LogoutServlet.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LogoutServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..fbc633dc5bd836c24f8698a778f9e77dccae84fc
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LogoutServlet.java
@@ -0,0 +1,30 @@
+package com.adaapa.identityservice.servlets;
+
+import com.adaapa.bean.LogoutResponseBean;
+import com.adaapa.identityservice.models.UserModel;
+import com.google.gson.Gson;
+import java.io.IOException;
+import java.io.PrintWriter;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class LogoutServlet extends HttpServlet {
+
+  @Override
+  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+      throws ServletException, IOException {
+    String token = req.getParameter("access_token");
+    UserModel userModel = new UserModel();
+    PrintWriter out = resp.getWriter();
+    LogoutResponseBean logoutResponse = new LogoutResponseBean();
+    if(userModel.deleteToken(token)){
+      logoutResponse.setStatus("accepted");
+    } else {
+      logoutResponse.setStatus("failed");
+    }
+    Gson gson = new Gson();
+    out.println(gson.toJson(logoutResponse));
+  }
+}
diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/RegisterServlet.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/RegisterServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..39fe54b7c193057a6047e933f2d9879396a384bf
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/RegisterServlet.java
@@ -0,0 +1,46 @@
+package com.adaapa.identityservice.servlets;
+
+import com.adaapa.bean.LoginResponseBean;
+import com.adaapa.bean.UserBean;
+import com.adaapa.identityservice.models.UserModel;
+import com.adaapa.identityservice.services.TokenService;
+import com.google.gson.Gson;
+import java.io.IOException;
+import java.io.PrintWriter;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class RegisterServlet extends HttpServlet{
+
+  @Override
+  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+      throws ServletException, IOException {
+    //Implement Register Here
+    UserBean user = new UserBean();
+    UserModel userModel = new UserModel();
+    UserModel usermodel = new UserModel();
+    TokenService tokenService = new TokenService();
+    //Parsing data
+    PrintWriter out = resp.getWriter();
+    user.name = req.getParameter("name");
+    user.username = req.getParameter("username");
+    user.email = req.getParameter("email");
+    user.phoneNumber = req.getParameter("phoneNumber");
+    String password = req.getParameter("password");
+    Gson gson = new Gson();
+    user.id = userModel.register(user,password);
+    UserBean responseUser = new UserBean();
+    if(user.id != null) {
+      //Register berhasil
+      //Generate token here, then save token
+      String token = tokenService.generateToken();
+      userModel.saveToken(user.id, token);
+      responseUser.username = user.username;
+      out.println(gson.toJson(new LoginResponseBean("accepted",token, LoginResponseBean.TOKEN_AGE_DEFAULT, responseUser)));
+    } else  {
+      out.println(gson.toJson(new LoginResponseBean("failed","",0,null)));
+    }
+  }
+}
\ No newline at end of file
diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/TokenVerifier.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/TokenVerifier.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8227fd2ce9b609455d8d365a390598f936eff32
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/TokenVerifier.java
@@ -0,0 +1,30 @@
+package com.adaapa.identityservice.servlets;
+
+import com.adaapa.bean.TokenVerificationResponse;
+import com.adaapa.bean.UserBean;
+import com.adaapa.identityservice.models.UserModel;
+import com.google.gson.Gson;
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebResult;
+import javax.jws.WebService;
+
+@WebService(targetNamespace = "tokenverifier.adaapa.com")
+public class TokenVerifier {
+  @WebMethod(operationName = "verifyToken")
+  @WebResult(name = "userObjectInJSON")
+  public String verifyToken(@WebParam(name = "access_token") String access_token) {
+    UserModel userModel = new UserModel();
+    UserBean userBean = userModel.findUserByToken(access_token);
+    TokenVerificationResponse response = new TokenVerificationResponse();
+    if(userBean != null){
+      userModel.updateTokenLifetime(userBean.getId());
+      response.setStatus(TokenVerificationResponse.TOKEN_VALID);
+      response.setUser(userBean);
+    } else {
+      response.setStatus(TokenVerificationResponse.TOKEN_INVALID);
+    }
+    return (new Gson().toJson(response));
+  }
+
+}
diff --git a/TugasBesar2_2017/IdentityService/src/main/resources/config/db.properties.example b/TugasBesar2_2017/IdentityService/src/main/resources/config/db.properties.example
new file mode 100644
index 0000000000000000000000000000000000000000..2ac73ae525cb1d856e437da082546e874442f50b
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/src/main/resources/config/db.properties.example
@@ -0,0 +1,4 @@
+DB_HOST = localhost
+DB_USER = wbd
+DB_PASS = wbd123
+DB_NAME = wbd_idservice
\ No newline at end of file
diff --git a/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/sun-jaxws.xml b/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/sun-jaxws.xml
new file mode 100644
index 0000000000000000000000000000000000000000..824107623d487777edd435b349a8a96ef00e69c2
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/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="TokenVerifier"
+    implementation="com.adaapa.identityservice.servlets.TokenVerifier"
+    url-pattern="/verify"/>
+</endpoints>
diff --git a/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/web.xml b/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d50262580f761fe0d1d628f31da42e783e8c6c38
--- /dev/null
+++ b/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,49 @@
+<?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>LoginServlet</servlet-name>
+    <servlet-class>com.adaapa.identityservice.servlets.LoginServlet</servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>LoginServlet</servlet-name>
+    <url-pattern>/login</url-pattern>
+  </servlet-mapping>
+
+  <servlet>
+    <servlet-name>LogoutServlet</servlet-name>
+    <servlet-class>com.adaapa.identityservice.servlets.LogoutServlet</servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>LogoutServlet</servlet-name>
+    <url-pattern>/logout</url-pattern>
+  </servlet-mapping>
+
+  <servlet>
+    <servlet-name>RegisterServlet</servlet-name>
+    <servlet-class>com.adaapa.identityservice.servlets.RegisterServlet</servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>RegisterServlet</servlet-name>
+    <url-pattern>/register</url-pattern>
+  </servlet-mapping>
+
+  <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>