diff --git a/modules/mol/alg/pymod/chain_mapping.py b/modules/mol/alg/pymod/chain_mapping.py
index 74094ac2131f1a82afcd0073141c51b21508812a..d30d2bcec66bd5239de73e0b84c4536c0e154262 100644
--- a/modules/mol/alg/pymod/chain_mapping.py
+++ b/modules/mol/alg/pymod/chain_mapping.py
@@ -190,9 +190,8 @@ class ReprResult:
         self._mdl_bb_pos = None
         self._ref_full_bb_pos = None
         self._mdl_full_bb_pos = None
-        self._transform = None
+        self._superposition = None
         self._superposed_mdl_bb_pos = None
-        self._bb_rmsd = None
         self._ost_query = None
         self._flat_mapping = None
         self._inconsistent_residues = None
@@ -314,24 +313,33 @@ class ReprResult:
             self._mdl_full_bb_pos = self._GetFullBBPos(self.mdl_residues)
         return self._mdl_full_bb_pos
 
+
     @property
-    def transform(self):
-        """ Transformation to superpose mdl residues onto ref residues
+    def superposition(self):
+        """ Superposition of mdl residues onto ref residues
 
         Superposition computed as minimal RMSD superposition on
         :attr:`ref_bb_pos` and :attr:`mdl_bb_pos`. If number of positions is
         smaller 3, the full_bb_pos equivalents are used instead.
 
-        :type: :class:`ost.geom.Mat4`
+        :type: :class:`ost.mol.alg.SuperpositionResult`
         """
-        if self._transform is None:
+        if self._superposition is None:
             if len(self.mdl_bb_pos) < 3:
-                self._transform = _GetTransform(self.mdl_full_bb_pos,
+                self._superposition = _GetSuperposition(self.mdl_full_bb_pos,
                                                 self.ref_full_bb_pos, False)
             else:
-                self._transform = _GetTransform(self.mdl_bb_pos,
+                self._superposition = _GetSuperposition(self.mdl_bb_pos,
                                                 self.ref_bb_pos, False)
-        return self._transform
+        return self._superposition
+
+    @property
+    def transform(self):
+        """ Transformation to superpose mdl residues onto ref residues
+
+        :type: :class:`ost.geom.Mat4`
+        """
+        return self.superposition.transformation
 
     @property
     def superposed_mdl_bb_pos(self):
@@ -346,13 +354,11 @@ class ReprResult:
 
     @property
     def bb_rmsd(self):
-        """ RMSD between :attr:`ref_bb_pos` and :attr:`superposed_mdl_bb_pos`
+        """ RMSD of the binding site backbone atoms after :attr:`superposition`
 
         :type: :class:`float`
         """
-        if self._bb_rmsd is None:
-            self._bb_rmsd = self.ref_bb_pos.GetRMSD(self.superposed_mdl_bb_pos)
-        return self._bb_rmsd
+        return self.superposition.rmsd
 
 
     @property
@@ -1114,7 +1120,8 @@ class ChainMapper:
               for t_pos, t in zip(trg_pos, trg_chains):
                   for m_pos, m in zip(mdl_pos, mdl_chains):
                       if len(t_pos) >= 3 and len(m_pos) >= 3:
-                          transform = _GetTransform(m_pos, t_pos, False)
+                          transform = _GetSuperposition(m_pos, t_pos,
+                                                        False).transformation
                           initial_transforms.append(transform)
                           initial_mappings.append((t,m))
 
@@ -2903,8 +2910,8 @@ def _IterativeRigidRMSD(initial_transforms, initial_mappings, chem_groups,
                 trg_chain_groups[best_sc_group_idx].remove(best_sc_mapping[0])
                 mdl_chain_groups[best_sc_group_idx].remove(best_sc_mapping[1])
 
-                transform = _GetTransform(mapped_mdl_pos, mapped_trg_pos,
-                                          False)
+                transform = _GetSuperposition(mapped_mdl_pos, mapped_trg_pos,
+                                              False).transformation
 
         # compute overall RMSD for current transform
         mapped_mdl_pos.ApplyTransform(transform)
@@ -3219,7 +3226,7 @@ def _ChainMappings(ref_chains, mdl_chains, n_max=None):
     return _ConcatIterators(iterators)
 
 
-def _GetTransform(pos_one, pos_two, iterative):
+def _GetSuperposition(pos_one, pos_two, iterative):
     """ Computes minimal RMSD superposition for pos_one onto pos_two
 
     :param pos_one: Positions that should be superposed onto *pos_two*
@@ -3230,7 +3237,7 @@ def _GetTransform(pos_one, pos_two, iterative):
                 potentially raises, uses standard superposition as fallback.
     :type iterative: :class:`bool`
     :returns: Transformation matrix to superpose *pos_one* onto *pos_two*
-    :rtype: :class:`geom.Mat4`
+    :rtype: :class:`ost.mol.alg.SuperpositionResult`
     """
     res = None
     if iterative:
@@ -3240,7 +3247,7 @@ def _GetTransform(pos_one, pos_two, iterative):
             pass # triggers fallback below
     if res is None:
         res = mol.alg.SuperposeSVD(pos_one, pos_two)
-    return res.transformation
+    return res
 
 # specify public interface
 __all__ = ('ChainMapper', 'ReprResult', 'MappingResult')