diff --git a/modules/mol/alg/pymod/chain_mapping.py b/modules/mol/alg/pymod/chain_mapping.py
index a7b2f824ff1a7a04e1b53763676d9c1138342270..7cd711b1fb03b8ba8d59808adc5bb6b6cad22500 100644
--- a/modules/mol/alg/pymod/chain_mapping.py
+++ b/modules/mol/alg/pymod/chain_mapping.py
@@ -116,15 +116,16 @@ class ReprResult:
                  :func:`ChainMapper.GetRepr` whether this is backbone only or
                  full atom lDDT.
     :type lDDT: :class:`float`
-    :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`
+    :param ref_view: The reference substructure
+    :type ref_view: :class:`mol.EntityView`
+    :param mdl_view: The matching counterpart in model
+    :type mdl_view: :class:`mol.EntityView`
     """
-    def __init__(self, lDDT, ref_residues, mdl_residues):
+    def __init__(self, lDDT, ref_view, mdl_view):
         self._lDDT = lDDT
-        self._ref_residues = ref_residues
-        self._mdl_residues = mdl_residues
+        assert(len(ref_view.residues) == len(mdl_view.residues))
+        self._ref_view = ref_view
+        self._mdl_view = mdl_view
 
         # lazily evaluated attributes
         self._ref_bb_pos = None
@@ -148,22 +149,38 @@ class ReprResult:
         :type: :class:`float`
         """
         return self._lDDT
+
+    @property
+    def ref_view(self):
+        """ View representing the reference substructure
+
+        :type: :class:`ost.mol.EntityView`
+        """
+        return self._ref_view
+
+    @property
+    def mdl_view(self):
+        """ View representing the matching counterpart in model
+
+        :type: :class:`ost.mol.EntityView`
+        """
+        return self._mdl_view
     
     @property
     def ref_residues(self):
         """ The reference residues
 
-        :type: :class:`list` of :class:`mol.alg.ResidueView`
+        :type: class:`mol.ResidueViewList`
         """
-        return self._ref_residues
+        return self.ref_view.residues
     
     @property
     def mdl_residues(self):
         """ The model residues
 
-        :type: :class:`list` of :class:`mol.alg.ResidueView`
+        :type: :class:`mol.ResidueViewList`
         """
-        return self._mdl_residues
+        return self.mdl_view.residues
     
     @property
     def ref_bb_pos(self):
@@ -293,7 +310,7 @@ class ReprResult:
                 rnum = r.GetNumber().GetNum()
                 if chname not in chain_rnums:
                     chain_rnums[chname] = list()
-                chain_rnums[chname].append(rnum)
+                chain_rnums[chname].append(str(rnum))
             chain_queries = list()
             for k,v in chain_rnums.items():
                 chain_queries.append(f"(cname={k} and rnum={','.join(v)})")
@@ -1155,8 +1172,8 @@ class ChainMapper:
         # finalize and return
         results = list()
         for scored_mapping in scored_mappings:
-            ref_residues = list()
-            mdl_residues = list()
+            ref_view = substructure.handle.CreateEmptyView()
+            mdl_view = mdl.handle.CreateEmptyView()
             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):
@@ -1164,11 +1181,11 @@ class ChainMapper:
                         aln = substructure_ref_mdl_alns[(ref_ch, mdl_ch)]
                         for col in aln:
                             if col[0] != '-' and col[1] != '-':
-                                ref_residues.append(col.GetResidue(0))
-                                mdl_residues.append(col.GetResidue(1))
-
-            results.append(ReprResult(scored_mapping[0], ref_residues,
-                                      mdl_residues))
+                                ref_view.AddResidue(col.GetResidue(0),
+                                                    mol.ViewAddFlag.INCLUDE_ALL)
+                                mdl_view.AddResidue(col.GetResidue(1),
+                                                    mol.ViewAddFlag.INCLUDE_ALL)
+            results.append(ReprResult(scored_mapping[0], ref_view, mdl_view))
         return results
 
     def GetNMappings(self, model):