diff --git a/modules/mol/alg/pymod/chain_mapping.py b/modules/mol/alg/pymod/chain_mapping.py
index c2d16bc044e4d8933d3b32e061b4794bff25c1a2..9455000f7d4f4e17155ea7c3ec1abceb376739d3 100644
--- a/modules/mol/alg/pymod/chain_mapping.py
+++ b/modules/mol/alg/pymod/chain_mapping.py
@@ -116,25 +116,19 @@ class ReprResult:
                  :func:`ChainMapper.GetRepr` whether this is backbone only or
                  full atom lDDT.
     :type lDDT: :class:`float`
-    :param ref_residues: Qualified names of ref structure, i.e. return values 
-                         of :func:`ost.mol.ResidueHandle.GetQualifiedName`
-    :type ref_residues: :class:`list` of :class:`str`
-    :param mdl_residues: Same for mdl residues
-    :type mdl_residues: :class:`list` of :class:`str`
-    :param ref_bb_pos: Representative backbone positions for reference residues.
-                       Thats CA positions for peptides and C3' positions for
-                       Nucleotides.
-    :type ref_bb_pos: :class:`geom.Vec3List`
+    :param ref_residues: The reference residues
+    :type ref_residues: :class:`list` of :class:`mol.alg.ResidueView`
+    :param mdl_residues: The model residues
+    :type mdl_residues: :class:`list` of :class:`mol.alg.ResidueView`
     """
-    def __init__(self, lDDT, ref_residues, mdl_residues, ref_bb_pos,
-                 mdl_bb_pos):
+    def __init__(self, lDDT, ref_residues, mdl_residues):
         self._lDDT = lDDT
         self._ref_residues = ref_residues
         self._mdl_residues = mdl_residues
-        self._ref_bb_pos = ref_bb_pos
-        self._mdl_bb_pos = mdl_bb_pos
 
         # lazily evaluated attributes
+        self._ref_bb_pos = None
+        self._mdl_bb_pos = None
         self._transform = None
         self._superposed_mdl_bb_pos = None
         self._bb_rmsd = None
@@ -157,21 +151,17 @@ class ReprResult:
     
     @property
     def ref_residues(self):
-        """ Qualified names of ref structure residues
+        """ The reference residues
 
-        The return values of :func:`ost.mol.ResidueHandle.GetQualifiedName`
-
-        :type: :class:`list` of :class:`str`
+        :type: :class:`list` of :class:`mol.alg.ResidueView`
         """
         return self._ref_residues
     
     @property
     def mdl_residues(self):
-        """ Qualified names of mdl structure residues
-
-        The return values of :func:`ost.mol.ResidueHandle.GetQualifiedName`
+        """ The model residues
 
-        :type: :class:`list` of :class:`str`
+        :type: :class:`list` of :class:`mol.alg.ResidueView`
         """
         return self._mdl_residues
     
@@ -183,6 +173,15 @@ class ReprResult:
 
         :type: :class:`geom.Vec3List`
         """
+        if self._ref_bb_pos is None:
+            self._ref_bb_pos = geom.Vec3List()
+            for r in self.ref_residues:
+                at = r.FindAtom("CA")
+                if not at.IsValid():
+                    at = r.FindAtom("C3'")
+                if not at.IsValid():
+                    raise RuntimeError("Something terrible happened... RUN...")
+                self._ref_bb_pos.append(at.GetPos())
         return self._ref_bb_pos
 
     @property
@@ -193,6 +192,15 @@ class ReprResult:
 
         :type: :class:`geom.Vec3List`
         """
+        if self._mdl_bb_pos is None:
+            self._mdl_bb_pos = geom.Vec3List()
+            for r in self.mdl_residues:
+                at = r.FindAtom("CA")
+                if not at.IsValid():
+                    at = r.FindAtom("C3'")
+                if not at.IsValid():
+                    raise RuntimeError("Something terrible happened... RUN...")
+                self._mdl_bb_pos.append(at.GetPos())
         return self._mdl_bb_pos
 
     @property
@@ -281,8 +289,8 @@ class ReprResult:
         if self._ost_query is None:
             chain_rnums = dict()
             for r in self.mdl_residues:
-                chname = r.split('.')[0]
-                rnum = r.split('.')[1][3:]
+                chname = r.GetChain().GetName()
+                rnum = r.GetNumber().GetNum()
                 if chname not in chain_rnums:
                     chain_rnums[chname] = list()
                 chain_rnums[chname].append(rnum)
@@ -297,8 +305,10 @@ class ReprResult:
         """
         json_dict = dict()
         json_dict["lDDT"] = self.lDDT
-        json_dict["ref_residues"] = self.ref_residues
-        json_dict["mdl_residues"] = self.mdl_residues
+        json_dict["ref_residues"] = [r.GetQualifiedName() for r in \
+                                     self.ref_residues]
+        json_dict["mdl_residues"] = [r.GetQualifiedName() for r in \
+                                     self.mdl_residues]
         json_dict["transform"] = list(self.transform.data)
         json_dict["bb_rmsd"] = self.bb_rmsd
         json_dict["gdt_8"] = self.gdt_8
@@ -1140,9 +1150,6 @@ class ChainMapper:
         for scored_mapping in scored_mappings:
             ref_residues = list()
             mdl_residues = list()
-            ref_bb_pos = geom.Vec3List()
-            mdl_bb_pos = geom.Vec3List()
-
             for ref_ch_group, mdl_ch_group in zip(substructure_chem_groups,
                                                   scored_mapping[1]):
                 for ref_ch, mdl_ch in zip(ref_ch_group, mdl_ch_group):
@@ -1150,21 +1157,11 @@ class ChainMapper:
                         aln = substructure_ref_mdl_alns[(ref_ch, mdl_ch)]
                         for col in aln:
                             if col[0] != '-' and col[1] != '-':
-                                ref_r = col.GetResidue(0)
-                                mdl_r = col.GetResidue(1)
-                                ref_residues.append(ref_r.GetQualifiedName())
-                                mdl_residues.append(mdl_r.GetQualifiedName())
-                                ref_at = ref_r.FindAtom("CA")
-                                if ref_at is None:
-                                    ref_at = ref_r.FindAtom("C3'")
-                                mdl_at = mdl_r.FindAtom("CA")
-                                if mdl_at is None:
-                                    mdl_at = mdl_r.FindAtom("C3'")
-                                ref_bb_pos.append(ref_at.GetPos())
-                                mdl_bb_pos.append(mdl_at.GetPos())
+                                ref_residues.append(col.GetResidue(0))
+                                mdl_residues.append(col.GetResidue(1))
 
             results.append(ReprResult(scored_mapping[0], ref_residues,
-                                      mdl_residues, ref_bb_pos, mdl_bb_pos))
+                                      mdl_residues))
         return results
 
     def GetNMappings(self, model):
diff --git a/modules/mol/alg/tests/test_lddt.py b/modules/mol/alg/tests/test_lddt.py
index f429b60ebaf57c5a63af0aa812ba99d970d6744b..cb8f1d28ad8c910d44954e05758d11c769503607 100644
--- a/modules/mol/alg/tests/test_lddt.py
+++ b/modules/mol/alg/tests/test_lddt.py
@@ -237,7 +237,8 @@ class TestlDDTBS(unittest.TestCase):
         ref_bs = ref.Select("grasdf:0=1")
         ref_bs = ref_bs.Select("peptide=true")
         ref_bs_names = [r.GetQualifiedName() for r in ref_bs.residues]
-        self.assertEqual(sorted(ref_bs_names), sorted(bs_repr.ref_residues))
+        repr_bs_names = [r.GetQualifiedName() for r in bs_repr.ref_residues]
+        self.assertEqual(sorted(ref_bs_names), sorted(repr_bs_names))
 
 
         # everything below basically computes lDDTBS manually and