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/handler/KeyHandler.java b/src/main/java/handler/KeyHandler.java
index f43144ed3e6d49864745396f62d1f076de6adee3..17c237f3f59b77c88b79c99f0b2e55cb32f96b0b 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,6 +52,14 @@ public class KeyHandler implements SOAPHandler<SOAPMessageContext> {
         }
     }
 
+    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);
+    }
+
     private boolean authorize(SOAPMessageContext ctx){
         try{
             @SuppressWarnings("unchecked")
diff --git a/src/main/java/handler/LoggingHandler.java b/src/main/java/handler/LoggingHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..a043b063fab33be62ced2028703466538a79a997
--- /dev/null
+++ b/src/main/java/handler/LoggingHandler.java
@@ -0,0 +1,64 @@
+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 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){
+        return true;
+    }
+
+    @Override
+    public boolean handleMessage(SOAPMessageContext ctx){
+        insertLog(ctx);
+        return true;
+    }
+
+    private void insertLog(SOAPMessageContext ctx){
+        try {
+            StringBuilder description = new StringBuilder();
+            // if((boolean) ctx.get("authorized")){
+            //     description.append("Called ");
+            // }else{
+            //     description.append("Unauthorized access tried 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/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