diff --git a/src/Bindings.cc b/src/Bindings.cc
index c7d2554da3b4cf62b65570d42cc3e7f4a0eda81d..2edaca1b3a7c06d2e921497b0bab1b78c6a5e1de 100644
--- a/src/Bindings.cc
+++ b/src/Bindings.cc
@@ -3,7 +3,6 @@
 #include "Mesh.hh"
 #include "Iterator.hh"
 #include "Circulator.hh"
-#include "PropertyManager.hh"
 #include "InputOutput.hh"
 #include "Decimater.hh"
 
@@ -39,16 +38,6 @@ PYBIND11_MODULE(openmesh, m) {
 
 	expose_circulator<OM::PolyConnectivity::HalfedgeLoopIter, OM::HalfedgeHandle>(m, "HalfedgeLoopIter");
 
-	typedef IteratorWrapperT<OM::PolyConnectivity::VertexIter, &OM::ArrayKernel::n_vertices> VertexIterWrapper;
-	typedef IteratorWrapperT<OM::PolyConnectivity::HalfedgeIter, &OM::ArrayKernel::n_halfedges> HalfedgeIterWrapper;
-	typedef IteratorWrapperT<OM::PolyConnectivity::EdgeIter, &OM::ArrayKernel::n_edges> EdgeIterWrapper;
-	typedef IteratorWrapperT<OM::PolyConnectivity::FaceIter, &OM::ArrayKernel::n_faces> FaceIterWrapper;
-
-	expose_property_manager<OM::VPropHandleT<py::none>, OM::VertexHandle, VertexIterWrapper>(m, "VPropertyManager");
-	expose_property_manager<OM::HPropHandleT<py::none>, OM::HalfedgeHandle, HalfedgeIterWrapper>(m, "HPropertyManager");
-	expose_property_manager<OM::EPropHandleT<py::none>, OM::EdgeHandle, EdgeIterWrapper>(m, "EPropertyManager");
-	expose_property_manager<OM::FPropHandleT<py::none>, OM::FaceHandle, FaceIterWrapper>(m, "FPropertyManager");
-
 	expose_io(m);
 
 	expose_decimater<PolyMesh>(m, "PolyMesh");
diff --git a/src/PropertyManager.hh b/src/PropertyManager.hh
deleted file mode 100644
index fe921eed15a6347a8dec43b59311afe43432f697..0000000000000000000000000000000000000000
--- a/src/PropertyManager.hh
+++ /dev/null
@@ -1,140 +0,0 @@
-#ifndef OPENMESH_PYTHON_PROPERTYMANAGER_HH
-#define OPENMESH_PYTHON_PROPERTYMANAGER_HH
-
-#include "MeshTypes.hh"
-#include <OpenMesh/Core/Utils/PropertyManager.hh>
-
-#include <pybind11/pybind11.h>
-
-namespace py = pybind11;
-namespace OM = OpenMesh;
-
-
-/**
- * Implementation of %Python's \_\_getitem\_\_ magic method.
- *
- * @tparam PropertyManager A property manager type.
- * @tparam IndexHandle The appropriate handle type.
- *
- * @param _self The property manager instance that is to be used.
- * @param _handle The index of the property value to be returned.
- *
- * @return The requested property value.
- */
-template <class PropertyManager, class IndexHandle>
-py::none propman_get_item(PropertyManager& _self, IndexHandle _handle) {
-	return _self[_handle];
-}
-
-/**
- * Implementation of %Python's \_\_setitem\_\_ magic method.
- *
- * @tparam PropertyManager A property manager type.
- * @tparam IndexHandle The appropriate handle type.
- *
- * @param _self The property manager instance that is to be used.
- * @param _handle The index of the property value to be set.
- * @param _value The property value to be set.
- */
-template <class PropertyManager, class IndexHandle>
-void propman_set_item(PropertyManager& _self, IndexHandle _handle, py::object _value) {
-	_self[_handle] = _value;
-}
-
-/**
- * Conveniently set the property value for an entire range of mesh items
- * using a %Python iterator.
- *
- * @tparam PropertyManager A property manager type.
- * @tparam Iterator A %Python iterator type.
- *
- * @param _self The property manager instance that is to be used.
- * @param _it An iterator that iterates over the items in the range.
- * @param _value The value the range will be set to.
- */
-template <class PropertyManager, class Iterator>
-void propman_set_range(PropertyManager& _self, Iterator _it, py::object _value) {
-	try {
-		while (true) {
-			_self[_it.next()] = _value;
-		}
-	}
-	catch (py::stop_iteration exception) {
-		// This is expected behavior
-		PyErr_Clear();
-	}
-}
-
-/**
- * Thin wrapper for propertyExists.
- *
- * @tparam PropertyManager A property manager type.
- * @tparam Mesh A mesh type.
- *
- * @param _mesh The mesh that is used to check if the property exists.
- * @param _propname The name of the property.
- */
-template <class PropertyManager, class Mesh>
-bool property_exists(Mesh& _mesh, const char *_propname) {
-	return PropertyManager::propertyExists(_mesh, _propname);
-}
-
-/**
- * Expose a property manager type to %Python.
- *
- * This function template is used to expose property managers to %Python. The
- * template parameters are used to instantiate the appropriate property manager
- * type.
- *
- * @tparam PropHandle A property handle type (e.g. %VPropHandle\<object\>).
- * @tparam IndexHandle The appropriate handle type (e.g. %VertexHandle for
- * %VPropHandle\<object\>).
- * @tparam Iterator A %Python iterator type. This type is used to instantiate
- * the propman_set_range function.
- *
- * @param _name The name of the property manager type to be exposed.
- */
-template <class PropHandle, class IndexHandle, class Iterator>
-void expose_property_manager(py::module& m, const char *_name) {
-	// Convenience typedef
-	typedef OM::PropertyManager<PropHandle, OM::PolyConnectivity> PropertyManager;
-
-	// Function pointers
-	py::none (*getitem)(PropertyManager&, IndexHandle          ) = &propman_get_item;
-	void     (*setitem)(PropertyManager&, IndexHandle, py::object) = &propman_set_item;
-
-	void (*set_range)(PropertyManager&, Iterator, py::object) = &propman_set_range;
-
-	bool (*property_exists_poly)(PolyMesh&, const char *) = &property_exists<PropertyManager, PolyMesh>;
-	bool (*property_exists_tri )(TriMesh&,  const char *) = &property_exists<PropertyManager, TriMesh >;
-
-	// Expose property manager
-	py::class_<PropertyManager>(m, _name)
-		.def(py::init<PolyMesh&, const char *>(), py::keep_alive<1,2>())
-		.def(py::init<PolyMesh&, const char *, bool>(), py::keep_alive<1,2>())
-		.def(py::init<TriMesh&,  const char *>(), py::keep_alive<1,2>())
-		.def(py::init<TriMesh&,  const char *, bool>(), py::keep_alive<1,2>())
-
-		.def("swap", &PropertyManager::swap)
-		.def("is_valid", &PropertyManager::isValid)
-
-		.def("__bool__", &PropertyManager::operator bool)
-		.def("__nonzero__", &PropertyManager::operator bool)
-
-		.def("get_raw_property", &PropertyManager::getRawProperty, py::return_value_policy::copy)
-		.def("get_name", &PropertyManager::getName, py::return_value_policy::copy)
-		.def("get_mesh", &PropertyManager::getMesh, py::return_value_policy::reference)
-
-		.def("retain", &PropertyManager::retain, py::arg("do_retain")=false)
-
-		.def("__getitem__", getitem)
-		.def("__setitem__", setitem)
-
-		.def("set_range", set_range)
-
-		.def_static("property_exists", property_exists_poly)
-		.def_static("property_exists", property_exists_tri)
-		;
-}
-
-#endif
diff --git a/tests/test_python.py b/tests/test_python.py
index 1332793ff328d2cb6822fbe7618949f640b38995..cb2697abf7ca9f62c613d3912dcdf8031c150aa0 100644
--- a/tests/test_python.py
+++ b/tests/test_python.py
@@ -50,25 +50,6 @@ class Python(unittest.TestCase):
         for v, idx in zip(self.mesh.vv(self.vhandle[1]), indices):
              self.assertEqual(v.idx(), idx)
 
-    def test_property_manager(self):
-        # Check if vertex property exists
-        self.assertFalse(openmesh.VPropertyManager.property_exists(self.mesh, "prop"))
-        
-        # Create a new vertex property
-        propman = openmesh.VPropertyManager(self.mesh, "prop")
-        self.assertTrue(propman.property_exists(self.mesh, "prop"))
-        
-        # Check initial property values
-        for v in self.mesh.vertices():
-            self.assertEqual(propman[v], None)
-        
-        # Set property values
-        propman.set_range(self.mesh.vertices(), 0.0)
-        
-        # Check again
-        for v in self.mesh.vertices():
-            self.assertEqual(propman[v], 0.0)
-
 
 if __name__ == '__main__':
     suite = unittest.TestLoader().loadTestsFromTestCase(Python)