Index: framspy/FramsticksLib.py
===================================================================
--- framspy/FramsticksLib.py	(revision 1148)
+++ framspy/FramsticksLib.py	(revision 1149)
@@ -24,5 +24,10 @@
 
 	GENOTYPE_INVALID = "/*invalid*/"  # this is how genotype invalidity is represented in Framsticks
-	EVALUATION_SETTINGS_FILE = "eval-allcriteria.sim"  # MUST be compatible with the standard-eval expdef
+	EVALUATION_SETTINGS_FILE = [  # all files MUST be compatible with the standard-eval expdef. The order they are loaded in is important!
+		"eval-allcriteria.sim",  # a good trade-off in performance sampling period ("perfperiod") for vertpos and velocity
+		# "deterministic.sim",  # turns off random noise (added for robustness) so that each evaluation yields identical performance values (causes "overfitting")
+		# "sample-period-2.sim", # short performance sampling period so performance (e.g. vertical position) is sampled more often
+		# "sample-period-longest.sim",  # increased performance sampling period so distance and velocity are measured rectilinearly
+	]
 
 
@@ -35,5 +40,5 @@
 	#	return frams
 
-	def __init__(self, frams_path, frams_lib_name, simsettings):
+	def __init__(self, frams_path, frams_lib_name, sim_settings_files):
 		if frams_lib_name is None:
 			frams.init(frams_path)  # could add support for setting alternative directories using -D and -d
@@ -54,7 +59,10 @@
 			frams.Math.randomize();
 		frams.Simulator.expdef = "standard-eval"  # this expdef (or fully compatible) must be used by EVALUATION_SETTINGS_FILE
-		if simsettings is not None:
-			self.EVALUATION_SETTINGS_FILE = simsettings
-		frams.Simulator.ximport(self.EVALUATION_SETTINGS_FILE, 4 + 8 + 16)
+		if sim_settings_files is not None:
+			self.EVALUATION_SETTINGS_FILE = sim_settings_files
+		print('Using settings:', self.EVALUATION_SETTINGS_FILE)
+		assert isinstance(self.EVALUATION_SETTINGS_FILE, list)  # ensure settings file(s) are provided as a list
+		for simfile in self.EVALUATION_SETTINGS_FILE:
+			frams.Simulator.ximport(simfile, 4 + 8 + 16)
 
 
Index: framspy/deterministic.sim
===================================================================
--- framspy/deterministic.sim	(revision 1149)
+++ framspy/deterministic.sim	(revision 1149)
@@ -0,0 +1,21 @@
+# Parameter values that make the evaluation of a Framsticks creature deterministic.
+# The values turn off random noise, so evaluation of the same genotype will always yield the same performance.
+# The advantage is that you do not need to evaluate a genotype many times, and performance values are reliable.
+# The disadvantage is that evolved creatures are "overfitting", i.e. rely entirely on the specific environment,
+# and their behavior may be different in any other environment or (even slightly) changed conditions or parameter values,
+# so each creature evolved using these settings must be later inspected using exactly the same setup.
+#
+# Before loading this file, load base settings, e.g. "eval-allcriteria.sim".
+# Put this file in the "data" subdirectory within the Framsticks distribution.
+
+sim_params:
+# always central location in the world:
+placement:1
+# no need to evaluate many times:
+evalcount:1
+# no random initialization of state in neurons:
+randinit:0.0
+# other noise parameters:
+nnoise:0.0
+bnoise_struct:0.0
+bnoise_vel:0.0
Index: framspy/eval-allcriteria.sim
===================================================================
--- framspy/eval-allcriteria.sim	(revision 1148)
+++ framspy/eval-allcriteria.sim	(revision 1149)
@@ -3,4 +3,5 @@
 # Other important parameters are "Energy0" and "perfperiod".
 # Put this file in the "data" subdirectory within the Framsticks distribution.
+
 sim_params:
 stop_on:2
@@ -361,4 +362,7 @@
 name:Genotypes
 fitness:return 0.0+this.velocity*1.0;
+fitness_step_limit:0
+fitness_time_limit:0.0
+fitness_allowed_objs:
 fitfun:0
 fitm:2.0
Index: framspy/evolalg/examples/multicriteria.py
===================================================================
--- framspy/evolalg/examples/multicriteria.py	(revision 1148)
+++ framspy/evolalg/examples/multicriteria.py	(revision 1149)
@@ -66,5 +66,5 @@
                         help='Genetic format for the demo run, for example 4, 9, or B. If not given, f1 is assumed.')
     parser.add_argument('-sim', required=False, default="eval-allcriteria.sim",
-                        help="Name of the .sim file with all parameter values")
+                        help="Name of the .sim file with all parameter values. If you want to provide more files, separate them with a semicolon ';'.")
     parser.add_argument('-dissim', required=False, type=Dissim, default=Dissim.frams,
                         help='Dissimilarity measure, default: frams', choices=list(Dissim))
@@ -168,5 +168,5 @@
 def create_experiment():
     parsed_args = parseArguments()
-    frams_lib = FramsticksLib(parsed_args.path, parsed_args.lib, parsed_args.sim)
+    frams_lib = FramsticksLib(parsed_args.path, parsed_args.lib, parsed_args.sim.split(";"))
 
     opt_dissim = []
@@ -311,5 +311,4 @@
     if parsed_args.checkpoint_path is not None and os.path.exists(parsed_args.checkpoint_path):
         experiment = load_experiment(parsed_args.checkpoint_path)
-        FramsticksLib(parsed_args.path, parsed_args.lib, parsed_args.sim)
     else:
         experiment = create_experiment()
Index: framspy/evolalg/examples/niching_novelty.py
===================================================================
--- framspy/evolalg/examples/niching_novelty.py	(revision 1148)
+++ framspy/evolalg/examples/niching_novelty.py	(revision 1149)
@@ -63,5 +63,5 @@
     parser.add_argument('-genformat', required=False, default="1",
                         help='Genetic format for the demo run, for example 4, 9, or B. If not given, f1 is assumed.')
-    parser.add_argument('-sim', required=False, default="eval-allcriteria.sim", help="Name of the .sim file with all parameter values")
+    parser.add_argument('-sim', required=False, default="eval-allcriteria.sim", help="Name of the .sim file with all parameter values. If you want to provide more files, separate them with a semicolon ';'.")
     parser.add_argument('-fit', required=False, default=Fitness.raw, type=Fitness,
                         help=' Fitness criteria, default: raw', choices=list(Fitness))
@@ -166,5 +166,5 @@
     parsed_args = parseArguments()
     frams_lib = FramsticksLib(parsed_args.path, parsed_args.lib,
-                          parsed_args.sim)
+                          parsed_args.sim.split(";"))
     # Steps for generating first population
     init_stages = [
@@ -332,10 +332,7 @@
     if parsed_args.checkpoint_path is not None and os.path.exists(parsed_args.checkpoint_path):
         experiment = load_experiment(parsed_args.checkpoint_path)
-        FramsticksLib(parsed_args.path, parsed_args.lib,
-                      parsed_args.sim)
     else:
         experiment = create_experiment()
         experiment.init()  # init is mandatory
-
 
     experiment.run(parsed_args.generations)
Index: framspy/evolalg/examples/standard.py
===================================================================
--- framspy/evolalg/examples/standard.py	(revision 1148)
+++ framspy/evolalg/examples/standard.py	(revision 1149)
@@ -46,5 +46,5 @@
     parser.add_argument('-genformat', required=False, default="1",
                         help='Genetic format for the demo run, for example 4, 9, or B. If not given, f1 is assumed.')
-    parser.add_argument('-sim', required=False, default="eval-allcriteria.sim", help="Name of the .sim file with all parameter values")
+    parser.add_argument('-sim', required=False, default="eval-allcriteria.sim", help="Name of the .sim file with all parameter values. If you want to provide more files, separate them with a semicolon ';'.")
     parser.add_argument("-popsize", type=int, default=50, help="Population size, default 50.")
     parser.add_argument('-generations', type=int, default=5, help="Number of generations, default 5.")
@@ -66,5 +66,5 @@
 def main():
     parsed_args = parseArguments()
-    frams_lib = FramsticksLib(parsed_args.path, parsed_args.lib, parsed_args.sim)
+    frams_lib = FramsticksLib(parsed_args.path, parsed_args.lib, parsed_args.sim.split(";"))
 
     hall_of_fame = HallOfFameStatistics(parsed_args.hof_size, "fitness")
Index: framspy/run-evolalg-examples.cmd
===================================================================
--- framspy/run-evolalg-examples.cmd	(revision 1148)
+++ framspy/run-evolalg-examples.cmd	(revision 1149)
@@ -1,3 +1,3 @@
-rem To learn about all available options of each .py algorithm, add "-h" to its parameters.
+rem To learn about all available options of each .py algorithm below, add "-h" to its parameters.
 rem Use the source code of the examples as a starting point for your customizations.
 rem Example usage:
@@ -6,10 +6,21 @@
 
 
+
+rem simple one-criterion evolution
 python -m evolalg.examples.standard          -path %DIR_WITH_FRAMS_LIBRARY%   -opt numneurons
 
+
+rem "chaining" .sim files, subsequent files overwrite selected parameters
+python -m evolalg.examples.standard          -path %DIR_WITH_FRAMS_LIBRARY%   -sim eval-allcriteria.sim;deterministic.sim;sample-period-longest.sim    -opt velocity
+
+
+rem hard limit on the number of parts
 python -m evolalg.examples.niching_novelty   -path %DIR_WITH_FRAMS_LIBRARY%   -opt velocity   -max_numparts 6   -debug
 
+
+rem "local" niching
 python -m evolalg.examples.niching_novelty   -path %DIR_WITH_FRAMS_LIBRARY%   -opt vertpos    -fit knn_niching  -knn 3    -max_numjoints 8 -popsize 10 -generations 30
 
-rem '-dissim ...' can be used to include dissimilarity as one of the criteria
+
+rem two criteria, '-dissim ...' can also be used to include dissimilarity as one of the criteria
 python -m evolalg.examples.multicriteria     -path %DIR_WITH_FRAMS_LIBRARY%   -popsize 40 -generations 10 -opt velocity,vertpos 
Index: framspy/sample-period-2.sim
===================================================================
--- framspy/sample-period-2.sim	(revision 1149)
+++ framspy/sample-period-2.sim	(revision 1149)
@@ -0,0 +1,8 @@
+# Very low "performance sampling period" in the first population to sample performance very often during lifespan
+# and avoid overlooking some behavior. Averaged performance of sampled values is returned as the final value.
+#
+# Before loading this file, load base settings, e.g. "eval-allcriteria.sim".
+# Put this file in the "data" subdirectory within the Framsticks distribution.
+
+Population:
+perfperiod:2
Index: framspy/sample-period-longest.sim
===================================================================
--- framspy/sample-period-longest.sim	(revision 1149)
+++ framspy/sample-period-longest.sim	(revision 1149)
@@ -0,0 +1,8 @@
+# Extremely high "performance sampling period" (likely longer than lifespan) in the first population
+# to measure distance and velocity rectilinearly. Such a long period results in two sampling events: at birth and at death.
+#
+# Before loading this file, load base settings, e.g. "eval-allcriteria.sim".
+# Put this file in the "data" subdirectory within the Framsticks distribution.
+
+Population:
+perfperiod:999999
