diff --git a/modules/mol/alg/pymod/chain_mapping.py b/modules/mol/alg/pymod/chain_mapping.py
index 25a19259a2de600490e74a89f292246ed15e76e3..fe3304d4193aceee0d6ea0b2c1dc2887b1dc4b28 100644
--- a/modules/mol/alg/pymod/chain_mapping.py
+++ b/modules/mol/alg/pymod/chain_mapping.py
@@ -820,9 +820,8 @@ class ChainMapper:
 
         * **greedy_block**: try multiple seeds for greedy extension, i.e. try
           all ref/mdl chain combinations within the respective chem groups and
-          compute single chain lDDTs. The *block_blocks_per_chem_group* best
-          scoring ones are extend by *block_seed_size* chains and the best
-          scoring one is exhaustively extended.
+          extend them to *block_seed_size*. *block_blocks_per_chem_group*
+          for each chem group are selected for exhaustive extension.
 
         Sets :attr:`MappingResult.opt_score` in case of no trivial one-to-one
         mapping. 
@@ -961,9 +960,8 @@ class ChainMapper:
 
         * **greedy_block**: try multiple seeds for greedy extension, i.e. try
           all ref/mdl chain combinations within the respective chem groups and
-          compute single chain lDDTs. The *block_blocks_per_chem_group* best
-          scoring ones are extend by *block_seed_size* chains and the block with
-          with best QS score is exhaustively extended.
+          extend them to *block_seed_size*. *block_blocks_per_chem_group*
+          for each chem group are selected for exhaustive extension.
 
         Sets :attr:`MappingResult.opt_score` in case of no trivial one-to-one
         mapping.
@@ -1034,7 +1032,6 @@ class ChainMapper:
             # cached => QSScore computation is fast here
             opt_qsscore = the_greed.Score(mapping, check=False)
               
-
         alns = dict()
         for ref_group, mdl_group in zip(self.chem_groups, mapping):
             for ref_ch, mdl_ch in zip(ref_group, mdl_group):
@@ -2540,30 +2537,32 @@ def _lDDTGreedyBlock(the_greed, seed_size, blocks_per_chem_group):
         for ref_chains, mdl_chains in zip(ref_chem_groups, mdl_chem_groups):
             if len(mdl_chains) == 0:
                 continue # nothing to map
-
-            # Identify starting seeds for *blocks_per_chem_group* blocks
-            seeds = list()
-            for ref_ch in ref_chains:
-                seeds += [(ref_ch, mdl_ch) for mdl_ch in mdl_chains]
-            counts = [the_greed.SCCounts(s[0], s[1]) for s in seeds]
-            tmp = [(a,b) for a,b in zip(counts, seeds)]
-            tmp.sort(reverse=True)
-            seeds = [item[1] for item in tmp[:blocks_per_chem_group]]
-
-            # extend starting seeds to *seed_size* and retain best scoring block
-            # for further extension
-            best_lddt = 0.0
-            best_mapping = None
-            for s in seeds:
-                seed = dict(mapping)
-                seed.update({s[0]: s[1]})  
-                seed = the_greed.ExtendMapping(seed, max_ext = max_ext)
-                seed_lddt = the_greed.lDDTFromFlatMap(seed)
-                if seed_lddt > best_lddt:
-                    best_lddt = seed_lddt
-                    best_mapping = seed
-            if best_mapping != None:
-                starting_blocks.append(best_mapping)
+            ref_chains_copy = list(ref_chains)
+            for i in range(blocks_per_chem_group):
+                if len(ref_chains_copy) == 0:
+                    break
+                seeds = list()
+                for ref_ch in ref_chains_copy:
+                    seeds += [(ref_ch, mdl_ch) for mdl_ch in mdl_chains]
+                # extend starting seeds to *seed_size* and retain best scoring
+                # block for further extension
+                best_score = -1.0
+                best_mapping = None
+                best_seed = None
+                for s in seeds:
+                    seed = dict(mapping)
+                    seed.update({s[0]: s[1]})  
+                    seed = the_greed.ExtendMapping(seed, max_ext = max_ext)
+                    seed_lddt = the_greed.lDDTFromFlatMap(seed)
+                    if seed_lddt > best_score:
+                        best_score = seed_lddt
+                        best_mapping = seed
+                        best_seed = s
+                if best_mapping != None:
+                    starting_blocks.append(best_mapping)
+                    if best_seed[0] in ref_chains_copy:
+                        # remove that ref chain to enforce diversity
+                        ref_chains_copy.remove(best_seed[0])
 
         # fully expand initial starting blocks
         best_lddt = 0.0
@@ -2963,31 +2962,32 @@ def _QSScoreGreedyBlock(the_greed, seed_size, blocks_per_chem_group):
         for ref_chains, mdl_chains in zip(ref_chem_groups, mdl_chem_groups):
             if len(mdl_chains) == 0:
                 continue # nothing to map
-
-            # Identify starting seeds for *blocks_per_chem_group* blocks
-            # thats done with lDDT
-            seeds = list()
-            for ref_ch in ref_chains:
-                seeds += [(ref_ch, mdl_ch) for mdl_ch in mdl_chains]
-            counts = [the_greed.SCCounts(s[0], s[1]) for s in seeds]
-            tmp = [(a,b) for a,b in zip(counts, seeds)]
-            tmp.sort(reverse=True)
-            seeds = [item[1] for item in tmp[:blocks_per_chem_group]]
-
-            # extend starting seeds to *seed_size* and retain best scoring block
-            # for further extension
-            best_score = -1.0
-            best_mapping = None
-            for s in seeds:
-                seed = dict(mapping)
-                seed.update({s[0]: s[1]})  
-                seed = the_greed.ExtendMapping(seed, max_ext = max_ext)
-                score_result = the_greed.FromFlatMapping(seed)
-                if score_result.QS_global > best_score:
-                    best_score = score_result.QS_global
-                    best_mapping = seed
-            if best_mapping != None:
-                starting_blocks.append(best_mapping)
+            ref_chains_copy = list(ref_chains)
+            for i in range(blocks_per_chem_group):
+                if len(ref_chains_copy) == 0:
+                    break
+                seeds = list()
+                for ref_ch in ref_chains_copy:
+                    seeds += [(ref_ch, mdl_ch) for mdl_ch in mdl_chains]
+                # extend starting seeds to *seed_size* and retain best scoring block
+                # for further extension
+                best_score = -1.0
+                best_mapping = None
+                best_seed = None
+                for s in seeds:
+                    seed = dict(mapping)
+                    seed.update({s[0]: s[1]})  
+                    seed = the_greed.ExtendMapping(seed, max_ext = max_ext)
+                    score_result = the_greed.FromFlatMapping(seed)
+                    if score_result.QS_global > best_score:
+                        best_score = score_result.QS_global
+                        best_mapping = seed
+                        best_seed = s
+                if best_mapping != None:
+                    starting_blocks.append(best_mapping)
+                    if best_seed[0] in ref_chains_copy:
+                        # remove selected ref chain to enforce diversity
+                        ref_chains_copy.remove(best_seed[0])
 
         # fully expand initial starting blocks
         best_score = -1.0