diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 0b3a5b1e94e0c1cc46ccfccd26a6b6df9ea083f7..d8d2e07ce9a3a1c62f00c4e62e3cab8955029503 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,10 +5,11 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="8522785e-cde9-49a6-ad14-9d935d110316" name="Changes" comment="">
-      <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/Dockerfile" beforeDir="false" />
       <change beforePath="$PROJECT_DIR$/src/main/java/com/example/jaxw/HelloServlet.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/example/jaxw/Main.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/example/jaxw/TestingService.java" beforeDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -38,6 +39,7 @@
   </component>
   <component name="PropertiesComponent"><![CDATA[{
   "keyToString": {
+    "ASKED_ADD_EXTERNAL_FILES": "true",
     "RunOnceActivity.OpenProjectViewOnStart": "true",
     "RunOnceActivity.ShowReadmeOnStart": "true",
     "SHARE_PROJECT_CONFIGURATION_FILES": "true",
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 700249060f0b89cd22382f746db9bc6c1360f607..0000000000000000000000000000000000000000
--- a/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM tomcat:jdk11-openjdk
-
-COPY ./target/jax-w-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/
-
-EXPOSE 3001
-
-# Start Tomcat when the container is run
-CMD ["catalina.sh", "run"]
diff --git a/src/main/java/com/example/jaxw/HelloServlet.java b/src/main/java/com/example/jaxw/HelloServlet.java
deleted file mode 100644
index 8a1b9deda773329c390d6c2b3df439bda7fa76ae..0000000000000000000000000000000000000000
--- a/src/main/java/com/example/jaxw/HelloServlet.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.example.jaxw;
-
-import java.io.*;
-import jakarta.servlet.http.*;
-import jakarta.servlet.annotation.*;
-
-@WebServlet(name = "helloServlet", value = "/hello-servlet")
-public class HelloServlet extends HttpServlet {
-    private String message;
-
-    public void init() {
-        message = "Hello World!";
-    }
-
-    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        response.setContentType("text/html");
-
-        // Hello
-        PrintWriter out = response.getWriter();
-        out.println("<html><body>");
-        out.println("<h1>" + message + "</h1>");
-        out.println("</body></html>");
-    }
-
-    public void destroy() {
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/com/example/jaxw/Main.java b/src/main/java/com/example/jaxw/Main.java
deleted file mode 100644
index deb09d137ec6c7dddc5d8f46711fe1a3f4513d4c..0000000000000000000000000000000000000000
--- a/src/main/java/com/example/jaxw/Main.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.example.jaxw;
-
-import javax.xml.ws.Endpoint;
-
-public class Main {
-    public static void main(String[] args) {
-        try {
-            Endpoint.publish("http://localhost:3001/ws/testing", new com.example.jaxw.TestingService());
-            System.out.println("Server started");
-        } catch (Exception e) {
-            System.out.println("Something's wrong");
-        }
-    }
-}
diff --git a/src/main/java/com/example/jaxw/TestingService.java b/src/main/java/com/example/jaxw/TestingService.java
deleted file mode 100644
index 4cf1279ad771624e6334766651109e058683a588..0000000000000000000000000000000000000000
--- a/src/main/java/com/example/jaxw/TestingService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.example.jaxw;
-
-import javax.jws.WebMethod;
-import javax.jws.WebService;
-
-@WebService
-public class TestingService {
-    @WebMethod
-    public String HelloWorld(String name) {
-        return "Hello " + name;
-    }
-}
diff --git a/src/main/java/com/gymtracker/Main.java b/src/main/java/com/gymtracker/Main.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e026629bb51f82c1ccb1835406626aeaeb02f2f
--- /dev/null
+++ b/src/main/java/com/gymtracker/Main.java
@@ -0,0 +1,19 @@
+package src.main.java.com.gymtracker;
+
+import src.main.java.com.gymtracker.example.TestingService;
+import src.main.java.com.gymtracker.controllers.GenerateAPIKeyController;
+
+import javax.xml.ws.Endpoint;
+
+public class Main {
+    public static void main(String[] args) {
+        try {
+            Endpoint.publish("http://localhost:3001/ws/testing", new TestingService());
+            Endpoint.publish("http://localhost:3001/ws/generate-api-key", new GenerateAPIKeyController());
+            System.out.println("Server started");
+        } catch (Exception e) {
+            System.out.println("Something's wrong");
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/java/com/gymtracker/controllers/GenerateAPIKeyController.java b/src/main/java/com/gymtracker/controllers/GenerateAPIKeyController.java
new file mode 100644
index 0000000000000000000000000000000000000000..dac005a67d3277d2c8a131e675eea1ec8f938e5b
--- /dev/null
+++ b/src/main/java/com/gymtracker/controllers/GenerateAPIKeyController.java
@@ -0,0 +1,20 @@
+package src.main.java.com.gymtracker.controllers;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import java.security.SecureRandom;
+import java.util.Base64;
+
+@WebService
+public class GenerateAPIKeyController {
+    @WebMethod
+    public String generateAPIKey() {
+        SecureRandom randomizer = new SecureRandom();
+        byte bytes[] = new byte[32];
+        randomizer.nextBytes(bytes);
+        Base64.Encoder encoder = Base64.getUrlEncoder().withoutPadding();
+        String token = encoder.encodeToString(bytes);
+
+        return token;
+    }
+}
diff --git a/src/main/java/com/gymtracker/example/TestingService.java b/src/main/java/com/gymtracker/example/TestingService.java
new file mode 100644
index 0000000000000000000000000000000000000000..b7f483db714c32156647c4e1e7c738eb0679d001
--- /dev/null
+++ b/src/main/java/com/gymtracker/example/TestingService.java
@@ -0,0 +1,23 @@
+package src.main.java.com.gymtracker.example;
+
+import src.main.java.com.gymtracker.middleware.APIKeyValidator;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.xml.ws.WebServiceContext;
+import javax.annotation.Resource;
+
+@WebService
+public class TestingService extends APIKeyValidator {
+    @Resource
+    WebServiceContext wsContext;
+    @WebMethod
+    public String HelloWorld(String name) {
+        if(verifyAPIKey(wsContext)) {
+            return "Hello " + name;
+        }
+        else {
+            return "Your key is wrong!";
+        }
+    }
+}
diff --git a/src/main/java/com/gymtracker/middleware/APIKeyValidator.java b/src/main/java/com/gymtracker/middleware/APIKeyValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..284239c3ee016eb3126be32247948645646ef430
--- /dev/null
+++ b/src/main/java/com/gymtracker/middleware/APIKeyValidator.java
@@ -0,0 +1,36 @@
+package src.main.java.com.gymtracker.middleware;
+
+import com.sun.net.httpserver.Headers;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.xml.internal.ws.api.message.HeaderList;
+
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.handler.MessageContext;
+
+public class APIKeyValidator {
+    private String phpKey = "zc6c6K695UgTdBdCeZFvk4FL6KaQAMlx8MgS_-0BwJs";
+    private String restKey = "XGv3FUYsAmNhzwa7sDkOzHsr_cTk7IGtbeMsU3PzhcU";
+
+    public boolean verifyAPIKey(WebServiceContext wsContext) {
+        try {
+            MessageContext msgContext = wsContext.getMessageContext();
+
+            HttpExchange exchange = (HttpExchange) msgContext.get("com.sun.xml.internal.ws.http.exchange");
+            Headers reqHeaders = exchange.getRequestHeaders();
+
+            String key = reqHeaders.getFirst("Authorization");
+            System.out.println("\napi_key: " + key);
+
+            if (key.equals(phpKey) || key.equals(restKey)) {
+                System.out.println("API key is verified");
+                return true;
+            } else {
+                System.out.println("API key is not verified.");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println(e);
+        }
+        return false;
+    }
+}