diff --git a/Backend/src/main/java/hsrt/VSundSOA/backendapi/fieldCreation/FieldCreation.java b/Backend/src/main/java/hsrt/VSundSOA/backendapi/fieldCreation/FieldCreation.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d43771b33ac27c529ea4373fa61a72c52bd5797
--- /dev/null
+++ b/Backend/src/main/java/hsrt/VSundSOA/backendapi/fieldCreation/FieldCreation.java
@@ -0,0 +1,260 @@
+package hsrt.VSundSOA.backendapi.fieldCreation;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Random;
+
+@CrossOrigin(origins = "*")
+@RestController
+public class FieldCreation {
+    private int[][] solutionField = new int[9][9];
+    private int[][] holedField = new int[9][9];
+    private Random random = new Random();
+    ArrayList<Integer> possibleFill = new ArrayList<>();
+
+    @ResponseStatus(HttpStatus.OK)
+    @GetMapping("/field/create")
+    public ArrayList<int[][]> getNewField() {
+        ArrayList<int[][]> fields = new ArrayList<>(Arrays.asList(holedField, solutionField));
+        createField();
+        return fields;
+    }
+
+    private void createField() {
+        for (Integer x = 0; x < 9; x++) {
+            for (Integer y = 0; y < 9; y++) {
+                solutionField[x][y] = -1;
+                holedField[x][y] = -1;
+            }
+        }
+        centerInit();
+        crossInit();
+        cornerInit();
+
+        holeField();
+    }
+
+    private boolean initialiseField(Integer row, Integer column) {
+        ArrayList<Integer> possibleFill = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
+
+        while (possibleFill.size() > 0) {
+            solutionField[row][column] = possibleFill.get(random.nextInt(possibleFill.size()));
+            if (correctPlacement(row, column)) {
+                if (column.equals(8) && row.equals(8)) {
+                    return true;
+                }
+                if (column.equals(8)) {
+                    if (initialiseField(++row, 0)) {
+                        return true;
+                    }
+                } else {
+                    if (initialiseField(row, ++column)) {
+                        return true;
+                    }
+                }
+            } else {
+                possibleFill.remove(possibleFill.indexOf(solutionField[row][column]));
+            }
+        }
+/*
+
+        if (possibleFill.size() == 0) {
+            System.out.println("possible fill == 0 for row " + row);
+            for (Integer y = 0; y < 9; y++) {
+                solutionField[row][y] = -1;
+            }
+            initialiseField(row, 0);
+        }
+*/
+
+        solutionField[row][column] = -1;
+        return false;
+    }
+
+    void centerInit() {
+        for (int i = 0; i < 9; ++i) {
+            Integer n = random.nextInt(9) + 1;
+            if (!possibleFill.contains(n))
+                possibleFill.add(n);
+            else
+                i--;
+        }
+
+        int k = 0;
+        for (int i = 3; i < 6; ++i)
+            for (int j = 3; j < 6; ++j)
+                solutionField[i][j] = possibleFill.get(k++);
+    }
+
+    void crossInit() {
+        for (int i = 3; i < 6; ++i) {
+            int l = 0;
+            for (int j = 3; j < 6; ++j) {
+                if (i == 3) {
+                    solutionField[i + 1][l] = solutionField[i][j];
+                    solutionField[i + 2][l + 6] = solutionField[i][j];
+                    ++l;
+                } else if (i == 4) {
+                    solutionField[i + 1][l] = solutionField[i][j];
+                    solutionField[i - 1][l + 6] = solutionField[i][j];
+                    ++l;
+                } else if (i == 5) {
+                    solutionField[i - 2][l] = solutionField[i][j];
+                    solutionField[i - 1][l + 6] = solutionField[i][j];
+                    ++l;
+                }
+            }
+        }
+        for (int j = 3; j < 6; ++j) {
+            int l = 0;
+            for (int i = 3; i < 6; ++i) {
+                if (j == 3) {
+                    solutionField[l][j + 1] = solutionField[i][j];
+                    solutionField[l + 6][j + 2] = solutionField[i][j];
+                    ++l;
+                } else if (j == 4) {
+                    solutionField[l][j + 1] = solutionField[i][j];
+                    solutionField[l + 6][j - 1] = solutionField[i][j];
+                    ++l;
+                } else if (j == 5) {
+                    solutionField[l][j - 2] = solutionField[i][j];
+                    solutionField[l + 6][j - 1] = solutionField[i][j];
+                    ++l;
+                }
+            }
+        }
+    }
+
+    void cornerInit() {
+        for (int i = 0; i < 3; ++i) {
+            int l = 0;
+            for (int j = 3; j < 6; ++j) {
+                if (i == 0) {
+                    solutionField[i + 1][l] = solutionField[i][j];
+                    solutionField[i + 2][l + 6] = solutionField[i][j];
+                    ++l;
+                } else if (i == 1) {
+                    solutionField[i + 1][l] = solutionField[i][j];
+                    solutionField[i - 1][l + 6] = solutionField[i][j];
+                    ++l;
+                } else if (i == 2) {
+                    solutionField[i - 2][l] = solutionField[i][j];
+                    solutionField[i - 1][l + 6] = solutionField[i][j];
+                    ++l;
+                }
+            }
+        }
+        for (int i = 6; i < 9; ++i) {
+            int l = 0;
+            for (int j = 3; j < 6; ++j) {
+                if (i == 6) {
+                    solutionField[i + 1][l] = solutionField[i][j];
+                    solutionField[i + 2][l + 6] = solutionField[i][j];
+                    ++l;
+                } else if (i == 7) {
+                    solutionField[i + 1][l] = solutionField[i][j];
+                    solutionField[i - 1][l + 6] = solutionField[i][j];
+                    ++l;
+                } else if (i == 8) {
+                    solutionField[i - 2][l] = solutionField[i][j];
+                    solutionField[i - 1][l + 6] = solutionField[i][j];
+                    ++l;
+                }
+            }
+        }
+    }
+
+    private boolean correctPlacement(Integer row, Integer column) {
+        Integer toTest = solutionField[row][column];
+        for (Integer x = 0; x < 9; x++) {
+            if (row == x) {
+                continue;
+            }
+            if (toTest.equals(solutionField[x][column])) {
+                return false;
+            }
+        }
+        for (Integer y = 0; y < 9; y++) {
+            if (column == y) {
+                continue;
+            }
+            if (toTest.equals(solutionField[row][y])) {
+                return false;
+            }
+        }
+        Integer blockX = Math.floorDiv(row, 3) * 3;
+        Integer blockY = Math.floorDiv(column, 3) * 3;
+        for (Integer x = 0 + blockX; x < 3 + blockX; x++) {
+            for (Integer y = 0 + blockY; y < 3 + blockY; y++) {
+                if (row != x && column != y && toTest.equals(solutionField[x][y])) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    private void holeField() {
+
+        Boolean removed;
+        Integer stackX, stackY;
+        for (Integer holes = 50; holes >= 0; holes--) {
+            removed = false;
+            do {
+                Integer x = random.nextInt(9);
+                Integer y = random.nextInt(9);
+                if (holedField[x][y] > 0) {
+                    removed = true;
+                } else {
+                    holedField[x][y] = solutionField[x][y];
+                    removed = false;
+                }
+
+//                stackX = holedField[x][y];
+//                stackY = holedField[8 - x][8 - y];
+//                holedField[x][y] = -1;
+//                holedField[8 - x][8 - y] = -1;
+//                if (!correctRemove(0).equals(1)) {
+//                    removed = true;
+//                } else {
+//                    holedField[x][y] = stackX;
+//                    holedField[8 - x][8 - y] = stackY;
+//                }
+            } while (removed);
+        }
+    }
+
+    private Integer correctRemove(Integer foundSolutions) {
+        Integer missingCells = 0;
+        for (Integer x = 0; x < 9; x++) {
+            for (Integer y = 0; y < 9; y++) {
+                if (holedField[x][y] < 0) {
+                    for (Integer tryThis = 1; tryThis <= 9; tryThis++) {
+                        holedField[x][y] = tryThis;
+                        if (correctPlacement(x, y)) {
+                            for (Integer x2 = x; x2 < 9; x2++) {
+                                for (Integer y2 = y; y2 < 9; y2++) {
+                                    if (holedField[x2][y2] < 0) {
+                                        missingCells++;
+                                    }
+                                }
+                            }
+                            if (missingCells == 0) {
+                                return ++foundSolutions;
+                            }
+                            foundSolutions = correctRemove(foundSolutions);
+                        }
+                    }
+                    holedField[x][y] = -1;
+                }
+            }
+        }
+        return foundSolutions;
+    }
+}
\ No newline at end of file