Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/SolutionCodeView.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/SolutionCodeView.cs	(revision 9926)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/SolutionCodeView.cs	(revision 9947)
@@ -50,5 +50,5 @@
 
     private void btnRunInRobocode_Click(object sender, EventArgs e) {
-      Interpreter.EvaluateTankProgram(Content.Tree, Content.Path, programName, true, Content.NrOfRounds);
+      Interpreter.EvaluateTankProgram(Content.Tree, Content.Path, Content.Enemies, programName, true, Content.NrOfRounds);
     }
   }
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/BestSolutionAnalyzer.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/BestSolutionAnalyzer.cs	(revision 9926)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/BestSolutionAnalyzer.cs	(revision 9947)
@@ -40,4 +40,5 @@
     private const string RobocodePathParamaterName = "RobocodePath";
     private const string NrOfRoundsParameterName = "NrOfRounds";
+    private const string EnemiesParameterName = "Enemies";
 
     public bool EnabledByDefault {
@@ -64,4 +65,7 @@
       get { return (ILookupParameter<IntValue>)Parameters[NrOfRoundsParameterName]; }
     }
+    public ILookupParameter<ICheckedItemList<StringValue>> EnemiesParameter {
+      get { return (ILookupParameter<ICheckedItemList<StringValue>>)Parameters[EnemiesParameterName]; }
+    }
     #endregion
 
@@ -78,4 +82,5 @@
       Parameters.Add(new LookupParameter<DirectoryValue>(RobocodePathParamaterName, "Path of the Robocode installation."));
       Parameters.Add(new LookupParameter<IntValue>(NrOfRoundsParameterName, "Nr. of Rounds a Robot has to fight against each opponent."));
+      Parameters.Add(new LookupParameter<ICheckedItemList<StringValue>>(EnemiesParameterName, "The enemies that should be battled."));
     }
 
@@ -97,5 +102,5 @@
 
       // create a solution instance
-      var bestSolution = new Solution(bestTree, RobocodePathParameter.ActualValue.Value, NrOfRoundsParameter.ActualValue.Value);
+      var bestSolution = new Solution(bestTree, RobocodePathParameter.ActualValue.Value, NrOfRoundsParameter.ActualValue.Value, EnemiesParameter.ActualValue);
       // store the new solution in the best solution parameter
       BestSolutionParameter.ActualValue = bestSolution;
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/External Evaluator/BattleRunner.java
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/External Evaluator/BattleRunner.java	(revision 9926)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/External Evaluator/BattleRunner.java	(revision 9947)
@@ -27,14 +27,4 @@
 //
 public class BattleRunner {
-    static String[] defaultRobots = new String[] {
-        "Evaluation.BestSolution*",
-        "sample.Corners",
-        "sample.Crazy",
-        "sample.Fire",
-        "sample.TrackFire",
-        "sample.Walls",
-        "sample.SpinBot",
-        "sample.SittingDuck"
-    };
     public static String player = "Evaluation.output*";    
     public static List<Double> score = new ArrayList<Double>();
@@ -45,41 +35,19 @@
 	// The fourth argument is the number of rounds. 
 	public static void main(String[] args) {
+		if (args.length < 5)
+			System.exit(-1);  
+
 		String roboCodePath = "C:\\robocode";
 		Boolean visible = false;		
 		String bots = "";
 		int numberOfRounds = 3;
-        String[] robots = new String[defaultRobots.length];
-        robots = defaultRobots.clone();    
-	
-		if (args.length == 1)
-        {
-            robots[0] = args[0];            
-			player = args[0];            
-        }
-        else if (args.length == 2)
-        {
-            robots[0] = args[0];            
-			player = args[0];        
-			roboCodePath = args[1];            
-        }
-		else if (args.length == 3)
-        {
-            robots[0] = args[0];            
-			player = args[0];        
-			roboCodePath = args[1];
-            visible = Boolean.valueOf(args[2]);
-        }
-		else if (args.length == 4)
-        {
-            robots[0] = args[0];            
-			player = args[0];        
-			roboCodePath = args[1];
-            visible = Boolean.valueOf(args[2]);
-			numberOfRounds = Integer.valueOf(args[3]);
-        }
-        else
-		{
-            System.exit(-1);
-		}		
+        String[] robots = new String[1 + args.length - 4];      
+
+		player = robots[0] = args[0];        
+		roboCodePath = args[1];
+		visible = Boolean.valueOf(args[2]);
+		numberOfRounds = Integer.valueOf(args[3]);
+		for (int i = 4; i < args.length; i++)
+			robots[i - 3] = args[i];
 
         RobocodeEngine.setLogMessagesEnabled(false);
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Interpreter.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Interpreter.cs	(revision 9926)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Interpreter.cs	(revision 9947)
@@ -26,9 +26,11 @@
 using System.Linq;
 using System.Reflection;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 
 namespace HeuristicLab.Problems.Robocode {
   public static class Interpreter {
-    public static double EvaluateTankProgram(ISymbolicExpressionTree tree, string path, string robotName = null, bool showUI = false, int nrOfRounds = 3) {
+    public static double EvaluateTankProgram(ISymbolicExpressionTree tree, string path, ICheckedItemList<StringValue> enemies, string robotName = null, bool showUI = false, int nrOfRounds = 3) {
       if (robotName == null)
         robotName = GenerateRobotName();
@@ -81,4 +83,7 @@
         evaluateCodeInfo.Arguments += " false " + nrOfRounds;
       }
+
+      foreach (var enemy in enemies)
+        evaluateCodeInfo.Arguments += enemy.Value + "* ";
 
       evaluateCodeInfo.RedirectStandardOutput = true;
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeEvaluator.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeEvaluator.cs	(revision 9926)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeEvaluator.cs	(revision 9947)
@@ -37,4 +37,5 @@
     private const string RobocodePathParamaterName = "RobocodePath";
     private const string NrOfRoundsParameterName = "NrOfRounds";
+    private const string EnemiesParameterName = "Enemies";
 
     #region Parameters
@@ -51,4 +52,7 @@
       get { return (ILookupParameter<IntValue>)Parameters[NrOfRoundsParameterName]; }
     }
+    public ILookupParameter<ICheckedItemList<StringValue>> EnemiesParameter {
+      get { return (ILookupParameter<ICheckedItemList<StringValue>>)Parameters[EnemiesParameterName]; }
+    }
     #endregion
 
@@ -63,4 +67,5 @@
       Parameters.Add(new LookupParameter<DirectoryValue>(RobocodePathParamaterName, "Path of the Robocode installation."));
       Parameters.Add(new LookupParameter<IntValue>(NrOfRoundsParameterName, "Nr. of Rounds a Robot has to fight against each opponent."));
+      Parameters.Add(new LookupParameter<ICheckedItemList<StringValue>>(EnemiesParameterName, "The enemies that should be battled."));
     }
 
@@ -68,5 +73,5 @@
       ISymbolicExpressionTree tree = TankProgramParameter.ActualValue;
       string path = RobocodePathParameter.ActualValue.Value;
-      QualityParameter.ActualValue = new DoubleValue(Interpreter.EvaluateTankProgram(tree, path, null, false, NrOfRoundsParameter.ActualValue.Value));
+      QualityParameter.ActualValue = new DoubleValue(Interpreter.EvaluateTankProgram(tree, path, EnemiesParameter.ActualValue, null, false, NrOfRoundsParameter.ActualValue.Value));
 
       return base.Apply();
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeProblem.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeProblem.cs	(revision 9926)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeProblem.cs	(revision 9947)
@@ -20,4 +20,7 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using HeuristicLab.Common;
@@ -44,4 +47,5 @@
     private const string RobocodePathParamaterName = "RobocodePath";
     private const string NrOfRoundsParameterName = "NrOfRounds";
+    private const string EnemiesParameterName = "Enemies";
     #endregion
 
@@ -62,4 +66,7 @@
       get { return (IFixedValueParameter<IntValue>)Parameters[NrOfRoundsParameterName]; }
     }
+    public IValueParameter<ICheckedItemList<StringValue>> EnemiesParameter {
+      get { return (IValueParameter<ICheckedItemList<StringValue>>)Parameters[EnemiesParameterName]; }
+    }
     #endregion
 
@@ -77,4 +84,17 @@
       robocodeDir.Value = @"C:\robocode";
 
+      var robotsDir = new DirectoryInfo(Path.Combine(robocodeDir.Value, "robots"));
+      var robotFiles = robotsDir.GetFiles("*", SearchOption.AllDirectories)
+                                .Where(x => x.Extension == ".class" || x.Extension == ".jar");
+      var robotSet = new Dictionary<string, StringValue>();
+      foreach (var robot in robotFiles) {
+        string robotName = Path.Combine(robot.DirectoryName, Path.GetFileNameWithoutExtension(robot.FullName));
+        robotName = robotName.Remove(0, robotsDir.FullName.Length);
+        string[] nameParts = robotName.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries);
+        robotName = string.Join(".", nameParts);
+        robotSet[robot.FullName] = new StringValue(robotName);
+      }
+      var robotList = new CheckedItemList<StringValue>(robotSet.Values);
+
       Parameters.Add(new FixedValueParameter<IntValue>(MaxTankProgramDepthParameterName, "Maximal depth of the Robocode tank program.", new IntValue(6)));
       Parameters.Add(new FixedValueParameter<IntValue>(MaxTankProgramLengthParameterName, "Maximal length of the tank program.", new IntValue(1000)));
@@ -82,4 +102,5 @@
       Parameters.Add(new FixedValueParameter<DirectoryValue>(RobocodePathParamaterName, "Path of the Robocode installation.", robocodeDir));
       Parameters.Add(new FixedValueParameter<IntValue>(NrOfRoundsParameterName, "Nr. of Rounds a Robot has to fight against each opponent.", new IntValue(3)));
+      Parameters.Add(new ValueParameter<ICheckedItemList<StringValue>>(EnemiesParameterName, "The enemies that should be battled.", robotList));
 
       Maximization.Value = true;
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Solution.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Solution.cs	(revision 9926)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Solution.cs	(revision 9947)
@@ -22,4 +22,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -38,4 +39,7 @@
     public int NrOfRounds { get; set; }
 
+    [Storable]
+    public ICheckedItemList<StringValue> Enemies { get; set; }
+
     [StorableConstructor]
     private Solution(bool deserializing) : base(deserializing) { }
@@ -45,11 +49,13 @@
       Path = (string)original.Path.Clone();
       NrOfRounds = original.NrOfRounds;
+      Enemies = cloner.Clone(original.Enemies);
     }
 
-    public Solution(ISymbolicExpressionTree tree, string path, int nrOfRounds)
+    public Solution(ISymbolicExpressionTree tree, string path, int nrOfRounds, ICheckedItemList<StringValue> enemies)
       : base() {
       this.Tree = tree;
       this.Path = path;
       this.NrOfRounds = nrOfRounds;
+      this.Enemies = enemies;
     }
 
