Index: /stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorClassification.cs
===================================================================
--- /stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorClassification.cs	(revision 11906)
+++ /stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorClassification.cs	(revision 11907)
@@ -142,6 +142,11 @@
 
     public static SupportVectorClassificationSolution CreateSupportVectorClassificationSolution(IClassificationProblemData problemData, IEnumerable<string> allowedInputVariables,
-      string svmType, string kernelType, double cost, double nu, double gamma, int degree,
-      out double trainingAccuracy, out double testAccuracy, out int nSv) {
+      string svmType, string kernelType, double cost, double nu, double gamma, int degree, out double trainingAccuracy, out double testAccuracy, out int nSv) {
+      return CreateSupportVectorClassificationSolution(problemData, allowedInputVariables, GetSvmType(svmType), GetKernelType(kernelType), cost, nu, gamma, degree,
+        out trainingAccuracy, out testAccuracy, out nSv);
+    }
+
+    public static SupportVectorClassificationSolution CreateSupportVectorClassificationSolution(IClassificationProblemData problemData, IEnumerable<string> allowedInputVariables,
+      int svmType, int kernelType, double cost, double nu, double gamma, int degree, out double trainingAccuracy, out double testAccuracy, out int nSv) {
       Dataset dataset = problemData.Dataset;
       string targetVariable = problemData.TargetVariable;
@@ -150,6 +155,6 @@
       //extract SVM parameters from scope and set them
       svm_parameter parameter = new svm_parameter();
-      parameter.svm_type = GetSvmType(svmType);
-      parameter.kernel_type = GetKernelType(kernelType);
+      parameter.svm_type = svmType;
+      parameter.kernel_type = kernelType;
       parameter.C = cost;
       parameter.nu = nu;
@@ -161,5 +166,4 @@
       parameter.shrinking = 1;
       parameter.coef0 = 0;
-
 
       var weightLabels = new List<int>();
Index: /stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineUtil.cs
===================================================================
--- /stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineUtil.cs	(revision 11906)
+++ /stable/HeuristicLab.Algorithms.DataAnalysis/3.4/SupportVectorMachine/SupportVectorMachineUtil.cs	(revision 11907)
@@ -20,7 +20,14 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Random;
 using LibSVM;
 
@@ -34,14 +41,11 @@
     /// <returns>A problem data type that can be used to train a support vector machine.</returns>
     public static svm_problem CreateSvmProblem(Dataset dataset, string targetVariable, IEnumerable<string> inputVariables, IEnumerable<int> rowIndices) {
-      double[] targetVector =
-        dataset.GetDoubleValues(targetVariable, rowIndices).ToArray();
-
+      double[] targetVector = dataset.GetDoubleValues(targetVariable, rowIndices).ToArray();
       svm_node[][] nodes = new svm_node[targetVector.Length][];
-      List<svm_node> tempRow;
       int maxNodeIndex = 0;
       int svmProblemRowIndex = 0;
       List<string> inputVariablesList = inputVariables.ToList();
       foreach (int row in rowIndices) {
-        tempRow = new List<svm_node>();
+        List<svm_node> tempRow = new List<svm_node>();
         int colIndex = 1; // make sure the smallest node index for SVM = 1
         foreach (var inputVariable in inputVariablesList) {
@@ -50,5 +54,6 @@
           // => don't add NaN values in the dataset to the sparse SVM matrix representation
           if (!double.IsNaN(value)) {
-            tempRow.Add(new svm_node() { index = colIndex, value = value }); // nodes must be sorted in ascending ordered by column index
+            tempRow.Add(new svm_node() { index = colIndex, value = value });
+            // nodes must be sorted in ascending ordered by column index
             if (colIndex > maxNodeIndex) maxNodeIndex = colIndex;
           }
@@ -57,6 +62,168 @@
         nodes[svmProblemRowIndex++] = tempRow.ToArray();
       }
-
-      return new svm_problem() { l = targetVector.Length, y = targetVector, x = nodes };
+      return new svm_problem { l = targetVector.Length, y = targetVector, x = nodes };
+    }
+
+    /// <summary>
+    /// Instantiate and return a svm_parameter object with default values.
+    /// </summary>
+    /// <returns>A svm_parameter object with default values</returns>
+    public static svm_parameter DefaultParameters() {
+      svm_parameter parameter = new svm_parameter();
+      parameter.svm_type = svm_parameter.NU_SVR;
+      parameter.kernel_type = svm_parameter.RBF;
+      parameter.C = 1;
+      parameter.nu = 0.5;
+      parameter.gamma = 1;
+      parameter.p = 1;
+      parameter.cache_size = 500;
+      parameter.probability = 0;
+      parameter.eps = 0.001;
+      parameter.degree = 3;
+      parameter.shrinking = 1;
+      parameter.coef0 = 0;
+
+      return parameter;
+    }
+
+    public static double CrossValidate(IDataAnalysisProblemData problemData, svm_parameter parameters, int numberOfFolds, bool shuffleFolds = true) {
+      var partitions = GenerateSvmPartitions(problemData, numberOfFolds, shuffleFolds);
+      return CalculateCrossValidationPartitions(partitions, parameters);
+    }
+
+    public static svm_parameter GridSearch(out double cvMse, IDataAnalysisProblemData problemData, Dictionary<string, IEnumerable<double>> parameterRanges, int numberOfFolds, bool shuffleFolds = true, int maxDegreeOfParallelism = 1) {
+      DoubleValue mse = new DoubleValue(Double.MaxValue);
+      var bestParam = DefaultParameters();
+      var crossProduct = parameterRanges.Values.CartesianProduct();
+      var setters = parameterRanges.Keys.Select(GenerateSetter).ToList();
+      var partitions = GenerateSvmPartitions(problemData, numberOfFolds, shuffleFolds);
+
+      var locker = new object(); // for thread synchronization
+      Parallel.ForEach(crossProduct, new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism },
+      parameterCombination => {
+        var parameters = DefaultParameters();
+        var parameterValues = parameterCombination.ToList();
+        for (int i = 0; i < parameterValues.Count; ++i)
+          setters[i](parameters, parameterValues[i]);
+
+        double testMse = CalculateCrossValidationPartitions(partitions, parameters);
+        if (!double.IsNaN(testMse)) {
+          lock (locker) {
+            if (testMse < mse.Value) {
+              mse.Value = testMse;
+              bestParam = (svm_parameter)parameters.Clone();
+            }
+          }
+        }
+      });
+      cvMse = mse.Value;
+      return bestParam;
+    }
+
+    private static double CalculateCrossValidationPartitions(Tuple<svm_problem, svm_problem>[] partitions, svm_parameter parameters) {
+      double avgTestMse = 0;
+      var calc = new OnlineMeanSquaredErrorCalculator();
+      foreach (Tuple<svm_problem, svm_problem> tuple in partitions) {
+        var trainingSvmProblem = tuple.Item1;
+        var testSvmProblem = tuple.Item2;
+        var model = svm.svm_train(trainingSvmProblem, parameters);
+        calc.Reset();
+        for (int i = 0; i < testSvmProblem.l; ++i)
+          calc.Add(testSvmProblem.y[i], svm.svm_predict(model, testSvmProblem.x[i]));
+        double mse = calc.ErrorState == OnlineCalculatorError.None ? calc.MeanSquaredError : double.NaN;
+        avgTestMse += mse;
+      }
+      avgTestMse /= partitions.Length;
+      return avgTestMse;
+    }
+
+    private static Tuple<svm_problem, svm_problem>[] GenerateSvmPartitions(IDataAnalysisProblemData problemData, int numberOfFolds, bool shuffleFolds = true) {
+      var folds = GenerateFolds(problemData, numberOfFolds, shuffleFolds).ToList();
+      var targetVariable = GetTargetVariableName(problemData);
+      var partitions = new Tuple<svm_problem, svm_problem>[numberOfFolds];
+      for (int i = 0; i < numberOfFolds; ++i) {
+        int p = i; // avoid "access to modified closure" warning below
+        var trainingRows = folds.SelectMany((par, j) => j != p ? par : Enumerable.Empty<int>());
+        var testRows = folds[i];
+        var trainingSvmProblem = CreateSvmProblem(problemData.Dataset, targetVariable, problemData.AllowedInputVariables, trainingRows);
+        var rangeTransform = RangeTransform.Compute(trainingSvmProblem);
+        var testSvmProblem = rangeTransform.Scale(CreateSvmProblem(problemData.Dataset, targetVariable, problemData.AllowedInputVariables, testRows));
+        partitions[i] = new Tuple<svm_problem, svm_problem>(rangeTransform.Scale(trainingSvmProblem), testSvmProblem);
+      }
+      return partitions;
+    }
+
+    public static IEnumerable<IEnumerable<int>> GenerateFolds(IDataAnalysisProblemData problemData, int numberOfFolds, bool shuffleFolds = true) {
+      var random = new MersenneTwister((uint)Environment.TickCount);
+      if (problemData is IRegressionProblemData) {
+        var trainingIndices = shuffleFolds ? problemData.TrainingIndices.OrderBy(x => random.Next()) : problemData.TrainingIndices;
+        return GenerateFolds(trainingIndices, problemData.TrainingPartition.Size, numberOfFolds);
+      }
+      if (problemData is IClassificationProblemData) {
+        // when shuffle is enabled do stratified folds generation, some folds may have zero elements 
+        // otherwise, generate folds normally
+        return shuffleFolds ? GenerateFoldsStratified(problemData as IClassificationProblemData, numberOfFolds, random) : GenerateFolds(problemData.TrainingIndices, problemData.TrainingPartition.Size, numberOfFolds);
+      }
+      throw new ArgumentException("Problem data is neither regression or classification problem data.");
+    }
+
+    /// <summary>
+    /// Stratified fold generation from classification data. Stratification means that we ensure the same distribution of class labels for each fold.
+    /// The samples are grouped by class label and each group is split into @numberOfFolds parts. The final folds are formed from the joining of 
+    /// the corresponding parts from each class label.
+    /// </summary>
+    /// <param name="problemData">The classification problem data.</param>
+    /// <param name="numberOfFolds">The number of folds in which to split the data.</param>
+    /// <param name="random">The random generator used to shuffle the folds.</param>
+    /// <returns>An enumerable sequece of folds, where a fold is represented by a sequence of row indices.</returns>
+    private static IEnumerable<IEnumerable<int>> GenerateFoldsStratified(IClassificationProblemData problemData, int numberOfFolds, IRandom random) {
+      var values = problemData.Dataset.GetDoubleValues(problemData.TargetVariable, problemData.TrainingIndices);
+      var valuesIndices = problemData.TrainingIndices.Zip(values, (i, v) => new { Index = i, Value = v }).ToList();
+      IEnumerable<IEnumerable<IEnumerable<int>>> foldsByClass = valuesIndices.GroupBy(x => x.Value, x => x.Index).Select(g => GenerateFolds(g, g.Count(), numberOfFolds));
+      var enumerators = foldsByClass.Select(f => f.GetEnumerator()).ToList();
+      while (enumerators.All(e => e.MoveNext())) {
+        yield return enumerators.SelectMany(e => e.Current).OrderBy(x => random.Next()).ToList();
+      }
+    }
+
+    private static IEnumerable<IEnumerable<T>> GenerateFolds<T>(IEnumerable<T> values, int valuesCount, int numberOfFolds) {
+      // if number of folds is greater than the number of values, some empty folds will be returned
+      if (valuesCount < numberOfFolds) {
+        for (int i = 0; i < numberOfFolds; ++i)
+          yield return i < valuesCount ? values.Skip(i).Take(1) : Enumerable.Empty<T>();
+      } else {
+        int f = valuesCount / numberOfFolds, r = valuesCount % numberOfFolds; // number of folds rounded to integer and remainder
+        int start = 0, end = f;
+        for (int i = 0; i < numberOfFolds; ++i) {
+          if (r > 0) {
+            ++end;
+            --r;
+          }
+          yield return values.Skip(start).Take(end - start);
+          start = end;
+          end += f;
+        }
+      }
+    }
+
+    private static Action<svm_parameter, double> GenerateSetter(string fieldName) {
+      var targetExp = Expression.Parameter(typeof(svm_parameter));
+      var valueExp = Expression.Parameter(typeof(double));
+      var fieldExp = Expression.Field(targetExp, fieldName);
+      var assignExp = Expression.Assign(fieldExp, Expression.Convert(valueExp, fieldExp.Type));
+      var setter = Expression.Lambda<Action<svm_parameter, double>>(assignExp, targetExp, valueExp).Compile();
+      return setter;
+    }
+
+    private static string GetTargetVariableName(IDataAnalysisProblemData problemData) {
+      var regressionProblemData = problemData as IRegressionProblemData;
+      var classificationProblemData = problemData as IClassificationProblemData;
+
+      if (regressionProblemData != null)
+        return regressionProblemData.TargetVariable;
+      if (classificationProblemData != null)
+        return classificationProblemData.TargetVariable;
+
+      throw new ArgumentException("Problem data is neither regression or classification problem data.");
     }
   }
Index: /stable/HeuristicLab.CodeEditor/3.3/CodeEditor.Designer.cs
===================================================================
--- /stable/HeuristicLab.CodeEditor/3.3/CodeEditor.Designer.cs	(revision 11906)
+++ /stable/HeuristicLab.CodeEditor/3.3/CodeEditor.Designer.cs	(revision 11907)
@@ -46,11 +46,12 @@
       // textEditor
       // 
-      this.textEditor.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.textEditor.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.textEditor.ConvertTabsToSpaces = true;
       this.textEditor.IndentStyle = ICSharpCode.TextEditor.Document.IndentStyle.Auto;
       this.textEditor.IsIconBarVisible = true;
       this.textEditor.IsReadOnly = false;
+      this.textEditor.LineViewerStyle = ICSharpCode.TextEditor.Document.LineViewerStyle.FullRow;
       this.textEditor.Location = new System.Drawing.Point(0, 0);
       this.textEditor.Name = "textEditor";
@@ -97,5 +98,5 @@
       this.sharpDevelopLabel.Text = "powered by #develop";
       this.sharpDevelopLabel.ToolTipText = "Syntax highlighting and code completion facilities provided through #develop libr" +
-          "aries";
+    "aries";
       this.sharpDevelopLabel.Click += new System.EventHandler(this.toolStripStatusLabel1_Click);
       // 
@@ -108,5 +109,4 @@
       // CodeEditor
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.Controls.Add(this.textEditor);
Index: /stable/HeuristicLab.CodeEditor/3.3/CodeEditor.cs
===================================================================
--- /stable/HeuristicLab.CodeEditor/3.3/CodeEditor.cs	(revision 11906)
+++ /stable/HeuristicLab.CodeEditor/3.3/CodeEditor.cs	(revision 11907)
@@ -46,4 +46,6 @@
 
     #region Fields & Properties
+    private static Color WarningColor = Color.Blue;
+    private static Color ErrorColor = Color.Red;
 
     internal Dom.ProjectContentRegistry projectContentRegistry;
@@ -127,4 +129,5 @@
       }
       set {
+        if (Doc.TextContent == value) return;
         Doc.Replace(prefix.Length, Doc.TextLength - suffix.Length - prefix.Length, value);
         Doc.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
@@ -133,8 +136,12 @@
     }
 
+    public bool ReadOnly {
+      get { return Doc.ReadOnly; }
+      set { Doc.ReadOnly = value; }
+    }
+
     #endregion
 
     public event EventHandler TextEditorValidated;
-
     protected void OnTextEditorValidated() {
       if (TextEditorValidated != null)
@@ -143,5 +150,4 @@
 
     public event EventHandler TextEditorTextChanged;
-
     protected void OnTextEditorTextChanged() {
       if (TextEditorTextChanged != null)
@@ -154,7 +160,5 @@
       textEditor.ActiveTextAreaControl.TextEditorProperties.SupportReadOnlySegments = true;
 
-      textEditor.SetHighlighting("C#");
-      textEditor.ShowEOLMarkers = false;
-      textEditor.ShowInvalidLines = false;
+      LoadHighlightingStrategy();
       HostCallbackImplementation.Register(this);
       CodeCompletionKeyHandler.Attach(this, textEditor);
@@ -187,14 +191,25 @@
         return;
 
-      textEditor.ActiveTextAreaControl.TextArea.KeyEventHandler += new ICSharpCode.TextEditor.KeyEventHandler(TextArea_KeyEventHandler);
-      textEditor.ActiveTextAreaControl.TextArea.DoProcessDialogKey += new DialogKeyProcessor(TextArea_DoProcessDialogKey);
-
-      parserThread = new Thread(ParserThread);
-      parserThread.IsBackground = true;
+      textEditor.ActiveTextAreaControl.TextArea.KeyEventHandler += TextArea_KeyEventHandler;
+      textEditor.ActiveTextAreaControl.TextArea.DoProcessDialogKey += TextArea_DoProcessDialogKey;
+
+      parserThread = new Thread(ParserThread) { IsBackground = true };
       parserThread.Start();
 
-      textEditor.Validated += (s, a) => { OnTextEditorValidated(); };
-      textEditor.TextChanged += (s, a) => { OnTextEditorTextChanged(); };
+      textEditor.Validated += (s, a) => OnTextEditorValidated();
+      textEditor.TextChanged += (s, a) => {
+        Doc.MarkerStrategy.RemoveAll(m => errorMarkers.Contains(m)); errorMarkers.Clear();
+        Doc.BookmarkManager.RemoveMarks(m => errorBookmarks.Contains(m)); errorBookmarks.Clear();
+        Doc.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+        Doc.CommitUpdate();
+        OnTextEditorTextChanged();
+      };
       InitializeImageList();
+    }
+
+    private void LoadHighlightingStrategy() {
+      var strategy = (DefaultHighlightingStrategy)HighlightingManager.Manager.FindHighlighter("C#");
+      strategy.SetColorFor("CaretMarker", new HighlightColor(Color.Beige, false, false));
+      Doc.HighlightingStrategy = strategy;
     }
 
@@ -211,5 +226,4 @@
 
     #region keyboard handlers: filter input in read-only areas
-
     bool TextArea_KeyEventHandler(char ch) {
       int caret = textEditor.ActiveTextAreaControl.Caret.Offset;
@@ -227,5 +241,4 @@
       return false;
     }
-
     #endregion
 
@@ -235,11 +248,15 @@
     }
 
+    public void ScrollToPosition(int line, int column) {
+      var segment = GetSegmentAtOffset(line, column);
+      var position = Doc.OffsetToPosition(segment.Offset + segment.Length);
+      var caret = textEditor.ActiveTextAreaControl.Caret;
+      caret.Position = position;
+      textEditor.ActiveTextAreaControl.CenterViewOn(line, 0);
+    }
+
     private List<TextMarker> errorMarkers = new List<TextMarker>();
     private List<Bookmark> errorBookmarks = new List<Bookmark>();
     public void ShowCompileErrors(CompilerErrorCollection compilerErrors, string filename) {
-      Doc.MarkerStrategy.RemoveAll(m => errorMarkers.Contains(m));
-      Doc.BookmarkManager.RemoveMarks(m => errorBookmarks.Contains(m));
-      errorMarkers.Clear();
-      errorBookmarks.Clear();
       errorLabel.Text = "";
       errorLabel.ToolTipText = null;
@@ -268,5 +285,5 @@
     private void AddErrorMarker(CompilerError error) {
       var segment = GetSegmentAtOffset(error.Line, error.Column);
-      Color color = error.IsWarning ? Color.Blue : Color.Red;
+      Color color = error.IsWarning ? WarningColor : ErrorColor;
       var marker = new TextMarker(segment.Offset, segment.Length, TextMarkerType.WaveLine, color) {
         ToolTip = error.ErrorText,
@@ -277,5 +294,6 @@
 
     private void AddErrorBookmark(CompilerError error) {
-      var bookmark = new ErrorBookmark(Doc, new TextLocation(error.Column, error.Line - 1));
+      Color color = error.IsWarning ? WarningColor : ErrorColor;
+      var bookmark = new ErrorBookmark(Doc, new TextLocation(error.Column, error.Line - 1), color);
       errorBookmarks.Add(bookmark);
       Doc.BookmarkManager.AddMark(bookmark);
@@ -283,8 +301,8 @@
 
     private AbstractSegment GetSegmentAtOffset(int lineNr, int columnNr) {
-      lineNr = Math.Max(Doc.OffsetToPosition(prefix.Length).Line, lineNr);
+      lineNr = Math.Max(Doc.OffsetToPosition(prefix.Length).Line, lineNr - 1);
       lineNr = Math.Min(Doc.OffsetToPosition(Doc.TextLength - suffix.Length).Line, lineNr);
-      var line = Doc.GetLineSegment(lineNr - 1);
-      columnNr = Math.Max(0, columnNr);
+      var line = Doc.GetLineSegment(lineNr);
+      columnNr = Math.Max(0, columnNr - 1);
       columnNr = Math.Min(line.Length, columnNr);
       var word = line.GetWord(columnNr);
@@ -294,5 +312,5 @@
         segment.Length = word.Length;
       } else {
-        segment.Offset = line.Offset + columnNr - 1;
+        segment.Offset = line.Offset + columnNr;
         segment.Length = 1;
       }
Index: able/HeuristicLab.CodeEditor/3.3/CodeEditor.resx
===================================================================
--- /stable/HeuristicLab.CodeEditor/3.3/CodeEditor.resx	(revision 11906)
+++ 	(revision )
@@ -1,129 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="toolStripFiller.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </metadata>
-  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>127, 17</value>
-  </metadata>
-  <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
Index: /stable/HeuristicLab.CodeEditor/3.3/ErrorBookmark.cs
===================================================================
--- /stable/HeuristicLab.CodeEditor/3.3/ErrorBookmark.cs	(revision 11906)
+++ /stable/HeuristicLab.CodeEditor/3.3/ErrorBookmark.cs	(revision 11907)
@@ -25,12 +25,17 @@
 namespace HeuristicLab.CodeEditor {
   public class ErrorBookmark : Bookmark {
+    private readonly Brush brush;
 
     public override bool CanToggle { get { return false; } }
 
     public ErrorBookmark(IDocument document, TextLocation location)
+      : this(document, location, Color.Red) { }
+
+    public ErrorBookmark(IDocument document, TextLocation location, Color color)
       : base(document, location) {
+      brush = new SolidBrush(color);
     }
 
-    public override void Draw(IconBarMargin margin, System.Drawing.Graphics g, System.Drawing.Point p) {
+    public override void Draw(IconBarMargin margin, Graphics g, Point p) {
       int delta = margin.TextArea.TextView.FontHeight / 4;
       Rectangle rect = new Rectangle(
@@ -39,5 +44,5 @@
         margin.DrawingPosition.Width - 6,
         margin.TextArea.TextView.FontHeight - delta * 2);
-      g.FillRectangle(Brushes.Red, rect);
+      g.FillRectangle(brush, rect);
       g.DrawRectangle(Pens.White, rect);
     }
Index: /stable/HeuristicLab.CodeEditor/3.3/HeuristicLab.CodeEditor-3.3.csproj
===================================================================
--- /stable/HeuristicLab.CodeEditor/3.3/HeuristicLab.CodeEditor-3.3.csproj	(revision 11906)
+++ /stable/HeuristicLab.CodeEditor/3.3/HeuristicLab.CodeEditor-3.3.csproj	(revision 11907)
@@ -145,7 +145,4 @@
   <ItemGroup>
     <Compile Include="CodeCompletionData.cs" />
-    <EmbeddedResource Include="CodeEditor.resx">
-      <DependentUpon>CodeEditor.cs</DependentUpon>
-    </EmbeddedResource>
     <EmbeddedResource Include="CodeViewer.resx">
       <DependentUpon>CodeViewer.cs</DependentUpon>
Index: /stable/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 11906)
+++ /stable/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 11907)
@@ -135,4 +135,8 @@
     <EmbeddedResource Include="Documents\GP_Multiplexer.hl" />
     <EmbeddedResource Include="Documents\OSGP_TimeSeries.hl" />
+    <EmbeddedResource Include="Documents\GridSearch_RF_Classification_Script.hl" />
+    <EmbeddedResource Include="Documents\GridSearch_RF_Regression_Script.hl" />
+    <EmbeddedResource Include="Documents\GridSearch_SVM_Classification_Script.hl" />
+    <EmbeddedResource Include="Documents\GridSearch_SVM_Regression_Script.hl" />
     <None Include="Plugin.cs.frame" />
     <Compile Include="OptimizerSingleDocumentMainForm.cs">
Index: /stable/HeuristicLab.Optimizer/3.3/StartPage.cs
===================================================================
--- /stable/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 11906)
+++ /stable/HeuristicLab.Optimizer/3.3/StartPage.cs	(revision 11907)
@@ -145,6 +145,6 @@
       groupLookup[dataAnalysisGroup] = dataAnalysisProblems;
       var scripts = new List<string> { "GA_QAP_Script", "GUI_Automation_Script", "OSGA_Rastrigin_Script", 
-                                       "GridSearch_RF_Classification", "GridSearch_RF_Regression",
-                                       "GridSearch_SVM_Classification", "GridSearch_SVM_Regression" };
+                                       "GridSearch_RF_Classification_Script", "GridSearch_RF_Regression_Script",
+                                       "GridSearch_SVM_Classification_Script", "GridSearch_SVM_Regression_Script" };
       groupLookup[scriptsGroup] = scripts;
     }
Index: /stable/HeuristicLab.Scripting.Views/3.3/CSharpScriptView.cs
===================================================================
--- /stable/HeuristicLab.Scripting.Views/3.3/CSharpScriptView.cs	(revision 11906)
+++ /stable/HeuristicLab.Scripting.Views/3.3/CSharpScriptView.cs	(revision 11907)
@@ -111,5 +111,5 @@
         if (Compile()) {
           outputTextBox.Clear();
-          Content.Execute();
+          Content.ExecuteAsync();
           Running = true;
         }
@@ -123,5 +123,5 @@
             if (Compile()) {
               outputTextBox.Clear();
-              Content.Execute();
+              Content.ExecuteAsync();
               Running = true;
             }
@@ -132,8 +132,8 @@
           return true;
         case Keys.F6:
-          if (!Running) Compile();
+          if (!Running) base.ProcessCmdKey(ref msg, keyData);
           return true;
       }
-      return base.ProcessCmdKey(ref msg, keyData); ;
+      return base.ProcessCmdKey(ref msg, keyData);
     }
     #endregion
Index: /stable/HeuristicLab.Scripting.Views/3.3/ScriptView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Scripting.Views/3.3/ScriptView.Designer.cs	(revision 11906)
+++ /stable/HeuristicLab.Scripting.Views/3.3/ScriptView.Designer.cs	(revision 11907)
@@ -110,5 +110,5 @@
       this.toolTip.SetToolTip(this.compileButton, "Compile (F6)");
       this.compileButton.UseVisualStyleBackColor = true;
-      this.compileButton.Click += new System.EventHandler(this.CompileButtonOnClick);
+      this.compileButton.Click += new System.EventHandler(this.compileButton_Click);
       // 
       // infoTabControl
@@ -178,4 +178,5 @@
       this.errorListView.UseCompatibleStateImageBehavior = false;
       this.errorListView.View = System.Windows.Forms.View.Details;
+      this.errorListView.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.errorListView_MouseDoubleClick);
       // 
       // iconColumnHeader
@@ -213,10 +214,10 @@
       this.codeEditor.TabIndex = 0;
       this.codeEditor.UserCode = "";
-      this.codeEditor.TextEditorTextChanged += new System.EventHandler(this.CodeEditorOnTextEditorTextChanged);
+      this.codeEditor.TextEditorTextChanged += new System.EventHandler(this.codeEditor_TextEditorTextChanged);
       // 
       // splitContainer1
       // 
-      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(0, 56);
Index: /stable/HeuristicLab.Scripting.Views/3.3/ScriptView.cs
===================================================================
--- /stable/HeuristicLab.Scripting.Views/3.3/ScriptView.cs	(revision 11906)
+++ /stable/HeuristicLab.Scripting.Views/3.3/ScriptView.cs	(revision 11907)
@@ -35,8 +35,20 @@
   [Content(typeof(Script), true)]
   public partial class ScriptView : NamedItemView {
+    #region Properties
     public new Script Content {
       get { return (Script)base.Content; }
       set { base.Content = value; }
     }
+
+    public override bool ReadOnly {
+      get { return codeEditor.ReadOnly || base.ReadOnly; }
+      set { base.ReadOnly = codeEditor.ReadOnly = value; }
+    }
+
+    public override bool Locked {
+      get { return codeEditor.ReadOnly || base.Locked; }
+      set { base.Locked = codeEditor.ReadOnly = value; }
+    }
+    #endregion
 
     public ScriptView() {
@@ -47,16 +59,13 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.CodeChanged += ContentOnCodeChanged;
+      Content.CodeChanged += Content_CodeChanged;
     }
 
     protected override void DeregisterContentEvents() {
-      Content.CodeChanged -= ContentOnCodeChanged;
+      Content.CodeChanged -= Content_CodeChanged;
       base.DeregisterContentEvents();
     }
 
-    protected virtual void ContentOnCodeChanged(object sender, EventArgs e) {
-      codeEditor.UserCode = Content.Code;
-    }
-
+    #region Overrides
     protected override void OnContentChanged() {
       base.OnContentChanged();
@@ -64,5 +73,6 @@
         codeEditor.UserCode = string.Empty;
       } else {
-        codeEditor.UserCode = Content.Code;
+        if (codeEditor.UserCode != Content.Code)
+          codeEditor.UserCode = Content.Code;
         foreach (var asm in Content.GetAssemblies())
           codeEditor.AddAssembly(asm);
@@ -83,15 +93,7 @@
       base.SetEnabledStateOfControls();
       compileButton.Enabled = Content != null && !Locked && !ReadOnly;
-      codeEditor.Enabled = Content != null && !Locked && !ReadOnly;
+      codeEditor.Enabled = Content != null;
     }
 
-    protected virtual void CompileButtonOnClick(object sender, EventArgs e) {
-      Compile();
-    }
-
-    protected virtual void CodeEditorOnTextEditorTextChanged(object sender, EventArgs e) {
-      if (Content == null) return;
-      Content.Code = codeEditor.UserCode;
-    }
     protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
       switch (keyData) {
@@ -103,4 +105,5 @@
       return base.ProcessCmdKey(ref msg, keyData);
     }
+    #endregion
 
     public virtual bool Compile() {
@@ -113,5 +116,5 @@
         outputTextBox.AppendText("Compilation succeeded.");
         return true;
-      } catch {
+      } catch (InvalidOperationException) {
         if (Content.CompileErrors.HasErrors) {
           outputTextBox.AppendText("Compilation failed.");
@@ -127,16 +130,20 @@
         ReadOnly = false;
         Locked = false;
+        codeEditor.Focus();
         OnContentChanged();
       }
     }
 
+    #region Helpers
     protected virtual void ShowCompilationResults() {
       if (Content.CompileErrors.Count == 0) return;
-      var msgs = Content.CompileErrors.OfType<CompilerError>()
+
+      var messages = Content.CompileErrors.OfType<CompilerError>()
                                       .OrderBy(x => x.IsWarning)
                                       .ThenBy(x => x.Line)
                                       .ThenBy(x => x.Column);
-      foreach (var m in msgs) {
-        var item = new ListViewItem();
+
+      foreach (var m in messages) {
+        var item = new ListViewItem { Tag = m };
         item.SubItems.AddRange(new[] {
           m.IsWarning ? "Warning" : "Error",
@@ -149,4 +156,7 @@
         errorListView.Items.Add(item);
       }
+
+      codeEditor.ShowCompileErrors(Content.CompileErrors, ".cs");
+
       AdjustErrorListViewColumnSizes();
     }
@@ -157,4 +167,33 @@
         ch.Width = -2;
     }
+    #endregion
+
+    #region Event Handlers
+    private void Content_CodeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_CodeChanged), sender, e);
+      else {
+        codeEditor.UserCode = Content.Code;
+      }
+    }
+
+    private void compileButton_Click(object sender, EventArgs e) {
+      Compile();
+    }
+
+    private void codeEditor_TextEditorTextChanged(object sender, EventArgs e) {
+      if (Content == null) return;
+      Content.Code = codeEditor.UserCode;
+    }
+
+    private void errorListView_MouseDoubleClick(object sender, MouseEventArgs e) {
+      if (e.Button == MouseButtons.Left) {
+        var item = errorListView.SelectedItems[0];
+        var message = (CompilerError)item.Tag;
+        codeEditor.ScrollToPosition(message.Line, message.Column);
+        codeEditor.Focus();
+      }
+    }
+    #endregion
   }
 }
Index: /stable/HeuristicLab.Scripting.Views/3.3/VariableStoreView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Scripting.Views/3.3/VariableStoreView.Designer.cs	(revision 11906)
+++ /stable/HeuristicLab.Scripting.Views/3.3/VariableStoreView.Designer.cs	(revision 11907)
@@ -66,5 +66,4 @@
       this.variableListView.LabelEdit = true;
       this.variableListView.Location = new System.Drawing.Point(6, 49);
-      this.variableListView.MultiSelect = false;
       this.variableListView.Name = "variableListView";
       this.variableListView.ShowItemToolTips = true;
Index: /stable/HeuristicLab.Scripting.Views/3.3/VariableStoreView.cs
===================================================================
--- /stable/HeuristicLab.Scripting.Views/3.3/VariableStoreView.cs	(revision 11906)
+++ /stable/HeuristicLab.Scripting.Views/3.3/VariableStoreView.cs	(revision 11907)
@@ -22,5 +22,4 @@
 using System;
 using System.Collections.Generic;
-using System.Drawing;
 using System.Linq;
 using System.Text.RegularExpressions;
@@ -40,5 +39,16 @@
   [Content(typeof(VariableStore), true)]
   public partial class VariableStoreView : AsynchronousContentView {
-    protected Dictionary<string, ListViewItem> itemListViewItemMapping;
+    #region Image Names
+    private const string ErrorImageName = "Error";
+    private const string WarningImageName = "Warning";
+    private const string HeuristicLabObjectImageName = "HeuristicLabObject";
+    private const string ObjectImageName = "Object";
+    private const string NothingImageName = "Nothing";
+    #endregion
+
+    private readonly Regex SafeVariableNameRegex = new Regex("^[@]?[_a-zA-Z][_a-zA-Z0-9]*$");
+    private const string DefaultVariableName = "enter_name";
+    protected readonly Dictionary<string, ListViewItem> itemListViewItemMapping;
+    protected readonly Dictionary<Type, bool> serializableLookup;
     protected TypeSelectorDialog typeSelectorDialog;
     protected bool validDragOperation;
@@ -56,9 +66,12 @@
       InitializeComponent();
       itemListViewItemMapping = new Dictionary<string, ListViewItem>();
-      variableListView.SmallImageList.Images.AddRange(new Image[] {
-        HeuristicLab.Common.Resources.VSImageLibrary.Error,
-        HeuristicLab.Common.Resources.VSImageLibrary.Object,
-        HeuristicLab.Common.Resources.VSImageLibrary.Nothing
-      });
+      serializableLookup = new Dictionary<Type, bool>();
+
+      var images = variableListView.SmallImageList.Images;
+      images.Add(ErrorImageName, Common.Resources.VSImageLibrary.Error);
+      images.Add(WarningImageName, Common.Resources.VSImageLibrary.Warning);
+      images.Add(HeuristicLabObjectImageName, Common.Resources.HeuristicLab.Icon.ToBitmap());
+      images.Add(ObjectImageName, Common.Resources.VSImageLibrary.Object);
+      images.Add(NothingImageName, Common.Resources.VSImageLibrary.Nothing);
     }
 
@@ -90,5 +103,4 @@
       variableListView.Items.Clear();
       itemListViewItemMapping.Clear();
-      RebuildImageList();
       if (Content != null) {
         Caption += " (" + Content.GetType().Name + ")";
@@ -107,12 +119,12 @@
         sortDescendingButton.Enabled = false;
         removeButton.Enabled = false;
-        variableListView.Enabled = false;
+        variableListView.LabelEdit = false;
       } else {
-        addButton.Enabled = !Locked && !ReadOnly;
+        bool enabled = !Locked && !ReadOnly;
+        addButton.Enabled = enabled;
         sortAscendingButton.Enabled = variableListView.Items.Count > 1;
         sortDescendingButton.Enabled = variableListView.Items.Count > 1;
-        removeButton.Enabled = !Locked && !ReadOnly && variableListView.SelectedItems.Count > 0;
-        variableListView.Enabled = true;
-        variableListView.LabelEdit = !Locked && !ReadOnly;
+        removeButton.Enabled = enabled && variableListView.SelectedItems.Count > 0;
+        variableListView.LabelEdit = enabled;
       }
     }
@@ -137,12 +149,12 @@
     protected virtual void AddVariable(KeyValuePair<string, object> variable) {
       if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
-      string value = (variable.Value ?? "null").ToString();
-      string type = variable.Value == null ? "null" : variable.Value.GetType().ToString();
       bool serializable = IsSerializable(variable);
-      var listViewItem = new ListViewItem(new[] { variable.Key, value, type }) { ToolTipText = GetToolTipText(variable, serializable), Tag = variable };
-      if (serializable) {
-        listViewItem.ImageIndex = variable.Value == null ? 2 : 1;
-      } else listViewItem.ImageIndex = 0;
+
+      var listViewItem = new ListViewItem();
+      AssignVariableToListViewItem(listViewItem, variable);
+      SetImageKey(listViewItem, serializable);
+      SetToolTipText(listViewItem, serializable);
       variableListView.Items.Add(listViewItem);
+
       itemListViewItemMapping[variable.Key] = listViewItem;
       sortAscendingButton.Enabled = variableListView.Items.Count > 1;
@@ -154,30 +166,28 @@
     protected virtual void RemoveVariable(KeyValuePair<string, object> variable) {
       if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+
       ListViewItem listViewItem;
-      if (itemListViewItemMapping.TryGetValue(variable.Key, out listViewItem)) {
-        itemListViewItemMapping.Remove(variable.Key);
-        variableListView.Items.Remove(listViewItem);
-        sortAscendingButton.Enabled = variableListView.Items.Count > 1;
-        sortDescendingButton.Enabled = variableListView.Items.Count > 1;
-        var item = variable.Value as IItem;
-        if (item != null) item.ToStringChanged -= item_ToStringChanged;
-      }
+      if (!itemListViewItemMapping.TryGetValue(variable.Key, out listViewItem)) return;
+
+      itemListViewItemMapping.Remove(variable.Key);
+      variableListView.Items.Remove(listViewItem);
+      sortAscendingButton.Enabled = variableListView.Items.Count > 1;
+      sortDescendingButton.Enabled = variableListView.Items.Count > 1;
+      var item = variable.Value as IItem;
+      if (item != null) item.ToStringChanged -= item_ToStringChanged;
     }
 
     protected virtual void UpdateVariable(KeyValuePair<string, object> variable) {
       if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+
       ListViewItem listViewItem;
-      if (itemListViewItemMapping.TryGetValue(variable.Key, out listViewItem)) {
-        string value = (variable.Value ?? "null").ToString();
-        string type = variable.Value == null ? "null" : variable.Value.GetType().ToString();
-        bool serializable = IsSerializable(variable);
-        if (serializable) {
-          listViewItem.ImageIndex = variable.Value == null ? 2 : 1;
-        } else listViewItem.ImageIndex = 0;
-        listViewItem.SubItems[1].Text = value;
-        listViewItem.SubItems[2].Text = type;
-        listViewItem.ToolTipText = GetToolTipText(variable, serializable);
-        listViewItem.Tag = variable;
-      } else throw new ArgumentException("A variable with the specified name does not exist.", "variable");
+      if (!itemListViewItemMapping.TryGetValue(variable.Key, out listViewItem))
+        throw new ArgumentException("A variable with the specified name does not exist.", "variable");
+
+      bool serializable = IsSerializable(variable);
+      AssignVariableToListViewItem(listViewItem, variable);
+      SetImageKey(listViewItem, serializable);
+      SetToolTipText(listViewItem, serializable);
+
     }
 
@@ -188,81 +198,99 @@
     }
     protected virtual void variableListView_KeyDown(object sender, KeyEventArgs e) {
-      if (e.KeyCode == Keys.Delete) {
-        if ((variableListView.SelectedItems.Count > 0) && !Locked && !ReadOnly) {
-          foreach (ListViewItem item in variableListView.SelectedItems)
-            Content.Remove(item.Text);
-        }
+      switch (e.KeyCode) {
+        case Keys.Delete:
+          if ((variableListView.SelectedItems.Count > 0) && !Locked && !ReadOnly) {
+            foreach (ListViewItem item in variableListView.SelectedItems)
+              Content.Remove(item.Text);
+          }
+          break;
+        case Keys.F2:
+          if (variableListView.SelectedItems.Count != 1) return;
+          var selectedItem = variableListView.SelectedItems[0];
+          if (variableListView.LabelEdit)
+            selectedItem.BeginEdit();
+          break;
+        case Keys.A:
+          if (e.Modifiers.HasFlag(Keys.Control)) {
+            foreach (ListViewItem item in variableListView.Items)
+              item.Selected = true;
+          }
+          break;
       }
     }
     protected virtual void variableListView_DoubleClick(object sender, EventArgs e) {
-      if (variableListView.SelectedItems.Count == 1) {
-        var item = variableListView.SelectedItems[0].Tag as KeyValuePair<string, object>?;
-        if (item != null) {
-          var value = item.Value.Value as IContent;
-          if (value != null) {
-            IContentView view = MainFormManager.MainForm.ShowContent(value);
-            if (view != null) {
-              view.ReadOnly = ReadOnly;
-              view.Locked = Locked;
-            }
-          }
-        }
-      }
+      if (variableListView.SelectedItems.Count != 1) return;
+      var item = variableListView.SelectedItems[0].Tag as KeyValuePair<string, object>?;
+      if (item == null) return;
+
+      var value = item.Value.Value as IContent;
+      if (value == null) return;
+
+      IContentView view = MainFormManager.MainForm.ShowContent(value);
+      if (view == null) return;
+
+      view.ReadOnly = ReadOnly;
+      view.Locked = Locked;
     }
     protected virtual void variableListView_ItemDrag(object sender, ItemDragEventArgs e) {
-      if (!Locked) {
-        var items = new List<object>();
-        foreach (ListViewItem listViewItem in variableListView.SelectedItems) {
-          var item = (KeyValuePair<string, object>)listViewItem.Tag as KeyValuePair<string, object>?;
-          if (item != null) items.Add(item.Value.Value);
-        }
-
-        if (items.Count > 0) {
-          var data = new DataObject();
-          if (items.Count == 1) data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items[0]);
-          else data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items);
-          if (ReadOnly) {
-            DoDragDrop(data, DragDropEffects.Copy);
-          } else {
-            var result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
-            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
-              foreach (string item in items) Content.Remove(item);
-            }
-          }
-        }
-      }
+      if (Locked || variableListView.SelectedItems.Count != 1) return;
+
+      var listViewItem = variableListView.SelectedItems[0];
+      var item = (KeyValuePair<string, object>)listViewItem.Tag;
+      if (!(item.Value is IDeepCloneable)) return;
+      var data = new DataObject(HeuristicLab.Common.Constants.DragDropDataFormat, item);
+      DoDragDrop(data, DragDropEffects.Copy);
     }
     protected virtual void variableListView_DragEnter(object sender, DragEventArgs e) {
-      validDragOperation = !Locked && !ReadOnly && e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) != null;
+      validDragOperation = !Locked && !ReadOnly;
+
+      object item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+      if (item is KeyValuePair<string, object>) {
+        var variable = (KeyValuePair<string, object>)item;
+        validDragOperation &= variable.Value is IDeepCloneable;
+      } else {
+        validDragOperation &= item is IDeepCloneable;
+      }
     }
     protected virtual void variableListView_DragOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
       if (validDragOperation) {
-        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
-        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
-        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
-        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+        if (e.AllowedEffect.HasFlag(DragDropEffects.Copy))
+          e.Effect = DragDropEffects.Copy;
       }
     }
     protected virtual void variableListView_DragDrop(object sender, DragEventArgs e) {
-      if (e.Effect != DragDropEffects.None) {
-        object item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
-        if (e.Effect.HasFlag(DragDropEffects.Copy)) {
-          var cloner = new Cloner();
-          var dc = item as IDeepCloneable;
-          if (dc != null) item = cloner.Clone(dc);
-        }
-        string name = GenerateNewVariableName();
-        Content.Add(name, item);
-        var listViewItem = variableListView.FindItemWithText(name);
-        listViewItem.BeginEdit();
-      }
-    }
-
-    private readonly Regex SafeVariableNameRegex = new Regex("^[@]?[_a-zA-Z][_a-zA-Z0-9]*$");
+      if (e.Effect != DragDropEffects.Copy) return;
+      object item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+
+      string variableName;
+      bool editLabel;
+
+      if (item is KeyValuePair<string, object>) {
+        var variable = (KeyValuePair<string, object>)item;
+        variableName = GenerateNewVariableName(out editLabel, variable.Key, false);
+        item = variable.Value;
+      } else {
+        var namedItem = item as INamedItem;
+        if (namedItem != null)
+          variableName = GenerateNewVariableName(out editLabel, namedItem.Name, false);
+        else
+          variableName = GenerateNewVariableName(out editLabel);
+      }
+
+      var cloneable = item as IDeepCloneable;
+      if (cloneable == null) return;
+
+      var clonedItem = cloneable.Clone();
+      Content.Add(variableName, clonedItem);
+
+      var listViewItem = variableListView.FindItemWithText(variableName);
+      variableListView.SelectedItems.Clear();
+      if (editLabel) listViewItem.BeginEdit();
+    }
+
     private void variableListView_AfterLabelEdit(object sender, LabelEditEventArgs e) {
       string name = e.Label;
-      if (!string.IsNullOrEmpty(name) && SafeVariableNameRegex.IsMatch(name)) {
+      if (!string.IsNullOrEmpty(name)) {
         var variable = (KeyValuePair<string, object>)variableListView.Items[e.Item].Tag;
         if (!Content.ContainsKey(name)) {
@@ -277,11 +305,19 @@
     #region Button Events
     protected virtual void addButton_Click(object sender, EventArgs e) {
-      object newVar = CreateItem();
-      if (newVar != null) {
-        string name = GenerateNewVariableName();
-        Content.Add(name, newVar);
-        var item = variableListView.FindItemWithText(name);
-        item.BeginEdit();
-      }
+      object variableValue = CreateItem();
+      if (variableValue == null) return;
+
+      string variableName;
+      var namedItem = variableValue as INamedItem;
+      if (namedItem != null)
+        variableName = GenerateNewVariableName(namedItem.Name, false);
+      else
+        variableName = GenerateNewVariableName();
+
+      Content.Add(variableName, variableValue);
+
+      var item = variableListView.FindItemWithText(variableName);
+      variableListView.SelectedItems.Clear();
+      item.BeginEdit();
     }
     protected virtual void sortAscendingButton_Click(object sender, EventArgs e) {
@@ -327,5 +363,4 @@
         foreach (var item in e.Items)
           RemoveVariable(item);
-        RebuildImageList();
         AdjustListViewColumnSizes();
       }
@@ -337,5 +372,4 @@
         foreach (var item in e.OldItems)
           RemoveVariable(item);
-        RebuildImageList();
         foreach (var item in e.Items)
           AddVariable(item);
@@ -347,11 +381,10 @@
       foreach (ListViewItem item in variableListView.Items) {
         var variable = item.Tag as KeyValuePair<string, object>?;
-        if (variable != null && variable.Value.Value == sender) {
-          string value = (variable.Value.Value ?? "null").ToString();
-          item.SubItems[1].Text = value;
-          item.SubItems[2].Text = variable.Value.Value.GetType().ToString();
-          item.ToolTipText = GetToolTipText(variable.Value, item.ImageIndex != 0);
-          return;
-        }
+        if (variable == null || variable.Value.Value != sender) continue;
+
+        string value = (variable.Value.Value ?? "null").ToString();
+        item.SubItems[1].Text = value;
+        item.SubItems[2].Text = variable.Value.Value.GetType().ToString();
+        SetToolTipText(item, item.ImageIndex != 0);
       }
     }
@@ -368,24 +401,36 @@
         ch.Width = -2;
     }
-    protected virtual void RebuildImageList() {
-      variableListView.SmallImageList.Images.Clear();
-      variableListView.SmallImageList.Images.AddRange(new Image[] {
-        HeuristicLab.Common.Resources.VSImageLibrary.Error,
-        HeuristicLab.Common.Resources.VSImageLibrary.Object,
-        HeuristicLab.Common.Resources.VSImageLibrary.Nothing
-      });
-      foreach (ListViewItem listViewItem in variableListView.Items) {
-        var variable = (KeyValuePair<string, object>)listViewItem.Tag;
-        bool serializable = IsSerializable(variable);
-        if (serializable) {
-          listViewItem.ImageIndex = variable.Value == null ? 2 : 1;
-        } else listViewItem.ImageIndex = 0;
-      }
-    }
-
-    private string GetToolTipText(KeyValuePair<string, object> variable, bool serializable) {
-      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+
+    protected virtual void AssignVariableToListViewItem(ListViewItem listViewItem, KeyValuePair<string, object> variable) {
       string value = (variable.Value ?? "null").ToString();
       string type = variable.Value == null ? "null" : variable.Value.GetType().ToString();
+
+      listViewItem.Tag = variable;
+
+      var subItems = listViewItem.SubItems;
+      subItems[0].Text = variable.Key;
+      if (subItems.Count == 1) { // variable information is added; subitems do not exist yet
+        subItems.AddRange(new[] { value, type });
+      } else { // variable information is updated; subitems are changed
+        subItems[1].Text = value;
+        subItems[2].Text = type;
+      }
+    }
+
+    protected virtual void SetImageKey(ListViewItem listViewItem, bool serializable) {
+      var variable = (KeyValuePair<string, object>)listViewItem.Tag;
+      if (!serializable) listViewItem.ImageKey = ErrorImageName;
+      else if (!SafeVariableNameRegex.IsMatch(variable.Key)) listViewItem.ImageKey = WarningImageName;
+      else if (variable.Value is IItem) listViewItem.ImageKey = HeuristicLabObjectImageName;
+      else if (variable.Value != null) listViewItem.ImageKey = ObjectImageName;
+      else listViewItem.ImageKey = NothingImageName;
+    }
+
+    protected virtual void SetToolTipText(ListViewItem listViewItem, bool serializable) {
+      var variable = (KeyValuePair<string, object>)listViewItem.Tag;
+      if (string.IsNullOrEmpty(variable.Key)) throw new ArgumentException("The variable must have a name.", "variable");
+      string value = listViewItem.SubItems[1].Text;
+      string type = listViewItem.SubItems[2].Text;
+
       string[] lines = {
         "Name: " + variable.Key,
@@ -393,29 +438,55 @@
         "Type: " + type
       };
+
       string toolTipText = string.Join(Environment.NewLine, lines);
+      if (!SafeVariableNameRegex.IsMatch(variable.Key))
+        toolTipText = "Caution: Identifier is no valid C# identifier!" + Environment.NewLine + toolTipText;
       if (!serializable)
         toolTipText = "Caution: Type is not serializable!" + Environment.NewLine + toolTipText;
-      return toolTipText;
-    }
-
-    private string GenerateNewVariableName(string defaultName = "enter_name") {
+      listViewItem.ToolTipText = toolTipText;
+    }
+
+    private string GenerateNewVariableName(string defaultName = DefaultVariableName, bool generateValidIdentifier = true) {
+      bool editLabel;
+      return GenerateNewVariableName(out editLabel, defaultName, generateValidIdentifier);
+    }
+
+    private string GenerateNewVariableName(out bool defaultNameExists, string defaultName = DefaultVariableName, bool generateValidIdentifier = true) {
+      if (string.IsNullOrEmpty(defaultName) || generateValidIdentifier && !SafeVariableNameRegex.IsMatch(defaultName))
+        defaultName = DefaultVariableName;
       if (Content.ContainsKey(defaultName)) {
         int i = 1;
+        string formatString = generateValidIdentifier ? "{0}{1}" : "{0} ({1})";
         string newName;
         do {
-          newName = defaultName + i++;
+          newName = string.Format(formatString, defaultName, i++);
         } while (Content.ContainsKey(newName));
+        defaultNameExists = true;
         return newName;
       }
+      defaultNameExists = false;
       return defaultName;
     }
 
     private bool IsSerializable(KeyValuePair<string, object> variable) {
+      Type type = null;
+      bool serializable;
+
+      if (variable.Value != null) {
+        type = variable.Value.GetType();
+        if (serializableLookup.TryGetValue(type, out serializable))
+          return serializable;
+      }
+
       var ser = new Serializer(variable, ConfigurationService.Instance.GetDefaultConfig(new XmlFormat()), "ROOT", true);
       try {
-        return ser.Count() > 0;
+        serializable = ser.Count() > 0; // try to create all serialization tokens
       } catch (PersistenceException) {
-        return false;
-      }
+        serializable = false;
+      }
+
+      if (type != null)
+        serializableLookup[type] = serializable;
+      return serializable;
     }
     #endregion
Index: able/HeuristicLab.Scripting/3.3/CSharpScript.cs
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/CSharpScript.cs	(revision 11906)
+++ 	(revision )
@@ -1,166 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2014 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.Linq;
-using System.Reflection;
-using System.Threading;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Scripting {
-  [Item("C# Script", "An empty C# script.")]
-  [Creatable("Scripts")]
-  [StorableClass]
-  public class CSharpScript : Script, IStorableContent {
-    #region Constants
-    protected const string ExecuteMethodName = "Execute";
-    protected override string CodeTemplate {
-      get {
-        return @"// use 'vars' to access variables in the script's variable store (e.g. vars.x = 5)
-// use 'vars[string]' to access variables via runtime strings (e.g. vars[""x""] = 5)
-// use 'vars.Contains(string)' to check if a variable exists
-// use 'vars.Clear()' to remove all variables
-// use 'foreach (KeyValuePair<string, object> v in vars) { ... }' to iterate over all variables
-
-using System;
-using System.Linq;
-using System.Collections.Generic;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-
-public class MyScript : HeuristicLab.Scripting.CSharpScriptBase {
-  public override void Main() {
-    // type your code here
-  }
-
-  // implement further classes and methods
-
-}";
-      }
-    }
-    #endregion
-
-    #region Fields & Properties
-    private CSharpScriptBase compiledScript;
-
-    public string Filename { get; set; }
-
-    [Storable]
-    private VariableStore variableStore;
-    public VariableStore VariableStore {
-      get { return variableStore; }
-    }
-    #endregion
-
-    #region Construction & Initialization
-    [StorableConstructor]
-    protected CSharpScript(bool deserializing) : base(deserializing) { }
-    protected CSharpScript(CSharpScript original, Cloner cloner)
-      : base(original, cloner) {
-      variableStore = cloner.Clone(original.variableStore);
-    }
-    public CSharpScript() {
-      variableStore = new VariableStore();
-      Code = CodeTemplate;
-    }
-    public CSharpScript(string code)
-      : base(code) {
-      variableStore = new VariableStore();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new CSharpScript(this, cloner);
-    }
-    #endregion
-
-    protected virtual void RegisterScriptEvents() {
-      if (compiledScript != null)
-        compiledScript.ConsoleOutputChanged += CompiledScriptOnConsoleOutputChanged;
-    }
-
-    protected virtual void DeregisterScriptEvents() {
-      if (compiledScript != null)
-        compiledScript.ConsoleOutputChanged -= CompiledScriptOnConsoleOutputChanged;
-    }
-
-    #region Compilation
-
-    public override Assembly Compile() {
-      DeregisterScriptEvents();
-      compiledScript = null;
-      var assembly = base.Compile();
-      var types = assembly.GetTypes();
-      compiledScript = (CSharpScriptBase)Activator.CreateInstance(types.Single(x => typeof(CSharpScriptBase).IsAssignableFrom(x)));
-      RegisterScriptEvents();
-      return assembly;
-    }
-    #endregion
-
-    private Thread scriptThread;
-    public virtual void Execute() {
-      if (compiledScript == null) return;
-      scriptThread = new Thread(() => {
-        Exception ex = null;
-        try {
-          OnScriptExecutionStarted();
-          compiledScript.Execute(VariableStore);
-        } catch (ThreadAbortException) {
-          // the execution was cancelled by the user
-        } catch (Exception e) {
-          ex = e;
-        } finally {
-          OnScriptExecutionFinished(ex);
-        }
-      });
-      scriptThread.Start();
-    }
-
-    public virtual void Kill() {
-      if (scriptThread.IsAlive)
-        scriptThread.Abort();
-    }
-
-    protected virtual void CompiledScriptOnConsoleOutputChanged(object sender, EventArgs<string> e) {
-      OnConsoleOutputChanged(e.Value);
-    }
-
-    public event EventHandler ScriptExecutionStarted;
-    protected virtual void OnScriptExecutionStarted() {
-      var handler = ScriptExecutionStarted;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler<EventArgs<Exception>> ScriptExecutionFinished;
-    protected virtual void OnScriptExecutionFinished(Exception e) {
-      var handler = ScriptExecutionFinished;
-      if (handler != null) handler(this, new EventArgs<Exception>(e));
-    }
-
-    public event EventHandler<EventArgs<string>> ConsoleOutputChanged;
-    protected virtual void OnConsoleOutputChanged(string args) {
-      var handler = ConsoleOutputChanged;
-      if (handler != null) handler(this, new EventArgs<string>(args));
-    }
-  }
-}
Index: able/HeuristicLab.Scripting/3.3/CSharpScriptBase.cs
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/CSharpScriptBase.cs	(revision 11906)
+++ 	(revision )
@@ -1,108 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2014 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.IO;
-using System.Text;
-using HeuristicLab.Common;
-
-namespace HeuristicLab.Scripting {
-  public abstract class CSharpScriptBase {
-    protected dynamic vars;
-
-    private readonly EventWriter console;
-    protected EventWriter Console {
-      get { return console; }
-    }
-
-    protected CSharpScriptBase() {
-      console = new EventWriter(this);
-    }
-
-    public abstract void Main();
-
-    internal void Execute(VariableStore variableStore) {
-      vars = new Variables(variableStore);
-      Main();
-    }
-
-    protected internal event EventHandler<EventArgs<string>> ConsoleOutputChanged;
-    private void OnConsoleOutputChanged(string args) {
-      var handler = ConsoleOutputChanged;
-      if (handler != null) handler(null, new EventArgs<string>(args));
-    }
-
-    protected class EventWriter : TextWriter {
-      private readonly CSharpScriptBase script;
-
-      public EventWriter(CSharpScriptBase script) {
-        this.script = script;
-      }
-
-      public override Encoding Encoding {
-        get { return Encoding.UTF8; }
-      }
-
-      #region Write/WriteLine Overrides
-      #region Write
-      public override void Write(bool value) { script.OnConsoleOutputChanged(value.ToString()); }
-      public override void Write(char value) { script.OnConsoleOutputChanged(value.ToString()); }
-      public override void Write(char[] buffer) { script.OnConsoleOutputChanged(new string(buffer)); }
-      public override void Write(char[] buffer, int index, int count) { script.OnConsoleOutputChanged(new string(buffer, index, count)); }
-      public override void Write(decimal value) { script.OnConsoleOutputChanged(value.ToString()); }
-      public override void Write(double value) { script.OnConsoleOutputChanged(value.ToString()); }
-      public override void Write(float value) { script.OnConsoleOutputChanged(value.ToString()); }
-      public override void Write(int value) { script.OnConsoleOutputChanged(value.ToString()); }
-      public override void Write(long value) { script.OnConsoleOutputChanged(value.ToString()); }
-      public override void Write(object value) { script.OnConsoleOutputChanged(value.ToString()); }
-      public override void Write(string value) { script.OnConsoleOutputChanged(value); }
-      public override void Write(string format, object arg0) { script.OnConsoleOutputChanged(string.Format(format, arg0)); }
-      public override void Write(string format, object arg0, object arg1) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg0)); }
-      public override void Write(string format, object arg0, object arg1, object arg2) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2)); }
-      public override void Write(string format, params object[] arg) { script.OnConsoleOutputChanged(string.Format(format, arg)); }
-      public override void Write(uint value) { script.OnConsoleOutputChanged(value.ToString()); }
-      public override void Write(ulong value) { script.OnConsoleOutputChanged(value.ToString()); }
-      #endregion
-
-      #region WriteLine
-      public override void WriteLine() { script.OnConsoleOutputChanged(Environment.NewLine); }
-      public override void WriteLine(bool value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(char value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(char[] buffer) { script.OnConsoleOutputChanged(new string(buffer) + Environment.NewLine); }
-      public override void WriteLine(char[] buffer, int index, int count) { script.OnConsoleOutputChanged(new string(buffer, index, count) + Environment.NewLine); }
-      public override void WriteLine(decimal value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(double value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(float value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(int value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(long value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(object value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(string value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(string format, object arg0) { script.OnConsoleOutputChanged(string.Format(format, arg0) + Environment.NewLine); }
-      public override void WriteLine(string format, object arg0, object arg1) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg1) + Environment.NewLine); }
-      public override void WriteLine(string format, object arg0, object arg1, object arg2) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2) + Environment.NewLine); }
-      public override void WriteLine(string format, params object[] arg) { script.OnConsoleOutputChanged(string.Format(format, arg) + Environment.NewLine); }
-      public override void WriteLine(uint value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      public override void WriteLine(ulong value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
-      #endregion
-      #endregion
-    }
-  }
-}
Index: /stable/HeuristicLab.Scripting/3.3/HeuristicLab.Scripting-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/HeuristicLab.Scripting-3.3.csproj	(revision 11906)
+++ /stable/HeuristicLab.Scripting/3.3/HeuristicLab.Scripting-3.3.csproj	(revision 11907)
@@ -85,10 +85,16 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="CSharpScript.cs" />
+    <Compile Include="Scripts\CSharp\CSharpScript.cs" />
+    <Compile Include="Scripts\Templates\CSharpScriptTemplate.cs" />
+    <Compile Include="Scripts\Templates\ScriptTemplates.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>ScriptTemplates.resx</DependentUpon>
+    </Compile>
     <Compile Include="Variables.cs" />
     <Compile Include="VariableStore.cs" />
     <None Include="Plugin.cs.frame" />
     <Compile Include="Script.cs" />
-    <Compile Include="CSharpScriptBase.cs" />
+    <Compile Include="Scripts\CSharp\CSharpScriptBase.cs" />
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -130,4 +136,11 @@
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Scripts\Templates\ScriptTemplates.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>ScriptTemplates.Designer.cs</LastGenOutput>
+      <CustomToolNamespace>HeuristicLab.Scripting</CustomToolNamespace>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    <PropertyGroup>
Index: /stable/HeuristicLab.Scripting/3.3/Script.cs
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/Script.cs	(revision 11906)
+++ /stable/HeuristicLab.Scripting/3.3/Script.cs	(revision 11907)
@@ -79,5 +79,5 @@
     public Script()
       : base("Script", "An empty script.") {
-      code = string.Empty;
+      code = CodeTemplate;
     }
     public Script(string code)
@@ -108,18 +108,11 @@
         WarningLevel = 4
       };
+
       parameters.ReferencedAssemblies.AddRange(
         GetAssemblies()
         .Select(a => a.Location)
         .ToArray());
-      var unit = CreateCompilationUnit();
-      var writer = new StringWriter();
-      CodeProvider.GenerateCodeFromCompileUnit(
-        unit,
-        writer,
-        new CodeGeneratorOptions {
-          ElseOnClosing = true,
-          IndentString = "  ",
-        });
-      return CodeProvider.CompileAssemblyFromDom(parameters, unit);
+
+      return CodeProvider.CompileAssemblyFromSource(parameters, code);
     }
 
@@ -134,5 +127,5 @@
             .AppendLine(error.ErrorText);
         }
-        throw new Exception(string.Format("Compilation of \"{0}\" failed:{1}{2}",
+        throw new InvalidOperationException(string.Format("Compilation of \"{0}\" failed:{1}{2}",
           Name, Environment.NewLine, sb.ToString()));
       } else {
@@ -142,15 +135,5 @@
 
     public virtual IEnumerable<Assembly> GetAssemblies() {
-      var assemblies = new List<Assembly>();
-      foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) {
-        try {
-          if (File.Exists(a.Location)) assemblies.Add(a);
-        } catch (NotSupportedException) {
-          // NotSupportedException is thrown while accessing 
-          // the Location property of the anonymously hosted
-          // dynamic methods assembly, which is related to
-          // LINQ queries
-        }
-      }
+      var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && File.Exists(a.Location)).ToList();
       assemblies.Add(typeof(Microsoft.CSharp.RuntimeBinder.Binder).Assembly); // for dlr functionality
       return assemblies;
Index: /stable/HeuristicLab.Scripting/3.3/Scripts/CSharp/CSharpScript.cs
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/Scripts/CSharp/CSharpScript.cs	(revision 11907)
+++ /stable/HeuristicLab.Scripting/3.3/Scripts/CSharp/CSharpScript.cs	(revision 11907)
@@ -0,0 +1,143 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Linq;
+using System.Reflection;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Scripting {
+  [Item("C# Script", "An empty C# script.")]
+  [Creatable("Scripts")]
+  [StorableClass]
+  public class CSharpScript : Script, IStorableContent {
+    #region Constants
+    protected const string ExecuteMethodName = "Execute";
+    protected override string CodeTemplate { get { return ScriptTemplates.CSharpScriptTemplate; } }
+    #endregion
+
+    #region Fields & Properties
+    private CSharpScriptBase compiledScript;
+
+    public string Filename { get; set; }
+
+    [Storable]
+    private VariableStore variableStore;
+    public VariableStore VariableStore {
+      get { return variableStore; }
+    }
+    #endregion
+
+    #region Construction & Initialization
+    [StorableConstructor]
+    protected CSharpScript(bool deserializing) : base(deserializing) { }
+    protected CSharpScript(CSharpScript original, Cloner cloner)
+      : base(original, cloner) {
+      variableStore = cloner.Clone(original.variableStore);
+    }
+    public CSharpScript() {
+      variableStore = new VariableStore();
+      Code = CodeTemplate;
+    }
+    public CSharpScript(string code)
+      : base(code) {
+      variableStore = new VariableStore();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CSharpScript(this, cloner);
+    }
+    #endregion
+
+    protected virtual void RegisterScriptEvents() {
+      if (compiledScript != null)
+        compiledScript.ConsoleOutputChanged += CompiledScriptOnConsoleOutputChanged;
+    }
+
+    protected virtual void DeregisterScriptEvents() {
+      if (compiledScript != null)
+        compiledScript.ConsoleOutputChanged -= CompiledScriptOnConsoleOutputChanged;
+    }
+
+    #region Compilation
+
+    public override Assembly Compile() {
+      DeregisterScriptEvents();
+      compiledScript = null;
+      var assembly = base.Compile();
+      var types = assembly.GetTypes();
+      compiledScript = (CSharpScriptBase)Activator.CreateInstance(types.Single(x => typeof(CSharpScriptBase).IsAssignableFrom(x)));
+      RegisterScriptEvents();
+      return assembly;
+    }
+    #endregion
+
+    private Thread scriptThread;
+    public virtual void ExecuteAsync() {
+      if (compiledScript == null) return;
+      scriptThread = new Thread(() => {
+        Exception ex = null;
+        try {
+          OnScriptExecutionStarted();
+          compiledScript.Execute(VariableStore);
+        } catch (ThreadAbortException) {
+          // the execution was cancelled by the user
+        } catch (Exception e) {
+          ex = e;
+        } finally {
+          OnScriptExecutionFinished(ex);
+        }
+      });
+      scriptThread.SetApartmentState(ApartmentState.STA);
+      scriptThread.Start();
+    }
+
+    public virtual void Kill() {
+      if (scriptThread.IsAlive)
+        scriptThread.Abort();
+    }
+
+    protected virtual void CompiledScriptOnConsoleOutputChanged(object sender, EventArgs<string> e) {
+      OnConsoleOutputChanged(e.Value);
+    }
+
+    public event EventHandler ScriptExecutionStarted;
+    protected virtual void OnScriptExecutionStarted() {
+      var handler = ScriptExecutionStarted;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler<EventArgs<Exception>> ScriptExecutionFinished;
+    protected virtual void OnScriptExecutionFinished(Exception e) {
+      var handler = ScriptExecutionFinished;
+      if (handler != null) handler(this, new EventArgs<Exception>(e));
+    }
+
+    public event EventHandler<EventArgs<string>> ConsoleOutputChanged;
+    protected virtual void OnConsoleOutputChanged(string args) {
+      var handler = ConsoleOutputChanged;
+      if (handler != null) handler(this, new EventArgs<string>(args));
+    }
+  }
+}
Index: /stable/HeuristicLab.Scripting/3.3/Scripts/CSharp/CSharpScriptBase.cs
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/Scripts/CSharp/CSharpScriptBase.cs	(revision 11907)
+++ /stable/HeuristicLab.Scripting/3.3/Scripts/CSharp/CSharpScriptBase.cs	(revision 11907)
@@ -0,0 +1,109 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Text;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Scripting {
+  public abstract class CSharpScriptBase {
+    protected Variables variables;
+    protected dynamic vars;
+
+    private readonly EventWriter console;
+    protected EventWriter Console {
+      get { return console; }
+    }
+
+    protected CSharpScriptBase() {
+      console = new EventWriter(this);
+    }
+
+    public abstract void Main();
+
+    internal void Execute(VariableStore variableStore) {
+      variables = vars = new Variables(variableStore);
+      Main();
+    }
+
+    protected internal event EventHandler<EventArgs<string>> ConsoleOutputChanged;
+    private void OnConsoleOutputChanged(string args) {
+      var handler = ConsoleOutputChanged;
+      if (handler != null) handler(null, new EventArgs<string>(args));
+    }
+
+    protected class EventWriter : TextWriter {
+      private readonly CSharpScriptBase script;
+
+      public EventWriter(CSharpScriptBase script) {
+        this.script = script;
+      }
+
+      public override Encoding Encoding {
+        get { return Encoding.UTF8; }
+      }
+
+      #region Write/WriteLine Overrides
+      #region Write
+      public override void Write(bool value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(char value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(char[] buffer) { script.OnConsoleOutputChanged(new string(buffer)); }
+      public override void Write(char[] buffer, int index, int count) { script.OnConsoleOutputChanged(new string(buffer, index, count)); }
+      public override void Write(decimal value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(double value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(float value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(int value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(long value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(object value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(string value) { script.OnConsoleOutputChanged(value); }
+      public override void Write(string format, object arg0) { script.OnConsoleOutputChanged(string.Format(format, arg0)); }
+      public override void Write(string format, object arg0, object arg1) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg0)); }
+      public override void Write(string format, object arg0, object arg1, object arg2) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2)); }
+      public override void Write(string format, params object[] arg) { script.OnConsoleOutputChanged(string.Format(format, arg)); }
+      public override void Write(uint value) { script.OnConsoleOutputChanged(value.ToString()); }
+      public override void Write(ulong value) { script.OnConsoleOutputChanged(value.ToString()); }
+      #endregion
+
+      #region WriteLine
+      public override void WriteLine() { script.OnConsoleOutputChanged(Environment.NewLine); }
+      public override void WriteLine(bool value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(char value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(char[] buffer) { script.OnConsoleOutputChanged(new string(buffer) + Environment.NewLine); }
+      public override void WriteLine(char[] buffer, int index, int count) { script.OnConsoleOutputChanged(new string(buffer, index, count) + Environment.NewLine); }
+      public override void WriteLine(decimal value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(double value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(float value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(int value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(long value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(object value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(string value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0) { script.OnConsoleOutputChanged(string.Format(format, arg0) + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0, object arg1) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg1) + Environment.NewLine); }
+      public override void WriteLine(string format, object arg0, object arg1, object arg2) { script.OnConsoleOutputChanged(string.Format(format, arg0, arg1, arg2) + Environment.NewLine); }
+      public override void WriteLine(string format, params object[] arg) { script.OnConsoleOutputChanged(string.Format(format, arg) + Environment.NewLine); }
+      public override void WriteLine(uint value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      public override void WriteLine(ulong value) { script.OnConsoleOutputChanged(value + Environment.NewLine); }
+      #endregion
+      #endregion
+    }
+  }
+}
Index: /stable/HeuristicLab.Scripting/3.3/Scripts/Templates/CSharpScriptTemplate.cs
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/Scripts/Templates/CSharpScriptTemplate.cs	(revision 11907)
+++ /stable/HeuristicLab.Scripting/3.3/Scripts/Templates/CSharpScriptTemplate.cs	(revision 11907)
@@ -0,0 +1,24 @@
+﻿// use 'vars' to access variables in the script's variable store (e.g. vars.x = 5)
+// use 'vars[string]' to access variables via runtime strings (e.g. vars[""x""] = 5)
+// use 'vars.Contains(string)' to check if a variable exists
+// use 'vars.Clear()' to remove all variables
+// use 'foreach (KeyValuePair<string, object> v in vars) { ... }' to iterate over all variables
+// use 'variables' to work with IEnumerable<T> extension methods on the script's variable store
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+//using HeuristicLab.Collections;
+//using HeuristicLab.Data;
+
+public class MyScript : HeuristicLab.Scripting.CSharpScriptBase {
+  public override void Main() {
+    // type your code here
+  }
+
+  // implement further classes and methods
+
+}
Index: /stable/HeuristicLab.Scripting/3.3/Scripts/Templates/ScriptTemplates.Designer.cs
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/Scripts/Templates/ScriptTemplates.Designer.cs	(revision 11907)
+++ /stable/HeuristicLab.Scripting/3.3/Scripts/Templates/ScriptTemplates.Designer.cs	(revision 11907)
@@ -0,0 +1,81 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.34014
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Scripting {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class ScriptTemplates {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal ScriptTemplates() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Scripting.Scripts.Templates.ScriptTemplates", typeof(ScriptTemplates).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to // use &apos;vars&apos; to access variables in the script&apos;s variable store (e.g. vars.x = 5)
+        ///// use &apos;vars[string]&apos; to access variables via runtime strings (e.g. vars[&quot;&quot;x&quot;&quot;] = 5)
+        ///// use &apos;vars.Contains(string)&apos; to check if a variable exists
+        ///// use &apos;vars.Clear()&apos; to remove all variables
+        ///// use &apos;foreach (KeyValuePair&lt;string, object&gt; v in vars) { ... }&apos; to iterate over all variables
+        ///// use &apos;variables&apos; to work with IEnumerable&lt;T&gt; extension methods on the script&apos;s variable store
+        ///
+        ///using System;
+        ///using System.Linq;
+        ///us [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string CSharpScriptTemplate {
+            get {
+                return ResourceManager.GetString("CSharpScriptTemplate", resourceCulture);
+            }
+        }
+    }
+}
Index: /stable/HeuristicLab.Scripting/3.3/Scripts/Templates/ScriptTemplates.resx
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/Scripts/Templates/ScriptTemplates.resx	(revision 11907)
+++ /stable/HeuristicLab.Scripting/3.3/Scripts/Templates/ScriptTemplates.resx	(revision 11907)
@@ -0,0 +1,124 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="CSharpScriptTemplate" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>csharpscripttemplate.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+</root>
Index: /stable/HeuristicLab.Scripting/3.3/VariableStore.cs
===================================================================
--- /stable/HeuristicLab.Scripting/3.3/VariableStore.cs	(revision 11906)
+++ /stable/HeuristicLab.Scripting/3.3/VariableStore.cs	(revision 11907)
@@ -21,7 +21,9 @@
 
 using System;
+using System.Drawing;
 using System.IO;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Core;
@@ -32,5 +34,24 @@
   [Item("VariableStore", "Represents a variable store.")]
   [StorableClass]
-  public class VariableStore : ObservableDictionary<string, object>, IContent, IDeepCloneable {
+  public class VariableStore : ObservableDictionary<string, object>, IItem {
+    #region Properties
+    public virtual string ItemName {
+      get { return ItemAttribute.GetName(GetType()); }
+    }
+    public virtual string ItemDescription {
+      get { return ItemAttribute.GetDescription(GetType()); }
+    }
+    public Version ItemVersion {
+      get { return ItemAttribute.GetVersion(GetType()); }
+    }
+    public static Image StaticItemImage {
+      get { return VSImageLibrary.Class; }
+    }
+    public virtual Image ItemImage {
+      get { return ItemAttribute.GetImage(GetType()); }
+    }
+    #endregion
+
+    #region Constructors & Cloning
     [StorableConstructor]
     protected VariableStore(bool deserializing) : base(deserializing) { }
@@ -68,4 +89,24 @@
       }
     }
+    #endregion
+
+    #region Overrides
+    public override string ToString() {
+      return ItemName;
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler ItemImageChanged;
+    protected virtual void OnItemImageChanged() {
+      var handler = ItemImageChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ToStringChanged;
+    protected virtual void OnToStringChanged() {
+      var handler = ToStringChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
   }
 }
Index: /stable/HeuristicLab.Tests/AssemblyInitializer.cs
===================================================================
--- /stable/HeuristicLab.Tests/AssemblyInitializer.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/AssemblyInitializer.cs	(revision 11907)
@@ -0,0 +1,21 @@
+﻿using System.IO;
+using System.Linq;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public static class AssemblyInitializer {
+    private static string SamplesDirectory = SamplesUtils.SamplesDirectory;
+    private static string ScriptsDirectory = ScriptingUtils.ScriptsDirectory;
+
+    [AssemblyInitialize]
+    public static void AssemblyInitialize(TestContext testContext) {
+      // load all assemblies
+      PluginLoader.Assemblies.Any();
+
+      // create output directories for samples and scripts
+      if (!Directory.Exists(SamplesDirectory)) Directory.CreateDirectory(SamplesDirectory);
+      if (!Directory.Exists(ScriptsDirectory)) Directory.CreateDirectory(ScriptsDirectory);
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/CloningConstructorTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/CloningConstructorTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/CloningConstructorTest.cs	(revision 11907)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Linq;
 using System.Reflection;
 using System.Text;
@@ -31,10 +30,4 @@
   [TestClass]
   public class CloningConstructorTest {
-    // Use ClassInitialize to run code before running the first test in the class
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.Assemblies.Any();
-    }
-
     [TestMethod]
     [TestCategory("General")]
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/ContentViewTests.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/ContentViewTests.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/ContentViewTests.cs	(revision 11907)
@@ -31,14 +31,4 @@
   [TestClass]
   public class ContentViewTests {
-    public ContentViewTests() {
-    }
-
-    // Use ClassInitialize to run code before running the first test in the class
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.Assemblies.Any();
-    }
-
-
     [TestMethod]
     [TestCategory("General")]
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/DeepCloneableCloningTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/DeepCloneableCloningTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/DeepCloneableCloningTest.cs	(revision 11907)
@@ -32,15 +32,6 @@
 
 namespace HeuristicLab.Tests {
-  /// <summary>
-  /// Summary description for DeepCloneableCloningTest
-  /// </summary>
   [TestClass]
   public class DeepCloneableCloningTest {
-
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.Assemblies.Any();
-    }
-
     private TestContext testContextInstance;
     public TestContext TestContext {
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/InstantiateCreatablesTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/InstantiateCreatablesTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/InstantiateCreatablesTest.cs	(revision 11907)
@@ -31,9 +31,4 @@
   [TestClass]
   public class InstantiateCreatablesTest {
-    // Use ClassInitialize to run code before running the first test in the class
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.Assemblies.Any();
-    }
     [TestMethod]
     [TestCategory("General")]
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/NamedItemTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/NamedItemTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/NamedItemTest.cs	(revision 11907)
@@ -1,4 +1,3 @@
-﻿using System.Linq;
-using System.Text;
+﻿using System.Text;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -9,9 +8,4 @@
   [TestClass]
   public class NamedItemTest {
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.Assemblies.Any();
-    }
-
     [TestMethod]
     [TestCategory("General")]
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/ParameterVisibilityTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/ParameterVisibilityTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/ParameterVisibilityTest.cs	(revision 11907)
@@ -31,10 +31,4 @@
   [TestClass]
   public class ParameterVisibilityTest {
-    // Use ClassInitialize to run code before running the first test in the class
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.Assemblies.Any();
-    }
-
     private TestContext testContextInstance;
     public TestContext TestContext {
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/EsGriewankSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/EsGriewankSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/EsGriewankSampleTest.cs	(revision 11907)
@@ -0,0 +1,99 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using HeuristicLab.Algorithms.EvolutionStrategy;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.TestFunctions;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class EsGriewankSampleTest {
+    private const string SampleFileName = "ES_Griewank";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateEsGriewankSampleTest() {
+      var es = CreateEsGriewankSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(es, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunEsGriewankSampleTest() {
+      var es = CreateEsGriewankSample();
+      es.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(es);
+      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(es, "BestQuality"));
+      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(es, "CurrentAverageQuality"));
+      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(es, "CurrentWorstQuality"));
+      Assert.AreEqual(100020, SamplesUtils.GetIntResult(es, "EvaluatedSolutions"));
+    }
+
+    private EvolutionStrategy CreateEsGriewankSample() {
+      EvolutionStrategy es = new EvolutionStrategy();
+
+      #region Problem Configuration
+
+      SingleObjectiveTestFunctionProblem problem = new SingleObjectiveTestFunctionProblem();
+
+      problem.ProblemSize.Value = 10;
+      problem.EvaluatorParameter.Value = new GriewankEvaluator();
+      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
+      problem.Maximization.Value = false;
+      problem.Bounds = new DoubleMatrix(new double[,] { { -600, 600 } });
+      problem.BestKnownQuality.Value = 0;
+      problem.BestKnownSolutionParameter.Value = new RealVector(10);
+      problem.Name = "Single Objective Test Function";
+      problem.Description = "Test function with real valued inputs and a single objective.";
+
+      #endregion
+
+      #region Algorithm Configuration
+
+      es.Name = "Evolution Strategy - Griewank";
+      es.Description = "An evolution strategy which solves the 10-dimensional Griewank test function";
+      es.Problem = problem;
+      SamplesUtils.ConfigureEvolutionStrategyParameters<AverageCrossover, NormalAllPositionsManipulator,
+        StdDevStrategyVectorCreator, StdDevStrategyVectorCrossover, StdDevStrategyVectorManipulator>(
+          es, 20, 500, 2, 200, false);
+
+      StdDevStrategyVectorCreator strategyCreator = (StdDevStrategyVectorCreator)es.StrategyParameterCreator;
+      strategyCreator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1, 20 } });
+
+      StdDevStrategyVectorManipulator strategyManipulator =
+        (StdDevStrategyVectorManipulator)es.StrategyParameterManipulator;
+      strategyManipulator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1E-12, 30 } });
+      strategyManipulator.GeneralLearningRateParameter.Value = new DoubleValue(0.22360679774997896);
+      strategyManipulator.LearningRateParameter.Value = new DoubleValue(0.39763536438352531);
+
+      #endregion
+
+      return es;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GATspSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GATspSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GATspSampleTest.cs	(revision 11907)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.Instances.TSPLIB;
+using HeuristicLab.Problems.TravelingSalesman;
+using HeuristicLab.Selection;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GATspSampleTest {
+    private const string SampleFileName = "GA_TSP";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateGaTspSampleTest() {
+      var ga = CreateGaTspSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ga, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGaTspSampleTest() {
+      var ga = CreateGaTspSample();
+      ga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ga);
+      Assert.AreEqual(12332, SamplesUtils.GetDoubleResult(ga, "BestQuality"));
+      Assert.AreEqual(13123.2, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"));
+      Assert.AreEqual(14538, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"));
+      Assert.AreEqual(99100, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
+    }
+
+    private GeneticAlgorithm CreateGaTspSample() {
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+
+      #region Problem Configuration
+      var provider = new TSPLIBTSPInstanceProvider();
+      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
+      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
+      tspProblem.Load(provider.LoadData(instance));
+      tspProblem.UseDistanceMatrix.Value = true;
+      #endregion
+      #region Algorithm Configuration
+      ga.Name = "Genetic Algorithm - TSP";
+      ga.Description = "A genetic algorithm which solves the \"ch130\" traveling salesman problem (imported from TSPLIB)";
+      ga.Problem = tspProblem;
+      SamplesUtils.ConfigureGeneticAlgorithmParameters<ProportionalSelector, OrderCrossover2, InversionManipulator>(
+        ga, 100, 1, 1000, 0.05);
+      #endregion
+
+      return ga;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GAVrpSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GAVrpSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GAVrpSampleTest.cs	(revision 11907)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Problems.Instances.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Encodings.General;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
+using HeuristicLab.Selection;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GAVrpSampleTest {
+    private const string SampleFileName = "GA_VRP";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateGaVrpSampleTest() {
+      var ga = CreateGaVrpSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ga, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGaVrpSampleTest() {
+      var ga = CreateGaVrpSample();
+      ga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ga);
+      Assert.AreEqual(1828.9368669428338, SamplesUtils.GetDoubleResult(ga, "BestQuality"));
+      Assert.AreEqual(1830.1444308908331, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"));
+      Assert.AreEqual(1871.7128510304112, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"));
+      Assert.AreEqual(99100, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
+    }
+
+    private GeneticAlgorithm CreateGaVrpSample() {
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+
+      #region Problem Configuration
+      VehicleRoutingProblem vrpProblem = new VehicleRoutingProblem();
+
+      SolomonFormatInstanceProvider instanceProvider = new SolomonInstanceProvider();
+      CVRPTWData data = instanceProvider.Import(@"Test Resources\C101.txt", @"Test Resources\C101.opt.txt") as CVRPTWData;
+      vrpProblem.Load(data);
+      vrpProblem.Name = "C101 VRP (imported from Solomon)";
+      vrpProblem.Description = "Represents a Vehicle Routing Problem.";
+      CVRPTWProblemInstance instance = vrpProblem.ProblemInstance as CVRPTWProblemInstance;
+      instance.DistanceFactor.Value = 1;
+      instance.FleetUsageFactor.Value = 100;
+      instance.OverloadPenalty.Value = 100;
+      instance.TardinessPenalty.Value = 100;
+      instance.TimeFactor.Value = 0;
+      vrpProblem.MaximizationParameter.Value.Value = false;
+      instance.UseDistanceMatrix.Value = true;
+      instance.Vehicles.Value = 25;
+      #endregion
+      #region Algorithm Configuration
+      ga.Name = "Genetic Algorithm - VRP";
+      ga.Description = "A genetic algorithm which solves the \"C101\" vehicle routing problem (imported from Solomon)";
+      ga.Problem = vrpProblem;
+      SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, MultiVRPSolutionCrossover, MultiVRPSolutionManipulator>(
+        ga, 100, 1, 1000, 0.05, 3);
+
+      var xOver = (MultiVRPSolutionCrossover)ga.Crossover;
+      foreach (var op in xOver.Operators) {
+        xOver.Operators.SetItemCheckedState(op, false);
+      }
+      xOver.Operators.SetItemCheckedState(xOver.Operators
+        .OfType<PotvinRouteBasedCrossover>()
+        .Single(), true);
+      xOver.Operators.SetItemCheckedState(xOver.Operators
+        .OfType<PotvinSequenceBasedCrossover>()
+        .Single(), true);
+
+      var manipulator = (MultiVRPSolutionManipulator)ga.Mutator;
+      foreach (var op in manipulator.Operators) {
+        manipulator.Operators.SetItemCheckedState(op, false);
+      }
+      manipulator.Operators.SetItemCheckedState(manipulator.Operators
+        .OfType<PotvinOneLevelExchangeMainpulator>()
+        .Single(), true);
+      manipulator.Operators.SetItemCheckedState(manipulator.Operators
+        .OfType<PotvinTwoLevelExchangeManipulator>()
+        .Single(), true);
+      #endregion
+
+      return ga;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPArtificialAntSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPArtificialAntSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPArtificialAntSampleTest.cs	(revision 11907)
@@ -0,0 +1,94 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.ArtificialAnt;
+using HeuristicLab.Selection;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GPArtificialAntSampleTest {
+    private const string SampleFileName = "SGP_SantaFe";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateGpArtificialAntSampleTest() {
+      var ga = CreateGpArtificialAntSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ga, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGpArtificialAntSampleTest() {
+      var ga = CreateGpArtificialAntSample();
+      ga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ga);
+      Assert.AreEqual(81, SamplesUtils.GetDoubleResult(ga, "BestQuality"));
+      Assert.AreEqual(48.19, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"));
+      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"));
+      Assert.AreEqual(50950, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
+    }
+
+    public GeneticAlgorithm CreateGpArtificialAntSample() {
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+
+      #region Problem Configuration
+      ArtificialAntProblem antProblem = new ArtificialAntProblem();
+      antProblem.BestKnownQuality.Value = 89;
+      antProblem.MaxExpressionDepth.Value = 10;
+      antProblem.MaxExpressionLength.Value = 100;
+      antProblem.MaxFunctionArguments.Value = 3;
+      antProblem.MaxFunctionDefinitions.Value = 3;
+      antProblem.MaxTimeSteps.Value = 600;
+      #endregion
+      #region Algorithm Configuration
+      ga.Name = "Genetic Programming - Artificial Ant";
+      ga.Description = "A standard genetic programming algorithm to solve the artificial ant problem (Santa-Fe trail)";
+      ga.Problem = antProblem;
+      SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeArchitectureManipulator>(
+        ga, 1000, 1, 50, 0.15, 5);
+      var mutator = (MultiSymbolicExpressionTreeArchitectureManipulator)ga.Mutator;
+      mutator.Operators.SetItemCheckedState(mutator.Operators
+        .OfType<FullTreeShaker>()
+        .Single(), false);
+      mutator.Operators.SetItemCheckedState(mutator.Operators
+        .OfType<OnePointShaker>()
+        .Single(), false);
+      mutator.Operators.SetItemCheckedState(mutator.Operators
+        .OfType<ArgumentDeleter>()
+        .Single(), false);
+      mutator.Operators.SetItemCheckedState(mutator.Operators
+        .OfType<SubroutineDeleter>()
+        .Single(), false);
+      #endregion
+
+      return ga;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPLawnMowerSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPLawnMowerSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPLawnMowerSampleTest.cs	(revision 11907)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Selection;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GPLawnMowerSampleTest {
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGpLawnMowerSampleTest() {
+      var ga = CreateGpLawnMowerSample();
+      ga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ga);
+    }
+
+    public GeneticAlgorithm CreateGpLawnMowerSample() {
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+
+      #region Problem Configuration
+
+      var problem = new HeuristicLab.Problems.LawnMower.Problem();
+
+      #endregion
+      #region Algorithm Configuration
+
+      ga.Name = "Genetic Programming - Lawn Mower";
+      ga.Description = "A standard genetic programming algorithm to solve the lawn mower problem";
+      ga.Problem = problem;
+      SamplesUtils
+        .ConfigureGeneticAlgorithmParameters
+        <TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeArchitectureManipulator>(
+          ga, 1000, 1, 50, 0.25, 5);
+      var mutator = (MultiSymbolicExpressionTreeArchitectureManipulator)ga.Mutator;
+      mutator.Operators.SetItemCheckedState(mutator.Operators
+        .OfType<OnePointShaker>()
+        .Single(), false);
+
+      #endregion
+
+      return ga;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPMultiplexerSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPMultiplexerSampleTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPMultiplexerSampleTest.cs	(revision 11907)
@@ -33,10 +33,5 @@
   [TestClass]
   public class GPMultiplexerSampleTest {
-    private const string samplesDirectory = SamplesUtils.Directory;
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      if (!Directory.Exists(samplesDirectory))
-        Directory.CreateDirectory(samplesDirectory);
-    }
+    private const string SampleFileName = "GP_Multiplexer";
 
     [TestMethod]
@@ -45,5 +40,5 @@
     public void CreateGpMultiplexerSampleTest() {
       var ga = CreateGpMultiplexerSample();
-      var path = Path.Combine(samplesDirectory, "GP_Multiplexer.hl");
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
       XmlGenerator.Serialize(ga, path);
     }
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPSymbolicClassificationSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPSymbolicClassificationSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPSymbolicClassificationSampleTest.cs	(revision 11907)
@@ -0,0 +1,154 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Classification;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Selection;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GPSymbolicClassificationSampleTest {
+    private const string SampleFileName = "SGP_SymbClass";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateGpSymbolicClassificationSampleTest() {
+      var ga = CreateGpSymbolicClassificationSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ga, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGpSymbolicClassificationSampleTest() {
+      var ga = CreateGpSymbolicClassificationSample();
+      ga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ga);
+      Assert.AreEqual(0.141880203907627, SamplesUtils.GetDoubleResult(ga, "BestQuality"), 1E-8);
+      Assert.AreEqual(4.3246992327753295, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"), 1E-8);
+      Assert.AreEqual(100.62175156249987, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"), 1E-8);
+      Assert.AreEqual(100900, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
+      var bestTrainingSolution = (IClassificationSolution)ga.Results["Best training solution"].Value;
+      Assert.AreEqual(0.80875, bestTrainingSolution.TrainingAccuracy, 1E-8);
+      Assert.AreEqual(0.795031055900621, bestTrainingSolution.TestAccuracy, 1E-8);
+      var bestValidationSolution = (IClassificationSolution)ga.Results["Best validation solution"].Value;
+      Assert.AreEqual(0.81375, bestValidationSolution.TrainingAccuracy, 1E-8);
+      Assert.AreEqual(0.788819875776398, bestValidationSolution.TestAccuracy, 1E-8);
+    }
+
+    private GeneticAlgorithm CreateGpSymbolicClassificationSample() {
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+      #region Problem Configuration
+      SymbolicClassificationSingleObjectiveProblem symbClassProblem = new SymbolicClassificationSingleObjectiveProblem();
+      symbClassProblem.Name = "Mammography Classification Problem";
+      symbClassProblem.Description = "Mammography dataset imported from the UCI machine learning repository (http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass)";
+      UCIInstanceProvider provider = new UCIInstanceProvider();
+      var instance = provider.GetDataDescriptors().Where(x => x.Name.Equals("Mammography, M. Elter, 2007")).Single();
+      var mammoData = (ClassificationProblemData)provider.LoadData(instance);
+      mammoData.TargetVariableParameter.Value = mammoData.TargetVariableParameter.ValidValues
+        .First(v => v.Value == "Severity");
+      mammoData.InputVariables.SetItemCheckedState(
+        mammoData.InputVariables.Single(x => x.Value == "BI-RADS"), false);
+      mammoData.InputVariables.SetItemCheckedState(
+        mammoData.InputVariables.Single(x => x.Value == "Age"), true);
+      mammoData.InputVariables.SetItemCheckedState(
+        mammoData.InputVariables.Single(x => x.Value == "Shape"), true);
+      mammoData.InputVariables.SetItemCheckedState(
+        mammoData.InputVariables.Single(x => x.Value == "Margin"), true);
+      mammoData.InputVariables.SetItemCheckedState(
+        mammoData.InputVariables.Single(x => x.Value == "Density"), true);
+      mammoData.InputVariables.SetItemCheckedState(
+        mammoData.InputVariables.Single(x => x.Value == "Severity"), false);
+      mammoData.TrainingPartition.Start = 0;
+      mammoData.TrainingPartition.End = 800;
+      mammoData.TestPartition.Start = 800;
+      mammoData.TestPartition.End = 961;
+      mammoData.Name = "Data imported from mammographic_masses.csv";
+      mammoData.Description = "Original dataset: http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass, missing values have been replaced with median values.";
+      symbClassProblem.ProblemData = mammoData;
+
+      // configure grammar
+      var grammar = new TypeCoherentExpressionGrammar();
+      grammar.ConfigureAsDefaultClassificationGrammar();
+      grammar.Symbols.OfType<VariableCondition>().Single().Enabled = false;
+      var varSymbol = grammar.Symbols.OfType<Variable>().Where(x => !(x is LaggedVariable)).Single();
+      varSymbol.WeightMu = 1.0;
+      varSymbol.WeightSigma = 1.0;
+      varSymbol.WeightManipulatorMu = 0.0;
+      varSymbol.WeightManipulatorSigma = 0.05;
+      varSymbol.MultiplicativeWeightManipulatorSigma = 0.03;
+      var constSymbol = grammar.Symbols.OfType<Constant>().Single();
+      constSymbol.MaxValue = 20;
+      constSymbol.MinValue = -20;
+      constSymbol.ManipulatorMu = 0.0;
+      constSymbol.ManipulatorSigma = 1;
+      constSymbol.MultiplicativeManipulatorSigma = 0.03;
+      symbClassProblem.SymbolicExpressionTreeGrammar = grammar;
+
+      // configure remaining problem parameters
+      symbClassProblem.BestKnownQuality.Value = 0.0;
+      symbClassProblem.FitnessCalculationPartition.Start = 0;
+      symbClassProblem.FitnessCalculationPartition.End = 400;
+      symbClassProblem.ValidationPartition.Start = 400;
+      symbClassProblem.ValidationPartition.End = 800;
+      symbClassProblem.RelativeNumberOfEvaluatedSamples.Value = 1;
+      symbClassProblem.MaximumSymbolicExpressionTreeLength.Value = 100;
+      symbClassProblem.MaximumSymbolicExpressionTreeDepth.Value = 10;
+      symbClassProblem.MaximumFunctionDefinitions.Value = 0;
+      symbClassProblem.MaximumFunctionArguments.Value = 0;
+      symbClassProblem.EvaluatorParameter.Value = new SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator();
+      #endregion
+      #region Algorithm Configuration
+      ga.Problem = symbClassProblem;
+      ga.Name = "Genetic Programming - Symbolic Classification";
+      ga.Description = "A standard genetic programming algorithm to solve a classification problem (Mammographic+Mass dataset)";
+      SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(
+        ga, 1000, 1, 100, 0.15, 5
+        );
+
+      var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator;
+      mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1;
+      mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0;
+
+      ga.Analyzer.Operators.SetItemCheckedState(
+        ga.Analyzer.Operators
+        .OfType<SymbolicClassificationSingleObjectiveOverfittingAnalyzer>()
+        .Single(), false);
+      ga.Analyzer.Operators.SetItemCheckedState(
+        ga.Analyzer.Operators
+        .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>()
+        .First(), false);
+      #endregion
+      return ga;
+    }
+
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPSymbolicRegressionSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPSymbolicRegressionSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPSymbolicRegressionSampleTest.cs	(revision 11907)
@@ -0,0 +1,153 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Selection;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GPSymbolicRegressionSampleTest {
+    private const string SampleFileName = "SGP_SymbReg";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateGpSymbolicRegressionSampleTest() {
+      var ga = CreateGpSymbolicRegressionSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ga, path);
+    }
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGpSymbolicRegressionSampleTest() {
+      var ga = CreateGpSymbolicRegressionSample();
+      ga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ga);
+      Assert.AreEqual(0.858344291534625, SamplesUtils.GetDoubleResult(ga, "BestQuality"), 1E-8);
+      Assert.AreEqual(0.56758466520692641, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"), 1E-8);
+      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"), 1E-8);
+      Assert.AreEqual(50950, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
+      var bestTrainingSolution = (IRegressionSolution)ga.Results["Best training solution"].Value;
+      Assert.AreEqual(0.85504801557844745, bestTrainingSolution.TrainingRSquared, 1E-8);
+      Assert.AreEqual(0.86259381948647817, bestTrainingSolution.TestRSquared, 1E-8);
+      var bestValidationSolution = (IRegressionSolution)ga.Results["Best validation solution"].Value;
+      Assert.AreEqual(0.84854338315539746, bestValidationSolution.TrainingRSquared, 1E-8);
+      Assert.AreEqual(0.8662813452656678, bestValidationSolution.TestRSquared, 1E-8);
+    }
+
+    private GeneticAlgorithm CreateGpSymbolicRegressionSample() {
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+      #region Problem Configuration
+      SymbolicRegressionSingleObjectiveProblem symbRegProblem = new SymbolicRegressionSingleObjectiveProblem();
+      symbRegProblem.Name = "Tower Symbolic Regression Problem";
+      symbRegProblem.Description = "Tower Dataset (downloaded from: http://www.symbolicregression.com/?q=towerProblem)";
+      RegressionRealWorldInstanceProvider provider = new RegressionRealWorldInstanceProvider();
+      var instance = provider.GetDataDescriptors().Where(x => x.Name.Equals("Tower")).Single();
+      var towerProblemData = (RegressionProblemData)provider.LoadData(instance);
+      towerProblemData.TargetVariableParameter.Value = towerProblemData.TargetVariableParameter.ValidValues
+        .First(v => v.Value == "towerResponse");
+      towerProblemData.InputVariables.SetItemCheckedState(
+        towerProblemData.InputVariables.Single(x => x.Value == "x1"), true);
+      towerProblemData.InputVariables.SetItemCheckedState(
+        towerProblemData.InputVariables.Single(x => x.Value == "x7"), false);
+      towerProblemData.InputVariables.SetItemCheckedState(
+        towerProblemData.InputVariables.Single(x => x.Value == "x11"), false);
+      towerProblemData.InputVariables.SetItemCheckedState(
+        towerProblemData.InputVariables.Single(x => x.Value == "x16"), false);
+      towerProblemData.InputVariables.SetItemCheckedState(
+        towerProblemData.InputVariables.Single(x => x.Value == "x21"), false);
+      towerProblemData.InputVariables.SetItemCheckedState(
+        towerProblemData.InputVariables.Single(x => x.Value == "x25"), false);
+      towerProblemData.InputVariables.SetItemCheckedState(
+        towerProblemData.InputVariables.Single(x => x.Value == "towerResponse"), false);
+      towerProblemData.TrainingPartition.Start = 0;
+      towerProblemData.TrainingPartition.End = 3136;
+      towerProblemData.TestPartition.Start = 3136;
+      towerProblemData.TestPartition.End = 4999;
+      towerProblemData.Name = "Data imported from towerData.txt";
+      towerProblemData.Description = "Chemical concentration at top of distillation tower, dataset downloaded from: http://vanillamodeling.com/realproblems.html, best R² achieved with nu-SVR = 0.97";
+      symbRegProblem.ProblemData = towerProblemData;
+
+      // configure grammar
+      var grammar = new TypeCoherentExpressionGrammar();
+      grammar.ConfigureAsDefaultRegressionGrammar();
+      grammar.Symbols.OfType<VariableCondition>().Single().InitialFrequency = 0.0;
+      var varSymbol = grammar.Symbols.OfType<Variable>().Where(x => !(x is LaggedVariable)).Single();
+      varSymbol.WeightMu = 1.0;
+      varSymbol.WeightSigma = 1.0;
+      varSymbol.WeightManipulatorMu = 0.0;
+      varSymbol.WeightManipulatorSigma = 0.05;
+      varSymbol.MultiplicativeWeightManipulatorSigma = 0.03;
+      var constSymbol = grammar.Symbols.OfType<Constant>().Single();
+      constSymbol.MaxValue = 20;
+      constSymbol.MinValue = -20;
+      constSymbol.ManipulatorMu = 0.0;
+      constSymbol.ManipulatorSigma = 1;
+      constSymbol.MultiplicativeManipulatorSigma = 0.03;
+      symbRegProblem.SymbolicExpressionTreeGrammar = grammar;
+
+      // configure remaining problem parameters
+      symbRegProblem.BestKnownQuality.Value = 0.97;
+      symbRegProblem.FitnessCalculationPartition.Start = 0;
+      symbRegProblem.FitnessCalculationPartition.End = 2300;
+      symbRegProblem.ValidationPartition.Start = 2300;
+      symbRegProblem.ValidationPartition.End = 3136;
+      symbRegProblem.RelativeNumberOfEvaluatedSamples.Value = 1;
+      symbRegProblem.MaximumSymbolicExpressionTreeLength.Value = 150;
+      symbRegProblem.MaximumSymbolicExpressionTreeDepth.Value = 12;
+      symbRegProblem.MaximumFunctionDefinitions.Value = 0;
+      symbRegProblem.MaximumFunctionArguments.Value = 0;
+
+      symbRegProblem.EvaluatorParameter.Value = new SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator();
+      #endregion
+      #region Algorithm Configuration
+      ga.Problem = symbRegProblem;
+      ga.Name = "Genetic Programming - Symbolic Regression";
+      ga.Description = "A standard genetic programming algorithm to solve a symbolic regression problem (tower dataset)";
+      SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(
+        ga, 1000, 1, 50, 0.15, 5);
+      var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator;
+      mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1;
+      mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0;
+
+      ga.Analyzer.Operators.SetItemCheckedState(
+        ga.Analyzer.Operators
+        .OfType<SymbolicRegressionSingleObjectiveOverfittingAnalyzer>()
+        .Single(), false);
+      ga.Analyzer.Operators.SetItemCheckedState(
+        ga.Analyzer.Operators
+        .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>()
+        .First(), false);
+      #endregion
+      return ga;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPTimeSeriesSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPTimeSeriesSampleTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GPTimeSeriesSampleTest.cs	(revision 11907)
@@ -32,10 +32,5 @@
   [TestClass]
   public class GPTimeSeriesSampleTest {
-    private const string samplesDirectory = SamplesUtils.Directory;
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      if (!Directory.Exists(samplesDirectory))
-        Directory.CreateDirectory(samplesDirectory);
-    }
+    private const string SampleFileName = "OSGP_TimeSeries";
 
     [TestMethod]
@@ -44,5 +39,5 @@
     public void CreateGpTimeSeriesSampleTest() {
       var ga = CreateGpTimeSeriesSample();
-      var path = Path.Combine(samplesDirectory, "OSGP_TimeSeries.hl");
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
       XmlGenerator.Serialize(ga, path);
     }
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GaussianProcessRegressionSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GaussianProcessRegressionSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GaussianProcessRegressionSampleTest.cs	(revision 11907)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GaussianProcessRegressionSampleTest {
+    private const string SampleFileName = "GPR";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateGaussianProcessRegressionSampleTest() {
+      var gpr = CreateGaussianProcessRegressionSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(gpr, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGaussianProcessRegressionSample() {
+      var gpr = CreateGaussianProcessRegressionSample();
+      gpr.SetSeedRandomly = false;
+      gpr.Seed = 1618551877;
+      SamplesUtils.RunAlgorithm(gpr);
+      Assert.AreEqual(-940.39914958616748, SamplesUtils.GetDoubleResult(gpr, "NegativeLogLikelihood"));
+      Assert.AreEqual(0.995614091354263, SamplesUtils.GetDoubleResult(gpr, "Training R²"));
+    }
+
+    private GaussianProcessRegression CreateGaussianProcessRegressionSample() {
+      var gpr = new GaussianProcessRegression();
+      var provider = new VariousInstanceProvider();
+      var instance = provider.GetDataDescriptors().Where(x => x.Name.Contains("Spatial co-evolution")).Single();
+      var regProblem = new RegressionProblem();
+      regProblem.Load(provider.LoadData(instance));
+
+      #region Algorithm Configuration
+      gpr.Name = "Gaussian Process Regression";
+      gpr.Description = "A Gaussian process regression algorithm which solves the spatial co-evolution benchmark problem";
+      gpr.Problem = regProblem;
+
+      gpr.CovarianceFunction = new CovarianceSquaredExponentialIso();
+      gpr.MeanFunction = new MeanConst();
+      gpr.MinimizationIterations = 20;
+      gpr.Seed = 0;
+      gpr.SetSeedRandomly = true;
+      #endregion
+
+      gpr.Engine = new ParallelEngine.ParallelEngine();
+      return gpr;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GeSymbolicRegressionSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GeSymbolicRegressionSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/GeSymbolicRegressionSampleTest.cs	(revision 11907)
@@ -0,0 +1,121 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Selection;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GeSymbolicRegressionSampleTest {
+    #region artificial ant
+    private const string GeArtificialAntSampleFileName = "GE_ArtificialAnt";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateGeArtificialAntSampleTest() {
+      var geaa = CreateGeArtificialAntSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, GeArtificialAntSampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(geaa, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGeArtificalAntSampleTest() {
+      var ga = CreateGeArtificialAntSample();
+      ga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ga);
+    }
+
+    public OffspringSelectionGeneticAlgorithm CreateGeArtificialAntSample() {
+      OffspringSelectionGeneticAlgorithm ga = new OffspringSelectionGeneticAlgorithm();
+
+      #region Problem Configuration
+      var problem = new HeuristicLab.Problems.GrammaticalEvolution.GEArtificialAntProblem();
+      #endregion
+      #region Algorithm Configuration
+      ga.Name = "Grammatical Evolution - Artificial Ant (SantaFe)";
+      ga.Description = "Grammatical evolution algorithm for solving a artificial ant problem";
+      ga.Problem = problem;
+      SamplesUtils.ConfigureOsGeneticAlgorithmParameters<GenderSpecificSelector, Encodings.IntegerVectorEncoding.SinglePointCrossover, Encodings.IntegerVectorEncoding.UniformOnePositionManipulator>(
+        ga, 200, 1, 50, 0.05, 200);
+      #endregion
+
+      return ga;
+    }
+    #endregion
+
+    #region symbolic regression
+    private const string GeSymbolicRegressionSampleFileName = "GE_SymbReg";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateGeSymbolicRegressionSampleTest() {
+      var geSymbReg = CreateGeSymbolicRegressionSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, GeSymbolicRegressionSampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(geSymbReg, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGeSymbolicRegressionSampleTest() {
+      var ga = CreateGeSymbolicRegressionSample();
+      ga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ga);
+    }
+
+    public OffspringSelectionGeneticAlgorithm CreateGeSymbolicRegressionSample() {
+      var ga = new OffspringSelectionGeneticAlgorithm();
+
+      #region Problem Configuration
+      var problem = new HeuristicLab.Problems.GrammaticalEvolution.GESymbolicRegressionSingleObjectiveProblem();
+
+      #endregion
+      #region Algorithm Configuration
+      ga.Name = "Grammatical Evolution - Symbolic Regression (Poly-10)";
+      ga.Description = "Grammatical evolution algorithm for solving a symbolic regression problem problem";
+      ga.Problem = problem;
+      problem.Load(new PolyTen().GenerateRegressionData());
+
+      // must occur after loading problem data because the grammar creates symbols for random constants once the data is loaded
+      var consts = problem.SymbolicExpressionTreeGrammar.AllowedSymbols.OfType<Constant>().ToList();
+      foreach (var c in consts) {
+        problem.SymbolicExpressionTreeGrammar.RemoveSymbol(c);
+      }
+
+      SamplesUtils.ConfigureOsGeneticAlgorithmParameters<GenderSpecificSelector, Encodings.IntegerVectorEncoding.SinglePointCrossover, Encodings.IntegerVectorEncoding.UniformOnePositionManipulator>(
+        ga, 1000, 1, 50, 0.05, 200);
+      #endregion
+
+      return ga;
+    }
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/IslandGaTspSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/IslandGaTspSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/IslandGaTspSampleTest.cs	(revision 11907)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.Instances.TSPLIB;
+using HeuristicLab.Problems.TravelingSalesman;
+using HeuristicLab.Selection;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class UnitTest1 {
+    private const string SampleFileName = "IslandGA_TSP";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateIslandGaTspSampleTest() {
+      var ga = CreateIslandGaTspSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ga, path);
+    }
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunIslandGaTspSampleTest() {
+      var ga = CreateIslandGaTspSample();
+      ga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ga);
+      Assert.AreEqual(9918, SamplesUtils.GetDoubleResult(ga, "BestQuality"));
+      Assert.AreEqual(10324.64, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"));
+      Assert.AreEqual(11823, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"));
+      Assert.AreEqual(495500, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
+    }
+
+    private IslandGeneticAlgorithm CreateIslandGaTspSample() {
+      IslandGeneticAlgorithm ga = new IslandGeneticAlgorithm();
+      #region Problem Configuration
+      var provider = new TSPLIBTSPInstanceProvider();
+      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
+      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
+      tspProblem.Load(provider.LoadData(instance));
+      tspProblem.UseDistanceMatrix.Value = true;
+      #endregion
+      #region Algorithm Configuration
+      ga.Name = "Island Genetic Algorithm - TSP";
+      ga.Description = "An island genetic algorithm which solves the \"ch130\" traveling salesman problem (imported from TSPLIB)";
+      ga.Problem = tspProblem;
+      SamplesUtils.ConfigureIslandGeneticAlgorithmParameters<ProportionalSelector, OrderCrossover2, InversionManipulator,
+        UnidirectionalRingMigrator, BestSelector, WorstReplacer>(
+        ga, 100, 1, 1000, 0.05, 5, 50, 0.25);
+      #endregion
+      return ga;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/LocalSearchKnapsackSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/LocalSearchKnapsackSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/LocalSearchKnapsackSampleTest.cs	(revision 11907)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.LocalSearch;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.Knapsack;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class LocalSearchKnapsackSampleTest {
+    private const string SampleFileName = "LS_Knapsack";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateLocalSearchKnapsackSampleTest() {
+      var ls = CreateLocalSearchKnapsackSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ls, path);
+    }
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "medium")]
+    public void RunLocalSearchKnapsackSampleTest() {
+      var ls = CreateLocalSearchKnapsackSample();
+      ls.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ls);
+      Assert.AreEqual(345, SamplesUtils.GetDoubleResult(ls, "BestQuality"));
+      Assert.AreEqual(340.70731707317071, SamplesUtils.GetDoubleResult(ls, "CurrentAverageQuality"));
+      Assert.AreEqual(337, SamplesUtils.GetDoubleResult(ls, "CurrentWorstQuality"));
+      Assert.AreEqual(82000, SamplesUtils.GetIntResult(ls, "EvaluatedMoves"));
+    }
+
+    private LocalSearch CreateLocalSearchKnapsackSample() {
+      LocalSearch ls = new LocalSearch();
+      #region Problem Configuration
+      KnapsackProblem problem = new KnapsackProblem();
+      problem.BestKnownQuality = new DoubleValue(362);
+      problem.BestKnownSolution = new HeuristicLab.Encodings.BinaryVectorEncoding.BinaryVector(new bool[] { 
+       true , false, false, true , true , true , true , true , false, true , true , true , true , true , true , false, true , false, true , true , false, true , true , false, true , false, true , true , true , false, true , true , false, true , true , false, true , false, true , true , true , true , true , true , true , true , true , true , true , true , true , false, true , false, false, true , true , false, true , true , true , true , true , true , true , true , false, true , false, true , true , true , true , false, true , true , true , true , true , true , true , true});
+      problem.EvaluatorParameter.Value = new KnapsackEvaluator();
+      problem.SolutionCreatorParameter.Value = new RandomBinaryVectorCreator();
+      problem.KnapsackCapacity.Value = 297;
+      problem.Maximization.Value = true;
+      problem.Penalty.Value = 1;
+      problem.Values = new IntArray(new int[] { 
+  6, 1, 1, 6, 7, 8, 7, 4, 2, 5, 2, 6, 7, 8, 7, 1, 7, 1, 9, 4, 2, 6, 5,  3, 5, 3, 3, 6, 5, 2, 4, 9, 4, 5, 7, 1, 4, 3, 5, 5, 8, 3, 6, 7, 3, 9, 7, 7, 5, 5, 7, 1, 4, 4, 3, 9, 5, 1, 6, 2, 2, 6, 1, 6, 5, 4, 4, 7, 1,  8, 9, 9, 7, 4, 3, 8, 7, 5, 7, 4, 4, 5});
+      problem.Weights = new IntArray(new int[] { 
+ 1, 9, 3, 6, 5, 3, 8, 1, 7, 4, 2, 1, 2, 7, 9, 9, 8, 4, 9, 2, 4, 8, 3, 7, 5, 7, 5, 5, 1, 9, 8, 7, 8, 9, 1, 3, 3, 8, 8, 5, 1, 2, 4, 3, 6, 9, 4, 4, 9, 7, 4, 5, 1, 9, 7, 6, 7, 4, 7, 1, 2, 1, 2, 9, 8, 6, 8, 4, 7, 6, 7, 5, 3, 9, 4, 7, 4, 6, 1, 2, 5, 4});
+      problem.Name = "Knapsack Problem";
+      problem.Description = "Represents a Knapsack problem.";
+      #endregion
+      #region Algorithm Configuration
+      ls.Name = "Local Search - Knapsack";
+      ls.Description = "A local search algorithm that solves a randomly generated Knapsack problem";
+      ls.Problem = problem;
+      ls.MaximumIterations.Value = 1000;
+      ls.MoveEvaluator = ls.MoveEvaluatorParameter.ValidValues
+        .OfType<KnapsackOneBitflipMoveEvaluator>()
+        .Single();
+      ls.MoveGenerator = ls.MoveGeneratorParameter.ValidValues
+        .OfType<ExhaustiveOneBitflipMoveGenerator>()
+        .Single();
+      ls.MoveMaker = ls.MoveMakerParameter.ValidValues
+        .OfType<OneBitflipMoveMaker>()
+        .Single();
+      ls.SampleSize.Value = 100;
+      ls.Seed.Value = 0;
+      ls.SetSeedRandomly.Value = true;
+      #endregion
+      ls.Engine = new ParallelEngine.ParallelEngine();
+      return ls;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/PsoSchwefelSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/PsoSchwefelSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/PsoSchwefelSampleTest.cs	(revision 11907)
@@ -0,0 +1,119 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.ParticleSwarmOptimization;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.TestFunctions;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class PsoSchwefelSampleTest {
+    private const string SampleFileName = "PSO_Schwefel";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreatePsoSchwefelSampleTest() {
+      var pso = CreatePsoSchwefelSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(pso, path);
+    }
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "medium")]
+    public void RunPsoSchwefelSampleTest() {
+      var pso = CreatePsoSchwefelSample();
+      pso.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(pso);
+      if (!Environment.Is64BitProcess) {
+        Assert.AreEqual(118.44027985932837, SamplesUtils.GetDoubleResult(pso, "BestQuality"));
+        Assert.AreEqual(140.71570105946438, SamplesUtils.GetDoubleResult(pso, "CurrentAverageQuality"));
+        Assert.AreEqual(220.956806502853, SamplesUtils.GetDoubleResult(pso, "CurrentWorstQuality"));
+        Assert.AreEqual(1000, SamplesUtils.GetIntResult(pso, "Iterations"));
+      } else {
+        Assert.AreEqual(118.43958282879345, SamplesUtils.GetDoubleResult(pso, "BestQuality"));
+        Assert.AreEqual(139.43946864779372, SamplesUtils.GetDoubleResult(pso, "CurrentAverageQuality"));
+        Assert.AreEqual(217.14654589055152, SamplesUtils.GetDoubleResult(pso, "CurrentWorstQuality"));
+        Assert.AreEqual(1000, SamplesUtils.GetIntResult(pso, "Iterations"));
+      }
+    }
+
+    private ParticleSwarmOptimization CreatePsoSchwefelSample() {
+      ParticleSwarmOptimization pso = new ParticleSwarmOptimization();
+      #region Problem Configuration
+      var problem = new SingleObjectiveTestFunctionProblem();
+      problem.BestKnownQuality.Value = 0.0;
+      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 420.968746, 420.968746 });
+      problem.Bounds = new DoubleMatrix(new double[,] { { -500, 500 } });
+      problem.EvaluatorParameter.Value = new SchwefelEvaluator();
+      problem.Maximization.Value = false;
+      problem.ProblemSize.Value = 2;
+      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
+      #endregion
+      #region Algorithm Configuration
+      pso.Name = "Particle Swarm Optimization - Schwefel";
+      pso.Description = "A particle swarm optimization algorithm which solves the 2-dimensional Schwefel test function (based on the description in Pedersen, M.E.H. (2010). PhD thesis. University of Southampton)";
+      pso.Problem = problem;
+      pso.Inertia.Value = 10;
+      pso.MaxIterations.Value = 1000;
+      pso.NeighborBestAttraction.Value = 0.5;
+      pso.PersonalBestAttraction.Value = -0.01;
+      pso.SwarmSize.Value = 50;
+
+      var inertiaUpdater = pso.InertiaUpdaterParameter.ValidValues
+        .OfType<ExponentialDiscreteDoubleValueModifier>()
+        .Single();
+      inertiaUpdater.StartValueParameter.Value = new DoubleValue(10);
+      inertiaUpdater.EndValueParameter.Value = new DoubleValue(1);
+      pso.InertiaUpdater = inertiaUpdater;
+
+      pso.ParticleCreator = pso.ParticleCreatorParameter.ValidValues
+        .OfType<RealVectorParticleCreator>()
+        .Single();
+      var swarmUpdater = pso.SwarmUpdaterParameter.ValidValues
+        .OfType<RealVectorSwarmUpdater>()
+        .Single();
+      swarmUpdater.VelocityBoundsIndexParameter.ActualName = "Iterations";
+      swarmUpdater.VelocityBoundsParameter.Value = new DoubleMatrix(new double[,] { { -10, 10 } });
+      swarmUpdater.VelocityBoundsStartValueParameter.Value = new DoubleValue(10.0);
+      swarmUpdater.VelocityBoundsEndValueParameter.Value = new DoubleValue(1.0);
+      swarmUpdater.VelocityBoundsScalingOperatorParameter.Value = swarmUpdater.VelocityBoundsScalingOperatorParameter.ValidValues
+        .OfType<ExponentialDiscreteDoubleValueModifier>()
+        .Single();
+
+      pso.TopologyInitializer = null;
+      pso.TopologyUpdater = null;
+      pso.SwarmUpdater = swarmUpdater;
+      pso.Seed.Value = 0;
+      pso.SetSeedRandomly.Value = true;
+      #endregion
+      pso.Engine = new ParallelEngine.ParallelEngine();
+      return pso;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/RAPGASchedulingSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/RAPGASchedulingSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/RAPGASchedulingSampleTest.cs	(revision 11907)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.RAPGA;
+using HeuristicLab.Encodings.ScheduleEncoding.JobSequenceMatrix;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.Scheduling;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class RAPGASchedulingSampleTest {
+    private const string SampleFileName = "RAPGA_JSSP";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateRAPGASchedulingSampleTest() {
+      var ss = CreateRAPGASchedulingSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ss, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunRAPGASchedulingSampleTest() {
+      var rapga = CreateRAPGASchedulingSample();
+      rapga.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(rapga);
+      Assert.AreEqual(988.00, SamplesUtils.GetDoubleResult(rapga, "BestQuality"));
+      Assert.AreEqual(988.00, SamplesUtils.GetDoubleResult(rapga, "CurrentAverageQuality"));
+      Assert.AreEqual(988.00, SamplesUtils.GetDoubleResult(rapga, "CurrentWorstQuality"));
+      Assert.AreEqual(27100, SamplesUtils.GetIntResult(rapga, "EvaluatedSolutions"));
+    }
+
+    private RAPGA CreateRAPGASchedulingSample() {
+      #region Problem Configuration
+      JobShopSchedulingProblem problem = new JobShopSchedulingProblem();
+      #endregion
+
+      #region Algorithm Configuration
+      RAPGA rapga = new RAPGA();
+      rapga.Engine = new SequentialEngine.SequentialEngine();
+      rapga.Name = "RAPGA - Job Shop Scheduling";
+      rapga.Description = "A relevant alleles preserving genetic algorithm which solves a job shop scheduling problem";
+      rapga.Problem = problem;
+      rapga.Mutator = rapga.MutatorParameter.ValidValues.OfType<JSMSwapManipulator>().First();
+      rapga.Seed.Value = 0;
+      return rapga;
+      #endregion
+    }
+  }
+}
Index: able/HeuristicLab.Tests/HeuristicLab-3.3/Samples/SamplesTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/SamplesTest.cs	(revision 11906)
+++ 	(revision )
@@ -1,1283 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2014 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.IO;
-using System.Linq;
-using System.Threading;
-using HeuristicLab.Algorithms.DataAnalysis;
-using HeuristicLab.Algorithms.EvolutionStrategy;
-using HeuristicLab.Algorithms.GeneticAlgorithm;
-using HeuristicLab.Algorithms.LocalSearch;
-using HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm;
-using HeuristicLab.Algorithms.ParticleSwarmOptimization;
-using HeuristicLab.Algorithms.RAPGA;
-using HeuristicLab.Algorithms.ScatterSearch;
-using HeuristicLab.Algorithms.SimulatedAnnealing;
-using HeuristicLab.Algorithms.TabuSearch;
-using HeuristicLab.Algorithms.VariableNeighborhoodSearch;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Encodings.RealVectorEncoding;
-using HeuristicLab.Encodings.ScheduleEncoding.JobSequenceMatrix;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Optimization;
-using HeuristicLab.Optimization.Operators;
-using HeuristicLab.Persistence.Default.Xml;
-using HeuristicLab.Problems.ArtificialAnt;
-using HeuristicLab.Problems.DataAnalysis;
-using HeuristicLab.Problems.DataAnalysis.Symbolic;
-using HeuristicLab.Problems.DataAnalysis.Symbolic.Classification;
-using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
-using HeuristicLab.Problems.Instances;
-using HeuristicLab.Problems.Instances.DataAnalysis;
-using HeuristicLab.Problems.Instances.TSPLIB;
-using HeuristicLab.Problems.Instances.VehicleRouting;
-using HeuristicLab.Problems.Knapsack;
-using HeuristicLab.Problems.Scheduling;
-using HeuristicLab.Problems.TestFunctions;
-using HeuristicLab.Problems.TravelingSalesman;
-using HeuristicLab.Problems.VehicleRouting;
-using HeuristicLab.Problems.VehicleRouting.Encodings.General;
-using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
-using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
-using HeuristicLab.Selection;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using StdDevStrategyVectorCreator = HeuristicLab.Encodings.RealVectorEncoding.StdDevStrategyVectorCreator;
-using StdDevStrategyVectorCrossover = HeuristicLab.Encodings.RealVectorEncoding.StdDevStrategyVectorCrossover;
-using StdDevStrategyVectorManipulator = HeuristicLab.Encodings.RealVectorEncoding.StdDevStrategyVectorManipulator;
-
-
-namespace HeuristicLab.Tests {
-  [TestClass]
-  public class SamplesTest {
-    private const string samplesDirectory = SamplesUtils.Directory;
-
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      if (!Directory.Exists(samplesDirectory))
-        Directory.CreateDirectory(samplesDirectory);
-    }
-
-    #region GA
-    #region TSP
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateGaTspSampleTest() {
-      var ga = CreateGaTspSample();
-      XmlGenerator.Serialize(ga, @"Samples\GA_TSP.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunGaTspSampleTest() {
-      var ga = CreateGaTspSample();
-      ga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ga);
-      Assert.AreEqual(12332, SamplesUtils.GetDoubleResult(ga, "BestQuality"));
-      Assert.AreEqual(13123.2, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"));
-      Assert.AreEqual(14538, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"));
-      Assert.AreEqual(99100, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
-    }
-
-    private GeneticAlgorithm CreateGaTspSample() {
-      GeneticAlgorithm ga = new GeneticAlgorithm();
-      #region Problem Configuration
-      var provider = new TSPLIBTSPInstanceProvider();
-      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
-      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
-      tspProblem.Load(provider.LoadData(instance));
-      tspProblem.UseDistanceMatrix.Value = true;
-      #endregion
-      #region Algorithm Configuration
-      ga.Name = "Genetic Algorithm - TSP";
-      ga.Description = "A genetic algorithm which solves the \"ch130\" traveling salesman problem (imported from TSPLIB)";
-      ga.Problem = tspProblem;
-      SamplesUtils.ConfigureGeneticAlgorithmParameters<ProportionalSelector, OrderCrossover2, InversionManipulator>(
-        ga, 100, 1, 1000, 0.05);
-      #endregion
-      return ga;
-    }
-    #endregion
-    #region VRP
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateGaVrpSampleTest() {
-      var ga = CreateGaVrpSample();
-      XmlGenerator.Serialize(ga, @"Samples\GA_VRP.hl");
-    }
-
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunGaVrpSampleTest() {
-      var ga = CreateGaVrpSample();
-      ga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ga);
-      Assert.AreEqual(1828.9368669428338, SamplesUtils.GetDoubleResult(ga, "BestQuality"));
-      Assert.AreEqual(1830.1444308908331, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"));
-      Assert.AreEqual(1871.7128510304112, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"));
-      Assert.AreEqual(99100, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
-    }
-
-    private GeneticAlgorithm CreateGaVrpSample() {
-      GeneticAlgorithm ga = new GeneticAlgorithm();
-      #region Problem Configuration
-      VehicleRoutingProblem vrpProblem = new VehicleRoutingProblem();
-
-      SolomonFormatInstanceProvider instanceProvider = new SolomonInstanceProvider();
-      CVRPTWData data = instanceProvider.Import(@"Test Resources\C101.txt", @"Test Resources\C101.opt.txt") as CVRPTWData;
-      vrpProblem.Load(data);
-      vrpProblem.Name = "C101 VRP (imported from Solomon)";
-      vrpProblem.Description = "Represents a Vehicle Routing Problem.";
-      CVRPTWProblemInstance instance = vrpProblem.ProblemInstance as CVRPTWProblemInstance;
-      instance.DistanceFactor.Value = 1;
-      instance.FleetUsageFactor.Value = 100;
-      instance.OverloadPenalty.Value = 100;
-      instance.TardinessPenalty.Value = 100;
-      instance.TimeFactor.Value = 0;
-      vrpProblem.MaximizationParameter.Value.Value = false;
-      instance.UseDistanceMatrix.Value = true;
-      instance.Vehicles.Value = 25;
-      #endregion
-      #region Algorithm Configuration
-      ga.Name = "Genetic Algorithm - VRP";
-      ga.Description = "A genetic algorithm which solves the \"C101\" vehicle routing problem (imported from Solomon)";
-      ga.Problem = vrpProblem;
-      SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, MultiVRPSolutionCrossover, MultiVRPSolutionManipulator>(
-        ga, 100, 1, 1000, 0.05, 3);
-
-      var xOver = (MultiVRPSolutionCrossover)ga.Crossover;
-      foreach (var op in xOver.Operators) {
-        xOver.Operators.SetItemCheckedState(op, false);
-      }
-      xOver.Operators.SetItemCheckedState(xOver.Operators
-        .OfType<PotvinRouteBasedCrossover>()
-        .Single(), true);
-      xOver.Operators.SetItemCheckedState(xOver.Operators
-        .OfType<PotvinSequenceBasedCrossover>()
-        .Single(), true);
-
-      var manipulator = (MultiVRPSolutionManipulator)ga.Mutator;
-      foreach (var op in manipulator.Operators) {
-        manipulator.Operators.SetItemCheckedState(op, false);
-      }
-      manipulator.Operators.SetItemCheckedState(manipulator.Operators
-        .OfType<PotvinOneLevelExchangeMainpulator>()
-        .Single(), true);
-      manipulator.Operators.SetItemCheckedState(manipulator.Operators
-        .OfType<PotvinTwoLevelExchangeManipulator>()
-        .Single(), true);
-      #endregion
-      return ga;
-    }
-    #endregion
-    #region ArtificialAnt
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateGpArtificialAntSampleTest() {
-      var ga = CreateGpArtificialAntSample();
-      XmlGenerator.Serialize(ga, @"Samples\SGP_SantaFe.hl");
-    }
-
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunGpArtificialAntSampleTest() {
-      var ga = CreateGpArtificialAntSample();
-      ga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ga);
-      Assert.AreEqual(81, SamplesUtils.GetDoubleResult(ga, "BestQuality"));
-      Assert.AreEqual(48.19, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"));
-      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"));
-      Assert.AreEqual(50950, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
-    }
-
-    public GeneticAlgorithm CreateGpArtificialAntSample() {
-      GeneticAlgorithm ga = new GeneticAlgorithm();
-      #region Problem Configuration
-      ArtificialAntProblem antProblem = new ArtificialAntProblem();
-      antProblem.BestKnownQuality.Value = 89;
-      antProblem.MaxExpressionDepth.Value = 10;
-      antProblem.MaxExpressionLength.Value = 100;
-      antProblem.MaxFunctionArguments.Value = 3;
-      antProblem.MaxFunctionDefinitions.Value = 3;
-      antProblem.MaxTimeSteps.Value = 600;
-      #endregion
-      #region Algorithm Configuration
-      ga.Name = "Genetic Programming - Artificial Ant";
-      ga.Description = "A standard genetic programming algorithm to solve the artificial ant problem (Santa-Fe trail)";
-      ga.Problem = antProblem;
-      SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeArchitectureManipulator>(
-        ga, 1000, 1, 50, 0.15, 5);
-      var mutator = (MultiSymbolicExpressionTreeArchitectureManipulator)ga.Mutator;
-      mutator.Operators.SetItemCheckedState(mutator.Operators
-        .OfType<FullTreeShaker>()
-        .Single(), false);
-      mutator.Operators.SetItemCheckedState(mutator.Operators
-        .OfType<OnePointShaker>()
-        .Single(), false);
-      mutator.Operators.SetItemCheckedState(mutator.Operators
-        .OfType<ArgumentDeleter>()
-        .Single(), false);
-      mutator.Operators.SetItemCheckedState(mutator.Operators
-        .OfType<SubroutineDeleter>()
-        .Single(), false);
-      #endregion
-      return ga;
-    }
-    #endregion
-    #region Symbolic Regression
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateGpSymbolicRegressionSampleTest() {
-      var ga = CreateGpSymbolicRegressionSample();
-      XmlGenerator.Serialize(ga, @"Samples\SGP_SymbReg.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunGpSymbolicRegressionSampleTest() {
-      var ga = CreateGpSymbolicRegressionSample();
-      ga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ga);
-      Assert.AreEqual(0.858344291534625, SamplesUtils.GetDoubleResult(ga, "BestQuality"), 1E-8);
-      Assert.AreEqual(0.56758466520692641, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"), 1E-8);
-      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"), 1E-8);
-      Assert.AreEqual(50950, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
-      var bestTrainingSolution = (IRegressionSolution)ga.Results["Best training solution"].Value;
-      Assert.AreEqual(0.85504801557844745, bestTrainingSolution.TrainingRSquared, 1E-8);
-      Assert.AreEqual(0.86259381948647817, bestTrainingSolution.TestRSquared, 1E-8);
-      var bestValidationSolution = (IRegressionSolution)ga.Results["Best validation solution"].Value;
-      Assert.AreEqual(0.84854338315539746, bestValidationSolution.TrainingRSquared, 1E-8);
-      Assert.AreEqual(0.8662813452656678, bestValidationSolution.TestRSquared, 1E-8);
-    }
-
-    private GeneticAlgorithm CreateGpSymbolicRegressionSample() {
-      GeneticAlgorithm ga = new GeneticAlgorithm();
-      #region Problem Configuration
-      SymbolicRegressionSingleObjectiveProblem symbRegProblem = new SymbolicRegressionSingleObjectiveProblem();
-      symbRegProblem.Name = "Tower Symbolic Regression Problem";
-      symbRegProblem.Description = "Tower Dataset (downloaded from: http://www.symbolicregression.com/?q=towerProblem)";
-      RegressionRealWorldInstanceProvider provider = new RegressionRealWorldInstanceProvider();
-      var instance = provider.GetDataDescriptors().Where(x => x.Name.Equals("Tower")).Single();
-      var towerProblemData = (RegressionProblemData)provider.LoadData(instance);
-      towerProblemData.TargetVariableParameter.Value = towerProblemData.TargetVariableParameter.ValidValues
-        .First(v => v.Value == "towerResponse");
-      towerProblemData.InputVariables.SetItemCheckedState(
-        towerProblemData.InputVariables.Single(x => x.Value == "x1"), true);
-      towerProblemData.InputVariables.SetItemCheckedState(
-        towerProblemData.InputVariables.Single(x => x.Value == "x7"), false);
-      towerProblemData.InputVariables.SetItemCheckedState(
-        towerProblemData.InputVariables.Single(x => x.Value == "x11"), false);
-      towerProblemData.InputVariables.SetItemCheckedState(
-        towerProblemData.InputVariables.Single(x => x.Value == "x16"), false);
-      towerProblemData.InputVariables.SetItemCheckedState(
-        towerProblemData.InputVariables.Single(x => x.Value == "x21"), false);
-      towerProblemData.InputVariables.SetItemCheckedState(
-        towerProblemData.InputVariables.Single(x => x.Value == "x25"), false);
-      towerProblemData.InputVariables.SetItemCheckedState(
-        towerProblemData.InputVariables.Single(x => x.Value == "towerResponse"), false);
-      towerProblemData.TrainingPartition.Start = 0;
-      towerProblemData.TrainingPartition.End = 3136;
-      towerProblemData.TestPartition.Start = 3136;
-      towerProblemData.TestPartition.End = 4999;
-      towerProblemData.Name = "Data imported from towerData.txt";
-      towerProblemData.Description = "Chemical concentration at top of distillation tower, dataset downloaded from: http://vanillamodeling.com/realproblems.html, best R² achieved with nu-SVR = 0.97";
-      symbRegProblem.ProblemData = towerProblemData;
-
-      // configure grammar
-      var grammar = new TypeCoherentExpressionGrammar();
-      grammar.ConfigureAsDefaultRegressionGrammar();
-      grammar.Symbols.OfType<VariableCondition>().Single().InitialFrequency = 0.0;
-      var varSymbol = grammar.Symbols.OfType<Variable>().Where(x => !(x is LaggedVariable)).Single();
-      varSymbol.WeightMu = 1.0;
-      varSymbol.WeightSigma = 1.0;
-      varSymbol.WeightManipulatorMu = 0.0;
-      varSymbol.WeightManipulatorSigma = 0.05;
-      varSymbol.MultiplicativeWeightManipulatorSigma = 0.03;
-      var constSymbol = grammar.Symbols.OfType<Constant>().Single();
-      constSymbol.MaxValue = 20;
-      constSymbol.MinValue = -20;
-      constSymbol.ManipulatorMu = 0.0;
-      constSymbol.ManipulatorSigma = 1;
-      constSymbol.MultiplicativeManipulatorSigma = 0.03;
-      symbRegProblem.SymbolicExpressionTreeGrammar = grammar;
-
-      // configure remaining problem parameters
-      symbRegProblem.BestKnownQuality.Value = 0.97;
-      symbRegProblem.FitnessCalculationPartition.Start = 0;
-      symbRegProblem.FitnessCalculationPartition.End = 2300;
-      symbRegProblem.ValidationPartition.Start = 2300;
-      symbRegProblem.ValidationPartition.End = 3136;
-      symbRegProblem.RelativeNumberOfEvaluatedSamples.Value = 1;
-      symbRegProblem.MaximumSymbolicExpressionTreeLength.Value = 150;
-      symbRegProblem.MaximumSymbolicExpressionTreeDepth.Value = 12;
-      symbRegProblem.MaximumFunctionDefinitions.Value = 0;
-      symbRegProblem.MaximumFunctionArguments.Value = 0;
-
-      symbRegProblem.EvaluatorParameter.Value = new SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator();
-      #endregion
-      #region Algorithm Configuration
-      ga.Problem = symbRegProblem;
-      ga.Name = "Genetic Programming - Symbolic Regression";
-      ga.Description = "A standard genetic programming algorithm to solve a symbolic regression problem (tower dataset)";
-      SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(
-        ga, 1000, 1, 50, 0.15, 5);
-      var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator;
-      mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1;
-      mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0;
-
-      ga.Analyzer.Operators.SetItemCheckedState(
-        ga.Analyzer.Operators
-        .OfType<SymbolicRegressionSingleObjectiveOverfittingAnalyzer>()
-        .Single(), false);
-      ga.Analyzer.Operators.SetItemCheckedState(
-        ga.Analyzer.Operators
-        .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>()
-        .First(), false);
-      #endregion
-      return ga;
-    }
-    #endregion
-    #region Symbolic Classification
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateGpSymbolicClassificationSampleTest() {
-      var ga = CreateGpSymbolicClassificationSample();
-      XmlGenerator.Serialize(ga, @"Samples\SGP_SymbClass.hl");
-    }
-
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunGpSymbolicClassificationSampleTest() {
-      var ga = CreateGpSymbolicClassificationSample();
-      ga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ga);
-      Assert.AreEqual(0.141880203907627, SamplesUtils.GetDoubleResult(ga, "BestQuality"), 1E-8);
-      Assert.AreEqual(4.3246992327753295, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"), 1E-8);
-      Assert.AreEqual(100.62175156249987, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"), 1E-8);
-      Assert.AreEqual(100900, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
-      var bestTrainingSolution = (IClassificationSolution)ga.Results["Best training solution"].Value;
-      Assert.AreEqual(0.80875, bestTrainingSolution.TrainingAccuracy, 1E-8);
-      Assert.AreEqual(0.795031055900621, bestTrainingSolution.TestAccuracy, 1E-8);
-      var bestValidationSolution = (IClassificationSolution)ga.Results["Best validation solution"].Value;
-      Assert.AreEqual(0.81375, bestValidationSolution.TrainingAccuracy, 1E-8);
-      Assert.AreEqual(0.788819875776398, bestValidationSolution.TestAccuracy, 1E-8);
-    }
-
-    private GeneticAlgorithm CreateGpSymbolicClassificationSample() {
-      GeneticAlgorithm ga = new GeneticAlgorithm();
-      #region Problem Configuration
-      SymbolicClassificationSingleObjectiveProblem symbClassProblem = new SymbolicClassificationSingleObjectiveProblem();
-      symbClassProblem.Name = "Mammography Classification Problem";
-      symbClassProblem.Description = "Mammography dataset imported from the UCI machine learning repository (http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass)";
-      UCIInstanceProvider provider = new UCIInstanceProvider();
-      var instance = provider.GetDataDescriptors().Where(x => x.Name.Equals("Mammography, M. Elter, 2007")).Single();
-      var mammoData = (ClassificationProblemData)provider.LoadData(instance);
-      mammoData.TargetVariableParameter.Value = mammoData.TargetVariableParameter.ValidValues
-        .First(v => v.Value == "Severity");
-      mammoData.InputVariables.SetItemCheckedState(
-        mammoData.InputVariables.Single(x => x.Value == "BI-RADS"), false);
-      mammoData.InputVariables.SetItemCheckedState(
-        mammoData.InputVariables.Single(x => x.Value == "Age"), true);
-      mammoData.InputVariables.SetItemCheckedState(
-        mammoData.InputVariables.Single(x => x.Value == "Shape"), true);
-      mammoData.InputVariables.SetItemCheckedState(
-        mammoData.InputVariables.Single(x => x.Value == "Margin"), true);
-      mammoData.InputVariables.SetItemCheckedState(
-        mammoData.InputVariables.Single(x => x.Value == "Density"), true);
-      mammoData.InputVariables.SetItemCheckedState(
-        mammoData.InputVariables.Single(x => x.Value == "Severity"), false);
-      mammoData.TrainingPartition.Start = 0;
-      mammoData.TrainingPartition.End = 800;
-      mammoData.TestPartition.Start = 800;
-      mammoData.TestPartition.End = 961;
-      mammoData.Name = "Data imported from mammographic_masses.csv";
-      mammoData.Description = "Original dataset: http://archive.ics.uci.edu/ml/datasets/Mammographic+Mass, missing values have been replaced with median values.";
-      symbClassProblem.ProblemData = mammoData;
-
-      // configure grammar
-      var grammar = new TypeCoherentExpressionGrammar();
-      grammar.ConfigureAsDefaultClassificationGrammar();
-      grammar.Symbols.OfType<VariableCondition>().Single().Enabled = false;
-      var varSymbol = grammar.Symbols.OfType<Variable>().Where(x => !(x is LaggedVariable)).Single();
-      varSymbol.WeightMu = 1.0;
-      varSymbol.WeightSigma = 1.0;
-      varSymbol.WeightManipulatorMu = 0.0;
-      varSymbol.WeightManipulatorSigma = 0.05;
-      varSymbol.MultiplicativeWeightManipulatorSigma = 0.03;
-      var constSymbol = grammar.Symbols.OfType<Constant>().Single();
-      constSymbol.MaxValue = 20;
-      constSymbol.MinValue = -20;
-      constSymbol.ManipulatorMu = 0.0;
-      constSymbol.ManipulatorSigma = 1;
-      constSymbol.MultiplicativeManipulatorSigma = 0.03;
-      symbClassProblem.SymbolicExpressionTreeGrammar = grammar;
-
-      // configure remaining problem parameters
-      symbClassProblem.BestKnownQuality.Value = 0.0;
-      symbClassProblem.FitnessCalculationPartition.Start = 0;
-      symbClassProblem.FitnessCalculationPartition.End = 400;
-      symbClassProblem.ValidationPartition.Start = 400;
-      symbClassProblem.ValidationPartition.End = 800;
-      symbClassProblem.RelativeNumberOfEvaluatedSamples.Value = 1;
-      symbClassProblem.MaximumSymbolicExpressionTreeLength.Value = 100;
-      symbClassProblem.MaximumSymbolicExpressionTreeDepth.Value = 10;
-      symbClassProblem.MaximumFunctionDefinitions.Value = 0;
-      symbClassProblem.MaximumFunctionArguments.Value = 0;
-      symbClassProblem.EvaluatorParameter.Value = new SymbolicClassificationSingleObjectiveMeanSquaredErrorEvaluator();
-      #endregion
-      #region Algorithm Configuration
-      ga.Problem = symbClassProblem;
-      ga.Name = "Genetic Programming - Symbolic Classification";
-      ga.Description = "A standard genetic programming algorithm to solve a classification problem (Mammographic+Mass dataset)";
-      SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeManipulator>(
-        ga, 1000, 1, 100, 0.15, 5
-        );
-
-      var mutator = (MultiSymbolicExpressionTreeManipulator)ga.Mutator;
-      mutator.Operators.OfType<FullTreeShaker>().Single().ShakingFactor = 0.1;
-      mutator.Operators.OfType<OnePointShaker>().Single().ShakingFactor = 1.0;
-
-      ga.Analyzer.Operators.SetItemCheckedState(
-        ga.Analyzer.Operators
-        .OfType<SymbolicClassificationSingleObjectiveOverfittingAnalyzer>()
-        .Single(), false);
-      ga.Analyzer.Operators.SetItemCheckedState(
-        ga.Analyzer.Operators
-        .OfType<SymbolicDataAnalysisAlleleFrequencyAnalyzer>()
-        .First(), false);
-      #endregion
-      return ga;
-    }
-    #endregion
-    #region LawnMower
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunGpLawnMowerSampleTest() {
-      var ga = CreateGpLawnMowerSample();
-      ga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ga);
-    }
-
-    public GeneticAlgorithm CreateGpLawnMowerSample() {
-      GeneticAlgorithm ga = new GeneticAlgorithm();
-      #region Problem Configuration
-      var problem = new HeuristicLab.Problems.LawnMower.Problem();
-      #endregion
-      #region Algorithm Configuration
-      ga.Name = "Genetic Programming - Lawn Mower";
-      ga.Description = "A standard genetic programming algorithm to solve the lawn mower problem";
-      ga.Problem = problem;
-      SamplesUtils.ConfigureGeneticAlgorithmParameters<TournamentSelector, SubtreeCrossover, MultiSymbolicExpressionTreeArchitectureManipulator>(
-        ga, 1000, 1, 50, 0.25, 5);
-      var mutator = (MultiSymbolicExpressionTreeArchitectureManipulator)ga.Mutator;
-      mutator.Operators.SetItemCheckedState(mutator.Operators
-        .OfType<OnePointShaker>()
-        .Single(), false);
-      #endregion
-      return ga;
-    }
-    #endregion
-    #endregion
-
-    #region ES
-    #region Griewank
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateEsGriewankSampleTest() {
-      var es = CreateEsGriewankSample();
-      XmlGenerator.Serialize(es, @"Samples\ES_Griewank.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunEsGriewankSampleTest() {
-      var es = CreateEsGriewankSample();
-      es.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(es);
-      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(es, "BestQuality"));
-      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(es, "CurrentAverageQuality"));
-      Assert.AreEqual(0, SamplesUtils.GetDoubleResult(es, "CurrentWorstQuality"));
-      Assert.AreEqual(100020, SamplesUtils.GetIntResult(es, "EvaluatedSolutions"));
-    }
-
-    private EvolutionStrategy CreateEsGriewankSample() {
-      EvolutionStrategy es = new EvolutionStrategy();
-      #region Problem Configuration
-      SingleObjectiveTestFunctionProblem problem = new SingleObjectiveTestFunctionProblem();
-
-      problem.ProblemSize.Value = 10;
-      problem.EvaluatorParameter.Value = new GriewankEvaluator();
-      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
-      problem.Maximization.Value = false;
-      problem.Bounds = new DoubleMatrix(new double[,] { { -600, 600 } });
-      problem.BestKnownQuality.Value = 0;
-      problem.BestKnownSolutionParameter.Value = new RealVector(10);
-      problem.Name = "Single Objective Test Function";
-      problem.Description = "Test function with real valued inputs and a single objective.";
-      #endregion
-      #region Algorithm Configuration
-      es.Name = "Evolution Strategy - Griewank";
-      es.Description = "An evolution strategy which solves the 10-dimensional Griewank test function";
-      es.Problem = problem;
-      SamplesUtils.ConfigureEvolutionStrategyParameters<AverageCrossover, NormalAllPositionsManipulator,
-        StdDevStrategyVectorCreator, StdDevStrategyVectorCrossover, StdDevStrategyVectorManipulator>(
-        es, 20, 500, 2, 200, false);
-
-      StdDevStrategyVectorCreator strategyCreator = (StdDevStrategyVectorCreator)es.StrategyParameterCreator;
-      strategyCreator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1, 20 } });
-
-      StdDevStrategyVectorManipulator strategyManipulator = (StdDevStrategyVectorManipulator)es.StrategyParameterManipulator;
-      strategyManipulator.BoundsParameter.Value = new DoubleMatrix(new double[,] { { 1E-12, 30 } });
-      strategyManipulator.GeneralLearningRateParameter.Value = new DoubleValue(0.22360679774997896);
-      strategyManipulator.LearningRateParameter.Value = new DoubleValue(0.39763536438352531);
-      #endregion
-      return es;
-    }
-    #endregion
-    #endregion
-
-    #region Island GA
-    #region TSP
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateIslandGaTspSampleTest() {
-      var ga = CreateIslandGaTspSample();
-      XmlGenerator.Serialize(ga, @"Samples\IslandGA_TSP.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunIslandGaTspSampleTest() {
-      var ga = CreateIslandGaTspSample();
-      ga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ga);
-      Assert.AreEqual(9918, SamplesUtils.GetDoubleResult(ga, "BestQuality"));
-      Assert.AreEqual(10324.64, SamplesUtils.GetDoubleResult(ga, "CurrentAverageQuality"));
-      Assert.AreEqual(11823, SamplesUtils.GetDoubleResult(ga, "CurrentWorstQuality"));
-      Assert.AreEqual(495500, SamplesUtils.GetIntResult(ga, "EvaluatedSolutions"));
-    }
-
-    private IslandGeneticAlgorithm CreateIslandGaTspSample() {
-      IslandGeneticAlgorithm ga = new IslandGeneticAlgorithm();
-      #region Problem Configuration
-      var provider = new TSPLIBTSPInstanceProvider();
-      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
-      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
-      tspProblem.Load(provider.LoadData(instance));
-      tspProblem.UseDistanceMatrix.Value = true;
-      #endregion
-      #region Algorithm Configuration
-      ga.Name = "Island Genetic Algorithm - TSP";
-      ga.Description = "An island genetic algorithm which solves the \"ch130\" traveling salesman problem (imported from TSPLIB)";
-      ga.Problem = tspProblem;
-      SamplesUtils.ConfigureIslandGeneticAlgorithmParameters<ProportionalSelector, OrderCrossover2, InversionManipulator,
-        UnidirectionalRingMigrator, BestSelector, WorstReplacer>(
-        ga, 100, 1, 1000, 0.05, 5, 50, 0.25);
-      #endregion
-      return ga;
-    }
-    #endregion
-    #endregion
-
-    #region LS
-    #region Knapsack
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateLocalSearchKnapsackSampleTest() {
-      var ls = CreateLocalSearchKnapsackSample();
-      XmlGenerator.Serialize(ls, @"Samples\LS_Knapsack.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "medium")]
-    public void RunLocalSearchKnapsackSampleTest() {
-      var ls = CreateLocalSearchKnapsackSample();
-      ls.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ls);
-      Assert.AreEqual(345, SamplesUtils.GetDoubleResult(ls, "BestQuality"));
-      Assert.AreEqual(340.70731707317071, SamplesUtils.GetDoubleResult(ls, "CurrentAverageQuality"));
-      Assert.AreEqual(337, SamplesUtils.GetDoubleResult(ls, "CurrentWorstQuality"));
-      Assert.AreEqual(82000, SamplesUtils.GetIntResult(ls, "EvaluatedMoves"));
-    }
-
-    private LocalSearch CreateLocalSearchKnapsackSample() {
-      LocalSearch ls = new LocalSearch();
-      #region Problem Configuration
-      KnapsackProblem problem = new KnapsackProblem();
-      problem.BestKnownQuality = new DoubleValue(362);
-      problem.BestKnownSolution = new HeuristicLab.Encodings.BinaryVectorEncoding.BinaryVector(new bool[] { 
-       true , false, false, true , true , true , true , true , false, true , true , true , true , true , true , false, true , false, true , true , false, true , true , false, true , false, true , true , true , false, true , true , false, true , true , false, true , false, true , true , true , true , true , true , true , true , true , true , true , true , true , false, true , false, false, true , true , false, true , true , true , true , true , true , true , true , false, true , false, true , true , true , true , false, true , true , true , true , true , true , true , true});
-      problem.EvaluatorParameter.Value = new KnapsackEvaluator();
-      problem.SolutionCreatorParameter.Value = new RandomBinaryVectorCreator();
-      problem.KnapsackCapacity.Value = 297;
-      problem.Maximization.Value = true;
-      problem.Penalty.Value = 1;
-      problem.Values = new IntArray(new int[] { 
-  6, 1, 1, 6, 7, 8, 7, 4, 2, 5, 2, 6, 7, 8, 7, 1, 7, 1, 9, 4, 2, 6, 5,  3, 5, 3, 3, 6, 5, 2, 4, 9, 4, 5, 7, 1, 4, 3, 5, 5, 8, 3, 6, 7, 3, 9, 7, 7, 5, 5, 7, 1, 4, 4, 3, 9, 5, 1, 6, 2, 2, 6, 1, 6, 5, 4, 4, 7, 1,  8, 9, 9, 7, 4, 3, 8, 7, 5, 7, 4, 4, 5});
-      problem.Weights = new IntArray(new int[] { 
- 1, 9, 3, 6, 5, 3, 8, 1, 7, 4, 2, 1, 2, 7, 9, 9, 8, 4, 9, 2, 4, 8, 3, 7, 5, 7, 5, 5, 1, 9, 8, 7, 8, 9, 1, 3, 3, 8, 8, 5, 1, 2, 4, 3, 6, 9, 4, 4, 9, 7, 4, 5, 1, 9, 7, 6, 7, 4, 7, 1, 2, 1, 2, 9, 8, 6, 8, 4, 7, 6, 7, 5, 3, 9, 4, 7, 4, 6, 1, 2, 5, 4});
-      problem.Name = "Knapsack Problem";
-      problem.Description = "Represents a Knapsack problem.";
-      #endregion
-      #region Algorithm Configuration
-      ls.Name = "Local Search - Knapsack";
-      ls.Description = "A local search algorithm that solves a randomly generated Knapsack problem";
-      ls.Problem = problem;
-      ls.MaximumIterations.Value = 1000;
-      ls.MoveEvaluator = ls.MoveEvaluatorParameter.ValidValues
-        .OfType<KnapsackOneBitflipMoveEvaluator>()
-        .Single();
-      ls.MoveGenerator = ls.MoveGeneratorParameter.ValidValues
-        .OfType<ExhaustiveOneBitflipMoveGenerator>()
-        .Single();
-      ls.MoveMaker = ls.MoveMakerParameter.ValidValues
-        .OfType<OneBitflipMoveMaker>()
-        .Single();
-      ls.SampleSize.Value = 100;
-      ls.Seed.Value = 0;
-      ls.SetSeedRandomly.Value = true;
-      #endregion
-      ls.Engine = new ParallelEngine.ParallelEngine();
-      return ls;
-    }
-    #endregion
-    #endregion
-
-    #region PSO
-    #region Schwefel
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreatePsoSchwefelSampleTest() {
-      var pso = CreatePsoSchwefelSample();
-      XmlGenerator.Serialize(pso, @"Samples\PSO_Schwefel.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "medium")]
-    public void RunPsoSchwefelSampleTest() {
-      var pso = CreatePsoSchwefelSample();
-      pso.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(pso);
-      if (!Environment.Is64BitProcess) {
-        Assert.AreEqual(118.44027985932837, SamplesUtils.GetDoubleResult(pso, "BestQuality"));
-        Assert.AreEqual(140.71570105946438, SamplesUtils.GetDoubleResult(pso, "CurrentAverageQuality"));
-        Assert.AreEqual(220.956806502853, SamplesUtils.GetDoubleResult(pso, "CurrentWorstQuality"));
-        Assert.AreEqual(1000, SamplesUtils.GetIntResult(pso, "Iterations"));
-      } else {
-        Assert.AreEqual(118.43958282879345, SamplesUtils.GetDoubleResult(pso, "BestQuality"));
-        Assert.AreEqual(139.43946864779372, SamplesUtils.GetDoubleResult(pso, "CurrentAverageQuality"));
-        Assert.AreEqual(217.14654589055152, SamplesUtils.GetDoubleResult(pso, "CurrentWorstQuality"));
-        Assert.AreEqual(1000, SamplesUtils.GetIntResult(pso, "Iterations"));
-      }
-    }
-    private ParticleSwarmOptimization CreatePsoSchwefelSample() {
-      ParticleSwarmOptimization pso = new ParticleSwarmOptimization();
-      #region Problem Configuration
-      var problem = new SingleObjectiveTestFunctionProblem();
-      problem.BestKnownQuality.Value = 0.0;
-      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 420.968746, 420.968746 });
-      problem.Bounds = new DoubleMatrix(new double[,] { { -500, 500 } });
-      problem.EvaluatorParameter.Value = new SchwefelEvaluator();
-      problem.Maximization.Value = false;
-      problem.ProblemSize.Value = 2;
-      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
-      #endregion
-      #region Algorithm Configuration
-      pso.Name = "Particle Swarm Optimization - Schwefel";
-      pso.Description = "A particle swarm optimization algorithm which solves the 2-dimensional Schwefel test function (based on the description in Pedersen, M.E.H. (2010). PhD thesis. University of Southampton)";
-      pso.Problem = problem;
-      pso.Inertia.Value = 10;
-      pso.MaxIterations.Value = 1000;
-      pso.NeighborBestAttraction.Value = 0.5;
-      pso.PersonalBestAttraction.Value = -0.01;
-      pso.SwarmSize.Value = 50;
-
-      var inertiaUpdater = pso.InertiaUpdaterParameter.ValidValues
-        .OfType<ExponentialDiscreteDoubleValueModifier>()
-        .Single();
-      inertiaUpdater.StartValueParameter.Value = new DoubleValue(10);
-      inertiaUpdater.EndValueParameter.Value = new DoubleValue(1);
-      pso.InertiaUpdater = inertiaUpdater;
-
-      pso.ParticleCreator = pso.ParticleCreatorParameter.ValidValues
-        .OfType<RealVectorParticleCreator>()
-        .Single();
-      var swarmUpdater = pso.SwarmUpdaterParameter.ValidValues
-        .OfType<RealVectorSwarmUpdater>()
-        .Single();
-      swarmUpdater.VelocityBoundsIndexParameter.ActualName = "Iterations";
-      swarmUpdater.VelocityBoundsParameter.Value = new DoubleMatrix(new double[,] { { -10, 10 } });
-      swarmUpdater.VelocityBoundsStartValueParameter.Value = new DoubleValue(10.0);
-      swarmUpdater.VelocityBoundsEndValueParameter.Value = new DoubleValue(1.0);
-      swarmUpdater.VelocityBoundsScalingOperatorParameter.Value = swarmUpdater.VelocityBoundsScalingOperatorParameter.ValidValues
-        .OfType<ExponentialDiscreteDoubleValueModifier>()
-        .Single();
-
-      pso.TopologyInitializer = null;
-      pso.TopologyUpdater = null;
-      pso.SwarmUpdater = swarmUpdater;
-      pso.Seed.Value = 0;
-      pso.SetSeedRandomly.Value = true;
-      #endregion
-      pso.Engine = new ParallelEngine.ParallelEngine();
-      return pso;
-    }
-    #endregion
-    #endregion
-
-    #region SA
-    #region Rastrigin
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateSimulatedAnnealingRastriginSampleTest() {
-      var sa = CreateSimulatedAnnealingRastriginSample();
-      XmlGenerator.Serialize(sa, @"Samples\SA_Rastrigin.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "medium")]
-    public void RunSimulatedAnnealingRastriginSampleTest() {
-      var sa = CreateSimulatedAnnealingRastriginSample();
-      sa.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(sa);
-      Assert.AreEqual(0.00014039606034543795, SamplesUtils.GetDoubleResult(sa, "BestQuality"));
-      Assert.AreEqual(5000, SamplesUtils.GetIntResult(sa, "EvaluatedMoves"));
-    }
-    private SimulatedAnnealing CreateSimulatedAnnealingRastriginSample() {
-      SimulatedAnnealing sa = new SimulatedAnnealing();
-      #region Problem Configuration
-      var problem = new SingleObjectiveTestFunctionProblem();
-      problem.BestKnownQuality.Value = 0.0;
-      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 0, 0 });
-      problem.Bounds = new DoubleMatrix(new double[,] { { -5.12, 5.12 } });
-      problem.EvaluatorParameter.Value = new RastriginEvaluator();
-      problem.Maximization.Value = false;
-      problem.ProblemSize.Value = 2;
-      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
-      #endregion
-      #region Algorithm Configuration
-      sa.Name = "Simulated Annealing - Rastrigin";
-      sa.Description = "A simulated annealing algorithm that solves the 2-dimensional Rastrigin test function";
-      sa.Problem = problem;
-      var annealingOperator = sa.AnnealingOperatorParameter.ValidValues
-        .OfType<ExponentialDiscreteDoubleValueModifier>()
-        .Single();
-      annealingOperator.StartIndexParameter.Value = new IntValue(0);
-      sa.AnnealingOperator = annealingOperator;
-
-      sa.EndTemperature.Value = 1E-6;
-      sa.InnerIterations.Value = 50;
-      sa.MaximumIterations.Value = 100;
-      var moveEvaluator = sa.MoveEvaluatorParameter.ValidValues
-        .OfType<RastriginAdditiveMoveEvaluator>()
-        .Single();
-      moveEvaluator.A.Value = 10;
-      sa.MoveEvaluator = moveEvaluator;
-
-      var moveGenerator = sa.MoveGeneratorParameter.ValidValues
-        .OfType<StochasticNormalMultiMoveGenerator>()
-        .Single();
-      moveGenerator.SigmaParameter.Value = new DoubleValue(1);
-      sa.MoveGenerator = moveGenerator;
-
-      sa.MoveMaker = sa.MoveMakerParameter.ValidValues
-        .OfType<AdditiveMoveMaker>()
-        .Single();
-
-      sa.Seed.Value = 0;
-      sa.SetSeedRandomly.Value = true;
-      sa.StartTemperature.Value = 1;
-      #endregion
-      sa.Engine = new ParallelEngine.ParallelEngine();
-      return sa;
-    }
-    #endregion
-    #endregion
-
-    #region TS
-    #region TSP
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateTabuSearchTspSampleTest() {
-      var ts = CreateTabuSearchTspSample();
-      XmlGenerator.Serialize(ts, @"Samples\TS_TSP.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunTabuSearchTspSampleTest() {
-      var ts = CreateTabuSearchTspSample();
-      ts.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ts);
-      Assert.AreEqual(6294, SamplesUtils.GetDoubleResult(ts, "BestQuality"));
-      Assert.AreEqual(7380.0386666666664, SamplesUtils.GetDoubleResult(ts, "CurrentAverageQuality"));
-      Assert.AreEqual(8328, SamplesUtils.GetDoubleResult(ts, "CurrentWorstQuality"));
-      Assert.AreEqual(750000, SamplesUtils.GetIntResult(ts, "EvaluatedMoves"));
-    }
-
-    private TabuSearch CreateTabuSearchTspSample() {
-      TabuSearch ts = new TabuSearch();
-      #region Problem Configuration
-      var provider = new TSPLIBTSPInstanceProvider();
-      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
-      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
-      tspProblem.Load(provider.LoadData(instance));
-      tspProblem.UseDistanceMatrix.Value = true;
-      #endregion
-      #region Algorithm Configuration
-      ts.Name = "Tabu Search - TSP";
-      ts.Description = "A tabu search algorithm that solves the \"ch130\" TSP (imported from TSPLIB)";
-      ts.Problem = tspProblem;
-
-      ts.MaximumIterations.Value = 1000;
-      // move generator has to be set first
-      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
-        .OfType<StochasticInversionMultiMoveGenerator>()
-        .Single();
-      ts.MoveGenerator = moveGenerator;
-      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
-        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
-        .Single();
-      ts.MoveEvaluator = moveEvaluator;
-      var moveMaker = ts.MoveMakerParameter.ValidValues
-        .OfType<InversionMoveMaker>()
-        .Single();
-      ts.MoveMaker = moveMaker;
-      ts.SampleSize.Value = 750;
-      ts.Seed.Value = 0;
-      ts.SetSeedRandomly.Value = true;
-
-      var tabuChecker = ts.TabuCheckerParameter.ValidValues
-        .OfType<InversionMoveSoftTabuCriterion>()
-        .Single();
-      tabuChecker.UseAspirationCriterion.Value = true;
-      ts.TabuChecker = tabuChecker;
-
-      var tabuMaker = ts.TabuMakerParameter.ValidValues
-        .OfType<InversionMoveTabuMaker>()
-        .Single();
-      ts.TabuMaker = tabuMaker;
-      ts.TabuTenure.Value = 60;
-
-      #endregion
-      ts.Engine = new ParallelEngine.ParallelEngine();
-      return ts;
-    }
-    #endregion
-
-    #region VRP
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateTabuSearchVRPSampleTest() {
-      var vrp = CreateTabuSearchVrpSample();
-      XmlGenerator.Serialize(vrp, @"Samples\TS_VRP.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunTabuSearchVRPSampleTest() {
-      var vrp = CreateTabuSearchVrpSample();
-      vrp.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(vrp);
-      Assert.AreEqual(1473, SamplesUtils.GetDoubleResult(vrp, "BestQuality"));
-      Assert.AreEqual(2102.1192622950812, SamplesUtils.GetDoubleResult(vrp, "CurrentAverageQuality"));
-      Assert.AreEqual(4006, SamplesUtils.GetDoubleResult(vrp, "CurrentWorstQuality"));
-      Assert.AreEqual(119072, SamplesUtils.GetIntResult(vrp, "EvaluatedMoves"));
-    }
-
-    private TabuSearch CreateTabuSearchVrpSample() {
-      TabuSearch ts = new TabuSearch();
-      #region Problem Configuration
-      var provider = new AugeratInstanceProvider();
-      var instance = provider.GetDataDescriptors().Where(x => x.Name == "A-n62-k8").Single();
-      VehicleRoutingProblem vrpProblem = new VehicleRoutingProblem();
-      vrpProblem.Load(provider.LoadData(instance));
-      #endregion
-      #region Algorithm Configuration
-      ts.Name = "Tabu Search - VRP";
-      ts.Description = "A tabu search algorithm that solves the \"A-n62-k8\" VRP (imported from Augerat)";
-      ts.Problem = vrpProblem;
-
-      ts.MaximumIterations.Value = 200;
-      // move generator has to be set first
-      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
-        .OfType<PotvinCustomerRelocationExhaustiveMoveGenerator>()
-        .Single();
-      ts.MoveGenerator = moveGenerator;
-      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
-        .OfType<PotvinCustomerRelocationMoveEvaluator>()
-        .Single();
-      ts.MoveEvaluator = moveEvaluator;
-      var moveMaker = ts.MoveMakerParameter.ValidValues
-        .OfType<PotvinCustomerRelocationMoveMaker>()
-        .Single();
-      ts.MoveMaker = moveMaker;
-      ts.SampleSize.Value = 1000;
-      ts.Seed.Value = 0;
-      ts.SetSeedRandomly.Value = true;
-
-      var tabuChecker = ts.TabuCheckerParameter.ValidValues
-        .OfType<PotvinCustomerRelocationMoveTabuCriterion>()
-        .Single();
-      tabuChecker.UseAspirationCriterion.Value = false;
-      ts.TabuChecker = tabuChecker;
-
-      var tabuMaker = ts.TabuMakerParameter.ValidValues
-        .OfType<PotvinCustomerRelocationMoveTabuMaker>()
-        .Single();
-      ts.TabuMaker = tabuMaker;
-      ts.TabuTenure.Value = 6;
-
-      #endregion
-      ts.Engine = new ParallelEngine.ParallelEngine();
-      return ts;
-    }
-    #endregion
-    #endregion
-
-    #region VNS
-    #region TSP
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateVnsTspSampleTest() {
-      var vns = CreateVnsTspSample();
-      XmlGenerator.Serialize(vns, @"Samples\VNS_TSP.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunVnsTspSampleTest() {
-      var vns = CreateVnsTspSample();
-      vns.SetSeedRandomly = false;
-      SamplesUtils.RunAlgorithm(vns);
-      Assert.AreEqual(867, SamplesUtils.GetDoubleResult(vns, "BestQuality"));
-      Assert.AreEqual(867, SamplesUtils.GetDoubleResult(vns, "CurrentAverageQuality"));
-      Assert.AreEqual(867, SamplesUtils.GetDoubleResult(vns, "CurrentWorstQuality"));
-      Assert.AreEqual(12975173, SamplesUtils.GetIntResult(vns, "EvaluatedSolutions"));
-    }
-
-    private VariableNeighborhoodSearch CreateVnsTspSample() {
-      VariableNeighborhoodSearch vns = new VariableNeighborhoodSearch();
-      #region Problem Configuration
-      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
-      tspProblem.BestKnownSolution = new Permutation(PermutationTypes.Absolute, new int[] {
-117, 65, 73, 74, 75, 76, 82, 86, 87, 94, 100, 106, 115, 120, 124, 107, 101, 108, 109, 102, 97, 90, 96, 95, 88, 89, 84, 78, 69, 57, 68, 56, 44, 55, 45, 36, 46, 37, 38, 47, 48, 59, 49, 58, 70, 77, 83, 79, 50, 80, 85, 98, 103, 110, 116, 121, 125, 133, 132, 138, 139, 146, 147, 159, 168, 169, 175, 182, 188, 201, 213, 189, 214, 221, 230, 246, 262, 276, 284, 275, 274, 261, 245, 229, 220, 228, 243, 259, 273, 282, 272, 258, 242, 257, 293, 292, 302, 310, 319, 320, 327, 326, 333, 340, 346, 339, 345, 344, 337, 338, 332, 325, 318, 309, 301, 291, 271, 251, 270, 233, 250, 269, 268, 280, 290, 300, 415, 440, 416, 417, 441, 458, 479, 418, 419, 395, 420, 442, 421, 396, 397, 422, 423, 461, 481, 502, 460, 501, 459, 480, 500, 517, 531, 516, 530, 499, 478, 457, 439, 414, 413, 412, 438, 456, 477, 498, 515, 529, 538, 547, 558, 559, 560, 548, 539, 549, 561, 562, 551, 550, 532, 540, 533, 541, 518, 534, 542, 552, 553, 554, 555, 535, 543, 556, 544, 536, 522, 505, 521, 520, 504, 519, 503, 482, 462, 463, 464, 483, 443, 465, 484, 506, 485, 507, 508, 487, 467, 486, 466, 445, 428, 444, 424, 425, 426, 427, 398, 399, 400, 381, 382, 371, 372, 401, 429, 446, 430, 402, 383, 366, 356, 357, 352, 385, 384, 403, 431, 447, 469, 468, 488, 489, 490, 470, 471, 448, 432, 433, 404, 405, 386, 373, 374, 367, 376, 375, 387, 491, 509, 537, 510, 492, 472, 449, 388, 389, 406, 450, 407, 377, 368, 359, 354, 350, 335, 324, 330, 390, 434, 451, 473, 493, 511, 523, 545, 563, 565, 567, 570, 569, 578, 577, 576, 575, 574, 573, 572, 580, 584, 583, 582, 587, 586, 585, 581, 579, 571, 568, 566, 564, 557, 546, 527, 513, 526, 525, 524, 512, 495, 494, 474, 452, 436, 409, 435, 453, 475, 496, 514, 528, 497, 455, 476, 454, 437, 411, 410, 394, 393, 392, 380, 370, 379, 408, 391, 378, 369, 364, 365, 361, 355, 351, 343, 336, 331, 317, 299, 286, 287, 278, 263, 264, 265, 223, 202, 248, 266, 279, 288, 289, 281, 267, 249, 232, 224, 216, 215, 204, 192, 193, 194, 186, 179, 185, 203, 191, 190, 177, 171, 161, 128, 135, 140, 149, 162, 150, 163, 172, 178, 173, 164, 152, 151, 141, 153, 165, 154, 142, 155, 143, 137, 136, 130, 129, 118, 114, 113, 105, 119, 123, 131, 144, 156, 157, 145, 158, 166, 167, 174, 180, 181, 187, 195, 205, 217, 226, 236, 225, 234, 252, 235, 253, 254, 255, 238, 239, 240, 241, 256, 237, 206, 207, 208, 196, 197, 198, 209, 199, 200, 211, 212, 219, 210, 218, 227, 244, 260, 283, 294, 295, 303, 296, 311, 304, 297, 298, 305, 285, 306, 314, 329, 321, 313, 312, 328, 334, 341, 347, 348, 353, 358, 362, 363, 360, 349, 342, 322, 323, 315, 316, 308, 307, 277, 247, 231, 222, 184, 183, 176, 170, 160, 148, 134, 127, 126, 111, 104, 92, 91, 71, 60, 51, 52, 40, 32, 23, 21, 20, 18, 17, 16, 14, 13, 11, 10, 7, 6, 5, 2, 1, 0, 3, 4, 31, 39, 25, 30, 35, 34, 33, 43, 54, 42, 27, 28, 29, 9, 8, 12, 15, 19, 22, 24, 26, 41, 67, 66, 64, 63, 53, 62, 61, 72, 81, 93, 99, 112, 122, 
-      });
-      tspProblem.Coordinates = new DoubleMatrix(new double[,] {
-{48, 71}, {49, 71}, {50, 71}, {44, 70}, {45, 70}, {52, 70}, {53, 70}, {54, 70}, {41, 69}, {42, 69}, {55, 69}, {56, 69}, {40, 68}, {56, 68}, {57, 68}, {39, 67}, {57, 67}, {58, 67}, {59, 67}, {38, 66}, {59, 66}, {60, 66}, {37, 65}, {60, 65}, {36, 64}, {43, 64}, {35, 63}, {37, 63}, {41, 63}, {42, 63}, {43, 63}, {47, 63}, {61, 63}, {40, 62}, {41, 62}, {42, 62}, {43, 62}, {45, 62}, {46, 62}, {47, 62}, {62, 62}, {34, 61}, {38, 61}, {39, 61}, {42, 61}, {43, 61}, {44, 61}, {45, 61}, {46, 61}, {47, 61}, {52, 61}, {62, 61}, {63, 61}, {26, 60}, {38, 60}, {42, 60}, {43, 60}, {44, 60}, {46, 60}, {47, 60}, {63, 60}, {23, 59}, {24, 59}, {27, 59}, {29, 59}, {30, 59}, {31, 59}, {33, 59}, {42, 59}, {46, 59}, {47, 59}, {63, 59}, {21, 58}, {32, 58}, {33, 58}, {34, 58}, {35, 58}, {46, 58}, {47, 58}, {48, 58}, {53, 58}, {21, 57}, {35, 57}, {47, 57}, {48, 57}, {53, 57}, {36, 56}, {37, 56}, {46, 56}, {47, 56}, {48, 56}, {64, 56}, {65, 56}, {20, 55}, {38, 55}, {46, 55}, {47, 55}, {48, 55}, {52, 55}, {21, 54}, {40, 54}, {47, 54}, {48, 54}, {52, 54}, {65, 54}, {30, 53}, {41, 53}, {46, 53}, {47, 53}, {48, 53}, {52, 53}, {65, 53}, {21, 52}, {32, 52}, {33, 52}, {42, 52}, {51, 52}, {21, 51}, {33, 51}, {34, 51}, {43, 51}, {51, 51}, {21, 50}, {35, 50}, {44, 50}, {50, 50}, {66, 50}, {67, 50}, {21, 49}, {34, 49}, {36, 49}, {37, 49}, {46, 49}, {49, 49}, {67, 49}, {22, 48}, {36, 48}, {37, 48}, {46, 48}, {47, 48}, {22, 47}, {30, 47}, {34, 47}, {37, 47}, {38, 47}, {39, 47}, {47, 47}, {48, 47}, {67, 47}, {23, 46}, {28, 46}, {29, 46}, {30, 46}, {31, 46}, {32, 46}, {35, 46}, {37, 46}, {38, 46}, {39, 46}, {49, 46}, {67, 46}, {23, 45}, {28, 45}, {29, 45}, {31, 45}, {32, 45}, {40, 45}, {41, 45}, {49, 45}, {50, 45}, {68, 45}, {24, 44}, {29, 44}, {32, 44}, {41, 44}, {51, 44}, {68, 44}, {25, 43}, {30, 43}, {32, 43}, {42, 43}, {43, 43}, {51, 43}, {68, 43}, {69, 43}, {31, 42}, {32, 42}, {43, 42}, {52, 42}, {55, 42}, {26, 41}, {27, 41}, {31, 41}, {32, 41}, {33, 41}, {44, 41}, {45, 41}, {46, 41}, {47, 41}, {48, 41}, {49, 41}, {53, 41}, {25, 40}, {27, 40}, {32, 40}, {43, 40}, {44, 40}, {45, 40}, {46, 40}, {48, 40}, {49, 40}, {50, 40}, {51, 40}, {53, 40}, {56, 40}, {32, 39}, {33, 39}, {43, 39}, {50, 39}, {51, 39}, {54, 39}, {56, 39}, {69, 39}, {24, 38}, {32, 38}, {41, 38}, {42, 38}, {51, 38}, {52, 38}, {54, 38}, {57, 38}, {69, 38}, {31, 37}, {32, 37}, {40, 37}, {41, 37}, {42, 37}, {43, 37}, {44, 37}, {45, 37}, {46, 37}, {47, 37}, {48, 37}, {51, 37}, {52, 37}, {55, 37}, {57, 37}, {69, 37}, {24, 36}, {31, 36}, {32, 36}, {39, 36}, {40, 36}, {41, 36}, {42, 36}, {43, 36}, {45, 36}, {48, 36}, {49, 36}, {51, 36}, {53, 36}, {55, 36}, {58, 36}, {22, 35}, {23, 35}, {24, 35}, {25, 35}, {30, 35}, {31, 35}, {32, 35}, {39, 35}, {41, 35}, {49, 35}, {51, 35}, {55, 35}, {56, 35}, {58, 35}, {71, 35}, {20, 34}, {27, 34}, {30, 34}, {31, 34}, {51, 34}, {53, 34}, {57, 34}, {60, 34}, {18, 33}, {19, 33}, {29, 33}, {30, 33}, {31, 33}, {45, 33}, {46, 33}, {47, 33}, {52, 33}, {53, 33}, {55, 33}, {57, 33}, {58, 33}, {17, 32}, {30, 32}, {44, 32}, {47, 32}, {54, 32}, {57, 32}, {59, 32}, {61, 32}, {71, 32}, {72, 32}, {43, 31}, {47, 31}, {56, 31}, {58, 31}, {59, 31}, {61, 31}, {72, 31}, {74, 31}, {16, 30}, {43, 30}, {46, 30}, {47, 30}, {59, 30}, {63, 30}, {71, 30}, {75, 30}, {43, 29}, {46, 29}, {47, 29}, {59, 29}, {60, 29}, {75, 29}, {15, 28}, {43, 28}, {46, 28}, {61, 28}, {76, 28}, {15, 27}, {43, 27}, {44, 27}, {45, 27}, {46, 27}, {60, 27}, {62, 27}, {15, 26}, {43, 26}, {44, 26}, {46, 26}, {59, 26}, {60, 26}, {64, 26}, {77, 26}, {15, 25}, {58, 25}, {61, 25}, {77, 25}, {15, 24}, {53, 24}, {55, 24}, {61, 24}, {77, 24}, {62, 23}, {16, 22}, {61, 22}, {62, 22}, {15, 21}, {16, 21}, {52, 21}, {63, 21}, {77, 21}, {16, 20}, {17, 20}, {46, 20}, {47, 20}, {60, 20}, {62, 20}, {63, 20}, {65, 20}, {76, 20}, {15, 19}, {17, 19}, {18, 19}, {44, 19}, {45, 19}, {48, 19}, {53, 19}, {56, 19}, {60, 19}, {62, 19}, {67, 19}, {68, 19}, {76, 19}, {15, 18}, {18, 18}, {19, 18}, {20, 18}, {32, 18}, {33, 18}, {34, 18}, {41, 18}, {42, 18}, {43, 18}, {46, 18}, {48, 18}, {53, 18}, {59, 18}, {60, 18}, {69, 18}, {75, 18}, {16, 17}, {17, 17}, {20, 17}, {21, 17}, {22, 17}, {23, 17}, {24, 17}, {26, 17}, {28, 17}, {29, 17}, {30, 17}, {31, 17}, {32, 17}, {34, 17}, {35, 17}, {36, 17}, {37, 17}, {38, 17}, {39, 17}, {40, 17}, {44, 17}, {46, 17}, {48, 17}, {53, 17}, {56, 17}, {58, 17}, {75, 17}, {17, 16}, {18, 16}, {20, 16}, {24, 16}, {26, 16}, {27, 16}, {29, 16}, {33, 16}, {41, 16}, {42, 16}, {44, 16}, {47, 16}, {52, 16}, {57, 16}, {70, 16}, {73, 16}, {74, 16}, {17, 15}, {18, 15}, {20, 15}, {22, 15}, {24, 15}, {27, 15}, {29, 15}, {31, 15}, {33, 15}, {35, 15}, {36, 15}, {38, 15}, {39, 15}, {42, 15}, {45, 15}, {47, 15}, {52, 15}, {53, 15}, {55, 15}, {56, 15}, {70, 15}, {73, 15}, {17, 14}, {19, 14}, {21, 14}, {24, 14}, {26, 14}, {29, 14}, {31, 14}, {34, 14}, {37, 14}, {40, 14}, {42, 14}, {44, 14}, {46, 14}, {47, 14}, {53, 14}, {54, 14}, {55, 14}, {62, 14}, {70, 14}, {72, 14}, {17, 13}, {19, 13}, {21, 13}, {23, 13}, {25, 13}, {27, 13}, {30, 13}, {32, 13}, {34, 13}, {36, 13}, {38, 13}, {41, 13}, {43, 13}, {44, 13}, {45, 13}, {60, 13}, {70, 13}, {71, 13}, {18, 12}, {21, 12}, {23, 12}, {26, 12}, {28, 12}, {31, 12}, {34, 12}, {37, 12}, {39, 12}, {41, 12}, {42, 12}, {70, 12}, {18, 11}, {19, 11}, {20, 11}, {21, 11}, {24, 11}, {25, 11}, {27, 11}, {29, 11}, {31, 11}, {33, 11}, {35, 11}, {38, 11}, {41, 11}, {59, 11}, {26, 10}, {29, 10}, {32, 10}, {34, 10}, {36, 10}, {39, 10}, {40, 10}, {69, 10}, {21, 9}, {26, 9}, {28, 9}, {30, 9}, {32, 9}, {33, 9}, {35, 9}, {36, 9}, {37, 9}, {38, 9}, {39, 9}, {22, 8}, {27, 8}, {28, 8}, {29, 8}, {30, 8}, {31, 8}, {68, 8}, {23, 7}, {66, 7}, {24, 6}, {65, 6}, {25, 5}, {62, 5}, {63, 5}, {26, 4}, {55, 4}, {56, 4}, {57, 4}, {58, 4}, {59, 4}, {60, 4}, {61, 4}, {28, 3}, {53, 3}, {29, 2}, {50, 2}, {51, 2}, {52, 2}, {31, 1}, {32, 1}, {48, 1}
-      });
-      tspProblem.BestKnownQuality = new DoubleValue(867);
-
-      tspProblem.EvaluatorParameter.Value = new TSPRoundedEuclideanPathEvaluator();
-      tspProblem.SolutionCreatorParameter.Value = new RandomPermutationCreator();
-      tspProblem.UseDistanceMatrix.Value = true;
-      tspProblem.Name = "Funny TSP";
-      tspProblem.Description = "Represents a symmetric Traveling Salesman Problem.";
-      #endregion
-      #region Algorithm Configuration
-      vns.Name = "Variable Neighborhood Search - TSP";
-      vns.Description = "A variable neighborhood search algorithm which solves a funny TSP instance";
-      vns.Problem = tspProblem;
-
-      var localImprovement = vns.LocalImprovementParameter.ValidValues
-        .OfType<LocalSearchImprovementOperator>()
-        .Single();
-      // move generator has to be set first
-      localImprovement.MoveGenerator = localImprovement.MoveGeneratorParameter.ValidValues
-        .OfType<StochasticInversionMultiMoveGenerator>()
-        .Single();
-      localImprovement.MoveEvaluator = localImprovement.MoveEvaluatorParameter.ValidValues
-        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
-        .Single();
-      localImprovement.MoveMaker = localImprovement.MoveMakerParameter.ValidValues
-        .OfType<InversionMoveMaker>()
-        .Single();
-      localImprovement.SampleSizeParameter.Value = new IntValue(500);
-      vns.LocalImprovement = localImprovement;
-
-      vns.LocalImprovementMaximumIterations = 150;
-      vns.MaximumIterations = 25;
-      vns.Seed = 0;
-      vns.SetSeedRandomly = true;
-      var shakingOperator = vns.ShakingOperatorParameter.ValidValues
-        .OfType<PermutationShakingOperator>()
-        .Single();
-      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
-        .OfType<Swap2Manipulator>()
-        .Single(), false);
-      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
-        .OfType<Swap3Manipulator>()
-        .Single(), false);
-      vns.ShakingOperator = shakingOperator;
-      #endregion
-      vns.Engine = new ParallelEngine.ParallelEngine();
-      return vns;
-    }
-    #endregion
-    #endregion
-
-    #region Gaussian Process Regression
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateGaussianProcessRegressionSampleTest() {
-      var gpr = CreateGaussianProcessRegressionSample();
-      XmlGenerator.Serialize(gpr, @"Samples\GPR.hl");
-    }
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunGaussianProcessRegressionSample() {
-      var gpr = CreateGaussianProcessRegressionSample();
-      gpr.SetSeedRandomly = false;
-      gpr.Seed = 1618551877;
-      SamplesUtils.RunAlgorithm(gpr);
-      Assert.AreEqual(-940.39914958616748, SamplesUtils.GetDoubleResult(gpr, "NegativeLogLikelihood"));
-      Assert.AreEqual(0.995614091354263, SamplesUtils.GetDoubleResult(gpr, "Training R²"));
-    }
-
-    private GaussianProcessRegression CreateGaussianProcessRegressionSample() {
-      var gpr = new GaussianProcessRegression();
-      var provider = new VariousInstanceProvider();
-      var instance = provider.GetDataDescriptors().Where(x => x.Name.Contains("Spatial co-evolution")).Single();
-      var regProblem = new RegressionProblem();
-      regProblem.Load(provider.LoadData(instance));
-      #region Algorithm Configuration
-      gpr.Name = "Gaussian Process Regression";
-      gpr.Description = "A Gaussian process regression algorithm which solves the spatial co-evolution benchmark problem";
-      gpr.Problem = regProblem;
-
-      gpr.CovarianceFunction = new CovarianceSquaredExponentialIso();
-      gpr.MeanFunction = new MeanConst();
-      gpr.MinimizationIterations = 20;
-      gpr.Seed = 0;
-      gpr.SetSeedRandomly = true;
-      #endregion
-      gpr.Engine = new ParallelEngine.ParallelEngine();
-      return gpr;
-    }
-    #endregion
-
-    #region Scatter Search
-    #region VRP
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateScatterSearchVRPSampleTest() {
-      var ss = CreateScatterSearchVRPSample();
-      XmlGenerator.Serialize(ss, @"Samples\SS_VRP.hl");
-    }
-
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunScatterSearchVRPSampleTest() {
-      var ss = CreateScatterSearchVRPSample();
-      ss.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ss);
-      Assert.AreEqual(828.93686694283383, SamplesUtils.GetDoubleResult(ss, "BestQuality"));
-      Assert.AreEqual(868.63623986983077, SamplesUtils.GetDoubleResult(ss, "CurrentAverageQuality"));
-      Assert.AreEqual(1048.8333559209832, SamplesUtils.GetDoubleResult(ss, "CurrentWorstQuality"));
-      Assert.AreEqual(262622, SamplesUtils.GetIntResult(ss, "EvaluatedSolutions"));
-    }
-
-    private ScatterSearch CreateScatterSearchVRPSample() {
-      #region Problem Configuration
-      var provider = new SolomonInstanceProvider();
-      var instance = provider.GetDataDescriptors().Single(x => x.Name == "C101");
-      VehicleRoutingProblem vrpProblem = new VehicleRoutingProblem();
-      vrpProblem.Load(provider.LoadData(instance));
-      #endregion
-
-      #region Algorithm Configuration
-      ScatterSearch ss = new ScatterSearch();
-      ss.Engine = new SequentialEngine.SequentialEngine();
-      ss.Name = "Scatter Search - VRP";
-      ss.Description = "A scatter search algorithm which solves the \"C101\" vehicle routing problem (imported from Solomon)";
-      ss.Problem = vrpProblem;
-
-      var improver = ss.Problem.Operators.OfType<VRPIntraRouteImprovementOperator>().First();
-      improver.ImprovementAttemptsParameter.Value.Value = 15;
-      improver.SampleSizeParameter.Value.Value = 10;
-      ss.Improver = improver;
-
-      var pathRelinker = ss.Problem.Operators.OfType<VRPPathRelinker>().First();
-      pathRelinker.IterationsParameter.Value.Value = 25;
-      ss.PathRelinker = pathRelinker;
-
-      var similarityCalculator = ss.SimilarityCalculatorParameter.ValidValues.OfType<VRPSimilarityCalculator>().First();
-      ss.SimilarityCalculator = similarityCalculator;
-
-      ss.MaximumIterations.Value = 2;
-      ss.PopulationSize.Value = 20;
-      ss.ReferenceSetSize.Value = 10;
-      ss.Seed.Value = 0;
-      return ss;
-      #endregion
-    }
-    #endregion
-    #endregion
-
-    #region RAPGA
-    #region Scheduling
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateRAPGASchedulingSampleTest() {
-      var ss = CreateRAPGASchedulingSample();
-      XmlGenerator.Serialize(ss, @"Samples\RAPGA_JSSP.hl");
-    }
-
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunRAPGASchedulingSampleTest() {
-      var rapga = CreateRAPGASchedulingSample();
-      rapga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(rapga);
-      Assert.AreEqual(988.00, SamplesUtils.GetDoubleResult(rapga, "BestQuality"));
-      Assert.AreEqual(988.00, SamplesUtils.GetDoubleResult(rapga, "CurrentAverageQuality"));
-      Assert.AreEqual(988.00, SamplesUtils.GetDoubleResult(rapga, "CurrentWorstQuality"));
-      Assert.AreEqual(27100, SamplesUtils.GetIntResult(rapga, "EvaluatedSolutions"));
-    }
-
-    private RAPGA CreateRAPGASchedulingSample() {
-      #region Problem Configuration
-      JobShopSchedulingProblem problem = new JobShopSchedulingProblem();
-      #endregion
-
-      #region Algorithm Configuration
-      RAPGA rapga = new RAPGA();
-      rapga.Engine = new SequentialEngine.SequentialEngine();
-      rapga.Name = "RAPGA - Job Shop Scheduling";
-      rapga.Description = "A relevant alleles preserving genetic algorithm which solves a job shop scheduling problem";
-      rapga.Problem = problem;
-      rapga.Mutator = rapga.MutatorParameter.ValidValues.OfType<JSMSwapManipulator>().First();
-      rapga.Seed.Value = 0;
-      return rapga;
-      #endregion
-    }
-    #endregion
-    #endregion
-
-    #region grammatical evolution
-    #region artificial ant
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateGeArtificialAntSampleTest() {
-      var geaa = CreateGeArtificialAntSample();
-      XmlGenerator.Serialize(geaa, @"Samples\GE_ArtificialAnt.hl");
-    }
-
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunGeArtificalAntSampleTest() {
-      var ga = CreateGeArtificialAntSample();
-      ga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ga);
-    }
-
-    public OffspringSelectionGeneticAlgorithm CreateGeArtificialAntSample() {
-      OffspringSelectionGeneticAlgorithm ga = new OffspringSelectionGeneticAlgorithm();
-      #region Problem Configuration
-      var problem = new HeuristicLab.Problems.GrammaticalEvolution.GEArtificialAntProblem();
-      #endregion
-      #region Algorithm Configuration
-      ga.Name = "Grammatical Evolution - Artificial Ant (SantaFe)";
-      ga.Description = "Grammatical evolution algorithm for solving a artificial ant problem";
-      ga.Problem = problem;
-      SamplesUtils.ConfigureOsGeneticAlgorithmParameters<GenderSpecificSelector, Encodings.IntegerVectorEncoding.SinglePointCrossover, Encodings.IntegerVectorEncoding.UniformOnePositionManipulator>(
-        ga, 200, 1, 50, 0.05, 200);
-      #endregion
-      return ga;
-    }
-    #endregion
-
-    #region symbolic regression
-    #endregion
-    [TestMethod]
-    [TestCategory("Samples.Create")]
-    [TestProperty("Time", "medium")]
-    public void CreateGeSymbolicRegressionSampleTest() {
-      var geSymbReg = CreateGeSymbolicRegressionSample();
-      XmlGenerator.Serialize(geSymbReg, @"Samples\GE_SymbReg.hl");
-    }
-
-    [TestMethod]
-    [TestCategory("Samples.Execute")]
-    [TestProperty("Time", "long")]
-    public void RunGeSymbolicRegressionSampleTest() {
-      var ga = CreateGeSymbolicRegressionSample();
-      ga.SetSeedRandomly.Value = false;
-      SamplesUtils.RunAlgorithm(ga);
-    }
-
-    public OffspringSelectionGeneticAlgorithm CreateGeSymbolicRegressionSample() {
-      var ga = new OffspringSelectionGeneticAlgorithm();
-      #region Problem Configuration
-      var problem = new HeuristicLab.Problems.GrammaticalEvolution.GESymbolicRegressionSingleObjectiveProblem();
-
-      #endregion
-      #region Algorithm Configuration
-      ga.Name = "Grammatical Evolution - Symbolic Regression (Poly-10)";
-      ga.Description = "Grammatical evolution algorithm for solving a symbolic regression problem problem";
-      ga.Problem = problem;
-      problem.Load(new PolyTen().GenerateRegressionData());
-
-      // must occur after loading problem data because the grammar creates symbols for random constants once the data is loaded
-      var consts = problem.SymbolicExpressionTreeGrammar.AllowedSymbols.OfType<Constant>().ToList();
-      foreach (var c in consts) {
-        problem.SymbolicExpressionTreeGrammar.RemoveSymbol(c);
-      }
-
-      SamplesUtils.ConfigureOsGeneticAlgorithmParameters<GenderSpecificSelector, Encodings.IntegerVectorEncoding.SinglePointCrossover, Encodings.IntegerVectorEncoding.UniformOnePositionManipulator>(
-        ga, 1000, 1, 50, 0.05, 200);
-      #endregion
-      return ga;
-    }
-    #endregion
-
-    #region Helpers
-
-    #endregion
-  }
-}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/SamplesUtils.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/SamplesUtils.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/SamplesUtils.cs	(revision 11907)
@@ -12,5 +12,6 @@
 namespace HeuristicLab.Tests {
   public static class SamplesUtils {
-    public const string Directory = @"Samples\";
+    public const string SamplesDirectory = @"Samples\";
+    public const string SampleFileExtension = ".hl";
 
     public static void RunAlgorithm(IAlgorithm a) {
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/ScatterSearchVRPSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/ScatterSearchVRPSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/ScatterSearchVRPSampleTest.cs	(revision 11907)
@@ -0,0 +1,92 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.ScatterSearch;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.Instances.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class ScatterSearchVRPSampleTest {
+    private const string SampleFileName = "SS_VRP";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateScatterSearchVRPSampleTest() {
+      var ss = CreateScatterSearchVRPSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ss, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunScatterSearchVRPSampleTest() {
+      var ss = CreateScatterSearchVRPSample();
+      ss.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ss);
+      Assert.AreEqual(828.93686694283383, SamplesUtils.GetDoubleResult(ss, "BestQuality"));
+      Assert.AreEqual(868.63623986983077, SamplesUtils.GetDoubleResult(ss, "CurrentAverageQuality"));
+      Assert.AreEqual(1048.8333559209832, SamplesUtils.GetDoubleResult(ss, "CurrentWorstQuality"));
+      Assert.AreEqual(262622, SamplesUtils.GetIntResult(ss, "EvaluatedSolutions"));
+    }
+
+    private ScatterSearch CreateScatterSearchVRPSample() {
+      #region Problem Configuration
+      var provider = new SolomonInstanceProvider();
+      var instance = provider.GetDataDescriptors().Single(x => x.Name == "C101");
+      VehicleRoutingProblem vrpProblem = new VehicleRoutingProblem();
+      vrpProblem.Load(provider.LoadData(instance));
+      #endregion
+
+      #region Algorithm Configuration
+      ScatterSearch ss = new ScatterSearch();
+      ss.Engine = new SequentialEngine.SequentialEngine();
+      ss.Name = "Scatter Search - VRP";
+      ss.Description = "A scatter search algorithm which solves the \"C101\" vehicle routing problem (imported from Solomon)";
+      ss.Problem = vrpProblem;
+
+      var improver = ss.Problem.Operators.OfType<VRPIntraRouteImprovementOperator>().First();
+      improver.ImprovementAttemptsParameter.Value.Value = 15;
+      improver.SampleSizeParameter.Value.Value = 10;
+      ss.Improver = improver;
+
+      var pathRelinker = ss.Problem.Operators.OfType<VRPPathRelinker>().First();
+      pathRelinker.IterationsParameter.Value.Value = 25;
+      ss.PathRelinker = pathRelinker;
+
+      var similarityCalculator = ss.SimilarityCalculatorParameter.ValidValues.OfType<VRPSimilarityCalculator>().First();
+      ss.SimilarityCalculator = similarityCalculator;
+
+      ss.MaximumIterations.Value = 2;
+      ss.PopulationSize.Value = 20;
+      ss.ReferenceSetSize.Value = 10;
+      ss.Seed.Value = 0;
+      return ss;
+      #endregion
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/SimulatedAnnealingRastriginSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/SimulatedAnnealingRastriginSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/SimulatedAnnealingRastriginSampleTest.cs	(revision 11907)
@@ -0,0 +1,104 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.SimulatedAnnealing;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.TestFunctions;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class SimulatedAnnealingRastriginSampleTest {
+    private const string SampleFileName = "SA_Rastrigin";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateSimulatedAnnealingRastriginSampleTest() {
+      var sa = CreateSimulatedAnnealingRastriginSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(sa, path);
+    }
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "medium")]
+    public void RunSimulatedAnnealingRastriginSampleTest() {
+      var sa = CreateSimulatedAnnealingRastriginSample();
+      sa.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(sa);
+      Assert.AreEqual(0.00014039606034543795, SamplesUtils.GetDoubleResult(sa, "BestQuality"));
+      Assert.AreEqual(5000, SamplesUtils.GetIntResult(sa, "EvaluatedMoves"));
+    }
+    private SimulatedAnnealing CreateSimulatedAnnealingRastriginSample() {
+      SimulatedAnnealing sa = new SimulatedAnnealing();
+      #region Problem Configuration
+      var problem = new SingleObjectiveTestFunctionProblem();
+      problem.BestKnownQuality.Value = 0.0;
+      problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 0, 0 });
+      problem.Bounds = new DoubleMatrix(new double[,] { { -5.12, 5.12 } });
+      problem.EvaluatorParameter.Value = new RastriginEvaluator();
+      problem.Maximization.Value = false;
+      problem.ProblemSize.Value = 2;
+      problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator();
+      #endregion
+      #region Algorithm Configuration
+      sa.Name = "Simulated Annealing - Rastrigin";
+      sa.Description = "A simulated annealing algorithm that solves the 2-dimensional Rastrigin test function";
+      sa.Problem = problem;
+      var annealingOperator = sa.AnnealingOperatorParameter.ValidValues
+        .OfType<ExponentialDiscreteDoubleValueModifier>()
+        .Single();
+      annealingOperator.StartIndexParameter.Value = new IntValue(0);
+      sa.AnnealingOperator = annealingOperator;
+
+      sa.EndTemperature.Value = 1E-6;
+      sa.InnerIterations.Value = 50;
+      sa.MaximumIterations.Value = 100;
+      var moveEvaluator = sa.MoveEvaluatorParameter.ValidValues
+        .OfType<RastriginAdditiveMoveEvaluator>()
+        .Single();
+      moveEvaluator.A.Value = 10;
+      sa.MoveEvaluator = moveEvaluator;
+
+      var moveGenerator = sa.MoveGeneratorParameter.ValidValues
+        .OfType<StochasticNormalMultiMoveGenerator>()
+        .Single();
+      moveGenerator.SigmaParameter.Value = new DoubleValue(1);
+      sa.MoveGenerator = moveGenerator;
+
+      sa.MoveMaker = sa.MoveMakerParameter.ValidValues
+        .OfType<AdditiveMoveMaker>()
+        .Single();
+
+      sa.Seed.Value = 0;
+      sa.SetSeedRandomly.Value = true;
+      sa.StartTemperature.Value = 1;
+      #endregion
+      sa.Engine = new ParallelEngine.ParallelEngine();
+      return sa;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/TabuSearchTspSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/TabuSearchTspSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/TabuSearchTspSampleTest.cs	(revision 11907)
@@ -0,0 +1,106 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.TabuSearch;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.Instances.TSPLIB;
+using HeuristicLab.Problems.TravelingSalesman;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class TabuSearchTspSampleTest {
+    private const string SampleFileName = "TS_TSP";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateTabuSearchTspSampleTest() {
+      var ts = CreateTabuSearchTspSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(ts, path);
+    }
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunTabuSearchTspSampleTest() {
+      var ts = CreateTabuSearchTspSample();
+      ts.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(ts);
+      Assert.AreEqual(6294, SamplesUtils.GetDoubleResult(ts, "BestQuality"));
+      Assert.AreEqual(7380.0386666666664, SamplesUtils.GetDoubleResult(ts, "CurrentAverageQuality"));
+      Assert.AreEqual(8328, SamplesUtils.GetDoubleResult(ts, "CurrentWorstQuality"));
+      Assert.AreEqual(750000, SamplesUtils.GetIntResult(ts, "EvaluatedMoves"));
+    }
+
+    private TabuSearch CreateTabuSearchTspSample() {
+      TabuSearch ts = new TabuSearch();
+      #region Problem Configuration
+      var provider = new TSPLIBTSPInstanceProvider();
+      var instance = provider.GetDataDescriptors().Where(x => x.Name == "ch130").Single();
+      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
+      tspProblem.Load(provider.LoadData(instance));
+      tspProblem.UseDistanceMatrix.Value = true;
+      #endregion
+      #region Algorithm Configuration
+      ts.Name = "Tabu Search - TSP";
+      ts.Description = "A tabu search algorithm that solves the \"ch130\" TSP (imported from TSPLIB)";
+      ts.Problem = tspProblem;
+
+      ts.MaximumIterations.Value = 1000;
+      // move generator has to be set first
+      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
+        .OfType<StochasticInversionMultiMoveGenerator>()
+        .Single();
+      ts.MoveGenerator = moveGenerator;
+      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
+        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
+        .Single();
+      ts.MoveEvaluator = moveEvaluator;
+      var moveMaker = ts.MoveMakerParameter.ValidValues
+        .OfType<InversionMoveMaker>()
+        .Single();
+      ts.MoveMaker = moveMaker;
+      ts.SampleSize.Value = 750;
+      ts.Seed.Value = 0;
+      ts.SetSeedRandomly.Value = true;
+
+      var tabuChecker = ts.TabuCheckerParameter.ValidValues
+        .OfType<InversionMoveSoftTabuCriterion>()
+        .Single();
+      tabuChecker.UseAspirationCriterion.Value = true;
+      ts.TabuChecker = tabuChecker;
+
+      var tabuMaker = ts.TabuMakerParameter.ValidValues
+        .OfType<InversionMoveTabuMaker>()
+        .Single();
+      ts.TabuMaker = tabuMaker;
+      ts.TabuTenure.Value = 60;
+
+      #endregion
+      ts.Engine = new ParallelEngine.ParallelEngine();
+      return ts;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/TabuSearchVRPSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/TabuSearchVRPSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/TabuSearchVRPSampleTest.cs	(revision 11907)
@@ -0,0 +1,105 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.TabuSearch;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.Instances.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting;
+using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class TabuSearchVRPSampleTest {
+    private const string SampleFileName = "TS_VRP";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateTabuSearchVRPSampleTest() {
+      var vrp = CreateTabuSearchVrpSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(vrp, path);
+    }
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunTabuSearchVRPSampleTest() {
+      var vrp = CreateTabuSearchVrpSample();
+      vrp.SetSeedRandomly.Value = false;
+      SamplesUtils.RunAlgorithm(vrp);
+      Assert.AreEqual(1473, SamplesUtils.GetDoubleResult(vrp, "BestQuality"));
+      Assert.AreEqual(2102.1192622950812, SamplesUtils.GetDoubleResult(vrp, "CurrentAverageQuality"));
+      Assert.AreEqual(4006, SamplesUtils.GetDoubleResult(vrp, "CurrentWorstQuality"));
+      Assert.AreEqual(119072, SamplesUtils.GetIntResult(vrp, "EvaluatedMoves"));
+    }
+
+    private TabuSearch CreateTabuSearchVrpSample() {
+      TabuSearch ts = new TabuSearch();
+      #region Problem Configuration
+      var provider = new AugeratInstanceProvider();
+      var instance = provider.GetDataDescriptors().Where(x => x.Name == "A-n62-k8").Single();
+      VehicleRoutingProblem vrpProblem = new VehicleRoutingProblem();
+      vrpProblem.Load(provider.LoadData(instance));
+      #endregion
+      #region Algorithm Configuration
+      ts.Name = "Tabu Search - VRP";
+      ts.Description = "A tabu search algorithm that solves the \"A-n62-k8\" VRP (imported from Augerat)";
+      ts.Problem = vrpProblem;
+
+      ts.MaximumIterations.Value = 200;
+      // move generator has to be set first
+      var moveGenerator = ts.MoveGeneratorParameter.ValidValues
+        .OfType<PotvinCustomerRelocationExhaustiveMoveGenerator>()
+        .Single();
+      ts.MoveGenerator = moveGenerator;
+      var moveEvaluator = ts.MoveEvaluatorParameter.ValidValues
+        .OfType<PotvinCustomerRelocationMoveEvaluator>()
+        .Single();
+      ts.MoveEvaluator = moveEvaluator;
+      var moveMaker = ts.MoveMakerParameter.ValidValues
+        .OfType<PotvinCustomerRelocationMoveMaker>()
+        .Single();
+      ts.MoveMaker = moveMaker;
+      ts.SampleSize.Value = 1000;
+      ts.Seed.Value = 0;
+      ts.SetSeedRandomly.Value = true;
+
+      var tabuChecker = ts.TabuCheckerParameter.ValidValues
+        .OfType<PotvinCustomerRelocationMoveTabuCriterion>()
+        .Single();
+      tabuChecker.UseAspirationCriterion.Value = false;
+      ts.TabuChecker = tabuChecker;
+
+      var tabuMaker = ts.TabuMakerParameter.ValidValues
+        .OfType<PotvinCustomerRelocationMoveTabuMaker>()
+        .Single();
+      ts.TabuMaker = tabuMaker;
+      ts.TabuTenure.Value = 6;
+
+      #endregion
+      ts.Engine = new ParallelEngine.ParallelEngine();
+      return ts;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/VnsTspSampleTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/VnsTspSampleTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/Samples/VnsTspSampleTest.cs	(revision 11907)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Algorithms.LocalSearch;
+using HeuristicLab.Algorithms.VariableNeighborhoodSearch;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.TravelingSalesman;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class VnsTspSampleTest {
+    private const string SampleFileName = "VNS_TSP";
+
+    [TestMethod]
+    [TestCategory("Samples.Create")]
+    [TestProperty("Time", "medium")]
+    public void CreateVnsTspSampleTest() {
+      var vns = CreateVnsTspSample();
+      string path = Path.Combine(SamplesUtils.SamplesDirectory, SampleFileName + SamplesUtils.SampleFileExtension);
+      XmlGenerator.Serialize(vns, path);
+    }
+    [TestMethod]
+    [TestCategory("Samples.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunVnsTspSampleTest() {
+      var vns = CreateVnsTspSample();
+      vns.SetSeedRandomly = false;
+      SamplesUtils.RunAlgorithm(vns);
+      Assert.AreEqual(867, SamplesUtils.GetDoubleResult(vns, "BestQuality"));
+      Assert.AreEqual(867, SamplesUtils.GetDoubleResult(vns, "CurrentAverageQuality"));
+      Assert.AreEqual(867, SamplesUtils.GetDoubleResult(vns, "CurrentWorstQuality"));
+      Assert.AreEqual(12975173, SamplesUtils.GetIntResult(vns, "EvaluatedSolutions"));
+    }
+
+    private VariableNeighborhoodSearch CreateVnsTspSample() {
+      VariableNeighborhoodSearch vns = new VariableNeighborhoodSearch();
+      #region Problem Configuration
+      TravelingSalesmanProblem tspProblem = new TravelingSalesmanProblem();
+      tspProblem.BestKnownSolution = new Permutation(PermutationTypes.Absolute, new int[] {
+117, 65, 73, 74, 75, 76, 82, 86, 87, 94, 100, 106, 115, 120, 124, 107, 101, 108, 109, 102, 97, 90, 96, 95, 88, 89, 84, 78, 69, 57, 68, 56, 44, 55, 45, 36, 46, 37, 38, 47, 48, 59, 49, 58, 70, 77, 83, 79, 50, 80, 85, 98, 103, 110, 116, 121, 125, 133, 132, 138, 139, 146, 147, 159, 168, 169, 175, 182, 188, 201, 213, 189, 214, 221, 230, 246, 262, 276, 284, 275, 274, 261, 245, 229, 220, 228, 243, 259, 273, 282, 272, 258, 242, 257, 293, 292, 302, 310, 319, 320, 327, 326, 333, 340, 346, 339, 345, 344, 337, 338, 332, 325, 318, 309, 301, 291, 271, 251, 270, 233, 250, 269, 268, 280, 290, 300, 415, 440, 416, 417, 441, 458, 479, 418, 419, 395, 420, 442, 421, 396, 397, 422, 423, 461, 481, 502, 460, 501, 459, 480, 500, 517, 531, 516, 530, 499, 478, 457, 439, 414, 413, 412, 438, 456, 477, 498, 515, 529, 538, 547, 558, 559, 560, 548, 539, 549, 561, 562, 551, 550, 532, 540, 533, 541, 518, 534, 542, 552, 553, 554, 555, 535, 543, 556, 544, 536, 522, 505, 521, 520, 504, 519, 503, 482, 462, 463, 464, 483, 443, 465, 484, 506, 485, 507, 508, 487, 467, 486, 466, 445, 428, 444, 424, 425, 426, 427, 398, 399, 400, 381, 382, 371, 372, 401, 429, 446, 430, 402, 383, 366, 356, 357, 352, 385, 384, 403, 431, 447, 469, 468, 488, 489, 490, 470, 471, 448, 432, 433, 404, 405, 386, 373, 374, 367, 376, 375, 387, 491, 509, 537, 510, 492, 472, 449, 388, 389, 406, 450, 407, 377, 368, 359, 354, 350, 335, 324, 330, 390, 434, 451, 473, 493, 511, 523, 545, 563, 565, 567, 570, 569, 578, 577, 576, 575, 574, 573, 572, 580, 584, 583, 582, 587, 586, 585, 581, 579, 571, 568, 566, 564, 557, 546, 527, 513, 526, 525, 524, 512, 495, 494, 474, 452, 436, 409, 435, 453, 475, 496, 514, 528, 497, 455, 476, 454, 437, 411, 410, 394, 393, 392, 380, 370, 379, 408, 391, 378, 369, 364, 365, 361, 355, 351, 343, 336, 331, 317, 299, 286, 287, 278, 263, 264, 265, 223, 202, 248, 266, 279, 288, 289, 281, 267, 249, 232, 224, 216, 215, 204, 192, 193, 194, 186, 179, 185, 203, 191, 190, 177, 171, 161, 128, 135, 140, 149, 162, 150, 163, 172, 178, 173, 164, 152, 151, 141, 153, 165, 154, 142, 155, 143, 137, 136, 130, 129, 118, 114, 113, 105, 119, 123, 131, 144, 156, 157, 145, 158, 166, 167, 174, 180, 181, 187, 195, 205, 217, 226, 236, 225, 234, 252, 235, 253, 254, 255, 238, 239, 240, 241, 256, 237, 206, 207, 208, 196, 197, 198, 209, 199, 200, 211, 212, 219, 210, 218, 227, 244, 260, 283, 294, 295, 303, 296, 311, 304, 297, 298, 305, 285, 306, 314, 329, 321, 313, 312, 328, 334, 341, 347, 348, 353, 358, 362, 363, 360, 349, 342, 322, 323, 315, 316, 308, 307, 277, 247, 231, 222, 184, 183, 176, 170, 160, 148, 134, 127, 126, 111, 104, 92, 91, 71, 60, 51, 52, 40, 32, 23, 21, 20, 18, 17, 16, 14, 13, 11, 10, 7, 6, 5, 2, 1, 0, 3, 4, 31, 39, 25, 30, 35, 34, 33, 43, 54, 42, 27, 28, 29, 9, 8, 12, 15, 19, 22, 24, 26, 41, 67, 66, 64, 63, 53, 62, 61, 72, 81, 93, 99, 112, 122, 
+      });
+      tspProblem.Coordinates = new DoubleMatrix(new double[,] {
+{48, 71}, {49, 71}, {50, 71}, {44, 70}, {45, 70}, {52, 70}, {53, 70}, {54, 70}, {41, 69}, {42, 69}, {55, 69}, {56, 69}, {40, 68}, {56, 68}, {57, 68}, {39, 67}, {57, 67}, {58, 67}, {59, 67}, {38, 66}, {59, 66}, {60, 66}, {37, 65}, {60, 65}, {36, 64}, {43, 64}, {35, 63}, {37, 63}, {41, 63}, {42, 63}, {43, 63}, {47, 63}, {61, 63}, {40, 62}, {41, 62}, {42, 62}, {43, 62}, {45, 62}, {46, 62}, {47, 62}, {62, 62}, {34, 61}, {38, 61}, {39, 61}, {42, 61}, {43, 61}, {44, 61}, {45, 61}, {46, 61}, {47, 61}, {52, 61}, {62, 61}, {63, 61}, {26, 60}, {38, 60}, {42, 60}, {43, 60}, {44, 60}, {46, 60}, {47, 60}, {63, 60}, {23, 59}, {24, 59}, {27, 59}, {29, 59}, {30, 59}, {31, 59}, {33, 59}, {42, 59}, {46, 59}, {47, 59}, {63, 59}, {21, 58}, {32, 58}, {33, 58}, {34, 58}, {35, 58}, {46, 58}, {47, 58}, {48, 58}, {53, 58}, {21, 57}, {35, 57}, {47, 57}, {48, 57}, {53, 57}, {36, 56}, {37, 56}, {46, 56}, {47, 56}, {48, 56}, {64, 56}, {65, 56}, {20, 55}, {38, 55}, {46, 55}, {47, 55}, {48, 55}, {52, 55}, {21, 54}, {40, 54}, {47, 54}, {48, 54}, {52, 54}, {65, 54}, {30, 53}, {41, 53}, {46, 53}, {47, 53}, {48, 53}, {52, 53}, {65, 53}, {21, 52}, {32, 52}, {33, 52}, {42, 52}, {51, 52}, {21, 51}, {33, 51}, {34, 51}, {43, 51}, {51, 51}, {21, 50}, {35, 50}, {44, 50}, {50, 50}, {66, 50}, {67, 50}, {21, 49}, {34, 49}, {36, 49}, {37, 49}, {46, 49}, {49, 49}, {67, 49}, {22, 48}, {36, 48}, {37, 48}, {46, 48}, {47, 48}, {22, 47}, {30, 47}, {34, 47}, {37, 47}, {38, 47}, {39, 47}, {47, 47}, {48, 47}, {67, 47}, {23, 46}, {28, 46}, {29, 46}, {30, 46}, {31, 46}, {32, 46}, {35, 46}, {37, 46}, {38, 46}, {39, 46}, {49, 46}, {67, 46}, {23, 45}, {28, 45}, {29, 45}, {31, 45}, {32, 45}, {40, 45}, {41, 45}, {49, 45}, {50, 45}, {68, 45}, {24, 44}, {29, 44}, {32, 44}, {41, 44}, {51, 44}, {68, 44}, {25, 43}, {30, 43}, {32, 43}, {42, 43}, {43, 43}, {51, 43}, {68, 43}, {69, 43}, {31, 42}, {32, 42}, {43, 42}, {52, 42}, {55, 42}, {26, 41}, {27, 41}, {31, 41}, {32, 41}, {33, 41}, {44, 41}, {45, 41}, {46, 41}, {47, 41}, {48, 41}, {49, 41}, {53, 41}, {25, 40}, {27, 40}, {32, 40}, {43, 40}, {44, 40}, {45, 40}, {46, 40}, {48, 40}, {49, 40}, {50, 40}, {51, 40}, {53, 40}, {56, 40}, {32, 39}, {33, 39}, {43, 39}, {50, 39}, {51, 39}, {54, 39}, {56, 39}, {69, 39}, {24, 38}, {32, 38}, {41, 38}, {42, 38}, {51, 38}, {52, 38}, {54, 38}, {57, 38}, {69, 38}, {31, 37}, {32, 37}, {40, 37}, {41, 37}, {42, 37}, {43, 37}, {44, 37}, {45, 37}, {46, 37}, {47, 37}, {48, 37}, {51, 37}, {52, 37}, {55, 37}, {57, 37}, {69, 37}, {24, 36}, {31, 36}, {32, 36}, {39, 36}, {40, 36}, {41, 36}, {42, 36}, {43, 36}, {45, 36}, {48, 36}, {49, 36}, {51, 36}, {53, 36}, {55, 36}, {58, 36}, {22, 35}, {23, 35}, {24, 35}, {25, 35}, {30, 35}, {31, 35}, {32, 35}, {39, 35}, {41, 35}, {49, 35}, {51, 35}, {55, 35}, {56, 35}, {58, 35}, {71, 35}, {20, 34}, {27, 34}, {30, 34}, {31, 34}, {51, 34}, {53, 34}, {57, 34}, {60, 34}, {18, 33}, {19, 33}, {29, 33}, {30, 33}, {31, 33}, {45, 33}, {46, 33}, {47, 33}, {52, 33}, {53, 33}, {55, 33}, {57, 33}, {58, 33}, {17, 32}, {30, 32}, {44, 32}, {47, 32}, {54, 32}, {57, 32}, {59, 32}, {61, 32}, {71, 32}, {72, 32}, {43, 31}, {47, 31}, {56, 31}, {58, 31}, {59, 31}, {61, 31}, {72, 31}, {74, 31}, {16, 30}, {43, 30}, {46, 30}, {47, 30}, {59, 30}, {63, 30}, {71, 30}, {75, 30}, {43, 29}, {46, 29}, {47, 29}, {59, 29}, {60, 29}, {75, 29}, {15, 28}, {43, 28}, {46, 28}, {61, 28}, {76, 28}, {15, 27}, {43, 27}, {44, 27}, {45, 27}, {46, 27}, {60, 27}, {62, 27}, {15, 26}, {43, 26}, {44, 26}, {46, 26}, {59, 26}, {60, 26}, {64, 26}, {77, 26}, {15, 25}, {58, 25}, {61, 25}, {77, 25}, {15, 24}, {53, 24}, {55, 24}, {61, 24}, {77, 24}, {62, 23}, {16, 22}, {61, 22}, {62, 22}, {15, 21}, {16, 21}, {52, 21}, {63, 21}, {77, 21}, {16, 20}, {17, 20}, {46, 20}, {47, 20}, {60, 20}, {62, 20}, {63, 20}, {65, 20}, {76, 20}, {15, 19}, {17, 19}, {18, 19}, {44, 19}, {45, 19}, {48, 19}, {53, 19}, {56, 19}, {60, 19}, {62, 19}, {67, 19}, {68, 19}, {76, 19}, {15, 18}, {18, 18}, {19, 18}, {20, 18}, {32, 18}, {33, 18}, {34, 18}, {41, 18}, {42, 18}, {43, 18}, {46, 18}, {48, 18}, {53, 18}, {59, 18}, {60, 18}, {69, 18}, {75, 18}, {16, 17}, {17, 17}, {20, 17}, {21, 17}, {22, 17}, {23, 17}, {24, 17}, {26, 17}, {28, 17}, {29, 17}, {30, 17}, {31, 17}, {32, 17}, {34, 17}, {35, 17}, {36, 17}, {37, 17}, {38, 17}, {39, 17}, {40, 17}, {44, 17}, {46, 17}, {48, 17}, {53, 17}, {56, 17}, {58, 17}, {75, 17}, {17, 16}, {18, 16}, {20, 16}, {24, 16}, {26, 16}, {27, 16}, {29, 16}, {33, 16}, {41, 16}, {42, 16}, {44, 16}, {47, 16}, {52, 16}, {57, 16}, {70, 16}, {73, 16}, {74, 16}, {17, 15}, {18, 15}, {20, 15}, {22, 15}, {24, 15}, {27, 15}, {29, 15}, {31, 15}, {33, 15}, {35, 15}, {36, 15}, {38, 15}, {39, 15}, {42, 15}, {45, 15}, {47, 15}, {52, 15}, {53, 15}, {55, 15}, {56, 15}, {70, 15}, {73, 15}, {17, 14}, {19, 14}, {21, 14}, {24, 14}, {26, 14}, {29, 14}, {31, 14}, {34, 14}, {37, 14}, {40, 14}, {42, 14}, {44, 14}, {46, 14}, {47, 14}, {53, 14}, {54, 14}, {55, 14}, {62, 14}, {70, 14}, {72, 14}, {17, 13}, {19, 13}, {21, 13}, {23, 13}, {25, 13}, {27, 13}, {30, 13}, {32, 13}, {34, 13}, {36, 13}, {38, 13}, {41, 13}, {43, 13}, {44, 13}, {45, 13}, {60, 13}, {70, 13}, {71, 13}, {18, 12}, {21, 12}, {23, 12}, {26, 12}, {28, 12}, {31, 12}, {34, 12}, {37, 12}, {39, 12}, {41, 12}, {42, 12}, {70, 12}, {18, 11}, {19, 11}, {20, 11}, {21, 11}, {24, 11}, {25, 11}, {27, 11}, {29, 11}, {31, 11}, {33, 11}, {35, 11}, {38, 11}, {41, 11}, {59, 11}, {26, 10}, {29, 10}, {32, 10}, {34, 10}, {36, 10}, {39, 10}, {40, 10}, {69, 10}, {21, 9}, {26, 9}, {28, 9}, {30, 9}, {32, 9}, {33, 9}, {35, 9}, {36, 9}, {37, 9}, {38, 9}, {39, 9}, {22, 8}, {27, 8}, {28, 8}, {29, 8}, {30, 8}, {31, 8}, {68, 8}, {23, 7}, {66, 7}, {24, 6}, {65, 6}, {25, 5}, {62, 5}, {63, 5}, {26, 4}, {55, 4}, {56, 4}, {57, 4}, {58, 4}, {59, 4}, {60, 4}, {61, 4}, {28, 3}, {53, 3}, {29, 2}, {50, 2}, {51, 2}, {52, 2}, {31, 1}, {32, 1}, {48, 1}
+      });
+      tspProblem.BestKnownQuality = new DoubleValue(867);
+
+      tspProblem.EvaluatorParameter.Value = new TSPRoundedEuclideanPathEvaluator();
+      tspProblem.SolutionCreatorParameter.Value = new RandomPermutationCreator();
+      tspProblem.UseDistanceMatrix.Value = true;
+      tspProblem.Name = "Funny TSP";
+      tspProblem.Description = "Represents a symmetric Traveling Salesman Problem.";
+      #endregion
+      #region Algorithm Configuration
+      vns.Name = "Variable Neighborhood Search - TSP";
+      vns.Description = "A variable neighborhood search algorithm which solves a funny TSP instance";
+      vns.Problem = tspProblem;
+
+      var localImprovement = vns.LocalImprovementParameter.ValidValues
+        .OfType<LocalSearchImprovementOperator>()
+        .Single();
+      // move generator has to be set first
+      localImprovement.MoveGenerator = localImprovement.MoveGeneratorParameter.ValidValues
+        .OfType<StochasticInversionMultiMoveGenerator>()
+        .Single();
+      localImprovement.MoveEvaluator = localImprovement.MoveEvaluatorParameter.ValidValues
+        .OfType<TSPInversionMoveRoundedEuclideanPathEvaluator>()
+        .Single();
+      localImprovement.MoveMaker = localImprovement.MoveMakerParameter.ValidValues
+        .OfType<InversionMoveMaker>()
+        .Single();
+      localImprovement.SampleSizeParameter.Value = new IntValue(500);
+      vns.LocalImprovement = localImprovement;
+
+      vns.LocalImprovementMaximumIterations = 150;
+      vns.MaximumIterations = 25;
+      vns.Seed = 0;
+      vns.SetSeedRandomly = true;
+      var shakingOperator = vns.ShakingOperatorParameter.ValidValues
+        .OfType<PermutationShakingOperator>()
+        .Single();
+      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
+        .OfType<Swap2Manipulator>()
+        .Single(), false);
+      shakingOperator.Operators.SetItemCheckedState(shakingOperator.Operators
+        .OfType<Swap3Manipulator>()
+        .Single(), false);
+      vns.ShakingOperator = shakingOperator;
+      #endregion
+      vns.Engine = new ParallelEngine.ParallelEngine();
+      return vns;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/StorableConstructorTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/StorableConstructorTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/StorableConstructorTest.cs	(revision 11907)
@@ -33,11 +33,4 @@
   [TestClass]
   public class StorableConstructorTest {
-
-    // Use ClassInitialize to run code before running the first test in the class
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.Assemblies.Any();
-    }
-
     [TestMethod]
     [TestCategory("General")]
Index: /stable/HeuristicLab.Tests/HeuristicLab-3.3/ToStringTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab-3.3/ToStringTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab-3.3/ToStringTest.cs	(revision 11907)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Linq;
 using HeuristicLab.Core;
 using HeuristicLab.PluginInfrastructure;
@@ -29,15 +28,8 @@
   [TestClass]
   public class ToStringTest {
-
     private TestContext testContextInstance;
     public TestContext TestContext {
       get { return testContextInstance; }
       set { testContextInstance = value; }
-    }
-
-    // Use ClassInitialize to run code before running the first test in the class
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.Assemblies.Any();
     }
 
Index: /stable/HeuristicLab.Tests/HeuristicLab.PluginInfraStructure-3.3/TypeExtensionsTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.PluginInfraStructure-3.3/TypeExtensionsTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab.PluginInfraStructure-3.3/TypeExtensionsTest.cs	(revision 11907)
@@ -29,7 +29,4 @@
 
 namespace HeuristicLab.PluginInfrastructure.Tests {
-  /// <summary>
-  /// Summary description for TypeDiscoveryTest
-  /// </summary>
   [TestClass]
   public class TypeExtensionsTest {
Index: /stable/HeuristicLab.Tests/HeuristicLab.Problems.VehicleRouting-3.4/VRPInstancesTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Problems.VehicleRouting-3.4/VRPInstancesTest.cs	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Problems.VehicleRouting-3.4/VRPInstancesTest.cs	(revision 11907)
@@ -25,5 +25,4 @@
 using System.Text;
 using HeuristicLab.Problems.Instances;
-using HeuristicLab.Tests;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 
@@ -31,9 +30,4 @@
   [TestClass]
   public class VRPInstancesTest {
-    [ClassInitialize]
-    public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.Assemblies.Any();
-    }
-
     [TestMethod]
     [TestCategory("Problems.VehicleRouting")]
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GAQAPScriptTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GAQAPScriptTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GAQAPScriptTest.cs	(revision 11907)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.Instances.QAPLIB;
+using HeuristicLab.Problems.QuadraticAssignment;
+using HeuristicLab.Scripting;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GAQAPScriptTest {
+    private const string ScriptFileName = "GA_QAP_Script";
+    private const string ScriptItemName = "Genetic Algorithm Script - QAP";
+    private const string ScriptItemDescription = "A scripted genetic algorithm which solves the \"" + ProblemInstanceName + "\" quadratic assignment problem (imported from Drezner)";
+    private const string ProblemInstanceName = "dre56";
+    private const string BestQualityVariableName = "bestQuality";
+
+    [TestMethod]
+    [TestCategory("Scripts.Create")]
+    [TestProperty("Time", "short")]
+    public void CreateGAQAPScriptScriptTest() {
+      var script = CreateGAQAPScript();
+      string path = Path.Combine(ScriptingUtils.ScriptsDirectory, ScriptFileName + ScriptingUtils.ScriptFileExtension);
+      XmlGenerator.Serialize(script, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Scripts.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGAQAPScriptTest() {
+      var script = CreateGAQAPScript();
+
+      script.Compile();
+      ScriptingUtils.RunScript(script);
+
+      var bestQuality = ScriptingUtils.GetVariable<double>(script, BestQualityVariableName);
+      Assert.AreEqual(2410.0, bestQuality, 1E-8);
+    }
+
+    private CSharpScript CreateGAQAPScript() {
+      var script = new CSharpScript {
+        Name = ScriptItemName,
+        Description = ScriptItemDescription
+      };
+      #region Variables
+      var provider = new DreznerQAPInstanceProvider();
+      var instance = provider.GetDataDescriptors().Single(x => x.Name == ProblemInstanceName);
+      var data = provider.LoadData(instance);
+      var problem = new QuadraticAssignmentProblem();
+      problem.Load(data);
+      script.VariableStore.Add(ProblemInstanceName, problem);
+      #endregion
+      #region Code
+      script.Code = ScriptSources.GAQAPScriptSource;
+      #endregion
+      return script;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GUIAutomationScriptTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GUIAutomationScriptTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GUIAutomationScriptTest.cs	(revision 11907)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Scripting;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GUIAutomationScriptTest {
+    private const string ScriptFileName = "GUI_Automation_Script";
+    private const string ScriptItemName = "GUI Automation Script";
+    private const string ScriptItemDescription = "A script that runs a genetic algorithm on a traveling salesman problem with 5 different settings for population sizes and with 10 repetitions, then opens a bubble chart of the results and chooses the appropriate values for x and y axis automatically";
+
+    [TestMethod]
+    [TestCategory("Scripts.Create")]
+    [TestProperty("Time", "short")]
+    public void CreateGUIAutomationScriptTest() {
+      var script = CreateGUIAutomationScript();
+      string path = Path.Combine(ScriptingUtils.ScriptsDirectory, ScriptFileName + ScriptingUtils.ScriptFileExtension);
+      XmlGenerator.Serialize(script, path);
+    }
+
+    private CSharpScript CreateGUIAutomationScript() {
+      var script = new CSharpScript {
+        Name = ScriptItemName,
+        Description = ScriptItemDescription
+      };
+      #region Code
+      script.Code = ScriptSources.GUIAutomationScriptSource;
+      #endregion
+      return script;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchRFClassificationScriptTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchRFClassificationScriptTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchRFClassificationScriptTest.cs	(revision 11907)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Scripting;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GridSearchRFClassificationScriptTest {
+    private const string ScriptFileName = "GridSearch_RF_Classification_Script";
+    private const string ScriptItemName = "Grid Search Random Forest Script - Classification";
+    private const string ScriptItemDescription = "A script that runs a grid search for random forest parameters for solving symbolic classification problems";
+    private const string ProblemInstanceName = "Mammography, M. Elter, 2007";
+    private const string ProblemInstanceDataVaribleName = "problem";
+    private const string BestSolutionVariableName = "bestSolution";
+
+    [TestMethod]
+    [TestCategory("Scripts.Create")]
+    [TestProperty("Time", "short")]
+    public void CreateGridSearchRFClassificationScriptTest() {
+      var script = CreateGridSearchRFClassificationScript();
+      string path = Path.Combine(ScriptingUtils.ScriptsDirectory, ScriptFileName + ScriptingUtils.ScriptFileExtension);
+      XmlGenerator.Serialize(script, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Scripts.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGridSearchRFClassificationScriptTest() {
+      var script = CreateGridSearchRFClassificationScript();
+
+      script.Compile();
+      ScriptingUtils.RunScript(script);
+
+      var bestSolution = ScriptingUtils.GetVariable<IClassificationSolution>(script, BestSolutionVariableName);
+      Assert.AreEqual(0.85179407176287, bestSolution.TrainingAccuracy, 1E-8);
+      Assert.AreEqual(0.81875, bestSolution.TestAccuracy, 1E-8);
+    }
+
+    private CSharpScript CreateGridSearchRFClassificationScript() {
+      var script = new CSharpScript {
+        Name = ScriptItemName,
+        Description = ScriptItemDescription
+      };
+      #region Variables
+      var provider = new UCIInstanceProvider();
+      var instance = (UCIDataDescriptor)provider.GetDataDescriptors().Single(x => x.Name == ProblemInstanceName);
+      var data = provider.LoadData(instance);
+      script.VariableStore.Add(ProblemInstanceDataVaribleName, data);
+      #endregion
+      #region Code
+      script.Code = ScriptSources.GridSearchRFClassificationScriptSource;
+      #endregion
+      return script;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchRFRegressionScriptTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchRFRegressionScriptTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchRFRegressionScriptTest.cs	(revision 11907)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Scripting;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GridSearchRFRegressionScriptTest {
+    private const string ScriptFileName = "GridSearch_RF_Regression_Script";
+    private const string ScriptItemName = "Grid Search Random Forest Script - Regression";
+    private const string ScriptItemDescription = "A script that runs a grid search for random forest parameters for solving symbolic regression problems";
+    private const string ProblemInstanceName = "Keijzer 3 f(x) = 0.3 * x *sin(2 * PI * x); Interval [-3, 3]";
+    private const string ProblemInstanceDataVaribleName = "problem";
+    private const string BestSolutionVariableName = "bestSolution";
+
+    [TestMethod]
+    [TestCategory("Scripts.Create")]
+    [TestProperty("Time", "short")]
+    public void CreateGridSearchRFRegressionScriptTest() {
+      var script = CreateGridSearchRFRegressionScript();
+      string path = Path.Combine(ScriptingUtils.ScriptsDirectory, ScriptFileName + ScriptingUtils.ScriptFileExtension);
+      XmlGenerator.Serialize(script, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Scripts.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunGridSearchRFRegressionScriptTest() {
+      var script = CreateGridSearchRFRegressionScript();
+
+      script.Compile();
+      ScriptingUtils.RunScript(script);
+
+      var bestSolution = ScriptingUtils.GetVariable<IRegressionSolution>(script, BestSolutionVariableName);
+      Assert.AreEqual(0.968329534139836, bestSolution.TrainingRSquared, 1E-8);
+      Assert.AreEqual(0.982380790563445, bestSolution.TestRSquared, 1E-8);
+    }
+
+    private CSharpScript CreateGridSearchRFRegressionScript() {
+      var script = new CSharpScript {
+        Name = ScriptItemName,
+        Description = ScriptItemDescription
+      };
+      #region Variables
+      var provider = new KeijzerInstanceProvider();
+      var instance = (ArtificialRegressionDataDescriptor)provider.GetDataDescriptors().Single(x => x.Name == ProblemInstanceName);
+      var data = instance.GenerateRegressionData();
+      script.VariableStore.Add(ProblemInstanceDataVaribleName, data);
+      #endregion
+      #region Code
+      script.Code = ScriptSources.GridSearchRFRegressionScriptSource;
+      #endregion
+      return script;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchSVMClassificationScriptTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchSVMClassificationScriptTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchSVMClassificationScriptTest.cs	(revision 11907)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Scripting;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GridSearchSVMClassificationScriptTest {
+    private const string ScriptFileName = "GridSearch_SVM_Classification_Script";
+    private const string ScriptItemName = "Grid Search SVM Script - Classification";
+    private const string ScriptItemDescription = "A script that runs a grid search for SVM parameters for solving symbolic classification problems";
+    private const string ProblemInstanceName = "Mammography, M. Elter, 2007";
+    private const string ProblemInstanceDataVaribleName = "problem";
+    private const string BestSolutionVariableName = "bestSolution";
+
+    [TestMethod]
+    [TestCategory("Scripts.Create")]
+    [TestProperty("Time", "short")]
+    public void CreateGridSearchSVMClassificationScriptTest() {
+      var script = CreateGridSearchSVMClassificationScript();
+      string path = Path.Combine(ScriptingUtils.ScriptsDirectory, ScriptFileName + ScriptingUtils.ScriptFileExtension);
+      XmlGenerator.Serialize(script, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Scripts.Execute")]
+    [TestProperty("Time", "medium")]
+    public void RunGridSearchSVMClassificationScriptTest() {
+      var script = CreateGridSearchSVMClassificationScript();
+
+      script.Compile();
+      ScriptingUtils.RunScript(script);
+
+      var bestSolution = ScriptingUtils.GetVariable<IClassificationSolution>(script, BestSolutionVariableName);
+      Assert.AreEqual(0.819032761310452, bestSolution.TrainingAccuracy, 1E-8);
+      Assert.AreEqual(0.721875, bestSolution.TestAccuracy, 1E-8);
+    }
+
+    private CSharpScript CreateGridSearchSVMClassificationScript() {
+      var script = new CSharpScript {
+        Name = ScriptItemName,
+        Description = ScriptItemDescription
+      };
+      #region Variables
+      var provider = new UCIInstanceProvider();
+      var instance = (UCIDataDescriptor)provider.GetDataDescriptors().Single(x => x.Name == ProblemInstanceName);
+      var data = provider.LoadData(instance);
+      script.VariableStore.Add(ProblemInstanceDataVaribleName, data);
+      #endregion
+      #region Code
+      script.Code = ScriptSources.GridSearchSVMClassificationScriptSource;
+      #endregion
+      return script;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchSVMRegressionScriptTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchSVMRegressionScriptTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/GridSearchSVMRegressionScriptTest.cs	(revision 11907)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using System.Linq;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Scripting;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class GridSearchSVMRegressionScriptTest {
+    private const string ScriptFileName = "GridSearch_SVM_Regression_Script";
+    private const string ScriptItemName = "Grid Search SVM Script - Regression";
+    private const string ScriptItemDescription = "A script that runs a grid search for SVM parameters for solving symbolic regression problems";
+    private const string ProblemInstanceName = "Keijzer 9 f(x) = arcsinh(x)  i.e. ln(x + sqrt(x² + 1))";
+    private const string ProblemInstanceDataVaribleName = "problem";
+    private const string BestSolutionVariableName = "bestSolution";
+
+    [TestMethod]
+    [TestCategory("Scripts.Create")]
+    [TestProperty("Time", "short")]
+    public void CreateGridSearchSVMRegressionScriptTest() {
+      var script = CreateGridSearchSVMRegressionScript();
+      string path = Path.Combine(ScriptingUtils.ScriptsDirectory, ScriptFileName + ScriptingUtils.ScriptFileExtension);
+      XmlGenerator.Serialize(script, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Scripts.Execute")]
+    [TestProperty("Time", "medium")]
+    public void RunGridSearchSVMRegressionScriptTest() {
+      var script = CreateGridSearchSVMRegressionScript();
+
+      script.Compile();
+      ScriptingUtils.RunScript(script);
+
+      var bestSolution = ScriptingUtils.GetVariable<IRegressionSolution>(script, BestSolutionVariableName);
+      Assert.AreEqual(0.982485852864274, bestSolution.TrainingRSquared, 1E-8);
+      Assert.AreEqual(0.98817480950295, bestSolution.TestRSquared, 1E-8);
+    }
+
+    private CSharpScript CreateGridSearchSVMRegressionScript() {
+      var script = new CSharpScript {
+        Name = ScriptItemName,
+        Description = ScriptItemDescription
+      };
+      #region Variables
+      var provider = new KeijzerInstanceProvider();
+      var instance = (ArtificialRegressionDataDescriptor)provider.GetDataDescriptors().Single(x => x.Name == ProblemInstanceName);
+      var data = instance.GenerateRegressionData();
+      script.VariableStore.Add(ProblemInstanceDataVaribleName, data);
+      #endregion
+      #region Code
+      script.Code = ScriptSources.GridSearchSVMRegressionScriptSource;
+      #endregion
+      return script;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/OSGARastriginScriptTest.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/OSGARastriginScriptTest.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/OSGARastriginScriptTest.cs	(revision 11907)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.Scripting;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  [TestClass]
+  public class OSGARastriginScriptTest {
+    private const string ScriptFileName = "OSGA_Rastrigin_Script";
+    private const string ScriptItemName = "Offspring Selection Genetic Algorithm Script - Rastrigin";
+    private const string ScriptItemDescription = "A scripted offspring selection genetic algorithm that solves the 100-dimensional Rastrigin test function";
+    private const string LowerBoundVariableName = "minX";
+    private const string UpperBoundVariableName = "maxX";
+    private const string DimensionsVariableName = "N";
+    private const string SeedVariableName = "seed";
+    private const string BestQualityVariableName = "bestFitness";
+
+    [TestMethod]
+    [TestCategory("Scripts.Create")]
+    [TestProperty("Time", "short")]
+    public void CreateOSGARastriginScriptTest() {
+      var script = CreateOSGARastriginScript();
+      string path = Path.Combine(ScriptingUtils.ScriptsDirectory, ScriptFileName + ScriptingUtils.ScriptFileExtension);
+      XmlGenerator.Serialize(script, path);
+    }
+
+    [TestMethod]
+    [TestCategory("Scripts.Execute")]
+    [TestProperty("Time", "long")]
+    public void RunOSGARastriginScriptTest() {
+      var script = CreateOSGARastriginScript();
+
+      script.Compile();
+      ScriptingUtils.RunScript(script);
+
+      var bestQuality = ScriptingUtils.GetVariable<double>(script, BestQualityVariableName);
+      Assert.AreEqual(0.176350329149955, bestQuality, 1E-8);
+    }
+
+    private CSharpScript CreateOSGARastriginScript() {
+      var script = new CSharpScript {
+        Name = ScriptItemName,
+        Description = ScriptItemDescription
+      };
+      #region Variables
+      script.VariableStore.Add(LowerBoundVariableName, new DoubleValue(-5.12));
+      script.VariableStore.Add(UpperBoundVariableName, new DoubleValue(5.12));
+      script.VariableStore.Add(DimensionsVariableName, new IntValue(100));
+      script.VariableStore.Add(SeedVariableName, new IntValue(0));
+      #endregion
+      #region Code
+      script.Code = ScriptSources.OSGARastriginScriptSource;
+      #endregion
+      return script;
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GAQAPScriptSource.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GAQAPScriptSource.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GAQAPScriptSource.cs	(revision 11907)
@@ -0,0 +1,69 @@
+﻿using System;
+using System.Linq;
+
+using HeuristicLab.Analysis;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Problems.Instances.QAPLIB;
+using HeuristicLab.Problems.QuadraticAssignment;
+using HeuristicLab.Random;
+
+public class GAQAPScript : HeuristicLab.Scripting.CSharpScriptBase {
+  public override void Main() {
+    DateTime start = DateTime.UtcNow;
+
+    QuadraticAssignmentProblem qap;
+    if (vars.Contains("qap")) qap = vars.qap;
+    else {
+      var provider = new DreznerQAPInstanceProvider();
+      var instance = provider.GetDataDescriptors().Single(x => x.Name == "dre56");
+      var data = provider.LoadData(instance);
+      qap = new QuadraticAssignmentProblem();
+      qap.Load(data);
+      vars.qap = qap;
+    }
+
+    const uint seed = 0;
+    const int popSize = 100;
+    const int generations = 1000;
+    const double mutationRate = 0.05;
+
+    var random = new MersenneTwister(seed);
+    var population = new Permutation[popSize];
+    var qualities = new double[popSize];
+    var nextGen = new Permutation[popSize];
+    var nextQual = new double[popSize];
+
+    var qualityChart = new DataTable("Quality Chart");
+    var qualityRow = new DataRow("Best Quality");
+    qualityChart.Rows.Add(qualityRow);
+    vars.qualityChart = qualityChart;
+
+    for (int i = 0; i < popSize; i++) {
+      population[i] = new Permutation(PermutationTypes.Absolute, qap.Weights.Rows, random);
+      qualities[i] = QAPEvaluator.Apply(population[i], qap.Weights, qap.Distances);
+    }
+    var bestQuality = qualities.Min();
+    var bestQualityGeneration = 0;
+
+    for (int g = 0; g < generations; g++) {
+      var parents = population.SampleProportional(random, 2 * popSize, qualities, windowing: true, inverseProportional: true).ToArray();
+      for (int i = 0; i < popSize; i++) {
+        nextGen[i] = PartiallyMatchedCrossover.Apply(random, parents[i * 2], parents[i * 2 + 1]);
+        if (random.NextDouble() < mutationRate) Swap2Manipulator.Apply(random, nextGen[i]);
+        nextQual[i] = QAPEvaluator.Apply(nextGen[i], qap.Weights, qap.Distances);
+        if (nextQual[i] < bestQuality) {
+          bestQuality = nextQual[i];
+          bestQualityGeneration = g;
+        }
+      }
+      qualityRow.Values.Add(bestQuality);
+      Array.Copy(nextGen, population, popSize);
+      Array.Copy(nextQual, qualities, popSize);
+    }
+
+    vars.elapsed = new TimeSpanValue(DateTime.UtcNow - start);
+    vars.bestQuality = bestQuality;
+    vars.bestQualityFoundAt = bestQualityGeneration;
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GUIAutomationScriptSource.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GUIAutomationScriptSource.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GUIAutomationScriptSource.cs	(revision 11907)
@@ -0,0 +1,46 @@
+﻿using System;
+using System.Linq;
+using System.Threading;
+using System.Windows.Forms;
+
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Views;
+using HeuristicLab.Problems.TravelingSalesman;
+
+public class GUIAutomationScript : HeuristicLab.Scripting.CSharpScriptBase {
+  readonly ManualResetEvent mutex = new ManualResetEvent(false);
+
+  public override void Main() {
+    var ga = new GeneticAlgorithm {
+      MaximumGenerations = { Value = 50 },
+      PopulationSize = { Value = 10 },
+      Problem = new TravelingSalesmanProblem()
+    };
+
+    var experiment = new Experiment();
+    for (int i = 0; i < 5; i++) {
+      experiment.Optimizers.Add(new BatchRun() { Optimizer = (IOptimizer)ga.Clone(), Repetitions = 10 });
+      ga.PopulationSize.Value *= 2;
+    }
+
+    experiment.ExecutionStateChanged += OnExecutionStateChanged;
+    experiment.Start();
+    mutex.WaitOne();
+
+    vars.experiment = experiment;
+    MainFormManager.MainForm.ShowContent(experiment);
+    var viewHost = (ViewHost)MainFormManager.MainForm.ShowContent(experiment.Runs, typeof(RunCollectionBubbleChartView));
+    var bubbleChart = (UserControl)(viewHost.ActiveView);
+    bubbleChart.Controls.OfType<ComboBox>().Single(x => x.Name == "yAxisComboBox").SelectedItem = "BestQuality";
+    bubbleChart.Controls.OfType<ComboBox>().Single(x => x.Name == "xAxisComboBox").SelectedItem = "PopulationSize";
+  }
+
+  private void OnExecutionStateChanged(object sender, EventArgs e) {
+    if (((IExecutable)sender).ExecutionState == ExecutionState.Stopped)
+      mutex.Set();
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchRFClassificationScriptSource.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchRFClassificationScriptSource.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchRFClassificationScriptSource.cs	(revision 11907)
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Scripting;
+
+public class RFClassificationCrossValidationScript : HeuristicLab.Scripting.CSharpScriptBase {
+  /* Maximum degree of parallelism (specifies whether or not the grid search should be parallelized) */
+  const int maximumDegreeOfParallelism = 4;
+  /* Number of crossvalidation folds: */
+  const int numberOfFolds = 3;
+  /* Specify whether the folds should be shuffled before doing crossvalidation */
+  const bool shuffleFolds = true;
+
+  /* The tunable Random Forest parameters:
+     - "N" (number of trees). In the random forests literature, this is referred to as the ntree parameter.
+       Larger number of trees produce more stable models and covariate importance estimates, but require more memory and a longer run time.
+       For small datasets, 50 trees may be sufficient. For larger datasets, 500 or more may be required. Please consult the random forests
+       literature for extensive discussion of this parameter (e.g. Cutler et al., 2007; Strobl et al., 2007; Strobl et al., 2008).
+
+     - "R" The ratio of the training set that will be used in the construction of individual trees (0<r<=1). Should be adjusted depending on
+       the noise level in the dataset in the range from 0.66 (low noise) to 0.05 (high noise). This parameter should be adjusted to achieve
+       good generalization error.
+
+     - "M" The ratio of features that will be used in the construction of individual trees (0<m<=1)
+  */
+  static Dictionary<string, IEnumerable<double>> randomForestParameterRanges = new Dictionary<string, IEnumerable<double>> {
+    { "N", ValueGenerator.GenerateSteps(5m, 10, 1).Select(x => Math.Pow(2,(double)x)) },
+    { "R", ValueGenerator.GenerateSteps(0.05m, 0.66m, 0.05m).Select(x => (double)x) },
+    { "M", ValueGenerator.GenerateSteps(0.1m, 1, 0.1m).Select(x => (double)x) }
+  };
+
+  private static RandomForestClassificationSolution GridSearchWithCrossvalidation(IClassificationProblemData problemData, int numberOfCrossvalidationFolds, out RFParameter bestParameters,
+  int seed = 3141519) {
+    double rmsError, outOfBagRmsError, relClassificationError, outOfBagRelClassificationError;
+    bestParameters = RandomForestUtil.GridSearch(problemData, numberOfFolds, shuffleFolds, randomForestParameterRanges, seed, maximumDegreeOfParallelism);
+    var model = RandomForestModel.CreateClassificationModel(problemData, problemData.TrainingIndices, bestParameters.N, bestParameters.R, bestParameters.M, seed,
+                                                            out rmsError, out outOfBagRmsError, out relClassificationError, out outOfBagRelClassificationError);
+    return (RandomForestClassificationSolution)model.CreateClassificationSolution(problemData);
+  }
+
+  private static RandomForestClassificationSolution GridSearch(IClassificationProblemData problemData, out RFParameter bestParameters, int seed = 3141519) {
+    double rmsError, outOfBagRmsError, relClassificationError, outOfBagRelClassificationError;
+    bestParameters = RandomForestUtil.GridSearch(problemData, randomForestParameterRanges, seed, maximumDegreeOfParallelism);
+    var model = RandomForestModel.CreateClassificationModel(problemData, problemData.TrainingIndices, bestParameters.N, bestParameters.R, bestParameters.M, seed,
+                                                            out rmsError, out outOfBagRmsError, out relClassificationError, out outOfBagRelClassificationError);
+    return (RandomForestClassificationSolution)model.CreateClassificationSolution(problemData);
+  }
+
+  public override void Main() {
+    var variables = (Variables)vars;
+    var item = variables.SingleOrDefault(x => x.Value is IClassificationProblem || x.Value is IClassificationProblemData);
+    if (item.Equals(default(KeyValuePair<string, object>)))
+      throw new ArgumentException("Could not find a suitable problem or problem data.");
+
+    string name = item.Key;
+    IClassificationProblemData problemData;
+    if (item.Value is IClassificationProblem)
+      problemData = ((IClassificationProblem)item.Value).ProblemData;
+    else
+      problemData = (IClassificationProblemData)item.Value;
+
+    var bestParameters = new RFParameter();
+    var bestSolution = GridSearch(problemData, out bestParameters);
+    vars["bestSolution"] = bestSolution;
+    vars["bestParameters"] = bestParameters;
+
+    Console.WriteLine("Accuracy (training): " + bestSolution.TrainingAccuracy + ", Accuracy (test): " + bestSolution.TestAccuracy);
+    Console.WriteLine("Model parameters: n = {0}, r = {1}, m = {2}", bestParameters.N, bestParameters.R, bestParameters.M);
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchRFRegressionScriptSource.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchRFRegressionScriptSource.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchRFRegressionScriptSource.cs	(revision 11907)
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Random;
+using HeuristicLab.Scripting;
+
+public class RFRegressionCrossValidationScript : HeuristicLab.Scripting.CSharpScriptBase {
+  /* Maximum degree of parallelism (specifies whether or not the grid search should be parallelized) */
+  const int maximumDegreeOfParallelism = 4;
+  /* Number of crossvalidation folds: */
+  const int numberOfFolds = 3;
+  /* Specify whether the crossvalidation folds should be shuffled */
+  const bool shuffleFolds = true;
+
+  /* The tunable Random Forest parameters:
+     - "n" (number of trees). In the random forests literature, this is referred to as the ntree parameter.
+       Larger number of trees produce more stable models and covariate importance estimates, but require more memory and a longer run time.
+       For small datasets, 50 trees may be sufficient. For larger datasets, 500 or more may be required. Please consult the random forests
+       literature for extensive discussion of this parameter (e.g. Cutler et al., 2007; Strobl et al., 2007; Strobl et al., 2008).
+
+     - "r" The ratio of the training set that will be used in the construction of individual trees (0<r<=1). Should be adjusted depending on
+       the noise level in the dataset in the range from 0.66 (low noise) to 0.05 (high noise). This parameter should be adjusted to achieve
+       good generalization error.
+
+     - "m" The ratio of features that will be used in the construction of individual trees (0<m<=1)
+  */
+  static Dictionary<string, IEnumerable<double>> randomForestParameterRanges = new Dictionary<string, IEnumerable<double>> {
+    { "N", ValueGenerator.GenerateSteps(5m, 10, 1).Select(x => Math.Pow(2,(double)x)) },
+    { "R", ValueGenerator.GenerateSteps(0.05m, 0.66m, 0.05m).Select(x => (double)x) },
+    { "M", ValueGenerator.GenerateSteps(0.1m, 1, 0.1m).Select(x => (double)x) }
+  };
+
+  private static RandomForestRegressionSolution GridSearchWithCrossvalidation(IRegressionProblemData problemData, out RFParameter bestParameters, int seed = 3141519) {
+    double rmsError, outOfBagRmsError, avgRelError, outOfBagAvgRelError;
+    bestParameters = RandomForestUtil.GridSearch(problemData, numberOfFolds, shuffleFolds, randomForestParameterRanges, seed, maximumDegreeOfParallelism);
+    var model = RandomForestModel.CreateRegressionModel(problemData, problemData.TrainingIndices, bestParameters.N, bestParameters.R, bestParameters.M, seed, out rmsError, out outOfBagRmsError, out avgRelError, out outOfBagAvgRelError);
+    return (RandomForestRegressionSolution)model.CreateRegressionSolution(problemData);
+  }
+
+  private static RandomForestRegressionSolution GridSearch(IRegressionProblemData problemData, out RFParameter bestParameters, int seed = 3141519) {
+    double rmsError, outOfBagRmsError, avgRelError, outOfBagAvgRelError;
+    var random = new MersenneTwister();
+    bestParameters = RandomForestUtil.GridSearch(problemData, randomForestParameterRanges, seed, maximumDegreeOfParallelism);
+    var model = RandomForestModel.CreateRegressionModel(problemData, problemData.TrainingIndices, bestParameters.N, bestParameters.R, bestParameters.M, seed,
+                                                        out rmsError, out outOfBagRmsError, out avgRelError, out outOfBagAvgRelError);
+    return (RandomForestRegressionSolution)model.CreateRegressionSolution(problemData);
+  }
+
+  public override void Main() {
+    var variables = (Variables)vars;
+    var item = variables.SingleOrDefault(x => x.Value is IRegressionProblem || x.Value is IRegressionProblemData);
+    if (item.Equals(default(KeyValuePair<string, object>)))
+      throw new ArgumentException("Could not find a suitable problem or problem data.");
+
+    string name = item.Key;
+    IRegressionProblemData problemData;
+    if (item.Value is IRegressionProblem)
+      problemData = ((IRegressionProblem)item.Value).ProblemData;
+    else
+      problemData = (IRegressionProblemData)item.Value;
+
+    var bestParameters = new RFParameter();
+    var bestSolution = GridSearch(problemData, out bestParameters);
+    vars["bestSolution"] = bestSolution;
+    vars["bestParameters"] = bestParameters;
+
+    Console.WriteLine("R2 (training): " + bestSolution.TrainingRSquared + ", R2 (test): " + bestSolution.TestRSquared);
+    Console.WriteLine("Model parameters: n = {0}, r = {1}, m = {2}", bestParameters.N, bestParameters.R, bestParameters.M);
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchSVMClassificationScriptSource.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchSVMClassificationScriptSource.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchSVMClassificationScriptSource.cs	(revision 11907)
@@ -0,0 +1,106 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Scripting;
+
+using LibSVM;
+
+public class SVMClassificationCrossValidationScript : HeuristicLab.Scripting.CSharpScriptBase {
+  /* Maximum degree of parallelism (specifies whether or not the grid search should be parallelized) */
+  const int maximumDegreeOfParallelism = 4;
+
+  /* Number of crossvalidation folds: */
+  const int numberOfFolds = 5;
+
+  /* Specify whether the folds should be shuffled */
+  const bool shuffleFolds = false;
+
+  /* The tunable SVM parameters:
+     - "C" (penalty factor) effects the trade-off between complexity and proportion of nonseparable samples and must be selected by the user. Can have any positive value.
+     - "nu" is an upper bound on the fraction of margin errors and a lower bound of the fraction of support vectors relative to the total number of training examples.
+     - "degree" represents the polynomial kernel degree
+     - "eps" (epsilon) determines the level of accuracy of the approximated function. It controls the width of the epsilon-insensitive zone used to fit the training data.
+       With optimal values of epsilon, the parameter C has negligible effect.
+     - "degree" represents the degree of the polynomial kernel
+     - "kernel_type" specifies the kernel to be used: linear, polynomial, radial basis or sigmoidal.
+       Valid values: svm_parameter.LINEAR, svm_parameter.POLY, svm_parameter.RBF, svm_parameter.SIGMOID
+     Comment or uncomment the parameter ranges below as needed.  */
+
+  static Dictionary<string, IEnumerable<double>> svmParameterRanges = new Dictionary<string, IEnumerable<double>> {
+        { "svm_type", new List<double> {svm_parameter.NU_SVC } },
+        { "kernel_type", new List<double> { svm_parameter.RBF }},
+        { "C", ValueGenerator.GenerateSteps(-1m, 10, 1).Select(x => Math.Pow(2,(double)x)) },
+        { "gamma", ValueGenerator.GenerateSteps(-4m, -1, 1).Select(x => Math.Pow(2,(double)x)) },
+//        { "eps", ValueGenerator.GenerateSteps(-8m, -1, 1).Select(x => Math.Pow(2, (double)x)) },
+        { "nu" , ValueGenerator.GenerateSteps(-10m, 0, 1m).Select(x => Math.Pow(2, (double)x)) },
+//        { "degree", ValueGenerator.GenerateSteps(1m, 4, 1).Select(x => (double)x) }
+  };
+
+  static Dictionary<int, string> svmTypes = new Dictionary<int, string> {
+    { svm_parameter.NU_SVC, "NU_SVC" },
+    { svm_parameter.C_SVC, "C_SVC" }
+  };
+
+  static Dictionary<int, string> kernelTypes = new Dictionary<int, string> {
+    { svm_parameter.LINEAR, "LINEAR" },
+    { svm_parameter.POLY, "POLY" },
+    { svm_parameter.RBF, "RBF" },
+    { svm_parameter.SIGMOID, "SIGMOID" }
+  };
+
+  private static SupportVectorClassificationSolution SvmGridSearch(IClassificationProblemData problemData, out svm_parameter bestParameters, out int nSv, out double cvMse) {
+    bestParameters = SupportVectorMachineUtil.GridSearch(out cvMse, problemData, svmParameterRanges, numberOfFolds, shuffleFolds, maximumDegreeOfParallelism);
+    double trainingError, testError;
+    string svmType = svmTypes[bestParameters.svm_type];
+    string kernelType = kernelTypes[bestParameters.kernel_type];
+    var svm_solution = SupportVectorClassification.CreateSupportVectorClassificationSolution(problemData, problemData.AllowedInputVariables, svmType, kernelType,
+                       bestParameters.C, bestParameters.nu, bestParameters.gamma, bestParameters.degree, out trainingError, out testError, out nSv);
+    return svm_solution;
+  }
+
+  public override void Main() {
+    var variables = (Variables)vars;
+    var item = variables.SingleOrDefault(x => x.Value is IClassificationProblem || x.Value is IClassificationProblemData);
+    if (item.Equals(default(KeyValuePair<string, object>)))
+      throw new ArgumentException("Could not find a suitable problem or problem data.");
+
+    string name = item.Key;
+    IClassificationProblemData problemData;
+    if (item.Value is IClassificationProblem)
+      problemData = ((IClassificationProblem)item.Value).ProblemData;
+    else
+      problemData = (IClassificationProblemData)item.Value;
+
+    int nSv; // number of support vectors
+    double cvMse;
+    svm_parameter bestParameters;
+    var bestSolution = SvmGridSearch(problemData, out bestParameters, out nSv, out cvMse);
+
+    vars["bestSolution"] = bestSolution;
+    Console.WriteLine(name + " parameters: C = {0}, g = {1:0.000}, eps = {2:0.000}, nu = {3:0.000}, degree = {4}", bestParameters.C, bestParameters.gamma, bestParameters.eps, bestParameters.nu, bestParameters.degree);
+    Console.WriteLine(name + " best solution accuracy (training): " + bestSolution.TrainingAccuracy + ", accuracy (test): " + bestSolution.TestAccuracy);
+
+    var bestParametersCollection = new ParameterCollection();
+    foreach (var p in svmParameterRanges.Keys) {
+      var getter = GenerateGetter(p);
+      bestParametersCollection.Add(new FixedValueParameter<DoubleValue>(p, new DoubleValue(getter(bestParameters))));
+    }
+    vars["bestParameters"] = bestParametersCollection;
+  }
+
+  private static Func<svm_parameter, double> GenerateGetter(string field) {
+    var paramExpr = Expression.Parameter(typeof(svm_parameter));
+    var getterExpr = Expression.Convert(Expression.Field(paramExpr, field), typeof(double)); // cast to double
+    Func<svm_parameter, double> f = Expression.Lambda<Func<svm_parameter, double>>(getterExpr, paramExpr).Compile();
+    return f;
+  }
+}
+
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchSVMRegressionScriptSource.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchSVMRegressionScriptSource.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/GridSearchSVMRegressionScriptSource.cs	(revision 11907)
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.Instances.DataAnalysis;
+using HeuristicLab.Scripting;
+
+using LibSVM;
+
+public class SVMRegressionCrossValidationScript : HeuristicLab.Scripting.CSharpScriptBase {
+  /* Maximum degree of parallelism (specifies whether or not the grid search should be parallelized) */
+  const int maximumDegreeOfParallelism = 4;
+
+  /* Number of crossvalidation folds: */
+  const int numberOfFolds = 5;
+
+  /* Specify whether the folds should be shuffled */
+  const bool shuffleFolds = false;
+
+  /* The tunable SVM parameters:
+     - "C" (penalty factor) effects the trade-off between complexity and proportion of nonseparable samples and must be selected by the user. Can have any positive value.
+     - "nu" is an upper bound on the fraction of margin errors and a lower bound of the fraction of support vectors relative to the total number of training examples.
+     - "degree" represents the polynomial kernel degree
+     - "eps" (epsilon) determines the level of accuracy of the approximated function. It controls the width of the epsilon-insensitive zone used to fit the training data.
+       With optimal values of epsilon, the parameter C has negligible effect.
+     - "degree" represents the degree of the polynomial kernel
+     - "kernel_type" specifies the kernel to be used: linear, polynomial, radial basis or sigmoidal.
+       Valid values: svm_parameter.LINEAR, svm_parameter.POLY, svm_parameter.RBF, svm_parameter.SIGMOID
+     Comment or uncomment the parameter ranges below as needed.  */
+
+  static Dictionary<string, IEnumerable<double>> svmParameterRanges = new Dictionary<string, IEnumerable<double>> {
+        { "svm_type", new List<double> {svm_parameter.NU_SVR } },
+        { "kernel_type", new List<double> { svm_parameter.RBF }},
+        { "C", ValueGenerator.GenerateSteps(-1m, 12, 1).Select(x => Math.Pow(2, (double)x)) },
+        { "gamma", ValueGenerator.GenerateSteps(-4m, -1, 1).Select(x => Math.Pow(2, (double)x)) },
+//        { "eps", ValueGenerator.GenerateSteps(-8m, -1, 1).Select(x => Math.Pow(2, (double)x)) },
+        { "nu" , ValueGenerator.GenerateSteps(-10m, 0, 1m).Select(x => Math.Pow(2, (double)x)) },
+//        { "degree", ValueGenerator.GenerateSteps(1m, 4, 1).Select(x => (double)x) }
+  };
+
+  static Dictionary<int, string> svmTypes = new Dictionary<int, string> {
+    { svm_parameter.NU_SVR, "NU_SVR" },
+    { svm_parameter.EPSILON_SVR, "EPSILON_SVR" }
+  };
+
+  static Dictionary<int, string> kernelTypes = new Dictionary<int, string> {
+    { svm_parameter.LINEAR, "LINEAR" },
+    { svm_parameter.POLY, "POLY" },
+    { svm_parameter.RBF, "RBF" },
+    { svm_parameter.SIGMOID, "SIGMOID" }
+  };
+
+  private static SupportVectorRegressionSolution SvmGridSearch(IRegressionProblemData problemData, out svm_parameter bestParameters, out int nSv, out double cvMse) {
+    bestParameters = SupportVectorMachineUtil.GridSearch(out cvMse, problemData, svmParameterRanges, numberOfFolds, shuffleFolds, maximumDegreeOfParallelism);
+    double trainingError, testError;
+    string svmType = svmTypes[bestParameters.svm_type];
+    string kernelType = kernelTypes[bestParameters.kernel_type];
+    var svm_solution = SupportVectorRegression.CreateSupportVectorRegressionSolution(problemData, problemData.AllowedInputVariables, svmType, kernelType,
+                       bestParameters.C, bestParameters.nu, bestParameters.gamma, bestParameters.eps, bestParameters.degree, out trainingError, out testError, out nSv);
+    return svm_solution;
+  }
+
+  public override void Main() {
+    var variables = (Variables)vars;
+    var item = variables.SingleOrDefault(x => x.Value is IRegressionProblem || x.Value is IRegressionProblemData);
+    if (item.Equals(default(KeyValuePair<string, object>)))
+      throw new ArgumentException("Could not find a suitable problem or problem data.");
+
+    string name = item.Key;
+    IRegressionProblemData problemData;
+    if (item.Value is IRegressionProblem)
+      problemData = ((IRegressionProblem)item.Value).ProblemData;
+    else
+      problemData = (IRegressionProblemData)item.Value;
+
+    int nSv; // number of support vectors
+    double cvMse;
+    svm_parameter bestParameters;
+    var bestSolution = SvmGridSearch(problemData, out bestParameters, out nSv, out cvMse);
+
+    vars["bestSolution"] = bestSolution;
+    Console.WriteLine(name + " parameters: C = {0}, g = {1:0.000}, eps = {2:0.000}, nu = {3:0.000}, degree = {4}", bestParameters.C, bestParameters.gamma, bestParameters.eps, bestParameters.nu, bestParameters.degree);
+    Console.WriteLine(name + " best solution mse (training): " + bestSolution.TrainingMeanSquaredError + ", mse (test): " + bestSolution.TestMeanSquaredError);
+    Console.WriteLine(name + " best solution R2 (training): " + bestSolution.TrainingRSquared + ", R2 (test): " + bestSolution.TestRSquared);
+
+    var bestParametersCollection = new ParameterCollection();
+    foreach (var p in svmParameterRanges.Keys) {
+      var getter = GenerateGetter(p);
+      bestParametersCollection.Add(new FixedValueParameter<DoubleValue>(p, new DoubleValue(getter(bestParameters))));
+    }
+    vars["bestParameters"] = bestParametersCollection;
+  }
+
+  private static Func<svm_parameter, double> GenerateGetter(string field) {
+    var paramExpr = Expression.Parameter(typeof(svm_parameter));
+    var getterExpr = Expression.Convert(Expression.Field(paramExpr, field), typeof(double)); // cast to double
+    Func<svm_parameter, double> f = Expression.Lambda<Func<svm_parameter, double>>(getterExpr, paramExpr).Compile();
+    return f;
+  }
+}
+
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/OSGARastriginScriptSource.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/OSGARastriginScriptSource.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/OSGARastriginScriptSource.cs	(revision 11907)
@@ -0,0 +1,111 @@
+﻿using System;
+using System.Linq;
+
+public class OSGARastriginScript : HeuristicLab.Scripting.CSharpScriptBase {
+  public override void Main() {
+    int N = vars.N.Value;
+    double minX = vars.minX.Value;
+    double maxX = vars.maxX.Value;
+    int seed = vars.seed.Value;
+    var rand = new Random(seed);
+
+    var result = OSGA(rand, popSize: 1000, iterations: 5000, maxSelPres: 1000, mutationRate: 0.1,
+         obj: Rastrigin,
+      // x ~(i.i.d) U(0,1) * 10.24 - 5.12
+         creator: () => Enumerable.Range(1, N).Select(_ => rand.NextDouble() * (maxX - minX) + minX).ToArray(),
+      // random parent selection
+         selector: (f) => rand.Next(f.Length),
+      // single point crossover
+         crossover: (p0, p1, cand) => {
+           int cut = rand.Next(cand.Length);
+           Array.Copy(p0, cand, cut);
+           Array.Copy(p1, cut, cand, cut, cand.Length - cut);
+         },
+      // single point manipulation
+         manipulator: (p) => p[rand.Next(N)] = rand.NextDouble() * (maxX - minX) + minX,
+         output: true
+      );
+
+    double bestFit = result.Item2;
+    vars.bestFitness = bestFit;
+    Console.WriteLine("best fitness: {0}", bestFit);
+  }
+
+  private double Rastrigin(double[] x) {
+    return 10.0 * x.Length + x.Sum(xi => xi * xi - 10.0 * Math.Cos(2.0 * Math.PI * xi));
+  }
+
+  private Tuple<T, double> OSGA<T>(Random rand, int popSize, int iterations, double maxSelPres, double mutationRate, Func<T, double> obj,
+      Func<T> creator, Func<double[], int> selector, Action<T, T, T> crossover, Action<T> manipulator,
+      bool output = false)
+      where T : ICloneable {
+    // generate random pop
+    T[] pop = Enumerable.Range(0, popSize).Select(_ => creator()).ToArray();
+    // evaluate initial pop
+    double[] fit = pop.Select(p => obj(p)).ToArray();
+
+    // arrays for next pop (clone current pop because solutions are reused)
+    T[] popNew = pop.Select(pi => (T)pi.Clone()).ToArray();
+    double[] fitNew = new double[popSize];
+
+    var bestSolution = (T)pop.First().Clone(); // take a random solution (don't care)
+    double bestFit = fit.First();
+
+    // run generations
+    double curSelPres = 0;
+    for (int g = 0; g < iterations && curSelPres < maxSelPres; g++) {
+      // keep the first element as elite
+      int i = 1;
+      int genEvals = 0;
+      do {
+        var p1Idx = selector(fit);
+        var p2Idx = selector(fit);
+
+        var p1 = pop[p1Idx];
+        var p2 = pop[p2Idx];
+        var f1 = fit[p1Idx];
+        var f2 = fit[p2Idx];
+
+        // generate candidate solution (reuse old solutions)
+        crossover(p1, p2, popNew[i]);
+        // optional mutation
+        if (rand.NextDouble() < mutationRate) {
+          manipulator(popNew[i]);
+        }
+
+        double f = obj(popNew[i]);
+        genEvals++;
+        // if child is better than best (strict offspring selection)
+        if (f < Math.Min(f1, f2)) {
+          // update best fitness
+          if (f < bestFit) {
+            bestFit = f;
+            bestSolution = (T)popNew[i].Clone(); // overall best
+          }
+
+          // keep
+          fitNew[i] = f;
+          i++;
+        }
+
+        curSelPres = genEvals / (double)popSize;
+      } while (i < popNew.Length && curSelPres < maxSelPres);
+
+      Console.WriteLine("generation {0} obj {1:0.000} sel. pres. {2:###.0}", g, bestFit, curSelPres);
+
+      // swap 
+      var tmpPop = pop;
+      var tmpFit = fit;
+      pop = popNew;
+      fit = fitNew;
+      popNew = tmpPop;
+      fitNew = tmpFit;
+
+      // keep elite
+      popNew[0] = (T)bestSolution.Clone();
+      fitNew[0] = bestFit;
+    }
+
+    return Tuple.Create(bestSolution, bestFit);
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/ScriptSources.Designer.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/ScriptSources.Designer.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/ScriptSources.Designer.cs	(revision 11907)
@@ -0,0 +1,229 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.34014
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Tests {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class ScriptSources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal ScriptSources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Tests.HeuristicLab.Scripting_3._3.Script_Sources.ScriptSources", typeof(ScriptSources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Linq;
+        ///
+        ///using HeuristicLab.Analysis;
+        ///using HeuristicLab.Data;
+        ///using HeuristicLab.Encodings.PermutationEncoding;
+        ///using HeuristicLab.Problems.Instances.QAPLIB;
+        ///using HeuristicLab.Problems.QuadraticAssignment;
+        ///using HeuristicLab.Random;
+        ///
+        ///public class GAQAPScript : HeuristicLab.Scripting.CSharpScriptBase {
+        ///  public override void Main() {
+        ///    DateTime start = DateTime.UtcNow;
+        ///
+        ///    QuadraticAssignmentProblem qap;
+        ///    if (vars.Contains(&quot;qap&quot;)) qap = vars.qap;
+        ///    else {
+        ///  [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string GAQAPScriptSource {
+            get {
+                return ResourceManager.GetString("GAQAPScriptSource", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Collections.Generic;
+        ///using System.Linq;
+        ///
+        ///using HeuristicLab.Algorithms.DataAnalysis;
+        ///using HeuristicLab.Problems.DataAnalysis;
+        ///using HeuristicLab.Problems.Instances.DataAnalysis;
+        ///using HeuristicLab.Scripting;
+        ///
+        ///public class RFClassificationCrossValidationScript : HeuristicLab.Scripting.CSharpScriptBase {
+        ///  /* Maximum degree of parallelism (specifies whether or not the grid search should be parallelized) */
+        ///  const int maximumDegreeOfParallelism = 4;
+        ///  /* Number of cross [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string GridSearchRFClassificationScriptSource {
+            get {
+                return ResourceManager.GetString("GridSearchRFClassificationScriptSource", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Collections.Generic;
+        ///using System.Linq;
+        ///
+        ///using HeuristicLab.Algorithms.DataAnalysis;
+        ///using HeuristicLab.Problems.DataAnalysis;
+        ///using HeuristicLab.Problems.Instances.DataAnalysis;
+        ///using HeuristicLab.Random;
+        ///using HeuristicLab.Scripting;
+        ///
+        ///public class RFRegressionCrossValidationScript : HeuristicLab.Scripting.CSharpScriptBase {
+        ///  /* Maximum degree of parallelism (specifies whether or not the grid search should be parallelized) */
+        ///  const int maximumDegreeOfParallelism =  [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string GridSearchRFRegressionScriptSource {
+            get {
+                return ResourceManager.GetString("GridSearchRFRegressionScriptSource", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Collections.Generic;
+        ///using System.Linq;
+        ///using System.Linq.Expressions;
+        ///
+        ///using HeuristicLab.Algorithms.DataAnalysis;
+        ///using HeuristicLab.Core;
+        ///using HeuristicLab.Data;
+        ///using HeuristicLab.Parameters;
+        ///using HeuristicLab.Problems.DataAnalysis;
+        ///using HeuristicLab.Problems.Instances.DataAnalysis;
+        ///using HeuristicLab.Scripting;
+        ///
+        ///using LibSVM;
+        ///
+        ///public class SVMClassificationCrossValidationScript : HeuristicLab.Scripting.CSharpScriptBase {
+        ///  /* Maximum degree of parallelism ( [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string GridSearchSVMClassificationScriptSource {
+            get {
+                return ResourceManager.GetString("GridSearchSVMClassificationScriptSource", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Collections.Generic;
+        ///using System.Linq;
+        ///using System.Linq.Expressions;
+        ///
+        ///using HeuristicLab.Algorithms.DataAnalysis;
+        ///using HeuristicLab.Core;
+        ///using HeuristicLab.Data;
+        ///using HeuristicLab.Parameters;
+        ///using HeuristicLab.Problems.DataAnalysis;
+        ///using HeuristicLab.Problems.Instances.DataAnalysis;
+        ///using HeuristicLab.Scripting;
+        ///
+        ///using LibSVM;
+        ///
+        ///public class SVMRegressionCrossValidationScript : HeuristicLab.Scripting.CSharpScriptBase {
+        ///  /* Maximum degree of parallelism (spec [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string GridSearchSVMRegressionScriptSource {
+            get {
+                return ResourceManager.GetString("GridSearchSVMRegressionScriptSource", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Linq;
+        ///using System.Threading;
+        ///using System.Windows.Forms;
+        ///
+        ///using HeuristicLab.Algorithms.GeneticAlgorithm;
+        ///using HeuristicLab.Core;
+        ///using HeuristicLab.MainForm;
+        ///using HeuristicLab.MainForm.WindowsForms;
+        ///using HeuristicLab.Optimization;
+        ///using HeuristicLab.Optimization.Views;
+        ///using HeuristicLab.Problems.TravelingSalesman;
+        ///
+        ///public class GUIAutomationScript : HeuristicLab.Scripting.CSharpScriptBase {
+        ///  readonly ManualResetEvent mutex = new ManualResetEvent(false);
+        ///
+        ///  p [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string GUIAutomationScriptSource {
+            get {
+                return ResourceManager.GetString("GUIAutomationScriptSource", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Linq;
+        ///
+        ///public class OSGARastriginScript : HeuristicLab.Scripting.CSharpScriptBase {
+        ///  public override void Main() {
+        ///    int N = vars.N.Value;
+        ///    double minX = vars.minX.Value;
+        ///    double maxX = vars.maxX.Value;
+        ///    int seed = vars.seed.Value;
+        ///    var rand = new Random(seed);
+        ///
+        ///    var result = OSGA(rand, popSize: 1000, iterations: 5000, maxSelPres: 1000, mutationRate: 0.1,
+        ///         obj: Rastrigin,
+        ///      // x ~(i.i.d) U(0,1) * 10.24 - 5.12
+        ///         creator: () =&gt; Enum [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string OSGARastriginScriptSource {
+            get {
+                return ResourceManager.GetString("OSGARastriginScriptSource", resourceCulture);
+            }
+        }
+    }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/ScriptSources.resx
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/ScriptSources.resx	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/Script Sources/ScriptSources.resx	(revision 11907)
@@ -0,0 +1,142 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="GAQAPScriptSource" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>gaqapscriptsource.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+  <data name="GridSearchRFClassificationScriptSource" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>gridsearchrfclassificationscriptsource.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="GridSearchRFRegressionScriptSource" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>gridsearchrfregressionscriptsource.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="GridSearchSVMClassificationScriptSource" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>gridsearchsvmclassificationscriptsource.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="GridSearchSVMRegressionScriptSource" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>gridsearchsvmregressionscriptsource.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="GUIAutomationScriptSource" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>guiautomationscriptsource.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+  <data name="OSGARastriginScriptSource" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>osgarastriginscriptsource.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+</root>
Index: /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/ScriptingUtils.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/ScriptingUtils.cs	(revision 11907)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Scripting-3.3/ScriptingUtils.cs	(revision 11907)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Threading;
+using HeuristicLab.Scripting;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Tests {
+  public static class ScriptingUtils {
+    public const string ScriptsDirectory = @"Scripts\";
+    public const string ScriptSourcesDirectory = @"Test Resources\Script Sources\";
+    public const string ScriptFileExtension = ".hl";
+    public const string ScriptSourceFileExtension = ".cs";
+
+    public static void RunScript(CSharpScript s) {
+      var trigger = new EventWaitHandle(false, EventResetMode.ManualReset);
+      Exception ex = null;
+
+      s.ScriptExecutionFinished += (sender, e) => { ex = e.Value; trigger.Set(); };
+      s.ExecuteAsync();
+      trigger.WaitOne();
+
+      Assert.IsNull(ex);
+    }
+
+    public static T GetVariable<T>(CSharpScript a, string resultName) {
+      return (T)a.VariableStore[resultName];
+    }
+  }
+}
Index: /stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 11906)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 11907)
@@ -102,5 +102,5 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="ALGLIB-3.7.0, Version=3.7.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+    <Reference Include="ALGLIB-3.7.0">
       <HintPath>..\bin\ALGLIB-3.7.0.dll</HintPath>
       <Private>False</Private>
@@ -122,7 +122,7 @@
       <Private>False</Private>
     </Reference>
-    <Reference Include="HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
+    <Reference Include="HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3">
       <HintPath>..\bin\HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3">
@@ -150,5 +150,5 @@
       <Private>False</Private>
     </Reference>
-    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0">
+    <Reference Include="HeuristicLab.Analysis-3.3">
       <HintPath>..\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
       <Private>False</Private>
@@ -214,4 +214,12 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3">
+      <HintPath>..\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimizer-3.3">
+      <HintPath>..\bin\HeuristicLab.Optimizer-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.ParallelEngine-3.3">
       <HintPath>..\bin\HeuristicLab.ParallelEngine-3.3.dll</HintPath>
@@ -254,7 +262,7 @@
       <Private>False</Private>
     </Reference>
-    <Reference Include="HeuristicLab.Problems.GrammaticalEvolution-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
+    <Reference Include="HeuristicLab.Problems.GrammaticalEvolution-3.3">
       <HintPath>..\bin\HeuristicLab.Problems.GrammaticalEvolution-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Problems.Instances-3.3">
@@ -322,4 +330,8 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Scripting-3.3">
+      <HintPath>..\bin\HeuristicLab.Scripting-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Selection-3.3">
       <HintPath>..\bin\HeuristicLab.Selection-3.3.dll</HintPath>
@@ -328,4 +340,8 @@
     <Reference Include="HeuristicLab.SequentialEngine-3.3">
       <HintPath>..\bin\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="LibSVM-3.12">
+      <HintPath>..\bin\LibSVM-3.12.dll</HintPath>
       <Private>False</Private>
     </Reference>
@@ -340,4 +356,5 @@
     <Reference Include="System.Drawing" />
     <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Windows.Forms" />
   </ItemGroup>
   <ItemGroup>
@@ -347,4 +364,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="AssemblyInitializer.cs" />
     <Compile Include="HeuristicLab-3.3\AlgorithmExtensions.cs" />
     <Compile Include="HeuristicLab-3.3\CloningConstructorTest.cs" />
@@ -358,8 +376,25 @@
     <Compile Include="HeuristicLab-3.3\PluginDependenciesTest.cs" />
     <Compile Include="HeuristicLab-3.3\PluginLoader.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\EsGriewankSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\GaussianProcessRegressionSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\GAVrpSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\GeSymbolicRegressionSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\GPArtificialAntSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\GPLawnMowerSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\GPSymbolicClassificationSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\GPSymbolicRegressionSampleTest.cs" />
     <Compile Include="HeuristicLab-3.3\Samples\GPTimeSeriesSampleTest.cs" />
     <Compile Include="HeuristicLab-3.3\Samples\GPMultiplexerSampleTest.cs" />
-    <Compile Include="HeuristicLab-3.3\Samples\SamplesTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\LocalSearchKnapsackSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\PsoSchwefelSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\RAPGASchedulingSampleTest.cs" />
     <Compile Include="HeuristicLab-3.3\Samples\SamplesUtils.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\GATspSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\IslandGaTspSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\ScatterSearchVRPSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\SimulatedAnnealingRastriginSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\TabuSearchTspSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\TabuSearchVRPSampleTest.cs" />
+    <Compile Include="HeuristicLab-3.3\Samples\VnsTspSampleTest.cs" />
     <Compile Include="HeuristicLab-3.3\StorableConstructorTest.cs" />
     <Compile Include="HeuristicLab-3.3\ThreadSafeLogTest.cs" />
@@ -476,5 +511,39 @@
     <Compile Include="HeuristicLab.Problems.VehicleRouting-3.4\VRPInstancesTest.cs" />
     <Compile Include="HeuristicLab.Random-3.3\RandomEnumerableSampleTest.cs" />
+    <Compile Include="HeuristicLab.Scripting-3.3\GAQAPScriptTest.cs" />
+    <Compile Include="HeuristicLab.Scripting-3.3\GridSearchRFClassificationScriptTest.cs" />
+    <Compile Include="HeuristicLab.Scripting-3.3\GridSearchRFRegressionScriptTest.cs" />
+    <Compile Include="HeuristicLab.Scripting-3.3\GridSearchSVMClassificationScriptTest.cs" />
+    <Compile Include="HeuristicLab.Scripting-3.3\GridSearchSVMRegressionScriptTest.cs" />
+    <Compile Include="HeuristicLab.Scripting-3.3\Script Sources\ScriptSources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>ScriptSources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLab.Scripting-3.3\ScriptingUtils.cs" />
+    <Compile Include="HeuristicLab.Scripting-3.3\GUIAutomationScriptTest.cs" />
+    <Compile Include="HeuristicLab.Scripting-3.3\OSGARastriginScriptTest.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="HeuristicLab.Scripting-3.3\Script Sources\GridSearchRFClassificationScriptSource.cs">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Compile>
+    <Compile Include="HeuristicLab.Scripting-3.3\Script Sources\GridSearchRFRegressionScriptSource.cs">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Compile>
+    <Compile Include="HeuristicLab.Scripting-3.3\Script Sources\GridSearchSVMClassificationScriptSource.cs">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Compile>
+    <Compile Include="HeuristicLab.Scripting-3.3\Script Sources\GridSearchSVMRegressionScriptSource.cs">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Compile>
+    <Compile Include="HeuristicLab.Scripting-3.3\Script Sources\GAQAPScriptSource.cs">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Compile>
+    <Compile Include="HeuristicLab.Scripting-3.3\Script Sources\OSGARastriginScriptSource.cs">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Compile>
+    <Compile Include="HeuristicLab.Scripting-3.3\Script Sources\GUIAutomationScriptSource.cs">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Compile>
     <Compile Include="TestRandom.cs" />
   </ItemGroup>
@@ -517,4 +586,11 @@
     </Content>
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="HeuristicLab.Scripting-3.3\Script Sources\ScriptSources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>ScriptSources.Designer.cs</LastGenOutput>
+      <CustomToolNamespace>HeuristicLab.Tests</CustomToolNamespace>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Index: /stable/Test.cmd
===================================================================
--- /stable/Test.cmd	(revision 11907)
+++ /stable/Test.cmd	(revision 11907)
@@ -0,0 +1,29 @@
+@ECHO OFF
+
+SET /P BUILDBEFORETEST=Should the test project be rebuilt [n]: 
+
+SET TESTCATEGORY=%~1
+
+IF "%TESTCATEGORY%"=="" SET TESTCATEGORY=Essential
+SET /P USERCATEGORY=Which category do you want to run  [%TESTCATEGORY%]: 
+IF "%USERCATEGORY%" NEQ "" SET TESTCATEGORY=%USERCATEGORY%
+
+set /P TESTPLATFORM=Which platform to run the tests [x64]: 
+IF "%TESTPLATFORM%"=="" SET TESTPLATFORM=x64
+
+FOR /F "tokens=1,3 delims=	 " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0"') DO (
+  IF "%%A"=="MSBuildToolsPath" SET MSBUILDPATH=%%B)
+    
+IF "%BUILDBEFORETEST%" NEQ "" (
+  ECHO Building tests project ...
+  %MSBUILDPATH%msbuild.exe "HeuristicLab 3.3 Tests.sln" /target:Rebuild /p:Configuration="Debug",Platform="%TESTPLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+)
+
+ECHO Test starting for category %TESTCATEGORY%...
+
+FOR /F "tokens=1,2,* delims=	 " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7"') DO (
+  IF "%%A"=="12.0" SET VSPATH=%%C)
+
+"%VSPATH%Common7\IDE\CommonExtensions\Microsoft\TestWindow\VSTest.Console.exe" bin\HeuristicLab.Tests.dll /Framework:framework40 /Platform:%TESTPLATFORM% /TestCaseFilter:"TestCategory=%TESTCATEGORY%"
+
+PAUSE
