diff --git a/cp/ex09/__init__.py b/cp/ex09/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..c9bf24e54d475806d511254e677f9f48d430f544
--- /dev/null
+++ b/cp/ex09/__init__.py
@@ -0,0 +1 @@
+"""DO NOT EDIT/ADD TO THIS FILE.""" 
diff --git a/cp/ex09/rectangle.py b/cp/ex09/rectangle.py
new file mode 100644
index 0000000000000000000000000000000000000000..5826e959779f915a58faa0c68fdd39679603675d
--- /dev/null
+++ b/cp/ex09/rectangle.py
@@ -0,0 +1,7 @@
+"""The Rectangle-exercises 9.1-9.3."""
+
+class Rectangle:
+    """A class that represents a Rectangle."""
+
+    # TODO: Code has been removed from here. 
+ 
diff --git a/cp/ex09/vector.py b/cp/ex09/vector.py
new file mode 100644
index 0000000000000000000000000000000000000000..5b25a805dab87bf647a45224eecc13ebf7a3cbe0
--- /dev/null
+++ b/cp/ex09/vector.py
@@ -0,0 +1,8 @@
+"""This file contains all the exercises relating to the Vector Exercises (9.4-9.7)."""
+
+class Vector:
+    """A class that represents a Vector, defined by the endpoint :math:`(x,y)`.""" 
+
+    # TODO: Code has been removed from here. 
+
+    
diff --git a/cp/tests/tests_week09.py b/cp/tests/tests_week09.py
new file mode 100644
index 0000000000000000000000000000000000000000..c847d46c55f2f1acdee59e1067d66d25bf13fc88
--- /dev/null
+++ b/cp/tests/tests_week09.py
@@ -0,0 +1,204 @@
+from unitgrade import Report, UTestCase
+import unittest
+import cp
+import inspect
+
+class Week09TestRectanglePerimeter(UTestCase):
+    def make_rectangle(self, width, height):
+        from cp.ex09.rectangle import Rectangle
+        init_parameters = inspect.signature(Rectangle.__init__).parameters
+        if len(init_parameters) == 5: # If the class has already been extended to have a center
+            return Rectangle(width, height, 0, 0)
+        else:
+            return Rectangle(width, height)
+    def test_perimeter(self):
+        self.assertEqual(self.make_rectangle(10, 4).get_perimeter(), 28)
+        self.assertEqual(self.make_rectangle(4, 10).get_perimeter(), 28)
+        self.assertEqual(self.make_rectangle(2, 8).get_perimeter(), 20)
+        self.assertEqual(self.make_rectangle(15, 12).get_perimeter(), 54)
+        self.assertEqual(self.make_rectangle(1, 1).get_perimeter(), 4)
+        self.assertEqual(self.make_rectangle(10, 1).get_perimeter(), 22)
+
+class Week09TestCorners(UTestCase):
+    def test_corners(self):
+        from cp.ex09.rectangle import Rectangle
+        X,Y = Rectangle(2, 5, 3, 4).get_corners()
+        self.assertEqual(X,[2.0, 2.0, 4.0, 4.0] )
+        self.assertEqual(Y,[1.5, 6.5, 6.5, 1.5] )
+
+        X,Y = Rectangle(1, 1, 3, 4).get_corners()
+        self.assertEqual(X,[2.5, 2.5, 3.5, 3.5] )
+        self.assertEqual(Y,[3.5, 4.5, 4.5, 3.5] )
+
+        X,Y = Rectangle(1, 2, 8, 2).get_corners()
+        self.assertEqual(X,[7.5, 7.5, 8.5, 8.5] )
+        self.assertEqual(Y,[1.0, 3.0, 3.0, 1.0] )
+
+        X,Y = Rectangle(7, 2, 3, 4).get_corners()
+        self.assertEqual(X,[-0.5, -0.5, 6.5, 6.5] )
+        self.assertEqual(Y,[3.0, 5.0, 5.0, 3.0] )
+
+
+class Week09TestVector(UTestCase):
+    def test_make_vector(self):
+        from cp.ex09.vector import Vector
+
+        v1 = Vector(2,3)
+        self.assertIsInstance(v1, Vector, msg="Must return a Vector instance.")
+        self.assertEqual(v1.x, 2)
+        self.assertEqual(v1.y, 3)
+
+        v1 = Vector(3,5)
+        self.assertIsInstance(v1, Vector, msg="Must return a Vector instance.")
+        self.assertEqual(v1.x, 3)
+        self.assertEqual(v1.y, 5)
+
+        v1 = Vector(10,2)
+        self.assertIsInstance(v1, Vector, msg="Must return a Vector instance.")
+        self.assertEqual(v1.x, 10)
+        self.assertEqual(v1.y, 2)
+
+
+class Week09VectorAddition(unittest.TestCase):
+    def test_add_positive_vectors(self):
+        from cp.ex09.vector import Vector
+        vector1 = Vector(2, 3)
+        vector2 = Vector(4, 5)
+        result = vector1.add(vector2)
+        # Check that the original vectors are unchanged
+        self.assertEqual((vector1.x, vector1.y), (2, 3))
+        self.assertEqual((vector2.x, vector2.y), (4, 5))
+
+        self.assertEqual(result.x, vector1.x + vector2.x)
+        self.assertEqual(result.y, vector1.y + vector2.y)
+
+    def test_add_negative_vectors(self):
+        from cp.ex09.vector import Vector
+        vector1 = Vector(-2, -3)
+        vector2 = Vector(-4, -5)
+        result = vector1.add(vector2)
+        # Check that the original vectors are unchanged
+        self.assertEqual((vector1.x, vector1.y), (-2, -3))
+        self.assertEqual((vector2.x, vector2.y), (-4, -5))
+
+        self.assertEqual(result.x, vector1.x + vector2.x)
+        self.assertEqual(result.y, vector1.y + vector2.y)
+
+    def test_add_mixed_vectors(self):
+        from cp.ex09.vector import Vector
+        vector1 = Vector(2, -3)
+        vector2 = Vector(-4, 5)
+        result = vector1.add(vector2)
+        # Check that the original vectors are unchanged
+        self.assertEqual((vector1.x, vector1.y), (2, -3))
+        self.assertEqual((vector2.x, vector2.y), (-4, 5))
+        
+        self.assertEqual(result.x, vector1.x + vector2.x)
+        self.assertEqual(result.y, vector1.y + vector2.y)
+
+class Week09VectorDotProduct(unittest.TestCase):
+
+    def test_dot_product_with_positive_vectors(self):
+        from cp.ex09.vector import Vector
+        vector1 = Vector(2, 3)
+        vector2 = Vector(4, 5)
+        result = vector1.dot(vector2)
+        self.assertEqual(result, vector1.x * vector2.x + vector1.y * vector2.y)
+
+    def test_dot_product_with_negative_vectors(self):
+        from cp.ex09.vector import Vector
+        vector1 = Vector(-2, -3)
+        vector2 = Vector(-4, -5)
+        result = vector1.dot(vector2)
+        self.assertEqual(result, vector1.x * vector2.x + vector1.y * vector2.y)
+
+    def test_dot_product_with_mixed_vectors(self):
+        from cp.ex09.vector import Vector
+        vector1 = Vector(2, -3)
+        vector2 = Vector(-4, 5)
+        result = vector1.dot(vector2)
+        self.assertEqual(result, vector1.x * vector2.x + vector1.y * vector2.y)
+
+class Week09VectorScale(unittest.TestCase):
+
+    def test_scale_positive_vector(self):
+        from cp.ex09.vector import Vector
+        vector1 = Vector(2, 3)
+        scale_factor = 2
+        scaled_vector = vector1.scale(scale_factor)
+
+        self.assertEqual(scaled_vector.x, vector1.x * scale_factor)
+        self.assertEqual(scaled_vector.y, vector1.y * scale_factor)
+
+        # Check that the original vector is unchanged
+        self.assertEqual((vector1.x, vector1.y), (2, 3))
+
+    def test_scale_negative_vector(self):
+        from cp.ex09.vector import Vector
+        vector1 = Vector(-2, -3)
+        scale_factor = 3
+        scaled_vector = vector1.scale(scale_factor)
+
+        self.assertEqual(scaled_vector.x, vector1.x * scale_factor)
+        self.assertEqual(scaled_vector.y, vector1.y * scale_factor)
+
+        # Check that the original vector is unchanged
+        self.assertEqual((vector1.x, vector1.y), (-2, -3))
+
+    def test_scale_mixed_vector(self):
+        from cp.ex09.vector import Vector
+        vector1 = Vector(2, -3)
+        scale_factor = -1.5
+        scaled_vector = vector1.scale(scale_factor)
+
+        self.assertEqual(scaled_vector.x, vector1.x * scale_factor)
+        self.assertEqual(scaled_vector.y, vector1.y * scale_factor)
+
+        # Check that the original vector is unchanged
+        self.assertEqual((vector1.x, vector1.y), (2, -3))
+
+class Week09TranslatingRectangle(UTestCase):
+    def test_move_vector(self):
+        from cp.ex09.vector import Vector
+        from cp.ex09.rectangle import Rectangle
+        r = Rectangle(10, 4, 2, 2)
+        r.translate(Vector(2, 3))
+        self.assertEqual(r.x_c, 4)
+        self.assertEqual(r.y_c, 5)
+
+        r = Rectangle(1, 2, 1, 1)
+        r.translate(Vector(4, 2))
+        self.assertEqual(r.x_c, 5)
+        self.assertEqual(r.y_c, 3)
+
+        r = Rectangle(12, 14, 0, 0)
+        r.translate(Vector(-5,5))
+        self.assertEqual(r.x_c, -5)
+        self.assertEqual(r.y_c, 5)
+        
+        r = Rectangle(12, 13, -5, 2)
+        r.translate(Vector(10, 12))
+        self.assertEqual(r.x_c, 5)
+        self.assertEqual(r.y_c, 14)
+        
+questions = [
+        (Week09TestRectanglePerimeter, 10),
+        (Week09TestVector, 10),
+        (Week09VectorDotProduct, 10),
+        (Week09VectorAddition, 10),
+        (Week09VectorScale, 10),
+        (Week09TranslatingRectangle, 10),
+        (Week09TestCorners,10),
+        ]
+
+class Week09Tests(Report):
+    title = "Tests for week 09"
+    #version = 1.0
+    #url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests"
+    pack_imports = [cp]
+    individual_imports = []
+    questions = questions
+
+if __name__ == '__main__':
+    from unitgrade import evaluate_report_student
+    evaluate_report_student(Week09Tests())
diff --git a/cp/tests/unitgrade_data/Week09TestCorners.pkl b/cp/tests/unitgrade_data/Week09TestCorners.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..39bb54c4b49d2fcab279d55f6e85a1c74eb96c36
Binary files /dev/null and b/cp/tests/unitgrade_data/Week09TestCorners.pkl differ
diff --git a/cp/tests/unitgrade_data/Week09TestRectanglePerimeter.pkl b/cp/tests/unitgrade_data/Week09TestRectanglePerimeter.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..2d0711c7727dca6ad67ff939b632d9dd52a6b2c8
Binary files /dev/null and b/cp/tests/unitgrade_data/Week09TestRectanglePerimeter.pkl differ
diff --git a/cp/tests/unitgrade_data/Week09TestVector.pkl b/cp/tests/unitgrade_data/Week09TestVector.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..efc9ccb32a2c958291b019c453af6560a22cb15f
Binary files /dev/null and b/cp/tests/unitgrade_data/Week09TestVector.pkl differ
diff --git a/cp/tests/unitgrade_data/Week09TranslatingRectangle.pkl b/cp/tests/unitgrade_data/Week09TranslatingRectangle.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..60c676135bdf1a005074237ccd163b9ba8ebcf34
Binary files /dev/null and b/cp/tests/unitgrade_data/Week09TranslatingRectangle.pkl differ