diff --git a/python-api-src/lib_point.cpp b/python-api-src/lib_point.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..66cb4b51f067435b65c3977ac30d6d4b7b41ec6c
--- /dev/null
+++ b/python-api-src/lib_point.cpp
@@ -0,0 +1,42 @@
+#include "library.h"
+
+namespace py = pybind11;
+
+void define_point(py::module & m)
+{
+    // Note that Point2D has dynamic attributes, allowing students to add additional methods to it
+
+    py::class_<sc2::Point2D>(m, "Point2D", py::dynamic_attr())
+        .def(py::init<float, float>())
+        .def(py::init())
+        .def_readwrite("x", &sc2::Point2D::x)
+        .def_readwrite("y", &sc2::Point2D::y)
+        .def(py::self += py::self)
+        .def(py::self -= py::self)
+        .def(py::self *= float())
+        .def(py::self /= float())
+        // TODO: These does not compile
+        //.def(py::self == py::self)
+        //.def(py::self != py::self)
+        .def(py::self + py::self)
+        .def(py::self - py::self)
+        .def(py::self * float())
+        .def(float() * py::self)
+        .def(py::self / float())
+        .def(float() / py::self)
+        .def("__repr__",
+            [](const sc2::Point2D & p) {
+                return "<Point2D: (" + std::to_string(p.x) + ", " + std::to_string(p.y) + ")>";
+            })
+        .def("__str__", 
+            [](const sc2::Point2D & p) {
+                return "(" + std::to_string(p.x) + ", " + std::to_string(p.y) + ")";
+            });
+
+       py::class_<sc2::Point2DI>(m, "Point2DI")
+           .def(py::init<int, int>())
+           .def_readwrite("x", &sc2::Point2DI::x)
+           .def_readwrite("y", &sc2::Point2DI::y)
+           .def(py::self == py::self)
+           .def(py::self != py::self);
+}
\ No newline at end of file
diff --git a/python-api-src/library.cpp b/python-api-src/library.cpp
index 08add75862eba63d93bc8b409868cf8a0d2fe7ad..50c2a4e54ae0ca9d29b8934738f613f26c900d99 100644
--- a/python-api-src/library.cpp
+++ b/python-api-src/library.cpp
@@ -10,6 +10,7 @@ PYBIND11_MODULE(library, m)
     define_unit(m);
     define_unittype(m);
     define_util(m);
+    define_point(m);
 
     py::class_<Coordinator>(m, "Coordinator")
         .def(py::init())
diff --git a/python-api-src/library.h b/python-api-src/library.h
index 14223b336fd9417d262d8c2cc5e195c77d437e34..b1da21a82bd111bfac08c19d7ad4039bb2d04a78 100644
--- a/python-api-src/library.h
+++ b/python-api-src/library.h
@@ -53,4 +53,5 @@ public:
 void define_typeenums(pybind11::module & m);
 void define_unit(pybind11::module & m);
 void define_unittype(pybind11::module &m);
-void define_util(pybind11::module &m);
\ No newline at end of file
+void define_util(pybind11::module &m);
+void define_point(pybind11::module &m);
\ No newline at end of file