diff --git a/modules/geom/src/transform.cc b/modules/geom/src/transform.cc
index d2a07f6ab0a701d0194bdcd1a4d300f039017f1f..b40a3229d4a0966b1e1f0b772c8f17c020b30a5d 100644
--- a/modules/geom/src/transform.cc
+++ b/modules/geom/src/transform.cc
@@ -168,6 +168,13 @@ geom::AlignedCuboid Transform::Apply(const geom::AlignedCuboid& c) const
   return geom::AlignedCuboid(minc,maxc);
 }
 
+Transform Transform::Apply(const Transform& tf) const
+{
+  Transform nrvo(*this);
+  nrvo.SetMatrix(tf.GetMatrix()*nrvo.GetMatrix());
+  return nrvo;
+}
+
 /*
   The order of the transformations given herein is conceptually
   "backward" as they are applied to a vertex, because the left-right
@@ -209,11 +216,11 @@ void Transform::update_tm()
 
 void Transform::update_components()
 {
+  // there is no way to extract the centering component
+  // so we just get a rotation and translation
   rot_ = tm_.ExtractRotation();
-  cen_ = tm_.ExtractTranslation();
-  trans_[0] = tm_(3,0);
-  trans_[1] = tm_(3,1);
-  trans_[2] = tm_(3,2);
+  trans_ = tm_.ExtractTranslation();
+  cen_ = Vec3(0,0,0);
 }
 
 } // ns
diff --git a/modules/geom/src/transform.hh b/modules/geom/src/transform.hh
index 997f763950d7f94a7f7c6df35ea11f210b40847d..ac6a87d0bed5478b08b2ad26feeb14bd51ac3296 100644
--- a/modules/geom/src/transform.hh
+++ b/modules/geom/src/transform.hh
@@ -82,6 +82,7 @@ public:
   Vec3 Apply(const Vec3& v) const;
   Vec4 Apply(const Vec4& v) const;
   AlignedCuboid Apply(const AlignedCuboid& c) const;
+  Transform Apply(const Transform& tf) const;
 
 private:
   Mat3 rot_;
diff --git a/modules/geom/tests/test_transform.cc b/modules/geom/tests/test_transform.cc
index 5f4a543fd8ecfa21c3a3ac78a0a4b88d24ee36f9..ae27fd594b71432bfa271fbcf5fecce52c9e5594 100644
--- a/modules/geom/tests/test_transform.cc
+++ b/modules/geom/tests/test_transform.cc
@@ -28,7 +28,7 @@ using namespace geom;
 
 BOOST_AUTO_TEST_SUITE( geom_base );
 
-BOOST_AUTO_TEST_CASE(test_transform)
+BOOST_AUTO_TEST_CASE(test_transform_essentials)
 {
   Transform tf;
 
@@ -37,12 +37,55 @@ BOOST_AUTO_TEST_CASE(test_transform)
   BOOST_CHECK_EQUAL(tf.GetTrans(), geom::Vec3());
   BOOST_CHECK_EQUAL(tf.GetCenter(), geom::Vec3());
 
-  geom::Mat4 mat = geom::Mat4(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
-  tf.SetMatrix(mat);
-  BOOST_CHECK_EQUAL(tf.GetMatrix(), mat);
-  BOOST_CHECK_EQUAL(tf.GetRot(), geom::Mat3(1,2,3,5,6,7,9,10,11));
-  BOOST_CHECK_EQUAL(tf.GetCenter(), geom::Vec3(4,8,12));
-  BOOST_CHECK_EQUAL(tf.GetTrans(), geom::Vec3(13,14,15));
+  Mat3 rot=AxisRotation(Vec3(0.4,1.0,-0.8),2.13253);
+  Vec3 cen(0.5,1.0,2.2);
+  Vec3 tra(10,20,30);
+  tf.SetRot(rot);
+  tf.SetTrans(tra);
+  tf.SetCenter(cen);
+
+  Mat4 tmat = 
+    geom::Mat4(1.0,0.0,0.0,tra[0],
+               0.0,1.0,0.0,tra[1],
+               0.0,0.0,1.0,tra[2],
+               0.0,0.0,0.0,1.0) *
+    geom::Mat4(rot) *
+    geom::Mat4(1.0,0.0,0.0,-cen[0],
+               0.0,1.0,0.0,-cen[1],
+               0.0,0.0,1.0,-cen[2],
+               0.0,0.0,0.0,1.0);
+
+  BOOST_CHECK_EQUAL(tf.GetRot(), rot);
+  BOOST_CHECK_EQUAL(tf.GetCenter(), cen);
+  BOOST_CHECK_EQUAL(tf.GetTrans(), tra);
+
+  Transform tf2;
+  tf2.SetMatrix(tf.GetMatrix());
+  BOOST_CHECK_EQUAL(tf2.GetRot(), rot);
+  BOOST_CHECK_EQUAL(tf2.GetCenter(), Vec3(0,0,0));
+  BOOST_CHECK_EQUAL(tf2.GetTrans(), rot*-cen+tra);
+}
+
+BOOST_AUTO_TEST_CASE(test_transform_apply_transform)
+{
+  Transform t1,t2;
+  Mat3 rm1=AxisRotation(Vec3(0.4,1.0,-0.8),2.13253);
+  Mat3 rm2=AxisRotation(Vec3(2.4,-0.1,3.8),-1.123);
+  t1.SetRot(rm1);
+  t1.SetCenter(Vec3(0.5,1.0,2.2));
+  t1.SetTrans(Vec3(10,20,30));
+  t2.SetRot(rm2);
+  t2.SetCenter(Vec3(1.3,2.7,-1.1));
+  t2.SetTrans(Vec3(-40,-60,80));
+
+  Mat4 mat1=t1.GetMatrix();
+  Mat4 mat2=t2.GetMatrix();
+  Mat4 mat12=mat2*mat1;
+  
+  Transform t3 = t1.Apply(t2);
+  Mat4 mat3=t3.GetMatrix();
+  for(int i=0;i<16;++i) BOOST_CHECK_CLOSE(mat3.Data()[i],mat12.Data()[i],1e-6);
+            
 }
 
 BOOST_AUTO_TEST_SUITE_END();
diff --git a/modules/mol/base/pymod/__init__.py b/modules/mol/base/pymod/__init__.py
index c51905578ce1f422598c5769f2717f69c4039e0f..512e4daf082ef7e17f8c019dc92021ff799b6ccc 100644
--- a/modules/mol/base/pymod/__init__.py
+++ b/modules/mol/base/pymod/__init__.py
@@ -20,17 +20,17 @@ from _ost_mol import *
 import ost.geom as _geom
 from ost.mol import alg
 
-__transform_warning_flag=True
 
 def Transform(tf=None):
   from ost import LogWarning
-  if __transform_warning_flag:
+  if Transform.mol_transform_warning_flag:
     LogWarning("mol.Transform is deprecated, please use geom.Transform instead")
-    __transform_warning_flag=False
+    Transform.mol_transform_warning_flag=False
   if tf:
     return _geom.Transform(tf)
   else:
     return _geom.Transform()
+Transform.mol_transform_warning_flag=True
 
 def MergeCoordGroups(*coord_groups):
   """