diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 574de4568e21706c1ac832f7025a60df46d8ae69..7ddfc9ed476345b09db3e8fdf464a62bb2ccfa9b 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -8,6 +8,5 @@
   </component>
   <component name="VcsDirectoryMappings">
     <mapping directory="" vcs="Git" />
-    <mapping directory="$PROJECT_DIR$/idatt2003" vcs="Git" />
   </component>
 </project>
\ No newline at end of file
diff --git a/src/main/java/edu/ntnu/stud/chaosgame/controller/game/Quadtree.java b/src/main/java/edu/ntnu/stud/chaosgame/controller/game/Quadtree.java
new file mode 100644
index 0000000000000000000000000000000000000000..32915e43675e4d141cd806ceb5f0f8e4eb3e7a71
--- /dev/null
+++ b/src/main/java/edu/ntnu/stud/chaosgame/controller/game/Quadtree.java
@@ -0,0 +1,34 @@
+package edu.ntnu.stud.chaosgame.controller.game;
+
+import javafx.geometry.Point2D;
+import javafx.scene.shape.Rectangle;
+
+public class Quadtree {
+  private QuadtreeNode root;
+
+  public Quadtree(Rectangle bounds) {
+    root = new QuadtreeNode(bounds, 0);
+  }
+
+  public QuadtreeNode findNodeContainingPoint(Point2D point) {
+    return findNodeContainingPoint(root, point);
+  }
+
+  private QuadtreeNode findNodeContainingPoint(QuadtreeNode node, Point2D point) {
+    if (node.isLeaf()) {
+      return node;
+    }
+
+    for (QuadtreeNode child : node.getChildren()) {
+      if (child.getBounds().contains(point)) {
+        return findNodeContainingPoint(child, point);
+      }
+    }
+
+    return null;
+  }
+
+
+
+  // other methods omitted for brevity
+}
diff --git a/src/main/java/edu/ntnu/stud/chaosgame/controller/game/QuadtreeNode.java b/src/main/java/edu/ntnu/stud/chaosgame/controller/game/QuadtreeNode.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e220a0a8f67cb8fce4ba7182743cd508bcaa043
--- /dev/null
+++ b/src/main/java/edu/ntnu/stud/chaosgame/controller/game/QuadtreeNode.java
@@ -0,0 +1,60 @@
+package edu.ntnu.stud.chaosgame.controller.game;
+
+import javafx.scene.shape.Rectangle;
+
+public class QuadtreeNode {
+  private QuadtreeNode parent;
+  private QuadtreeNode[] children;
+  private boolean isLeaf;
+  private int levelOfDetail;
+  private Rectangle bounds;
+
+  public QuadtreeNode(Rectangle bounds, int levelOfDetail) {
+    this.bounds = bounds;
+    this.levelOfDetail = levelOfDetail;
+    this.isLeaf = true;
+    this.children = new QuadtreeNode[4];
+  }
+
+  public void split() {
+    if (!isLeaf) {
+      return;
+    }
+
+    double halfWidth = bounds.getWidth() / 2;
+    double halfHeight = bounds.getHeight() / 2;
+
+    children[0] = new QuadtreeNode(new Rectangle(bounds.getX(), bounds.getY(), halfWidth, halfHeight), levelOfDetail + 1);
+    children[1] = new QuadtreeNode(new Rectangle(bounds.getX() + halfWidth, bounds.getY(), halfWidth, halfHeight), levelOfDetail + 1);
+    children[2] = new QuadtreeNode(new Rectangle(bounds.getX(), bounds.getY() + halfHeight, halfWidth, halfHeight), levelOfDetail + 1);
+    children[3] = new QuadtreeNode(new Rectangle(bounds.getX() + halfWidth, bounds.getY() + halfHeight, halfWidth, halfHeight), levelOfDetail + 1);
+
+    isLeaf = false;
+  }
+
+  public void merge() {
+    if (isLeaf) {
+      return;
+    }
+
+    for (int i = 0; i < 4; i++) {
+      children[i] = null;
+    }
+
+    isLeaf = true;
+  }
+
+  public Rectangle getBounds() {
+    return this.bounds;
+  }
+
+  public QuadtreeNode[] getChildren() {
+    return this.children;
+  }
+
+  public Boolean isLeaf() {
+    return this.isLeaf;
+  }
+
+  // getters and setters omitted for brevity
+}