diff --git a/bob/fusion/base/script/bob_fuse.py b/bob/fusion/base/script/bob_fuse.py
index 41d4df09d50b4f9408397d4fc91c0721a8c6ffd3..20a5fa03382dd65882e3a15dc17d69e61fba2139 100755
--- a/bob/fusion/base/script/bob_fuse.py
+++ b/bob/fusion/base/script/bob_fuse.py
@@ -17,6 +17,23 @@ import bob.core
 logger = bob.core.log.setup("bob.fusion.base")
 
 
+def fuse_and_dump_for_group(algorithm, group_file_name, preprocess_only, group_files,
+                            score_lines_list, idx1, nans, scores, gen, zei):
+    score_lines = score_lines_list[idx1][~nans]
+    if preprocess_only and len(group_files) == 1:
+      score_lines['score'] = np.reshape(scores, scores.shape[0])
+    else:
+      fused_scores_train = algorithm.fuse(scores)
+      score_lines['score'] = fused_scores_train
+    create_directories_safe(os.path.dirname(group_file_name))
+    dump_score(group_file_name, score_lines)
+    # to separate scores for licit and spoof scenarios
+    start_zei = len(gen[0])
+    start_atk = start_zei + len(zei[0])
+    dump_score(group_file_name + '-licit', score_lines[0:start_atk])
+    dump_score(group_file_name + '-spoof', np.append(score_lines[0:start_zei], score_lines[start_atk:-1]))
+
+
 def fuse(args, command_line_parameters):
   """Do the actual fusion."""
   algorithm = args.algorithm
@@ -118,38 +135,15 @@ def fuse(args, command_line_parameters):
       logger.info(
         "- Fusion: scores '%s' already exists.", args.fused_train_file)
     elif args.train_files:
-      score_lines = score_lines_list_train[idx1][~nan_train]
-      if args.preprocess_only and len(args.train_files) == 1:
-        score_lines['score'] = np.reshape(scores_train, scores_train.shape[0])
-      else:
-        fused_scores_train = algorithm.fuse(scores_train)
-        score_lines['score'] = fused_scores_train
-      create_directories_safe(os.path.dirname(args.fused_train_file))
-      dump_score(args.fused_train_file, score_lines)
-      # to separate scores for licit and spoof scenarios
-      start_zei = len(gen_lt[0])
-      start_atk = start_zei + len(zei_lt[0])
-      dump_score(args.fused_train_file + '-licit', score_lines[0:start_atk])
-      dump_score(args.fused_train_file + '-spoof', np.append(score_lines[0:start_zei], score_lines[start_atk:-1]))
-
+      fuse_and_dump_for_group(algorithm, args.fused_train_file, args.preprocess_only, args.train_files,
+                              score_lines_list_train, idx1, nan_train, scores_train, gen_lt, zei_lt)
   # fuse the scores (dev)
   if utils.check_file(args.fused_dev_file, args.force, 1000):
     logger.info(
       "- Fusion: scores '%s' already exists.", args.fused_dev_file)
   elif args.dev_files:
-    score_lines = score_lines_list_dev[idx1][~nan_dev]
-    if args.preprocess_only and len(args.dev_files) == 1:
-      score_lines['score'] = np.reshape(scores_dev, scores_dev.shape[0])
-    else:
-      fused_scores_dev = algorithm.fuse(scores_dev)
-      score_lines['score'] = fused_scores_dev
-    create_directories_safe(os.path.dirname(args.fused_dev_file))
-    dump_score(args.fused_dev_file, score_lines)
-    # to separate scores for licit and spoof scenarios
-    start_zei = len(gen_ld[0])
-    start_atk = start_zei + len(zei_ld[0])
-    dump_score(args.fused_dev_file+'-licit', score_lines[0:start_atk])
-    dump_score(args.fused_dev_file+'-spoof', np.append(score_lines[0:start_zei], score_lines[start_atk:-1]))
+    fuse_and_dump_for_group(algorithm, args.fused_dev_file, args.preprocess_only, args.dev_files,
+                            score_lines_list_dev, idx1, nan_dev, scores_dev, gen_ld, zei_ld)
 
   # fuse the scores (eval)
   if args.eval_files:
@@ -157,19 +151,8 @@ def fuse(args, command_line_parameters):
       logger.info(
         "- Fusion: scores '%s' already exists.", args.fused_eval_file)
     else:
-      score_lines = score_lines_list_eval[idx1][~nan_eval]
-      if args.preprocess_only and len(args.eval_files) == 1:
-        score_lines['score'] = np.reshape(scores_eval, scores_eval.shape[0])
-      else:
-        fused_scores_eval = algorithm.fuse(scores_eval)
-        score_lines['score'] = fused_scores_eval
-      create_directories_safe(os.path.dirname(args.fused_eval_file))
-      dump_score(args.fused_eval_file, score_lines)
-      # to separate scores for licit and spoof scenarios
-      start_zei = len(gen_le[0])
-      start_atk = start_zei + len(zei_le[0])
-      dump_score(args.fused_eval_file + '-licit', score_lines[0:start_atk])
-      dump_score(args.fused_eval_file + '-spoof', np.append(score_lines[0:start_zei], score_lines[start_atk:-1]))
+      fuse_and_dump_for_group(algorithm, args.fused_eval_file, args.preprocess_only, args.eval_files,
+                              score_lines_list_eval, idx1, nan_eval, scores_eval, gen_le, zei_le)
 
 
 def main(command_line_parameters=None):
diff --git a/bob/fusion/base/script/fuse_several_systems.py b/bob/fusion/base/script/bob_fuse_several_systems.py
similarity index 100%
rename from bob/fusion/base/script/fuse_several_systems.py
rename to bob/fusion/base/script/bob_fuse_several_systems.py