Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/EnemyCollectionView.Designer.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/EnemyCollectionView.Designer.cs	(revision 9971)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/EnemyCollectionView.Designer.cs	(revision 9971)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.Problems.Robocode.Views {
+  partial class EnemyCollectionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.checkedItemListView = new Core.Views.CheckedItemListView<HeuristicLab.Data.StringValue>();
+      this.reloadButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // checkedItemListView
+      // 
+      this.checkedItemListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.checkedItemListView.Caption = "View";
+      this.checkedItemListView.Content = null;
+      this.checkedItemListView.Location = new System.Drawing.Point(3, 34);
+      this.checkedItemListView.Name = "checkedItemListView";
+      this.checkedItemListView.ReadOnly = false;
+      this.checkedItemListView.Size = new System.Drawing.Size(434, 238);
+      this.checkedItemListView.TabIndex = 0;
+      // 
+      // reloadButton
+      // 
+      this.reloadButton.Location = new System.Drawing.Point(0, 3);
+      this.reloadButton.Name = "reloadButton";
+      this.reloadButton.Size = new System.Drawing.Size(24, 24);
+      this.reloadButton.TabIndex = 1;
+      this.reloadButton.UseVisualStyleBackColor = true;
+      this.reloadButton.Click += new System.EventHandler(this.reloadButton_Click);
+      this.reloadButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      // 
+      // EnemyCollectionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.reloadButton);
+      this.Controls.Add(this.checkedItemListView);
+      this.Name = "EnemyCollectionView";
+      this.Size = new System.Drawing.Size(440, 275);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private Core.Views.CheckedItemListView<HeuristicLab.Data.StringValue> checkedItemListView;
+    private System.Windows.Forms.Button reloadButton;
+
+  }
+}
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/EnemyCollectionView.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/EnemyCollectionView.cs	(revision 9971)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/EnemyCollectionView.cs	(revision 9971)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.Robocode.Views {
+  [View("EnemyCollection View")]
+  [Content(typeof(EnemyCollection), true)]
+  public partial class EnemyCollectionView : ItemView {
+    public new EnemyCollection Content {
+      get { return (EnemyCollection)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EnemyCollectionView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      checkedItemListView.Content = Content;
+    }
+
+    private void reloadButton_Click(object sender, System.EventArgs e) {
+      Content.Clear();
+      Content.AddRange(EnemyCollection.ReloadEnemies(Content.RobocodePath));
+      foreach (var robot in Content) {
+        Content.SetItemCheckedState(robot, false);
+      }
+    }
+  }
+}
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/HeuristicLab.Problems.Robocode.Views-3.3.csproj
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/HeuristicLab.Problems.Robocode.Views-3.3.csproj	(revision 9967)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/HeuristicLab.Problems.Robocode.Views-3.3.csproj	(revision 9971)
@@ -46,4 +46,9 @@
     <Reference Include="HeuristicLab.Common-3.3">
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
@@ -103,4 +108,10 @@
     <None Include="Plugin.cs.frame" />
     <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="EnemyCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EnemyCollectionView.Designer.cs">
+      <DependentUpon>EnemyCollectionView.cs</DependentUpon>
+    </Compile>
     <Compile Include="SolutionCodeView.cs">
       <SubType>UserControl</SubType>
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/Plugin.cs.frame
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/Plugin.cs.frame	(revision 9967)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode.Views/3.3/Plugin.cs.frame	(revision 9971)
@@ -37,4 +37,5 @@
     [PluginDependency("HeuristicLab.Operators", "3.3")]
     [PluginDependency("HeuristicLab.Common", "3.3")]
+    [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
     [PluginDependency("HeuristicLab.Collections", "3.3")]
     [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/BestSolutionAnalyzer.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/BestSolutionAnalyzer.cs	(revision 9967)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/BestSolutionAnalyzer.cs	(revision 9971)
@@ -65,6 +65,6 @@
       get { return (ILookupParameter<IntValue>)Parameters[NrOfRoundsParameterName]; }
     }
-    public ILookupParameter<ICheckedItemList<StringValue>> EnemiesParameter {
-      get { return (ILookupParameter<ICheckedItemList<StringValue>>)Parameters[EnemiesParameterName]; }
+    public ILookupParameter<EnemyCollection> EnemiesParameter {
+      get { return (ILookupParameter<EnemyCollection>)Parameters[EnemiesParameterName]; }
     }
     #endregion
@@ -82,5 +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."));
+      Parameters.Add(new LookupParameter<EnemyCollection>(EnemiesParameterName, "The enemies that should be battled."));
     }
 
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/EnemyCollection.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/EnemyCollection.cs	(revision 9971)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/EnemyCollection.cs	(revision 9971)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Robocode {
+  [Item("EnemyCollection", "A collection of enemy robots.")]
+  [StorableClass]
+  public class EnemyCollection : CheckedItemList<StringValue> {
+    [Storable]
+    public string RobocodePath { get; set; }
+
+    [StorableConstructor]
+    private EnemyCollection(bool deserializing) : base(deserializing) { }
+    private EnemyCollection(EnemyCollection original, Cloner cloner)
+      : base(original, cloner) {
+      RobocodePath = original.RobocodePath;
+    }
+    public EnemyCollection() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EnemyCollection(this, cloner);
+    }
+
+    public static EnemyCollection ReloadEnemies(string robocodeDir) {
+      EnemyCollection robotList = new EnemyCollection(); ;
+
+      try {
+        var robotsDir = new DirectoryInfo(Path.Combine(robocodeDir, "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);
+        }
+        robotList.AddRange(robotSet.Values);
+
+        foreach (var robot in robotList) {
+          robotList.SetItemCheckedState(robot, false);
+        }
+      }
+      catch { }
+
+      return robotList;
+    }
+  }
+}
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/HeuristicLab.Problems.Robocode-3.3.csproj
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/HeuristicLab.Problems.Robocode-3.3.csproj	(revision 9967)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/HeuristicLab.Problems.Robocode-3.3.csproj	(revision 9971)
@@ -101,4 +101,5 @@
     <None Include="HeuristicLab.snk" />
     <None Include="Plugin.cs.frame" />
+    <Compile Include="EnemyCollection.cs" />
     <Compile Include="RobocodeEvaluator.cs" />
     <Compile Include="Grammar.cs" />
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Interpreter.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Interpreter.cs	(revision 9967)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Interpreter.cs	(revision 9971)
@@ -32,5 +32,5 @@
 namespace HeuristicLab.Problems.Robocode {
   public static class Interpreter {
-    public static double EvaluateTankProgram(ISymbolicExpressionTree tree, string path, ICheckedItemList<StringValue> enemies, string robotName = null, bool showUI = false, int nrOfRounds = 3) {
+    public static double EvaluateTankProgram(ISymbolicExpressionTree tree, string path, EnemyCollection enemies, string robotName = null, bool showUI = false, int nrOfRounds = 3) {
       if (robotName == null)
         robotName = GenerateRobotName();
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeEvaluator.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeEvaluator.cs	(revision 9967)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeEvaluator.cs	(revision 9971)
@@ -52,6 +52,6 @@
       get { return (ILookupParameter<IntValue>)Parameters[NrOfRoundsParameterName]; }
     }
-    public ILookupParameter<ICheckedItemList<StringValue>> EnemiesParameter {
-      get { return (ILookupParameter<ICheckedItemList<StringValue>>)Parameters[EnemiesParameterName]; }
+    public ILookupParameter<EnemyCollection> EnemiesParameter {
+      get { return (ILookupParameter<EnemyCollection>)Parameters[EnemiesParameterName]; }
     }
     #endregion
@@ -67,5 +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."));
+      Parameters.Add(new LookupParameter<EnemyCollection>(EnemiesParameterName, "The enemies that should be battled."));
     }
 
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeProblem.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeProblem.cs	(revision 9967)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/RobocodeProblem.cs	(revision 9971)
@@ -20,7 +20,4 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.IO;
 using System.Linq;
 using HeuristicLab.Common;
@@ -66,6 +63,6 @@
       get { return (IFixedValueParameter<IntValue>)Parameters[NrOfRoundsParameterName]; }
     }
-    public IValueParameter<ICheckedItemList<StringValue>> EnemiesParameter {
-      get { return (IValueParameter<ICheckedItemList<StringValue>>)Parameters[EnemiesParameterName]; }
+    public IValueParameter<EnemyCollection> EnemiesParameter {
+      get { return (IValueParameter<EnemyCollection>)Parameters[EnemiesParameterName]; }
     }
     #endregion
@@ -74,7 +71,11 @@
     protected RobocodeProblem(bool deserializing)
       : base(deserializing) {
+      if (deserializing) {
+        RegisterRobocodePathEvent();
+      }
     }
     protected RobocodeProblem(RobocodeProblem original, Cloner cloner)
       : base(original, cloner) {
+      RegisterRobocodePathEvent();
     }
 
@@ -84,5 +85,6 @@
       robocodeDir.Value = @"C:\robocode";
 
-      var robotList = ReloadEnemies(robocodeDir.Value);
+      var robotList = EnemyCollection.ReloadEnemies(robocodeDir.Value);
+      robotList.RobocodePath = robocodeDir.Value;
 
       Parameters.Add(new FixedValueParameter<IntValue>(MaxTankProgramDepthParameterName, "Maximal depth of the Robocode tank program.", new IntValue(6)));
@@ -91,5 +93,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));
+      Parameters.Add(new ValueParameter<EnemyCollection>(EnemiesParameterName, "The enemies that should be battled.", robotList));
 
       Maximization.Value = true;
@@ -99,24 +101,4 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       return new RobocodeProblem(this, cloner);
-    }
-
-    private ICheckedItemList<StringValue> ReloadEnemies(string robocodeDir) {
-      var robotsDir = new DirectoryInfo(Path.Combine(robocodeDir, "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);
-      foreach (var robot in robotList) {
-        robotList.SetItemCheckedState(robot, false);
-      }
-
-      return robotList;
     }
 
@@ -129,4 +111,13 @@
       ParameterizeOperators();
       ParameterizeAnalyzers();
+      RegisterRobocodePathEvent();
+    }
+
+    private void RegisterRobocodePathEvent() {
+      RobocodePathParameter.Value.StringValue.ValueChanged += RobocodePathParameter_ValueChanged;
+    }
+
+    void RobocodePathParameter_ValueChanged(object sender, System.EventArgs e) {
+      EnemiesParameter.Value.RobocodePath = RobocodePathParameter.Value.Value;
     }
 
Index: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Solution.cs
===================================================================
--- branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Solution.cs	(revision 9967)
+++ branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Solution.cs	(revision 9971)
@@ -22,5 +22,4 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -40,5 +39,5 @@
 
     [Storable]
-    public ICheckedItemList<StringValue> Enemies { get; set; }
+    public EnemyCollection Enemies { get; set; }
 
     [StorableConstructor]
@@ -52,5 +51,5 @@
     }
 
-    public Solution(ISymbolicExpressionTree tree, string path, int nrOfRounds, ICheckedItemList<StringValue> enemies)
+    public Solution(ISymbolicExpressionTree tree, string path, int nrOfRounds, EnemyCollection enemies)
       : base() {
       this.Tree = tree;
