diff --git a/modules/geom/pymod/export_mat2.cc b/modules/geom/pymod/export_mat2.cc
index ff8159cab563a6dcf49a96cbff73ee12cb97fa93..fa1e382c9c62b7bc7ef789303d41cc88bcca6316 100644
--- a/modules/geom/pymod/export_mat2.cc
+++ b/modules/geom/pymod/export_mat2.cc
@@ -26,7 +26,13 @@ using namespace boost::python;
 const Real Mat2_getitem(const geom::Mat2& m, tuple i) {return m(extract<int> (i[0]),extract<int> (i[1]));}
 void Mat2_setitem(geom::Mat2& m,const  tuple i,const  Real val) {m(extract<int> (i[0]),extract<int> (i[1]))=val;}
 
+String mat2_repr(const geom::Mat2& m) {
+  std::stringstream ss;
 
+  ss << "geom.Mat2(" << m(0,0) << ", " << m(0,1) << ", "
+     << m(1,0) << ", " << m(1,1) << ")";
+  return ss.str();
+}
 void export_Mat2()
 {
   using namespace geom;
@@ -36,6 +42,7 @@ void export_Mat2()
     .def(self += self)
     .def(self -= self)
     .def(self + self)
+    .def("__repr__", mat2_repr)
     .def(self - self)
     .def(self *= Real())
     .def(self /= Real())
diff --git a/modules/geom/pymod/export_mat3.cc b/modules/geom/pymod/export_mat3.cc
index 613c6f41b9713ea5bbaa50f3f32505034f7b3d78..4d86381a4db04b747f6834f6e56d5b3890c0de3c 100644
--- a/modules/geom/pymod/export_mat3.cc
+++ b/modules/geom/pymod/export_mat3.cc
@@ -53,6 +53,17 @@ void Mat3_setslice(geom::Mat3& m,const  slice s,const  Mat2& m2)
   m(start0+1,start1+1)=m2(1,1);
 }
 
+String mat3_repr(const geom::Mat3& m)
+{
+  std::stringstream ss;
+
+  ss << "geom.Mat3(" << m(0,0) << ", " << m(0,1) << ", " << m(0,2) << ", "
+     << m(1, 0) << ", " << m(1,1) << ", " << m(1, 2) << ", "
+     << m(2, 0) << "," << m(2, 1) << ", " << m(2, 2) << ")";
+  return ss.str();
+}
+
+
 void export_Mat3()
 {
   class_<Mat3>("Mat3",init<>())
@@ -61,6 +72,7 @@ void export_Mat3()
     .def(init<Real,Real,Real>())
     .def(self += self)
     .def(self -= self)
+    .def("__repr__", mat3_repr)
     .def(self + self)
     .def(self - self)
     .def(self *= Real())
diff --git a/modules/geom/pymod/export_mat4.cc b/modules/geom/pymod/export_mat4.cc
index 071c46d58f5930211806480ca189d8acb78fb535..7a5805dc6c45305fcebc5742428065d9d49f2afe 100644
--- a/modules/geom/pymod/export_mat4.cc
+++ b/modules/geom/pymod/export_mat4.cc
@@ -74,6 +74,17 @@ void Mat4_setslice3(geom::Mat4& m,const  slice s,const  Mat3& m2)
   m(start0+2,start1+2)=m2(2,2);
 }
 
+String mat4_repr(const geom::Mat4& m) {
+  std::stringstream ss;
+
+  ss << "geom.Mat4("
+     << m(0,0) << ", " << m(0,1) << ", " << m(0,2) << ", " << m(0,3) << ", "
+     << m(1,0) << ", " << m(1,1) << ", " << m(1,2) << ", " << m(1,3) << ", "
+     << m(2,0) << ", " << m(2,1) << ", " << m(2,2) << ", " << m(2,3) << ", "
+     << m(3,0) << ", " << m(3,1) << ", " << m(3,2) << ", " << m(3,3) << ")";
+  return ss.str();
+}
+
 
 void export_Mat4()
 {
@@ -94,6 +105,7 @@ void export_Mat4()
     .def(self * Vec4())
     .def(self / Real())
     .def(self_ns::str(self))
+    .def("__repr__", mat4_repr)
     .def("__getitem__",Mat4_getitem)
     .def("__getitem__",Mat4_getslice)
     .def("__setitem__",Mat4_setitem)
diff --git a/modules/geom/pymod/export_vec2.cc b/modules/geom/pymod/export_vec2.cc
index 586b9b9d6937300995c71657cdfb5c906270f816..eec194418d780663aab9ecfe8e09388067c7f28f 100644
--- a/modules/geom/pymod/export_vec2.cc
+++ b/modules/geom/pymod/export_vec2.cc
@@ -27,6 +27,14 @@ using namespace boost::python;
 const Real Vec2_getitem(const geom::Vec2& v, int i) {return v[i];}
 void Vec2_setitem(geom::Vec2& v,const  int i,const  Real val) {v[i]=val;}
 
+
+String vec2_repr(const geom::Vec2& v)
+{
+  std::stringstream ss;
+  ss << "geom.Vec2(" << v[0] << ", " << v[1] << ")";
+  return ss.str();
+}
+
 void export_Vec2()
 {
   using namespace geom;
@@ -50,6 +58,7 @@ void export_Vec2()
     .def(self / Real())
     .def(self + self)
     .def(self - self)
+    .def("__repr__", vec2_repr)
     .def(self_ns::str(self))
     .def("__getitem__",Vec2_getitem)
     .def("__setitem__",Vec2_setitem)
diff --git a/modules/geom/pymod/export_vec3.cc b/modules/geom/pymod/export_vec3.cc
index ce7704ddfcce9691d8186dd4ca9987aa6b4871ca..623671de519d14f73d7843115a5d5b18e74c8da8 100644
--- a/modules/geom/pymod/export_vec3.cc
+++ b/modules/geom/pymod/export_vec3.cc
@@ -31,13 +31,13 @@ geom::Vec3 NormalizeV3(const geom::Vec3& v) {
   return geom::Normalize(v);
 }
 
-
-void vec_test(const geom::Vec3List& v)
+String vec3_repr(const geom::Vec3& v)
 {
-  for (size_t i=0; i<v.size(); ++i) {
-    std::cout << i << v[i] << std::endl;
-  }
+  std::stringstream ss;
+  ss << "geom.Vec3(" << v[0] << ", " << v[1] << "," << v[2] << ")";
+  return ss.str();
 }
+
 void export_Vec3()
 {
   using namespace geom;
@@ -64,6 +64,7 @@ void export_Vec3()
     .def(self_ns::str(self))
     .def("__getitem__",Vec3_getitem)
     .def("__setitem__",Vec3_setitem)
+    .def("__repr__", vec3_repr)
     .def("GetX", &Vec3::GetX)
     .def("GetY", &Vec3::GetY)
     .def("GetZ", &Vec3::GetZ)
@@ -82,5 +83,4 @@ void export_Vec3()
     .add_property("inertia", &Vec3List::GetInertia)
     .add_property("principal_axes", &Vec3List::GetPrincipalAxes)
   ;
-  def("vec_test", &vec_test);
 }
diff --git a/modules/geom/pymod/export_vec4.cc b/modules/geom/pymod/export_vec4.cc
index 409cf1cc22e298024a0c05938078370c07b0726f..bb3d80f90cc62205ec40e6fd22a736d05c0b1d20 100644
--- a/modules/geom/pymod/export_vec4.cc
+++ b/modules/geom/pymod/export_vec4.cc
@@ -26,6 +26,13 @@ using namespace boost::python;
 const Real Vec4_getitem(const geom::Vec4& v, int i) {return v[i];}
 void Vec4_setitem(geom::Vec4& v,const  int i,const  Real val) {v[i]=val;}
 
+String vec4_repr(const geom::Vec4& v)
+{
+  std::stringstream ss;
+  ss << "geom.Vec4(" << v[0] << ", " << v[1] << "," << v[2]
+     << ", " << v[3] << ")";
+  return ss.str();
+}
 
 void export_Vec4()
 {
@@ -40,6 +47,7 @@ void export_Vec4()
     .def(self /= Real())
     .def(self += Real())
     .def(self += self)
+    .def("__repr__", vec4_repr)
     .def(self -= self)
     .def(-self)
     .def(self * Real())
diff --git a/modules/geom/pymod/export_vecmat2_op.cc b/modules/geom/pymod/export_vecmat2_op.cc
index 2e5b2e568e5e4de00c7013e03203a421624ae534..4215e25fdf4cbc28f0dfdc09f5820cb1adc5ea91 100644
--- a/modules/geom/pymod/export_vecmat2_op.cc
+++ b/modules/geom/pymod/export_vecmat2_op.cc
@@ -42,10 +42,10 @@ void export_VecMat2_op()
   
   def("Length",Vec2Length);
   def("Length2",Vec2Length2);
-  def("Equal",Vec2Equal);
+  def("Equal",Vec2Equal, (arg("v1"), arg("v2"), arg("epsilon")=EPSILON));
   def("CompMultiply",Vec2CompMultiply);
   def("CompDivide",Vec2CompDivide);
-  def("Equal",Mat2Equal);
+  def("Equal",Mat2Equal, (arg("m1"), arg("m2"), arg("epsilon")=EPSILON));
   def("Dot",Mat2Dot);
   def("Det",Mat2Det);
   def("Invert",Mat2Invert);
diff --git a/modules/geom/pymod/export_vecmat3_op.cc b/modules/geom/pymod/export_vecmat3_op.cc
index 9e66832f83a14203ca0d079237a6299b2a6f5eff..fe4444b75a176651a700c032895d04a926fc2257 100644
--- a/modules/geom/pymod/export_vecmat3_op.cc
+++ b/modules/geom/pymod/export_vecmat3_op.cc
@@ -44,11 +44,11 @@ void export_VecMat3_op()
   
   def("Length",Vec3Length);
   def("Length2",Vec3Length2);
-  def("Equal",Vec3Equal);
+  def("Equal",Vec3Equal, (arg("v1"), arg("v2"), arg("epsilon")=EPSILON));
   def("CompMultiply",Vec3CompMultiply);
   def("CompDivide",Vec3CompDivide);
   def("Distance",Vec3Distance);  
-  def("Equal",Mat3Equal);
+  def("Equal",Mat3Equal, (arg("m1"), arg("m2"), arg("epsilon")=EPSILON));
   def("DihedralAngle", &DihedralAngle);
   def("Dot",Mat3Dot);
   def("Det",Mat3Det);
diff --git a/modules/geom/pymod/export_vecmat4_op.cc b/modules/geom/pymod/export_vecmat4_op.cc
index c4baaf63a5ddb7645eb9fe98fa32d38f318762b0..9d91f48bbf9c3e8f6378e6822fdeeeefcd10fd16 100644
--- a/modules/geom/pymod/export_vecmat4_op.cc
+++ b/modules/geom/pymod/export_vecmat4_op.cc
@@ -42,12 +42,12 @@ void export_VecMat4_op()
 {
   using namespace geom;
   
-  def("Length",Vec4Length);
+  def("Equal",Vec4Equal, (arg("v1"), arg("v2"), arg("epsilon")=EPSILON));
   def("Length2",Vec4Length2);
   def("Equal",Vec4Equal);
   def("CompMultiply",Vec4CompMultiply);
   def("CompDivide",Vec4CompDivide);
-  def("Equal",Mat4Equal);
+  def("Equal",Mat4Equal, (arg("m1"), arg("m2"), arg("epsilon")=EPSILON));
   def("Dot",Mat4Dot);
   def("Det",Mat4Det);
   def("Transpose",Mat4Transpose);
diff --git a/modules/geom/tests/CMakeLists.txt b/modules/geom/tests/CMakeLists.txt
index a7c4ab6c229fc7723c3af2ba76377c130e069e37..86c40f1bb247cc73c79918e7aa5195c7491673da 100644
--- a/modules/geom/tests/CMakeLists.txt
+++ b/modules/geom/tests/CMakeLists.txt
@@ -11,6 +11,7 @@ set(GEOM_UNITTESTS
   test_vec3.cc
   test_vec4.cc
   tests.cc
+  test_repr.py
 )
 
 ost_unittest(geom "${GEOM_UNITTESTS}")
diff --git a/modules/geom/tests/test_repr.py b/modules/geom/tests/test_repr.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69358f20f783c7f8b731de7f13deb569105a0fa
--- /dev/null
+++ b/modules/geom/tests/test_repr.py
@@ -0,0 +1,39 @@
+import unittest
+from ost import geom
+
+class TestRepr(unittest.TestCase):
+  def testReprVec2(self):
+    v=geom.Vec2(1,2)
+    v2=eval(repr(v))
+    assert geom.Equal(v, v2)
+
+  def testReprVec3(self):
+    v=geom.Vec3(1,2,3)
+    v2=eval(repr(v))
+    assert geom.Equal(v, v2)
+
+  def testReprVec4(self):
+    v=geom.Vec4(1,2,3,4)
+    v2=eval(repr(v))
+    assert geom.Equal(v, v2)
+
+  def testReprMat2(self):
+    m=geom.Mat2(1,2,3,4)
+    m2=eval(repr(m))
+    assert geom.Equal(m, m2)
+
+  def testReprMat3(self):
+    m=geom.Mat3(1,2,3,4,5,6,7,8,9)
+    m2=eval(repr(m))
+    assert geom.Equal(m, m2)
+
+  def testReprMat4(self):
+    m=geom.Mat4(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
+    m2=eval(repr(m))
+    assert geom.Equal(m, m2)
+
+if __name__ == "__main__":
+  try:
+    unittest.main()
+  except Exception, e:
+    print e
\ No newline at end of file