diff --git a/pom.xml b/pom.xml
index 47da5ff69313689386b1243e0da327118ad57672..43f99f4d9bbbc0c32c507b2288a15c6b4ab9c828 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,11 @@
             <artifactId>jaxws-rt</artifactId>
             <version>2.3.6</version>
         </dependency>
+        <dependency>
+            <groupId>com.sun.net.httpserver</groupId>
+            <artifactId>http</artifactId>
+            <version>20070405</version>
+        </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
diff --git a/src/main/java/database/Database.java b/src/main/java/database/Database.java
index 7fbc52ab3911b6f327d7ca93b1f332dabaa1875d..f3c3c2ba5e2803e33893ec8d312170cb86a012a9 100644
--- a/src/main/java/database/Database.java
+++ b/src/main/java/database/Database.java
@@ -3,6 +3,8 @@ package database;
 import java.sql.*;
 import java.util.Date;
 
+import enums.Status;
+
 public class Database {
     private String host = System.getenv("DB_HOST");
     private String port = System.getenv("DB_PORT");
@@ -49,7 +51,10 @@ public class Database {
     }
 
     public void bind(int index, Object value) throws SQLException{
-        if(value instanceof java.sql.Date){
+        if(value instanceof java.sql.Timestamp){
+            this.psmt.setTimestamp(index, (java.sql.Timestamp)value);
+        }
+        else if(value instanceof java.sql.Date){
             this.psmt.setDate(index, (java.sql.Date)value);
         }
         else if(value instanceof java.util.Date){
@@ -64,6 +69,9 @@ public class Database {
         }
         else if(value instanceof Boolean){
             this.psmt.setBoolean(index, (Boolean) value);
+        }else if(value instanceof Status){
+            Status val = (Status) value;
+            this.psmt.setString(index, "'"+val.getStatusCode().toUpperCase()+"'");
         }
     }
 
diff --git a/src/main/java/handler/KeyHandler.java b/src/main/java/handler/KeyHandler.java
index f43144ed3e6d49864745396f62d1f076de6adee3..d5794482e8b6ac50b8f9a8771700b61fcf5abc9e 100644
--- a/src/main/java/handler/KeyHandler.java
+++ b/src/main/java/handler/KeyHandler.java
@@ -1,6 +1,7 @@
 package handler;
 
 import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPBody;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFault;
 import javax.xml.ws.handler.MessageContext;
@@ -38,12 +39,11 @@ public class KeyHandler implements SOAPHandler<SOAPMessageContext> {
         }
         else{
             boolean authorized = authorize(ctx);
+            ctx.put("Authorized", authorized);
             if(!authorize(ctx)){
                 try{
-                    SOAPFault soapFault = ctx.getMessage().getSOAPPart().getEnvelope().getBody().addFault();
-                    soapFault.setFaultCode(new QName("http://example.com/namespace", "Client", "env"));
-                    soapFault.setFaultString("Unauthorized access");
-                    throw new SOAPFaultException(soapFault);
+                    injectSOAPFault(ctx, "Client", "Unauthorized");
+                    throw new SOAPFaultException(ctx.getMessage().getSOAPBody().getFault());
                 }catch(SOAPException e){
                     e.printStackTrace();
                 }
@@ -52,7 +52,15 @@ public class KeyHandler implements SOAPHandler<SOAPMessageContext> {
         }
     }
 
-    private boolean authorize(SOAPMessageContext ctx){
+    private void injectSOAPFault(SOAPMessageContext ctx, String faultCode, String faultString) throws SOAPException{
+        SOAPBody soapBody = ctx.getMessage().getSOAPBody();
+        soapBody.removeContents();
+        SOAPFault soapFault = soapBody.addFault();
+        soapFault.setFaultCode(faultCode);
+        soapFault.setFaultString(faultString);
+    }
+
+    public static boolean authorize(SOAPMessageContext ctx){
         try{
             @SuppressWarnings("unchecked")
             Map<String, List<?>> headers = (Map<String, List<?>>) ctx.get(MessageContext.HTTP_REQUEST_HEADERS);
diff --git a/src/main/java/handler/LoggingHandler.java b/src/main/java/handler/LoggingHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..64e9a1bf5823d004ad59e7882bcaa03317e3ae26
--- /dev/null
+++ b/src/main/java/handler/LoggingHandler.java
@@ -0,0 +1,75 @@
+package handler;
+
+import java.net.URI;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.Headers;
+
+
+import model.ApiKeysModel;
+import model.LoggingModel;
+
+public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {
+    @Override
+    public Set<QName> getHeaders(){
+        return null;
+    }
+
+    @Override
+    public void close(MessageContext ctx){
+
+    }
+
+    @Override
+    public boolean handleFault(SOAPMessageContext ctx){
+        insertLog(ctx);
+        return true;
+    }
+
+    @Override
+    public boolean handleMessage(SOAPMessageContext ctx){
+        insertLog(ctx);
+        return true;
+    }
+
+    private void insertLog(SOAPMessageContext ctx){
+        try {
+            StringBuilder description = new StringBuilder();
+
+            boolean outbound = (boolean) ctx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
+            boolean authorized = KeyHandler.authorize(ctx);
+            if(outbound){
+                if(authorized){
+                    description.append("Called ");
+                }else{
+                    description.append("Unauthorized tried to call ");
+                }
+            }else{
+                description.append("Attempting to call ");
+            }
+            
+            QName operation = (QName) ctx.get(MessageContext.WSDL_OPERATION);
+            description.append(operation.getLocalPart());
+
+            HttpExchange exchange = (HttpExchange) ctx.get("com.sun.xml.ws.http.exchange");
+
+            String ip = exchange.getRemoteAddress().getAddress().getHostAddress();
+            String endpoint = exchange.getRequestURI().toString();
+            
+            Timestamp ts = new Timestamp(System.currentTimeMillis());
+
+            LoggingModel.getInstance().createLog(description.toString(), ip, endpoint, ts);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/java/model/LoggingModel.java b/src/main/java/model/LoggingModel.java
index 6951bb4b15e7a29e6f819a903bf346c0cb816457..46b9aaeec6b4a5f62dd90dc6da061c56a7576573 100644
--- a/src/main/java/model/LoggingModel.java
+++ b/src/main/java/model/LoggingModel.java
@@ -11,6 +11,7 @@ import object.Logging;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -52,7 +53,7 @@ public class LoggingModel {
         return listLogging;
     }
 
-    public String createLog(String description, String ip, String endpoint, Date requested_At) throws SQLException{
+    public String createLog(String description, String ip, String endpoint, Timestamp requested_At) throws SQLException{
 
         String query = "INSERT INTO " + this.table + " (description, ip, endpoint, requested_at)" +
                 "VALUES ( ?, ?, ?, ?)";
@@ -61,7 +62,7 @@ public class LoggingModel {
             pstmt.setString(1, description);
             pstmt.setString(2, ip);
             pstmt.setString(3, endpoint);
-            pstmt.setDate(4, new java.sql.Date(requested_At.getTime()));
+            pstmt.setTimestamp(4, requested_At);
 
             int rowsAffected = pstmt.executeUpdate();
             return rowsAffected + " rows affected";
diff --git a/src/main/java/model/SubscriptionModel.java b/src/main/java/model/SubscriptionModel.java
index 0903d576379f4bd4548cc3f410f2f555d8c3b19b..8e03c2dcd81ae4fa131349dfcd6e16533560e098 100644
--- a/src/main/java/model/SubscriptionModel.java
+++ b/src/main/java/model/SubscriptionModel.java
@@ -22,7 +22,7 @@ public class SubscriptionModel {
     private Database db;
     private String table;
     private static SubscriptionModel instance;
-
+    
     public static SubscriptionModel getInstance() {
         try {
             if (instance == null) {
@@ -50,6 +50,33 @@ public class SubscriptionModel {
         return ls;
     }
 
+    public Status getSubscriptionStatus(int user_id) throws SQLException{
+        String query = "SELECT * FROM "+this.table+" WHERE creator_id = ?";
+        PreparedStatement pstmt = this.db.prepareStatement(query);
+        this.db.bind(user_id);
+
+        ResultSet rs = pstmt.executeQuery();
+        if(rs.next()){
+            return Status.fromStatusCode(rs.getString("status"));
+        }
+        return null;
+    }
+
+    public List<Subscription> getSubscriptionsByStatus(Status state) throws SQLException{
+        List<Subscription> ls = new ArrayList<>();
+
+        String query = "SELECT * FROM "+this.table+" WHERE status = '"+state.getStatusCode().toUpperCase()+"'";
+        PreparedStatement pstmt = this.db.prepareStatement(query);
+        ResultSet rs = pstmt.executeQuery();
+
+        while(rs.next()){
+            Subscription sub = new Subscription(rs);
+            ls.add(sub);
+        }
+
+        return ls;
+    }
+    
     public String requestSubscription(int user_id) throws SQLException{
         String query = "INSERT INTO "+this.table+" (creator_id) VALUES (?)";
         PreparedStatement pstmt = this.db.prepareStatement(query);
@@ -68,4 +95,5 @@ public class SubscriptionModel {
         int rowsAffected = pstmt.executeUpdate();
         return rowsAffected + " rows affected";
     }
+
 }
diff --git a/src/main/java/service/BaseWS.java b/src/main/java/service/BaseWS.java
deleted file mode 100644
index 79a974f290fbace92025da632b90c968123a280b..0000000000000000000000000000000000000000
--- a/src/main/java/service/BaseWS.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package service;
-
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.annotation.Resource;
-import javax.xml.ws.WebServiceContext;
-import javax.xml.ws.handler.MessageContext;
-
-import com.sun.net.httpserver.Headers;
-import com.sun.net.httpserver.HttpExchange;
-import model.ApiKeysModel;
-import model.LoggingModel;
-
-import java.sql.Timestamp;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-
-public class BaseWS {
-    @Resource
-    WebServiceContext wsContext;
-    public boolean verifyApiKey() {
-        try {
-
-            MessageContext messageContext = wsContext.getMessageContext();
-            Map<String, List<String>> requestHeaders = (Map<String, List<String>>) messageContext.get(MessageContext.HTTP_REQUEST_HEADERS);
-            String api_key = getApiKeyFromHeaders(requestHeaders);
-
-            boolean trueApi = ApiKeysModel.getInstance().verifyApiKey(api_key);
-
-            return trueApi;
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-    }
-
-    private String getApiKeyFromHeaders(Map<String, List<String>> headers) {
-        List<String> apiKeyHeader = headers.get("API-Key");
-
-        if (apiKeyHeader != null && !apiKeyHeader.isEmpty()) {
-            return apiKeyHeader.get(0);
-        } else {
-            return null;
-        }
-    }
-
-    public String insertLog(String description, String endpoint) {
-        try {
-
-            MessageContext msgContext = wsContext.getMessageContext();
-            HttpExchange exchange = (HttpExchange) msgContext.get("com.sun.xml.ws.http.exchange");
-            Headers reqHeaders = exchange.getRequestHeaders();
-            String ip = reqHeaders.getFirst("X-Forwarded-For");
-            Timestamp ts = new Timestamp(System.currentTimeMillis());
-            return LoggingModel.getInstance().createLog(description, ip, endpoint, ts);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return "";
-        }
-    }
-
-}
diff --git a/src/main/java/service/RequestFilmWS.java b/src/main/java/service/RequestFilmWS.java
index f35fdcd1feb754270994f94d5d382e5b1c846960..cf9809f8df6a1971c1290225e63c985e3fcedac1 100644
--- a/src/main/java/service/RequestFilmWS.java
+++ b/src/main/java/service/RequestFilmWS.java
@@ -13,17 +13,12 @@ import java.util.List;
 
 @WebService(endpointInterface = "service.RequestFilmWS")
 @HandlerChain(file = "log_and_auth.xml")
-public class RequestFilmWS extends BaseWS{
+public class RequestFilmWS{
     @WebMethod
     public List<RequestFilm> getAllRequestFilms() {
         try {
             List<RequestFilm> result =  RequestFilmModel.getInstance().getAllRequestFilm();
-            if(result.isEmpty()){
-                return null;
-            } else {
-                insertLog("Get All Request Film", "service.RequestFilmWS");
-                return result;
-            }
+            return result;
         } catch (Exception e) {
             e.printStackTrace();
             return null;
@@ -34,12 +29,7 @@ public class RequestFilmWS extends BaseWS{
     public List<RequestFilm> getAllRequestFilmById(@WebParam(name="user_id") int user_id){
         try {
             List<RequestFilm> result =  RequestFilmModel.getInstance().getAllRequestFilm();
-            if(result.isEmpty()){
-                return null;
-            } else {
-                insertLog("Get All Request Film", "service.RequestFilmWS");
-                return result;
-            }
+            return result;
         } catch (Exception e){
             e.printStackTrace();
             return null;
@@ -50,12 +40,7 @@ public class RequestFilmWS extends BaseWS{
     public RequestFilm getRequestFilmByFilmId(@WebParam(name="requestFilm_id") int requestFilm_Id){
         try {
             RequestFilm result =  RequestFilmModel.getInstance().getRequestFilmByFilmId(requestFilm_Id);
-            if(result == null){
-                return null;
-            } else {
-                insertLog("", "service.RequestFilmWS");
-                return result;
-            }
+            return result;
         } catch (Exception e){
             e.printStackTrace();
             return null;
diff --git a/src/main/java/service/RequestProcessingService.java b/src/main/java/service/RequestProcessingService.java
deleted file mode 100644
index 4efbca664f3bffb2798d6ad162e45fc887ee0d91..0000000000000000000000000000000000000000
--- a/src/main/java/service/RequestProcessingService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package service;
-
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.xml.ws.WebServiceContext;
-
-interface RequestProcessingService {
-    public void acceptRequest(@WebParam Integer creator_id, @WebParam Integer request_id);
-    public void rejectRequest(@WebParam Integer creator_id, @WebParam Integer request_id);
-    public void request(@WebParam Integer creator_id, @WebParam Integer request_id);
-}
diff --git a/src/main/java/service/SubscriptionWS.java b/src/main/java/service/SubscriptionWS.java
index 182f90ca2e7c09cd9e18bdc24057e222cdcc82fa..5a62899e7d3faf7bfcdce9bd6f6b5a1b4079a1f2 100644
--- a/src/main/java/service/SubscriptionWS.java
+++ b/src/main/java/service/SubscriptionWS.java
@@ -14,7 +14,7 @@ import java.util.List;
 
 @WebService(endpointInterface = "service.SubscriptionWS")
 @HandlerChain(file = "log_and_auth.xml")
-public class SubscriptionWS extends BaseWS{
+public class SubscriptionWS{
     @WebMethod
     public List<Subscription> getAllSubscription(){
         try{
@@ -25,6 +25,26 @@ public class SubscriptionWS extends BaseWS{
         }
     }
 
+    @WebMethod
+    public Status checkSubscriptionStatus(@WebParam(name="user_id") Integer user_id){
+        try{
+            return SubscriptionModel.getInstance().getSubscriptionStatus(user_id);
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+    
+    @WebMethod
+    public List<Subscription> getSubscriptionsByStatus(@WebParam(name="status") String status){
+        try{
+            return SubscriptionModel.getInstance().getSubscriptionsByStatus(Status.fromStatusCode(status));
+        }catch(Exception e){
+            e.printStackTrace();
+            return null;
+        }
+    }
+
     @WebMethod
     public String acceptRequest(@WebParam(name = "user_id") Integer user_id){
         try{
@@ -52,4 +72,5 @@ public class SubscriptionWS extends BaseWS{
         }
         return null;
     }
+
 }
\ No newline at end of file
diff --git a/src/main/resources/log_and_auth.xml b/src/main/resources/log_and_auth.xml
index 8c5e3300ea8e886107489a1f3f9258281e94990b..58644d60d48c5ec039d9f5963971760eac6b0969 100644
--- a/src/main/resources/log_and_auth.xml
+++ b/src/main/resources/log_and_auth.xml
@@ -5,4 +5,9 @@
       <handler-class>handler.KeyHandler</handler-class>
     </handler>
   </handler-chain>
+  <handler-chain>
+    <handler>
+      <handler-class>handler.LoggingHandler</handler-class>
+    </handler>
+  </handler-chain>
 </handler-chains>
\ No newline at end of file