diff --git a/.env.xmpl b/.env.xmpl
index 349acf6d8e19ce551b4aa87e50705d168fc0760c..62ecec38d1ed0b8bd0c7725297d5938f16e7d01a 100644
--- a/.env.xmpl
+++ b/.env.xmpl
@@ -1,3 +1,3 @@
-DB_URL=jdbc:mysql://mysql:3306/tocosoap
+DB_URL=jdbc:mysql://localhost:3306/tocosoap
 DB_USERNAME=toco
 DB_PASSWORD=toco
\ No newline at end of file
diff --git a/db/tocosoap.sql b/db/tocosoap.sql
index 98d40c79696d34370afa08c57a35ea633e209359..4faaedbc14c78bbcf0b8a47eb547a7e68492d7b7 100644
--- a/db/tocosoap.sql
+++ b/db/tocosoap.sql
@@ -43,6 +43,15 @@ INSERT INTO `api` (`api_key`) VALUES
     ('toco_rest'),
     ('toco_php');
 
+CREATE TABLE `voucher`(
+    `vid` int(11) NOT NULL AUTO_INCREMENT,
+    `code` varchar(255) NOT NULL,
+    `user_id` int NOT NULL,
+    `amount` int NOT NULL,
+    `timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+    PRIMARY KEY (`vid`)
+    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
 
   
 
diff --git a/docker-compose.yml b/docker-compose.yml
index 64efb8a91de5d097c3ebf046fa739a310ec832dd..8d11b58ff5d05c3a848716449f31c7566020ea98 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -7,16 +7,16 @@ services:
       - "./db:/docker-entrypoint-initdb.d"
     environment:
       MYSQL_ROOT_PASSWORD: root
-      MYSQL_DATABASE: toco_soap
+      MYSQL_DATABASE: tocosoap
       MYSQL_USER: toco
       MYSQL_PASSWORD: toco
 
-  toco-soap:
-    build:
-      dockerfile: Dockerfile
-      context: .
-    ports:
-        - "8080:8080"
-    depends_on:
-      - toco-soap-db
+#  toco-soap:
+#    build:
+#      dockerfile: Dockerfile
+#      context: .
+#    ports:
+#        - "8080:8080"
+#    depends_on:
+#      - toco-soap-db
 
diff --git a/dockerfile b/dockerfile
index f46acab1952d6c2840e399614bd41455371a3fc8..1e8e49a088f825130874f72c7ae2146f352e2b5d 100644
--- a/dockerfile
+++ b/dockerfile
@@ -1,15 +1,15 @@
 FROM mysql/mysql-server:8.0.23
-COPY db/toco_soap.sql /docker-entrypoint-initdb.d/
-
-FROM maven:3.8-openjdk-11-slim
-
-WORKDIR /app
-
-COPY src ./src
-COPY pom.xml .
-COPY .env .
-COPY target ./target
-
-RUN mvn clean package
-
-CMD ["mvn", "exec:java"]
\ No newline at end of file
+COPY db/tocosoap.sql /docker-entrypoint-initdb.d/
+
+#FROM maven:3.8-openjdk-11-slim
+#
+#WORKDIR /app
+#
+#COPY src ./src
+#COPY pom.xml .
+#COPY .env .
+#COPY target ./target
+#
+#RUN mvn clean package
+#
+#CMD ["mvn", "exec:java"]
\ No newline at end of file
diff --git a/src/main/java/org/toco/entity/voucher_entity.java b/src/main/java/org/toco/entity/voucher_entity.java
new file mode 100644
index 0000000000000000000000000000000000000000..f786a85be6f1ced70eecfa17c1fd08d09f23f9fe
--- /dev/null
+++ b/src/main/java/org/toco/entity/voucher_entity.java
@@ -0,0 +1,15 @@
+package org.toco.entity;
+import lombok.Data;
+
+@Data
+public class voucher_entity {
+    private String code;
+    private Integer user_id;
+    private Integer amount;
+
+    public voucher_entity(String code, Integer user_id, Integer amount) {
+        this.code = code;
+        this.user_id = user_id;
+        this.amount = amount;
+    }
+}
diff --git a/src/main/java/org/toco/model/voucher_model.java b/src/main/java/org/toco/model/voucher_model.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f5937a4eeeddb8d5d96f9fcddde046b64a6e78d
--- /dev/null
+++ b/src/main/java/org/toco/model/voucher_model.java
@@ -0,0 +1,97 @@
+package org.toco.model;
+
+import java.sql.*;
+
+import org.toco.core.connector;
+import org.toco.entity.voucher_entity;
+
+public class voucher_model {
+    public void insert (voucher_entity voucher_entity) {
+        String sql = "INSERT INTO voucher (code, user_id, amount) VALUES (?, ?, ?)";
+        try (Connection connection = connector.connect() ;
+             PreparedStatement command = connection.prepareStatement(sql)) {
+            command.setString(1, voucher_entity.getCode());
+            command.setInt(2, voucher_entity.getUser_id());
+            command.setInt(3, voucher_entity.getAmount());
+            command.execute();
+        } catch (SQLException exception) {
+            throw new RuntimeException("Error when inserting", exception);
+        }
+    }
+
+    public voucher_entity [] getAllVouchers () {
+        String sql = "SELECT * FROM voucher";
+        try (Connection connection = connector.connect() ;
+             PreparedStatement command = connection.prepareStatement(sql)) {
+            ResultSet result = command.executeQuery();
+            voucher_entity [] voucher_entity = new voucher_entity[getAllCount()];
+            int i = 0;
+            while (result.next()) {
+                voucher_entity[i] = new voucher_entity(result.getString("code"), result.getInt("user_id"), result.getInt("amount"));
+                i++;
+            }
+            return voucher_entity;
+        } catch (SQLException exception) {
+            throw new RuntimeException("Error when inserting", exception);
+        }
+    }
+
+    public voucher_entity[] getSpecifiedVoucher(String code){
+        String sql = "SELECT * FROM voucher WHERE code = ?";
+        try (Connection connection = connector.connect() ;
+             PreparedStatement command = connection.prepareStatement(sql)) {
+            command.setString(1, code);
+            ResultSet result = command.executeQuery();
+            voucher_entity [] voucher_entity = new voucher_entity[getSpecifiedCount(code)];
+            int i = 0;
+            while (result.next()) {
+                voucher_entity[i] = new voucher_entity(result.getString("code"), result.getInt("user_id"), result.getInt("amount"));
+                i++;
+            }
+            return voucher_entity;
+        } catch (SQLException exception) {
+            throw new RuntimeException("Error when inserting", exception);
+        }
+    }
+
+    public Integer getSpecifiedCount(String code){
+        String sql = "SELECT COUNT(*) FROM voucher WHERE code = ?";
+        try (Connection connection = connector.connect() ;
+             PreparedStatement command = connection.prepareStatement(sql)) {
+            command.setString(1, code);
+            ResultSet result = command.executeQuery();
+            if (result.next()) {
+                return result.getInt(1);
+            }
+            else{
+                return 0;
+            }
+        } catch (SQLException exception) {
+            throw new RuntimeException("Error when inserting", exception);
+        }
+    }
+
+    public Integer getAllCount(){
+        String sql = "SELECT COUNT(*) FROM voucher";
+        try (Connection connection = connector.connect() ;
+             PreparedStatement command = connection.prepareStatement(sql)) {
+            ResultSet result = command.executeQuery();
+            if (result.next()) {
+                return result.getInt(1);
+            }
+            else{
+                return 0;
+            }
+        } catch (SQLException exception) {
+            throw new RuntimeException("Error when inserting", exception);
+        }
+    }
+
+
+
+
+
+
+
+
+}
diff --git a/src/main/java/org/toco/service/toco_service.java b/src/main/java/org/toco/service/toco_service.java
index 30ad53f216302ef3f5b44944d3f38685912fa8e6..f3d82ce7f110fac14e6aa4252778ea0a339f09f7 100644
--- a/src/main/java/org/toco/service/toco_service.java
+++ b/src/main/java/org/toco/service/toco_service.java
@@ -36,4 +36,24 @@ public interface toco_service {
             @WebParam(name = "user_id") Integer user_id
     );
 
+    @WebMethod
+    public String useVoucher(
+            @WebParam(name = "code") String code,
+            @WebParam(name = "user_id") Integer user_id,
+            @WebParam(name = "amount") Integer amount
+
+    );
+
+    @WebMethod
+    public String[] getSpecifiedVouchers(
+            @WebParam(name = "code") String code
+    );
+
+    @WebMethod
+    public String[] getAllVouchers(
+
+    );
+
+
+
 }
diff --git a/src/main/java/org/toco/service/toco_service_impl.java b/src/main/java/org/toco/service/toco_service_impl.java
index a1df6c149d4caeed539a49dd4dc5851fecb1afed..c4277e61b1f0621104fe768a42723ca08ed92689 100644
--- a/src/main/java/org/toco/service/toco_service_impl.java
+++ b/src/main/java/org/toco/service/toco_service_impl.java
@@ -105,6 +105,66 @@ public class toco_service_impl implements toco_service {
         }
     }
 
+    @Override
+    public String useVoucher(String voucher, Integer user_id, Integer amount) {
+        if(validateApiKey()){
+            voucher_model voucherModel = new voucher_model();
+            userGems_model userGemsModel = new userGems_model();
+            transaction_model transactionModel = new transaction_model();
+            voucher_entity voucherEntity = new voucher_entity(voucher,user_id,amount);
+            voucherModel.insert(voucherEntity);
+            transactionModel.insert(new transaction_entity(user_id, amount, "voucher", "accepted", "0"));
+            if (userGemsModel.checkUser(user_id)) {
+                Integer currentGems = userGemsModel.getUserGems(user_id);
+                userGemsModel.update(new userGems_Entity(user_id, currentGems + amount));
+            } else {
+                userGemsModel.insert(new userGems_Entity(user_id, amount));
+            }
+            addLoggging("User with id " + user_id + " used voucher " + voucher + "with amount " + amount);
+            return "success";
+        }
+        else {
+            addLoggging("User with id " + user_id + " tried to use a voucher with amount " + amount + " but failed because of invalid api key");
+            return "invalid apikey";
+        }
+    }
+
+    @Override
+    public String[] getSpecifiedVouchers (String code){
+        if(validateApiKey()){
+            voucher_model voucherModel = new voucher_model();
+            voucher_entity[] voucherEntity = voucherModel.getSpecifiedVoucher(code);
+            Integer len = voucherModel.getSpecifiedCount(code);
+            String[] ret = new String[len];
+            for (int i = 0; i < len; i++) {
+                ret[i] = voucherEntity[i].getCode()+", "+voucherEntity[i].getAmount().toString()+", "+voucherEntity[i].getUser_id().toString();
+            }
+            return ret;
+        }
+        else {
+            addLoggging("invalid api key");
+            return null;
+        }
+    }
+
+    @Override
+    public String[] getAllVouchers() {
+        if(validateApiKey()){
+            voucher_model voucherModel = new voucher_model();
+            voucher_entity[] voucherEntity = voucherModel.getAllVouchers();
+            Integer len = voucherModel.getAllCount();
+            String[] ret = new String[len];
+            for (int i = 0; i < len; i++) {
+                ret[i] = voucherEntity[i].getCode()+", "+voucherEntity[i].getAmount().toString()+", "+voucherEntity[i].getUser_id().toString();
+            }
+            return ret;
+        }
+        else {
+            addLoggging("invalid api key");
+            return null;
+        }
+    }
+
     public Boolean validateApiKey() {
         api_model apiModel = new api_model();
         MessageContext mc = wsctx.getMessageContext();