diff --git a/IdentityService/src/com/KEM/ws/IdentityS.java b/IdentityService/src/com/KEM/ws/IdentityS.java
index 943d84175c394dfd90bafd4d66ccabb2a4000e2b..3bb4ff5ecc98fcfa383f119c118ff105edd393bc 100644
--- a/IdentityService/src/com/KEM/ws/IdentityS.java
+++ b/IdentityService/src/com/KEM/ws/IdentityS.java
@@ -27,26 +27,27 @@ import com.KEM.ws.*;
 @WebService
 @Path("/Login")
 public class IdentityS extends HttpServlet {
-	
-	@WebMethod
-	@POST
-	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
-		String un=request.getParameter("username");
-		String pw=request.getParameter("password");
-		PrintWriter out = response.getWriter();
-		Statement stmt = null;
-		Connection conn = null;
-		ResultSet rs = null;
-		ResultSet rs2 = null;
-		// JDBC driver name and database URL 
-	      final String DB_URL="jdbc:mysql://localhost/login";
+    
+    @WebMethod
+    @POST
+    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
+        String un=request.getParameter("username");
+        String pw=request.getParameter("password");
+        PrintWriter out = response.getWriter();
+        Statement stmt = null;
+        Connection conn = null;
+        ResultSet rs = null;
+        ResultSet rs2 = null;
+        ResultSet rs3 = null;
+        // JDBC driver name and database URL 
+          final String DB_URL="jdbc:mysql://localhost/login";
 
-	      //  Database credentials
-	      final String USER = "root";
-	      final String PASS = "atikazzahra";
+          //  Database credentials
+          final String USER = "root";
+          final String PASS = "atikazzahra";
 
-	      // Set response content type
-	      
+          // Set response content type
+          
          try{
          // Register JDBC driver
          Class.forName("com.mysql.jdbc.Driver");
@@ -62,15 +63,15 @@ public class IdentityS extends HttpServlet {
          
          // Extract data from result set
          if (rs.getInt("count")==1){
-        	 rs.close();
-        	 
-        	// Clean-up environment
-        	 sql2 = "SELECT * FROM User WHERE Username=\""+un+"\" AND Password=\""+pw+"\"";
-	         rs2 = stmt.executeQuery(sql2);
-	         rs2.next();
-	         int Id = rs2.getInt("Id_User");
-	         
-	         generateToken gt = new generateToken();
+             rs.close();
+             
+            // Clean-up environment
+             sql2 = "SELECT * FROM User WHERE Username=\""+un+"\" AND Password=\""+pw+"\"";
+             rs2 = stmt.executeQuery(sql2);
+             rs2.next();
+             int Id = rs2.getInt("Id_User");
+             
+             generateToken gt = new generateToken();
              String token = gt.generateAccessToken();
              String browser=request.getParameter("browser");
              String ipAdr=request.getParameter("ip");
@@ -92,13 +93,14 @@ public class IdentityS extends HttpServlet {
                  }
                  rs3.close();
                  t=0;
-                 System.out.println("substring : " + auth[t].substring(0, 40));
+                 
                  while (t<i && !sama) {
                      if (token.equals(auth[t].substring(0, 40))) {
                          sama = true;
                      }
                      t++;
                  }
+                 System.out.println("substring : " + auth[t-1].substring(0, 40));
                  if (sama==false) {
                      System.out.println("ini token berbedaaaaaaaa");
                      token = token+"_"+browser+"_"+ipAdr;
@@ -138,7 +140,7 @@ public class IdentityS extends HttpServlet {
                          rs2.close();
                          stmt.close();
                          conn.close();
-                         out.println("invalid");
+                         out.println("User Agent / IP Address berbeda");
                      }
                  }
                      
@@ -156,12 +158,12 @@ public class IdentityS extends HttpServlet {
                  out.println(Id);
              }
          }else{
-        	// Clean-up environment
-	         rs.close();
-	         stmt.close();
-	         conn.close();
-	         out.println("invalid");
- 			return;
+            // Clean-up environment
+             rs.close();
+             stmt.close();
+             conn.close();
+             out.println("invalid");
+            return;
          } 
       }catch(SQLException se){
          //Handle errors for JDBC
@@ -183,5 +185,5 @@ public class IdentityS extends HttpServlet {
             se.printStackTrace();
          }//end finally try
       } //end try
-	}
-}
+    }
+}
\ No newline at end of file
diff --git a/IdentityService/src/com/KEM/ws/registerUser.java b/IdentityService/src/com/KEM/ws/registerUser.java
index ad63a4271d3742aa971ed46049db2b6fdc0f58c9..54786fd0d3326c5cfaab7ae84db65de25966e0e6 100644
--- a/IdentityService/src/com/KEM/ws/registerUser.java
+++ b/IdentityService/src/com/KEM/ws/registerUser.java
@@ -21,9 +21,12 @@ import java.util.Random;
 import javax.jws.WebService;
 import javax.jws.WebMethod;
 import static java.lang.System.*;
+
+import javax.servlet.annotation.MultipartConfig;
 import javax.servlet.annotation.WebServlet;
 
 @WebService
+@MultipartConfig
 @Path("/Register")
 public class registerUser extends HttpServlet {
 	
@@ -44,6 +47,7 @@ public class registerUser extends HttpServlet {
 		ResultSet rs = null;
 		ResultSet rsUser = null;
 		ResultSet rsEmail = null;
+		ResultSet rs3 = null;
 		// JDBC driver name and database URL 
 	      final String DB_URL="jdbc:mysql://localhost/login";
 
@@ -62,7 +66,7 @@ public class registerUser extends HttpServlet {
          
          // Execute SQL query
          stmt = conn.createStatement();
-         String sqlToken, sql, sqlUser;
+         String sqlToken, sql, sqlUser, sql3;
          sqlUser = "SELECT COUNT(*) as count FROM User WHERE Username=\"" +username+ "\"";
          rsUser = stmt.executeQuery(sqlUser);
          rsUser.next();
@@ -154,7 +158,7 @@ public class registerUser extends HttpServlet {
 		        			 rsEmail.close();
 		        			 stmt.close();
 		        			 conn.close();
-		        			 out.println("invalid");
+		        			 out.println("User Agent / IP Address berbeda");
 		        		 }
 		        	 }
 	        	 }
@@ -171,6 +175,7 @@ public class registerUser extends HttpServlet {
 			         out.println(token);
 			         out.println(Id);
 	        	 }
+        	 }
         	 else {
         		// Clean-up environment
 		         rsEmail.close();
@@ -208,5 +213,4 @@ public class registerUser extends HttpServlet {
          }//end finally try
       } //end try
 	}
-}
-
+}
\ No newline at end of file
diff --git a/KEMProject/WebContent/addproduct.jsp b/KEMProject/WebContent/addproduct.jsp
index 1aa2f932d9326f5258e30c739f55c00fba8c8ba6..c9d91c4d9588e5c9ed5a9886e0afdde1124d454b 100644
--- a/KEMProject/WebContent/addproduct.jsp
+++ b/KEMProject/WebContent/addproduct.jsp
@@ -14,6 +14,7 @@
 <html>
 	<head>
 		<link rel="stylesheet" type="text/css" href="theme.css">
+		<script type="text/javascript" src="validate.js"></script>
 	</head>
 	<body>
 	<div class="container">
diff --git a/KEMProject/WebContent/catalog.jsp b/KEMProject/WebContent/catalog.jsp
index 795325983ff362343cd64a445809d919908f815c..fbd18b7aa6c7704f6ca1ac3bac22d15315c2d23e 100644
--- a/KEMProject/WebContent/catalog.jsp
+++ b/KEMProject/WebContent/catalog.jsp
@@ -23,6 +23,7 @@
 	<script src="app.js"></script>
 	<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0-beta.2/angular.min.js"></script> 
 	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
+	
 	</head>
 	<body ng-app="Appchat" ng-controller="mainController">
 	<div class="container">
diff --git a/KEMProject/WebContent/confirmation.jsp b/KEMProject/WebContent/confirmation.jsp
index f987c8e54a927262f5139ac0f3809a64554ce161..f4f296ed698c5bdd4b6ec159c5e7e9f520745549 100644
--- a/KEMProject/WebContent/confirmation.jsp
+++ b/KEMProject/WebContent/confirmation.jsp
@@ -14,7 +14,7 @@
 <html>
 	<head>
 	<link rel="stylesheet" type="text/css" href="theme.css">
-
+	<script type="text/javascript" src="validate.js"></script>
 	</head>
 	<body>
 	<div class="container">
diff --git a/KEMProject/WebContent/editproduct.jsp b/KEMProject/WebContent/editproduct.jsp
index 32c4f0cecc9d26bea9a257d327d0900ec764ce7d..5f2831fae0aeeb58bdfda3b9d043afc5544525a4 100644
--- a/KEMProject/WebContent/editproduct.jsp
+++ b/KEMProject/WebContent/editproduct.jsp
@@ -14,6 +14,7 @@
 	<head>
 		<link rel="stylesheet" type="text/css" href="theme.css">
 		<link rel="import" href="navbar.html">
+		<script type="text/javascript" src="validate.js"></script>
 	</head>
 	<body>
 	<div class="container">
diff --git a/KEMProject/WebContent/login.jsp b/KEMProject/WebContent/login.jsp
index b45fc8eff7406590b6d0591fca2aadb5aab25413..26866377ce55e83431e5c792e4e86e5716b50578 100644
--- a/KEMProject/WebContent/login.jsp
+++ b/KEMProject/WebContent/login.jsp
@@ -1,14 +1,50 @@
-<%session.invalidate();%>
 <%@ page import="java.net.InetAddress" %>
 <!DOCTYPE html>
 <html>
 	<head>
-	<meta charset="ISO-8859-1">
+	<meta charset="ISO-8859-1">	
 	<link rel="stylesheet" type="text/css" href="theme.css">
+	<script type="text/javascript" src="validate.js"></script>
 	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    	<script type="text/javascript" src="http://www.json.org/json2.js"></script>
 	</head>
 	<body>
+		<%
+		if (session.getAttribute("pesan") != null) {
+		String beda = new String("User Agent / IP Address berbeda");
+		if (session.getAttribute("pesan").equals(beda)) {%>
+			<style>
+			 /* The alert message box */
+			.alert {
+			    padding: 20px;
+			    background-color: #f44336; /* Red */
+			    color: white;
+			    margin-bottom: 15px;
+			}
+			
+			/* The close button */
+			.closebtn {
+			    margin-left: 15px;
+			    color: white;
+			    font-weight: bold;
+			    float: right;
+			    font-size: 22px;
+			    line-height: 20px;
+			    cursor: pointer;
+			    transition: 0.3s;
+			}
+			
+			/* When moving the mouse over the close button */
+			.closebtn:hover {
+			    color: black;
+			}
+		</style>
+  		<div class="alert">
+		  User Agent and IP Address is same!
+		</div>
+		<% }}
+		%>
+		
 		<div class = "container">
 			<form class = "login" action ="Login" method ="post" onSubmit="return validateLogin()">
 				<div class="title">
@@ -39,4 +75,5 @@
 	      	</form>
 	    </div>
 	</body>
-</html>
\ No newline at end of file
+</html>
+<%session.invalidate();%>
\ No newline at end of file
diff --git a/KEMProject/WebContent/register.jsp b/KEMProject/WebContent/register.jsp
index b3837c49784c7839f8ac40c86c2d2af4570a1bb4..2517839cbdd994165680a6c987aa154e23e19c3e 100644
--- a/KEMProject/WebContent/register.jsp
+++ b/KEMProject/WebContent/register.jsp
@@ -6,6 +6,41 @@
 		<script type="text/javascript" src="validate.js"></script>
 	</head>
 	<body>
+	<%
+		if (session.getAttribute("pesan") != null) {
+		String beda = new String("User Agent / IP Address berbeda");
+		if (session.getAttribute("pesan").equals(beda)) {%>
+			<style>
+			 /* The alert message box */
+			.alert {
+			    padding: 20px;
+			    background-color: #f44336; /* Red */
+			    color: white;
+			    margin-bottom: 15px;
+			}
+			
+			/* The close button */
+			.closebtn {
+			    margin-left: 15px;
+			    color: white;
+			    font-weight: bold;
+			    float: right;
+			    font-size: 22px;
+			    line-height: 20px;
+			    cursor: pointer;
+			    transition: 0.3s;
+			}
+			
+			/* When moving the mouse over the close button */
+			.closebtn:hover {
+			    color: black;
+			}
+		</style>
+  		<div class="alert">
+		  User Agent and IP Address is same!
+		</div>
+		<% }}
+		%>
 		<div class="container">
 			<form class="register" name="register" onsubmit="return ValidateForm()" action="register" method="post" id="register">
 				<div class="title">
diff --git a/KEMProject/src/backend/javaclass/Login.java b/KEMProject/src/backend/javaclass/Login.java
index 466837c78c2e219394317fcfeb8f1adf1e4d3876..a35e686c65eab7b456ab65b6e23f3146208ba915 100644
--- a/KEMProject/src/backend/javaclass/Login.java
+++ b/KEMProject/src/backend/javaclass/Login.java
@@ -56,9 +56,15 @@ public class Login extends HttpServlet {
         } else {
         }
         String invalid = new String("invalid");
+        String beda = new String("User Agent / IP Address berbeda");
 		if(res.equals(invalid)){
 			response.sendRedirect("login.jsp");
 		}
+		else if (res.equals(beda)) {
+			HttpSession session = request.getSession();
+			session.setAttribute("pesan", beda);
+			response.sendRedirect("login.jsp");
+		}
 		else{
 			int lengres= res.length();
 			token = res.substring(0, lengres-1);
diff --git a/KEMProject/src/backend/javaclass/register.java b/KEMProject/src/backend/javaclass/register.java
index 117ed821d3525f32d0140daeb17740380beb79b2..1534a9f760876079e2b3c65da1bd5c62db926580 100644
--- a/KEMProject/src/backend/javaclass/register.java
+++ b/KEMProject/src/backend/javaclass/register.java
@@ -70,9 +70,15 @@ public class register extends HttpServlet {
 	        in.close();
         } else {}
         String invalid = new String("invalid");
+        String beda = new String("User Agent / IP Address berbeda");
         if(res.equals(invalid)){
 			response.sendRedirect("register.jsp");
 		}
+        else if (res.equals(beda)) {
+			HttpSession session = request.getSession();
+			session.setAttribute("pesan", beda);
+			response.sendRedirect("register.jsp");
+		}
 		else{
 			int lengres= res.length();
 			String token = res.substring(0, lengres-1);
diff --git a/README.md b/README.md
index cc570e167edcaa712548992bf0a1b90335a6fea3..9edf1cd4926230f4dff98db6d7060e504d189395 100644
--- a/README.md
+++ b/README.md
@@ -1,158 +1,62 @@
 # Tugas 3 IF3110 Pengembangan Aplikasi Berbasis Web
+Melakukan upgrade Website Marketplace sederhana pada Tugas 2 dengan mengaplikasikan cloud service (Firebase Cloud Messaging) dan framework AngularJS.
 
-Melakukan upgrade Website Marketplace sederhana pada Tugas 2 dengan mengaplikasikan ***cloud service* (Firebase Cloud Messaging) dan *framework* AngularJS**.
-
-**Luangkan waktu untuk membaca spek ini sampai selesai. Kerjakan hal yang perlu saja.**
-
-## Tujuan Pembuatan Tugas
-
-Diharapkan dengan tugas ini Anda dapat mengerti:
-* Salah satu Frontend framework yaitu AngularJS dan kegunaannya.
-* *Cloud service* Firebase Cloud Messaging (FCM) dan kegunaannya.
-* Web security terkait access token dan HTTP Headers.
-
+## Deskripsi Singkat
+Pada tugas besar ini, setiap kelompok diminta untuk menambahkan fungsi chat pada sales project dan mengubah token yang sebelumnya digunakan menjadi token + `user agent` + `ip address` serta validasi token sesuai dengan skenario umum program pada spesifikasi Tugas 3.
 
 ## Anggota Tim
+1. Micky Yudi Utama - 13514011
+2. Elvina R. K. Situmorang - 13514045
+3. Atika Azzahra Akbar - 13514077
 
-Setiap kelompok beranggotakan **3 - 4 orang**. Daftar anggota kelompok terdapat pada link berikut: https://drive.google.com/open?id=1wpzU2VHZXvSVNR6TS4sxILVvHimQYhxQhorMr1nSelw
-
-## Petunjuk Pengerjaan
-1. Buatlah organisasi pada gitlab dengan nama sesuai dengan nama tim yang anda daftarkan.
-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. Silakan commit pada repository anda (hasil fork). Lakukan berberapa commit dengan pesan yang bermakna, contoh: `fix css`, `create post done`, 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 commit yang berpengaruh terhadap proses pembuatan aplikasi.
-6. Edit file readme ini semenarik mungkin (gunakan panduan Markdown language), diperbolehkan untuk merubah struktur dari readme ini. (Soal tidak perlu dipertahankan).
-7. Pada Readme terdapat tampilan aplikasi dan penjelasan mengenai pembagian tugas masing-masing anggota (lihat formatnya pada bagian **pembagian tugas**).
-8. Merge request dari repository anda ke repository ini dengan format **Nama kelompok** - **NIM terkecil** - **Nama Lengkap dengan NIM terkecil** sebelum **Rabu, 30 November 2016 18.00**.
-
-![](img/arsitektur_umum.png)
-
-### Arsitektur Umum
-Tugas 3 ini terdiri dari komponen tugas 2 dan tambahan yang harus dibuat:
-* `Chat REST Service`: digunakan untuk menerima HTTP request dari client terkait fungsionalitas pengiriman pesan dengan menggunakan layanan Firebase Cloud Messaging (FCM).
-* `Komponen front end chat`: digunakan untuk melakukan request ke Chat Service dengan menggunakan AJAX dan menampilkan chat.
-
-
-### Deskripsi Tugas
-Kali ini, anda diminta untuk menambah fungsionalitas chat pada aplikasi yang telah anda buat pada tugas 2. Aplikasi ini akan menggunakan AngularJS (bukan Angular 2) sebagai framework front-end, serta menggunakan layanan cloud Firebase Cloud Messaging sebagai media penyampaian pesan. Selain itu, Anda juga diminta untuk mengimplementasikan beberapa fitur security. spesifikasi untuk tugas ini adalah sebagai berikut:
-
-
-1. Pengguna dapat saling bertukar pesan dengan pengguna lain secara realtime di halaman katalog. Fitur ini harus diimplementasikan dengan AngularJS.
-2. REST service yang akan menghubungkan client dan Firebase Cloud Messaging. Rincian service ini akan dijelaskan kemudian. Silahkan pelajari cara mendaftar ke layanan Firebase, dan cara membuat project baru.
-2. Pengguna harus login terlebih dahulu sebelum dapat melakukan chat. Silahkan cari cara untuk sharing session antara JSP dan AngularJS. Sebagai contoh, anda dapat menggunakan cookie yang dapat diakses oleh keduanya.
-3. Aplikasi dapat menampilkan pengguna yang sedang online. Pengguna yang sedang online ditandai dengan tanda di samping nama pengguna pada halaman katalog. Ketika nama pengguna yang sedang online diklik, maka akan muncul kotak chat antar pengguna.
-4. Pengguna dengan IP address yang berbeda tidak dapat menggunakan access token yang sama.
-5. Pengguna dengan user-agent yang berbeda tidak dapat menggunakan access token yang sama. Dalam hal ini, user-agent yang dimaksud adalah web browser yang digunakan.
-6. Komponen yang harus digunakan pada AngularJS adalah:
-	* Data binding (ng-model directives)
-	* Controllers (ng-controllers)
-	* ng-repeat, untuk menampilkan list
-	* $http untuk AJAX request
-	* $scope untuk komunikasi data antara controller dengan view.
-	* ng-show dan ng-hide untuk menampilkan/menyembunyikan elemen
-7. tidak perlu memperhatikan aspek keamanan dan etika dalam penyimpanan data.
-
-
-### Rincian Arsitektur Aplikasi Chat
-
-![](img/mekanisme_chat.png)
-
-Proses untuk komunikasi antar client adalah sebagai berikut:
-1. Ketika client dijalankan, client akan meminta token (token yang berbeda dengan token untuk authentication dari Identity Service) dari FCM.
-2. FCM mengirimkan token ke client.
-3. Setelah token diterima, client akan mengirim token serta identitas dari client (nama/email) ke chat server. Identitas client digunakan untuk mengidentifikasi kepemilikan token.
-4. Untuk mengirim pesan kepada client lain, client pertama mengirimkan pesan yang berisi identitas pengirim, identitas tujuan, dan isi pesan ke chat server.
-5. Chat server kemudian akan mencari token yang terkait dengan identitas tujuan.
-6. Chat server lalu mengirim request ke FCM untuk mengirimkan pesan kepada client dangan token yang terkait.
-7. FCM mengirimkan pesan kepada tujuan.
-
-
-### Asumsi yang Digunakan
-1. Pada tugas ini, diasumsikan kedua client sedang aktif. Aplikasi hanya akan dijalankan pada localhost, sehingga memerlukan 2 browser yang berbeda untuk mensimulasikan client yang berbeda. Aplikasi berjalan pada localhost karena browser mensyaratkan sumber aplikasi harus aman untuk operasi-operasi yang digunakan pada aplikasi ini. Localhost termasuk lokasi yang diperbolehkan oleh browser.
-2. Kedua browser tersebut harus dalam keadaan aktif dan terfokus, serta tidak terminimize. Hal ini karena cara kerja service worker, yang hanya dapat memberikan notifikasi, dan tidak dapat melakukan manipulasi halaman apabila web browser tidak sedang terfokus ketika pesan datang.
-Selain itu, seorang pengguna hanya dapat chatting dengan 1 pengguna lain dalam 1 waktu, sehingga hanya 1 kotak chat yang ditampilkan.
-
-
-### Skenario Chatting
-Skenario penggunaan aplikasi adalah sebagai berikut.
-Misal pengguna yang memulai chat adalah A, dan yang menerima chat adalah B.
-1. A dan B login untuk masuk ke aplikasi.
-2. A dan B membuka halaman katalog. Pada tahap ini, status online dari kedua pihak sudah tercatat pada chat server.
-3. A membuka kotak chat dengan cara melakukan klik pada nama B di halaman katalog.
-4. Kotak chat akan muncul pada layar A.
-5. A mengetikkan pesan, dan menekan tombol kirim.
-6. Pesan dikirim ke B melalui chat server dan FCM.
-7. ketika pesan sudah diterima di B, kotak chat pada layar B akan muncul.
-8. B dapat membalas chat dari A.
-9. Apabila A ingin menyudahi percakapan, A dapat menekan tombol untuk menutup kotak. Begitu pula dengan B.
-10. Apabila A ingin melakukan chat dengan pihak lain, katakanlah C, C harus login dan browsernya harus terfokus.
+## Hasil Pengerjaan
+### Pengimplementasian
+Untuk mengimplementasikan FCM diperlukan perubahan pada *database*, sehingga *database* yang kami implementasikan berubah menjadi :
+*Database* pada login (*identity service*)
+![](img/login.png)
+*Database* pada marketplace
+![](img/marketplace.png)
 
-### Skenario Umum Program
-Skenario program selain chat, pada umumnya sama seperti tugas 2. Akan tetapi, metode pengecekan token pada identity service sedikit berbeda.
-
-Identity Service harus mengecek: 
-1. Apakah access token ini sudah kadaluarsa?
-2. Apakah access token ini digunakan pada browser yang berbeda?
-3. Apakah access token ini digunakan dengan koneksi internet yang berbeda?
-
-Jika jawaban salah satu pertanyaan tersebut adalah "ya", maka identity service akan memberikan respon error dan detail errornya.
-
-### Mekanisme pembuatan token
-Token anda harus mempunyai informasi terkait browser (user agent) dan IP address dari pengguna. Identity service harus dapat mengekstrak informasi tersebut. Sebagai contoh, anda dapat melakukan (tidak harus) konstruksi token dengan `format:some_random_string#user_agent#ip_address`. Jika pada tugas 2 token anda adalah abcdefgh Maka pada tugas 3 token anda adalah `abcdefgh#Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36#167.205.22.104`.
-
-Token tidak perlu dienkripsi-dekripsi (for simplicity)
 
 ### Tampilan Program
 Halaman Catalog
 
-![](img/mockup01.png)
+![](img/catalog.PNG)
 
 Chatting
 
-![](img/mockup02.png)
-
-### Referensi Terkait
-Berikut adalah referensi yang dapat Anda baca terkait tugas ini:
-1. https://firebase.google.com/docs/web/setup
-2. https://firebase.google.com/docs/cloud-messaging/js/client
-3. https://docs.angularjs.org/api
-
-
-Selain itu, silahkan cari "user agent parser", "how to get my IP from HTTPServletRequest", dan "HTTP Headers field" untuk penjelasan lebih lanjut.
-
-
-### 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.
+![](img/hasil_implementasi.png)
 
 
-### Pembagian Tugas
-
-
-Tugas kali ini cukup rumit, karena melibatkan layanan dari pihak ketiga, dan framework. 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 baik implementasi Firebase sebagai *cloud service* maupun *framework* AngularJS. Tuliskan pembagian tugas seperti berikut ini.
-
+## Pembagian Tugas
 
 Chat app frontend :
-1. Fungsionalitas A : 135140XX  
-2. Fungsionalitas B : 135140XX  
+
+1. Daftar user online : 13514077
+2. Tampilan Chatbox : 13514077
+3. Show/Hide Chat Box : 13514045, 13514077
+4. Pop Up : 13514045, 13514077
+5. Tampilan Pesan : 13514011
 
 
 Chat app backend :  
-1. Fungsionalitas C : 135140XX  
-2. Fungsionalitas D : 135140XX  
+
+1. Konfigurasi Firebase : 13514045, 13514077
+2. Pengiriman Pesan : 13514011
+3. Penerimaan Pesan : 13514045, 13514077
+4. Penyimpanan Pesan : 13514011
+5. Daftar User Online : 13514077
+6. Generate Token FCM : 13514045
+7. Chat service : 13514011
     
 Fitur security (IP, User-agent) :
-1. Fungsionalitas E : 135140XX
-2. Fungsionalitas F : 135140XX
 
+1. Token : 13514045
+2. Validate Token : 13514011, 13514077
 
-## About
 
-Asisten IF3110 2016
+## About
 
-Adin | Chairuni | David | Natan | Nilta | Tifani | Wawan | William
+**KEM PROJECT**
 
-Dosen: Yudistira Dwi Wardhana | Riza Satria Perdana
+Kepi | Elvina | Micky
diff --git a/img/catalog.PNG b/img/catalog.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..c5c5b138856fa60d623373a5c694f14e660108a2
Binary files /dev/null and b/img/catalog.PNG differ
diff --git a/img/hasil_implementasi.png b/img/hasil_implementasi.png
new file mode 100644
index 0000000000000000000000000000000000000000..3726f9fe15f2a4d89ec90fd31430301d0dcdbc5a
Binary files /dev/null and b/img/hasil_implementasi.png differ
diff --git a/img/login.png b/img/login.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ed2e2202190b4029d6eb5916bb02a6a03516169
Binary files /dev/null and b/img/login.png differ
diff --git a/img/marketplace.png b/img/marketplace.png
new file mode 100644
index 0000000000000000000000000000000000000000..6805d5bdd53228c6e1d74782baf50f1ccee7d256
Binary files /dev/null and b/img/marketplace.png differ