diff --git a/modules/mol/alg/pymod/chain_mapping.py b/modules/mol/alg/pymod/chain_mapping.py
index fe3304d4193aceee0d6ea0b2c1dc2887b1dc4b28..9f30d0c9af2f30ffaa1dd632101eef422efd6d81 100644
--- a/modules/mol/alg/pymod/chain_mapping.py
+++ b/modules/mol/alg/pymod/chain_mapping.py
@@ -2683,7 +2683,14 @@ class _QSScoreGreedySearcher(qsscore.QSScorer):
         for ref_ch in mapping.keys():
             map_targets.discard(ref_ch)
 
-        if len(map_targets) == 0:
+        # same for model
+        mdl_map_targets = set()
+        for mdl_ch in mapping.values():
+            mdl_map_targets.update(self.mdl_neighbors[mdl_ch])
+        for mdl_ch in mapping.values():
+            mdl_map_targets.discard(mdl_ch)
+
+        if len(map_targets) == 0 or len(mdl_map_targets) == 0:
             return mapping # nothing to extend
 
         # keep track of what model chains are not yet mapped for each chem group
@@ -2707,47 +2714,19 @@ class _QSScoreGreedySearcher(qsscore.QSScorer):
             if max_ext is not None and len(newly_mapped_ref_chains) >= max_ext:
                 break
 
-            score_result = self.FromFlatMapping(mapping)
-            old_score = score_result.QS_global
-            nominator = score_result.weighted_scores
-            denominator = score_result.weight_sum + score_result.weight_extra_all
-
-            max_diff = 0.0
             max_mapping = None
+            best_score = self.FromFlatMapping(mapping).QS_global
             for ref_ch in map_targets:
                 chem_group_idx = self.ref_ch_group_mapper[ref_ch]
                 for mdl_ch in free_mdl_chains[chem_group_idx]:
-                    nominator_diff = 0.0
-                    denominator_diff = 0.0
-                    for neighbor in self.neighbors[ref_ch]:
-                        if neighbor in mapping and mapping[neighbor] in \
-                        self.mdl_neighbors[mdl_ch]:
-                            # it's a newly added interface if (ref_ch, mdl_ch)
-                            # are added to mapping
-                            int1 = (ref_ch, neighbor)
-                            int2 = (mdl_ch, mapping[neighbor])
-                            a, b, c, d = self._MappedInterfaceScores(int1, int2)
-                            nominator_diff += a # weighted_scores
-                            denominator_diff += b # weight_sum
-                            denominator_diff += d # weight_extra_all
-                            # the respective interface penalties are subtracted
-                            # from denominator
-                            denominator_diff -= self._InterfacePenalty1(int1)
-                            denominator_diff -= self._InterfacePenalty2(int2)
-
-                    if nominator_diff > 0:
-                        # Only accept a new solution if its actually connected
-                        # i.e. nominator_diff > 0.
-                        new_nominator = nominator + nominator_diff
-                        new_denominator = denominator + denominator_diff
-                        new_score = 0.0
-                        if new_denominator != 0.0:
-                            new_score = new_nominator/new_denominator
-                        diff = new_score - old_score
-                        if diff > max_diff:
-                            max_diff = diff
+                    if mdl_ch in mdl_map_targets:
+                        new_mapping = dict(mapping)
+                        new_mapping[ref_ch] = mdl_ch
+                        new_score = self.FromFlatMapping(new_mapping).QS_global
+                        if new_score > best_score:
+                            best_score = new_score
                             max_mapping = (ref_ch, mdl_ch)
-     
+
             if max_mapping is not None:
                 something_happened = True
                 # assign new found mapping
@@ -2759,8 +2738,13 @@ class _QSScoreGreedySearcher(qsscore.QSScorer):
                     if neighbor not in mapping:
                         map_targets.add(neighbor)
 
-                # remove the ref chain from map targets
+                for neighbor in self.mdl_neighbors[max_mapping[1]]:
+                    if neighbor not in mapping.values():
+                        mdl_map_targets.add(neighbor)
+
+                # remove chains from map targets
                 map_targets.remove(max_mapping[0])
+                mdl_map_targets.remove(max_mapping[1])
 
                 # remove the mdl chain from free_mdl_chains - its taken...
                 chem_group_idx = self.ref_ch_group_mapper[max_mapping[0]]