Index: trunk/sources/HeuristicLab.Communication.Data/DummyDriverConfiguration.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/DummyDriverConfiguration.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/DummyDriverConfiguration.cs	(revision 584)
@@ -0,0 +1,11 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Communication.Data {
+  public class DummyDriverConfiguration : ItemBase, IDriverConfiguration {
+    public DummyDriverConfiguration() {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/HeuristicLab.Communication.Data.csproj
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/HeuristicLab.Communication.Data.csproj	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/HeuristicLab.Communication.Data.csproj	(revision 584)
@@ -0,0 +1,197 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{14E1C3E3-2496-436A-AE00-09F7B81DB15B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Communication.Data</RootNamespace>
+    <AssemblyName>HeuristicLab.Communication.Data-3.2</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <StartupObject>
+    </StartupObject>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ItemGroup>
+    <Compile Include="DummyDriverConfiguration.cs" />
+    <Compile Include="HeuristicLabCommunicationDataPlugin.cs" />
+    <Compile Include="IDataStream.cs" />
+    <Compile Include="IDriverConfiguration.cs" />
+    <Compile Include="IObjectStream.cs" />
+    <Compile Include="LocalProcessDriverConfiguration.cs" />
+    <Compile Include="LocalProcessDriverConfigurationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LocalProcessDriverConfigurationView.designer.cs">
+      <DependentUpon>LocalProcessDriverConfigurationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OdbcDatabaseDriverConfiguration.cs" />
+    <Compile Include="OdbcDatabaseDriverConfigurationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OdbcDatabaseDriverConfigurationView.designer.cs">
+      <DependentUpon>OdbcDatabaseDriverConfigurationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ProcessData.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Protocol.cs" />
+    <Compile Include="ProtocolEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProtocolEditor.Designer.cs">
+      <DependentUpon>ProtocolEditor.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ProtocolState.cs" />
+    <Compile Include="ProtocolStateView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProtocolStateView.Designer.cs">
+      <DependentUpon>ProtocolStateView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="SocketData.cs" />
+    <Compile Include="StateTransition.cs" />
+    <Compile Include="StateTransitionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StateTransitionView.Designer.cs">
+      <DependentUpon>StateTransitionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TcpNetworkDriverConfiguration.cs" />
+    <Compile Include="TcpNetworkDriverConfigurationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TcpNetworkDriverConfigurationView.designer.cs">
+      <DependentUpon>TcpNetworkDriverConfigurationView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="LocalProcessDriverConfigurationView.resx">
+      <DependentUpon>LocalProcessDriverConfigurationView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OdbcDatabaseDriverConfigurationView.resx">
+      <DependentUpon>OdbcDatabaseDriverConfigurationView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ProtocolEditor.resx">
+      <DependentUpon>ProtocolEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ProtocolStateView.resx">
+      <DependentUpon>ProtocolStateView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="StateTransitionView.resx">
+      <DependentUpon>StateTransitionView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TcpNetworkDriverConfigurationView.resx">
+      <DependentUpon>TcpNetworkDriverConfigurationView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.XML" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <PropertyGroup>
+    <PreBuildEvent>cmd /c ""$(SolutionDir)PreBuildEvent.cmd" "$(ProjectDir).""</PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Constraints\HeuristicLab.Constraints.csproj">
+      <Project>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</Project>
+      <Name>HeuristicLab.Constraints</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators.Programmable\HeuristicLab.Operators.Programmable.csproj">
+      <Project>{E3CCBFC6-900C-41B6-AFB8-6646DB097435}</Project>
+      <Name>HeuristicLab.Operators.Programmable</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+</Project>
Index: trunk/sources/HeuristicLab.Communication.Data/HeuristicLabCommunicationDataPlugin.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/HeuristicLabCommunicationDataPlugin.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/HeuristicLabCommunicationDataPlugin.cs	(revision 584)
@@ -0,0 +1,15 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Communication.Data {
+  [ClassInfo(Name = "HeuristicLab.Communication.Data-3.2")]
+  [PluginFile(Filename = "HeuristicLab.Communication.Data-3.2.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Data-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Operators.Programmable-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Constraints-3.2")]
+  public class HeuristicLabCommunicationDataPlugin : PluginBase {
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/IDataStream.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/IDataStream.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/IDataStream.cs	(revision 584)
@@ -0,0 +1,15 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Communication.Data {
+  public interface IDataStream : IItem {
+    void Initialize(IDriverConfiguration configuration);
+    bool Connect();
+    void Close();
+
+    void Write(string s);
+    string Read();
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/IDriverConfiguration.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/IDriverConfiguration.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/IDriverConfiguration.cs	(revision 584)
@@ -0,0 +1,9 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Communication.Data {
+  public interface IDriverConfiguration : IItem {
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/IObjectStream.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/IObjectStream.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/IObjectStream.cs	(revision 584)
@@ -0,0 +1,15 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Communication.Data {
+  public interface IObjectStream : IItem {
+    void Initialize(IDriverConfiguration configuration);
+    bool Connect();
+    void Close();
+
+    void Write(IItem item);
+    IItem Read();
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfiguration.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfiguration.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfiguration.cs	(revision 584)
@@ -0,0 +1,60 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public class LocalProcessDriverConfiguration : ItemBase, IDriverConfiguration {
+    private StringData executablePath;
+    public StringData ExecutablePath {
+      get { return executablePath; }
+      set {
+        executablePath = value;
+        OnChanged();
+      }
+    }
+    private StringData arguments;
+    public StringData Arguments {
+      get { return arguments; }
+      set {
+        arguments = value;
+        OnChanged();
+      }
+    }
+    public LocalProcessDriverConfiguration() {
+      executablePath = new StringData("");
+      arguments = new StringData("");
+    }
+
+    public override IView CreateView() {
+      return new LocalProcessDriverConfigurationView(this);
+    }
+
+    #region persistence & clone
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode executablePathNode = PersistenceManager.Persist("ExecutablePath", ExecutablePath, document, persistedObjects);
+      node.AppendChild(executablePathNode);
+      XmlNode argumentsNode = PersistenceManager.Persist("Arguments", Arguments, document, persistedObjects);
+      node.AppendChild(argumentsNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      executablePath = (StringData)PersistenceManager.Restore(node.SelectSingleNode("ExecutablePath"), restoredObjects);
+      arguments = (StringData)PersistenceManager.Restore(node.SelectSingleNode("Arguments"), restoredObjects);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      LocalProcessDriverConfiguration clone = new LocalProcessDriverConfiguration();
+      clonedObjects.Add(Guid, clone);
+      clone.executablePath = (StringData)Auxiliary.Clone(executablePath, clonedObjects);
+      clone.arguments = (StringData)Auxiliary.Clone(arguments, clonedObjects);
+      return clone;
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfigurationView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfigurationView.Designer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfigurationView.Designer.cs	(revision 584)
@@ -0,0 +1,110 @@
+﻿namespace HeuristicLab.Communication.Data {
+  partial class LocalProcessDriverConfigurationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.executablePathStringDataView = new HeuristicLab.Data.StringDataView();
+      this.argumentsStringDataView = new HeuristicLab.Data.StringDataView();
+      this.executableLabel = new System.Windows.Forms.Label();
+      this.argumentsLabel = new System.Windows.Forms.Label();
+      this.browseExecutableButtom = new System.Windows.Forms.Button();
+      this.executablePathOpenFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.SuspendLayout();
+      // 
+      // executablePathStringDataView
+      // 
+      this.executablePathStringDataView.Caption = "View";
+      this.executablePathStringDataView.Location = new System.Drawing.Point(69, 3);
+      this.executablePathStringDataView.Name = "executablePathStringDataView";
+      this.executablePathStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.executablePathStringDataView.StringData = null;
+      this.executablePathStringDataView.TabIndex = 0;
+      // 
+      // argumentsStringDataView
+      // 
+      this.argumentsStringDataView.Caption = "View";
+      this.argumentsStringDataView.Location = new System.Drawing.Point(69, 31);
+      this.argumentsStringDataView.Name = "argumentsStringDataView";
+      this.argumentsStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.argumentsStringDataView.StringData = null;
+      this.argumentsStringDataView.TabIndex = 1;
+      // 
+      // executableLabel
+      // 
+      this.executableLabel.AutoSize = true;
+      this.executableLabel.Location = new System.Drawing.Point(3, 6);
+      this.executableLabel.Name = "executableLabel";
+      this.executableLabel.Size = new System.Drawing.Size(60, 13);
+      this.executableLabel.TabIndex = 2;
+      this.executableLabel.Text = "Executable";
+      // 
+      // argumentsLabel
+      // 
+      this.argumentsLabel.AutoSize = true;
+      this.argumentsLabel.Location = new System.Drawing.Point(3, 34);
+      this.argumentsLabel.Name = "argumentsLabel";
+      this.argumentsLabel.Size = new System.Drawing.Size(57, 13);
+      this.argumentsLabel.TabIndex = 3;
+      this.argumentsLabel.Text = "Arguments";
+      // 
+      // browseExecutableButtom
+      // 
+      this.browseExecutableButtom.Location = new System.Drawing.Point(275, 1);
+      this.browseExecutableButtom.Name = "browseExecutableButtom";
+      this.browseExecutableButtom.Size = new System.Drawing.Size(75, 23);
+      this.browseExecutableButtom.TabIndex = 4;
+      this.browseExecutableButtom.Text = "Browse...";
+      this.browseExecutableButtom.UseVisualStyleBackColor = true;
+      this.browseExecutableButtom.Click += new System.EventHandler(this.browseExecutableButtom_Click);
+      // 
+      // executablePathOpenFileDialog
+      // 
+      this.executablePathOpenFileDialog.FileName = "*.exe";
+      this.executablePathOpenFileDialog.Filter = "Executables|*.exe|All files|*.*";
+      // 
+      // LocalProcessDriverConfigurationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.browseExecutableButtom);
+      this.Controls.Add(this.argumentsLabel);
+      this.Controls.Add(this.executableLabel);
+      this.Controls.Add(this.argumentsStringDataView);
+      this.Controls.Add(this.executablePathStringDataView);
+      this.Name = "LocalProcessDriverConfigurationView";
+      this.Size = new System.Drawing.Size(352, 54);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.StringDataView executablePathStringDataView;
+    private HeuristicLab.Data.StringDataView argumentsStringDataView;
+    private System.Windows.Forms.Label executableLabel;
+    private System.Windows.Forms.Label argumentsLabel;
+    private System.Windows.Forms.Button browseExecutableButtom;
+    private System.Windows.Forms.OpenFileDialog executablePathOpenFileDialog;
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfigurationView.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfigurationView.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfigurationView.cs	(revision 584)
@@ -0,0 +1,48 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public partial class LocalProcessDriverConfigurationView : ViewBase {
+    public LocalProcessDriverConfiguration LocalProcessDriverConfiguration {
+      get { return (LocalProcessDriverConfiguration)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public LocalProcessDriverConfigurationView() {
+      InitializeComponent();
+    }
+
+    public LocalProcessDriverConfigurationView(LocalProcessDriverConfiguration localProcessDriverConfiguration)
+      : this() {
+      LocalProcessDriverConfiguration = localProcessDriverConfiguration;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (LocalProcessDriverConfiguration == null) {
+        executablePathStringDataView.Enabled = false;
+        executablePathStringDataView.StringData = null;
+        argumentsStringDataView.Enabled = false;
+        argumentsStringDataView.StringData = null;
+      } else {
+        executablePathStringDataView.StringData = LocalProcessDriverConfiguration.ExecutablePath;
+        executablePathStringDataView.Enabled = true;
+        argumentsStringDataView.StringData = LocalProcessDriverConfiguration.Arguments;
+        argumentsStringDataView.Enabled = true;
+      }
+    }
+
+    private void browseExecutableButtom_Click(object sender, EventArgs e) {
+      if (LocalProcessDriverConfiguration != null && executablePathOpenFileDialog.ShowDialog() == DialogResult.OK) {
+        LocalProcessDriverConfiguration.ExecutablePath = new StringData(executablePathOpenFileDialog.FileName);
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfigurationView.resx
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfigurationView.resx	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/LocalProcessDriverConfigurationView.resx	(revision 584)
@@ -0,0 +1,123 @@
+<?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="executablePathOpenFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfiguration.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfiguration.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfiguration.cs	(revision 584)
@@ -0,0 +1,166 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Data;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public class OdbcDatabaseDriverConfiguration : ItemBase, IDriverConfiguration {
+    private StringData odbcDriver;
+    public StringData OdbcDriver {
+      get { return odbcDriver; }
+      set {
+        odbcDriver = value;
+        OnChanged();
+      }
+    }
+    private StringData ipAddress;
+    public StringData IPAddress {
+      get { return ipAddress; }
+      set {
+        ipAddress = value;
+        OnChanged();
+      }
+    }
+    private IntData port;
+    public IntData Port {
+      get { return port; }
+      set {
+        port = value;
+        OnChanged();
+      }
+    }
+    private StringData dbName;
+    public StringData DBName {
+      get { return dbName; }
+      set {
+        dbName = value;
+        OnChanged();
+      }
+    }
+    private StringData dbUser;
+    public StringData DBUser {
+      get { return dbUser; }
+      set {
+        dbUser = value;
+        OnChanged();
+      }
+    }
+    private StringData dbPassword;
+    public StringData DBPassword {
+      get { return dbPassword; }
+      set {
+        dbPassword = value;
+        OnChanged();
+      }
+    }
+    private StringData dbTable;
+    public StringData DBTable {
+      get { return dbTable; }
+      set {
+        dbTable = value;
+        OnChanged();
+      }
+    }
+    private StringData dbIDcolumnName;
+    public StringData DBIDColumnName {
+      get { return dbIDcolumnName; }
+      set {
+        dbIDcolumnName = value;
+        OnChanged();
+      }
+    }
+    private StringData dbCommunicationColumnName;
+    public StringData DBCommunciationColumnName {
+      get { return dbCommunicationColumnName; }
+      set {
+        dbCommunicationColumnName = value;
+        OnChanged();
+      }
+    }
+    private StringData dbSynchronizationColumnName;
+    public StringData DBSynchronizationColumnName {
+      get { return dbSynchronizationColumnName; }
+      set {
+        dbSynchronizationColumnName = value;
+        OnChanged();
+      }
+    }
+    
+    public OdbcDatabaseDriverConfiguration() {
+      odbcDriver = new StringData("");
+      ipAddress = new StringData("127.0.0.1");
+      port = new IntData(0);
+      dbName = new StringData("");
+      dbUser = new StringData("");
+      dbPassword = new StringData("");
+      dbTable = new StringData("");
+      dbIDcolumnName = new StringData("");
+      dbCommunicationColumnName = new StringData("");
+      dbSynchronizationColumnName = new StringData("");
+    }
+
+    public override IView CreateView() {
+      return new OdbcDatabaseDriverConfigurationView(this);
+    }
+
+    #region persistence & clone
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode driverNode = PersistenceManager.Persist("Driver", OdbcDriver, document, persistedObjects);
+      node.AppendChild(driverNode);
+      XmlNode ipNode = PersistenceManager.Persist("IP", IPAddress, document, persistedObjects);
+      node.AppendChild(ipNode);
+      XmlNode portNode = PersistenceManager.Persist("Port", Port, document, persistedObjects);
+      node.AppendChild(portNode);
+      XmlNode nameNode = PersistenceManager.Persist("DBName", DBName, document, persistedObjects);
+      node.AppendChild(nameNode);
+      XmlNode userNode = PersistenceManager.Persist("DBUser", DBUser, document, persistedObjects);
+      node.AppendChild(userNode);
+      XmlNode pwdNode = PersistenceManager.Persist("DBPassword", DBPassword, document, persistedObjects);
+      node.AppendChild(pwdNode);
+      XmlNode tableNode = PersistenceManager.Persist("DBTable", DBTable, document, persistedObjects);
+      node.AppendChild(tableNode);
+      XmlNode idNode = PersistenceManager.Persist("DBIDColumnName", DBIDColumnName, document, persistedObjects);
+      node.AppendChild(idNode);
+      XmlNode commNode = PersistenceManager.Persist("DBCommunicationColumnName", DBCommunciationColumnName, document, persistedObjects);
+      node.AppendChild(commNode);
+      XmlNode syncNode = PersistenceManager.Persist("DBSynchronizationColumnName", DBSynchronizationColumnName, document, persistedObjects);
+      node.AppendChild(syncNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      odbcDriver = (StringData)PersistenceManager.Restore(node.SelectSingleNode("Driver"), restoredObjects);
+      ipAddress = (StringData)PersistenceManager.Restore(node.SelectSingleNode("IP"), restoredObjects);
+      port = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Port"), restoredObjects);
+      dbName = (StringData)PersistenceManager.Restore(node.SelectSingleNode("DBName"), restoredObjects);
+      dbUser = (StringData)PersistenceManager.Restore(node.SelectSingleNode("DBUser"), restoredObjects);
+      dbPassword = (StringData)PersistenceManager.Restore(node.SelectSingleNode("DBPassword"), restoredObjects);
+      dbTable = (StringData)PersistenceManager.Restore(node.SelectSingleNode("DBTable"), restoredObjects);
+      dbIDcolumnName = (StringData)PersistenceManager.Restore(node.SelectSingleNode("DBIDColumnName"), restoredObjects);
+      dbCommunicationColumnName = (StringData)PersistenceManager.Restore(node.SelectSingleNode("DBCommunicationColumnName"), restoredObjects);
+      dbSynchronizationColumnName = (StringData)PersistenceManager.Restore(node.SelectSingleNode("DBSynchronizationColumnName"), restoredObjects);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OdbcDatabaseDriverConfiguration clone = new OdbcDatabaseDriverConfiguration();
+      clonedObjects.Add(Guid, clone);
+      clone.odbcDriver = (StringData)Auxiliary.Clone(odbcDriver, clonedObjects);
+      clone.ipAddress = (StringData)Auxiliary.Clone(ipAddress, clonedObjects);
+      clone.port = (IntData)Auxiliary.Clone(port, clonedObjects);
+      clone.dbName = (StringData)Auxiliary.Clone(dbName, clonedObjects);
+      clone.dbUser = (StringData)Auxiliary.Clone(dbUser, clonedObjects);
+      clone.dbPassword = (StringData)Auxiliary.Clone(dbPassword, clonedObjects);
+      clone.dbTable = (StringData)Auxiliary.Clone(dbTable, clonedObjects);
+      clone.dbIDcolumnName = (StringData)Auxiliary.Clone(dbIDcolumnName, clonedObjects);
+      clone.dbCommunicationColumnName = (StringData)Auxiliary.Clone(dbCommunicationColumnName, clonedObjects);
+      clone.dbSynchronizationColumnName = (StringData)Auxiliary.Clone(dbSynchronizationColumnName, clonedObjects);
+      return clone;
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfigurationView.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfigurationView.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfigurationView.cs	(revision 584)
@@ -0,0 +1,94 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using Microsoft.Win32;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public partial class OdbcDatabaseDriverConfigurationView : ViewBase {
+    public OdbcDatabaseDriverConfiguration OdbcDatabaseDriverConfiguration {
+      get { return (OdbcDatabaseDriverConfiguration)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public OdbcDatabaseDriverConfigurationView() {
+      InitializeComponent();
+      BuildOdbcDriverComboBox();
+    }
+
+    public OdbcDatabaseDriverConfigurationView(OdbcDatabaseDriverConfiguration odbcDatabaseDriverConfiguration)
+      : this() {
+      OdbcDatabaseDriverConfiguration = odbcDatabaseDriverConfiguration;
+    }
+
+    private void BuildOdbcDriverComboBox() {
+      RegistryKey lm = null;
+      try {
+        lm = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("ODBC").OpenSubKey("ODBCINST.INI").OpenSubKey("ODBC Drivers");
+      } catch (Exception e) {
+        MessageBox.Show("Unable to open registry:\n" + e.Message + "\n\nPlease provide the correct driver name for the ODBC connection driver.", "Registry error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+      }
+      if (lm != null) {
+        string[] odbcDrivers = lm.GetValueNames();
+        odbcDriverComboBox.Items.AddRange(odbcDrivers);
+        odbcDriverComboBox.SelectedIndex = 0;
+      }
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (OdbcDatabaseDriverConfiguration == null) {
+        odbcDriverComboBox.Enabled = false;
+        ipAddressStringDataView.Enabled = false;
+        ipAddressStringDataView.StringData = null;
+        portIntDataView.Enabled = false;
+        portIntDataView.IntData = null;
+        dbNameStringDataView.Enabled = false;
+        dbNameStringDataView.StringData = null;
+        dbUserStringDataView.Enabled = false;
+        dbUserStringDataView.StringData = null;
+        dbPasswordStringDataView.Enabled = false;
+        dbPasswordStringDataView.StringData = null;
+        dbTableStringDataView.Enabled = false;
+        dbTableStringDataView.StringData = null;
+        dbIDColumnNameStringDataView.Enabled = false;
+        dbIDColumnNameStringDataView.StringData = null;
+        dbCommunicationColumnNameStringDataView.Enabled = false;
+        dbCommunicationColumnNameStringDataView.StringData = null;
+        dbSynchronizationColumnNameStringDataView.Enabled = false;
+        dbSynchronizationColumnNameStringDataView.StringData = null;
+      } else {
+        odbcDriverComboBox.Enabled = true;
+        ipAddressStringDataView.StringData = OdbcDatabaseDriverConfiguration.IPAddress;
+        ipAddressStringDataView.Enabled = true;
+        portIntDataView.IntData = OdbcDatabaseDriverConfiguration.Port;
+        portIntDataView.Enabled = true;
+        dbNameStringDataView.StringData = OdbcDatabaseDriverConfiguration.DBName;
+        dbNameStringDataView.Enabled = true;
+        dbUserStringDataView.StringData = OdbcDatabaseDriverConfiguration.DBUser;
+        dbUserStringDataView.Enabled = true;
+        dbPasswordStringDataView.StringData = OdbcDatabaseDriverConfiguration.DBPassword;
+        dbPasswordStringDataView.Enabled = true;
+        dbTableStringDataView.StringData = OdbcDatabaseDriverConfiguration.DBTable;
+        dbTableStringDataView.Enabled = true;
+        dbIDColumnNameStringDataView.StringData = OdbcDatabaseDriverConfiguration.DBIDColumnName;
+        dbIDColumnNameStringDataView.Enabled = true;
+        dbCommunicationColumnNameStringDataView.StringData = OdbcDatabaseDriverConfiguration.DBCommunciationColumnName;
+        dbCommunicationColumnNameStringDataView.Enabled = true;
+        dbSynchronizationColumnNameStringDataView.StringData = OdbcDatabaseDriverConfiguration.DBSynchronizationColumnName;
+        dbSynchronizationColumnNameStringDataView.Enabled = true;
+      }
+    }
+
+    private void odbcDriverComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (odbcDriverComboBox.SelectedIndex >= 0 && OdbcDatabaseDriverConfiguration != null) {
+        OdbcDatabaseDriverConfiguration.OdbcDriver = new StringData((string)odbcDriverComboBox.SelectedItem);
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfigurationView.designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfigurationView.designer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfigurationView.designer.cs	(revision 584)
@@ -0,0 +1,298 @@
+﻿namespace HeuristicLab.Communication.Data {
+  partial class OdbcDatabaseDriverConfigurationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dbTableGroupBox = new System.Windows.Forms.GroupBox();
+      this.dbSynchronizationColumnNameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.dbCommunicationColumnNameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.dbIDColumnNameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.dbIDColumnNameLabel = new System.Windows.Forms.Label();
+      this.dbCommunicationColumnNameLabel = new System.Windows.Forms.Label();
+      this.dbSynchronizationColumnNameLabel = new System.Windows.Forms.Label();
+      this.dbTableStringDataView = new HeuristicLab.Data.StringDataView();
+      this.dbPasswordStringDataView = new HeuristicLab.Data.StringDataView();
+      this.dbUserStringDataView = new HeuristicLab.Data.StringDataView();
+      this.dbNameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.dbTableLabel = new System.Windows.Forms.Label();
+      this.dbPasswordLabel = new System.Windows.Forms.Label();
+      this.dbUserLabel = new System.Windows.Forms.Label();
+      this.dbNameLabel = new System.Windows.Forms.Label();
+      this.portLabel = new System.Windows.Forms.Label();
+      this.ipAddressLabel = new System.Windows.Forms.Label();
+      this.portIntDataView = new HeuristicLab.Data.IntDataView();
+      this.ipAddressStringDataView = new HeuristicLab.Data.StringDataView();
+      this.odbcDriverLabel = new System.Windows.Forms.Label();
+      this.odbcDriverComboBox = new System.Windows.Forms.ComboBox();
+      this.dbTableGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // dbTableGroupBox
+      // 
+      this.dbTableGroupBox.Controls.Add(this.dbSynchronizationColumnNameStringDataView);
+      this.dbTableGroupBox.Controls.Add(this.dbCommunicationColumnNameStringDataView);
+      this.dbTableGroupBox.Controls.Add(this.dbIDColumnNameStringDataView);
+      this.dbTableGroupBox.Controls.Add(this.dbIDColumnNameLabel);
+      this.dbTableGroupBox.Controls.Add(this.dbCommunicationColumnNameLabel);
+      this.dbTableGroupBox.Controls.Add(this.dbSynchronizationColumnNameLabel);
+      this.dbTableGroupBox.Location = new System.Drawing.Point(6, 180);
+      this.dbTableGroupBox.Name = "dbTableGroupBox";
+      this.dbTableGroupBox.Size = new System.Drawing.Size(402, 101);
+      this.dbTableGroupBox.TabIndex = 6;
+      this.dbTableGroupBox.TabStop = false;
+      this.dbTableGroupBox.Text = "Table";
+      // 
+      // dbSynchronizationColumnNameStringDataView
+      // 
+      this.dbSynchronizationColumnNameStringDataView.Caption = "View";
+      this.dbSynchronizationColumnNameStringDataView.Location = new System.Drawing.Point(184, 65);
+      this.dbSynchronizationColumnNameStringDataView.Name = "dbSynchronizationColumnNameStringDataView";
+      this.dbSynchronizationColumnNameStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.dbSynchronizationColumnNameStringDataView.StringData = null;
+      this.dbSynchronizationColumnNameStringDataView.TabIndex = 2;
+      // 
+      // dbCommunicationColumnNameStringDataView
+      // 
+      this.dbCommunicationColumnNameStringDataView.Caption = "View";
+      this.dbCommunicationColumnNameStringDataView.Location = new System.Drawing.Point(184, 42);
+      this.dbCommunicationColumnNameStringDataView.Name = "dbCommunicationColumnNameStringDataView";
+      this.dbCommunicationColumnNameStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.dbCommunicationColumnNameStringDataView.StringData = null;
+      this.dbCommunicationColumnNameStringDataView.TabIndex = 1;
+      // 
+      // dbIDColumnNameStringDataView
+      // 
+      this.dbIDColumnNameStringDataView.Caption = "View";
+      this.dbIDColumnNameStringDataView.Location = new System.Drawing.Point(184, 19);
+      this.dbIDColumnNameStringDataView.Name = "dbIDColumnNameStringDataView";
+      this.dbIDColumnNameStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.dbIDColumnNameStringDataView.StringData = null;
+      this.dbIDColumnNameStringDataView.TabIndex = 0;
+      // 
+      // dbIDColumnNameLabel
+      // 
+      this.dbIDColumnNameLabel.AutoSize = true;
+      this.dbIDColumnNameLabel.Location = new System.Drawing.Point(6, 23);
+      this.dbIDColumnNameLabel.Name = "dbIDColumnNameLabel";
+      this.dbIDColumnNameLabel.Size = new System.Drawing.Size(108, 13);
+      this.dbIDColumnNameLabel.TabIndex = 3;
+      this.dbIDColumnNameLabel.Text = "DB ID Column Name:";
+      // 
+      // dbCommunicationColumnNameLabel
+      // 
+      this.dbCommunicationColumnNameLabel.AutoSize = true;
+      this.dbCommunicationColumnNameLabel.Location = new System.Drawing.Point(6, 46);
+      this.dbCommunicationColumnNameLabel.Name = "dbCommunicationColumnNameLabel";
+      this.dbCommunicationColumnNameLabel.Size = new System.Drawing.Size(169, 13);
+      this.dbCommunicationColumnNameLabel.TabIndex = 4;
+      this.dbCommunicationColumnNameLabel.Text = "DB Communication Column Name:";
+      // 
+      // dbSynchronizationColumnNameLabel
+      // 
+      this.dbSynchronizationColumnNameLabel.AutoSize = true;
+      this.dbSynchronizationColumnNameLabel.Location = new System.Drawing.Point(6, 70);
+      this.dbSynchronizationColumnNameLabel.Name = "dbSynchronizationColumnNameLabel";
+      this.dbSynchronizationColumnNameLabel.Size = new System.Drawing.Size(172, 13);
+      this.dbSynchronizationColumnNameLabel.TabIndex = 5;
+      this.dbSynchronizationColumnNameLabel.Text = "DB Synchronization Column Name:";
+      // 
+      // dbTableStringDataView
+      // 
+      this.dbTableStringDataView.Caption = "View";
+      this.dbTableStringDataView.Location = new System.Drawing.Point(86, 148);
+      this.dbTableStringDataView.Name = "dbTableStringDataView";
+      this.dbTableStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.dbTableStringDataView.StringData = null;
+      this.dbTableStringDataView.TabIndex = 5;
+      // 
+      // dbPasswordStringDataView
+      // 
+      this.dbPasswordStringDataView.Caption = "View";
+      this.dbPasswordStringDataView.Location = new System.Drawing.Point(86, 124);
+      this.dbPasswordStringDataView.Name = "dbPasswordStringDataView";
+      this.dbPasswordStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.dbPasswordStringDataView.StringData = null;
+      this.dbPasswordStringDataView.TabIndex = 4;
+      // 
+      // dbUserStringDataView
+      // 
+      this.dbUserStringDataView.Caption = "View";
+      this.dbUserStringDataView.Location = new System.Drawing.Point(86, 100);
+      this.dbUserStringDataView.Name = "dbUserStringDataView";
+      this.dbUserStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.dbUserStringDataView.StringData = null;
+      this.dbUserStringDataView.TabIndex = 3;
+      // 
+      // dbNameStringDataView
+      // 
+      this.dbNameStringDataView.Caption = "View";
+      this.dbNameStringDataView.Location = new System.Drawing.Point(86, 76);
+      this.dbNameStringDataView.Name = "dbNameStringDataView";
+      this.dbNameStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.dbNameStringDataView.StringData = null;
+      this.dbNameStringDataView.TabIndex = 2;
+      // 
+      // dbTableLabel
+      // 
+      this.dbTableLabel.AutoSize = true;
+      this.dbTableLabel.Location = new System.Drawing.Point(3, 152);
+      this.dbTableLabel.Name = "dbTableLabel";
+      this.dbTableLabel.Size = new System.Drawing.Size(55, 13);
+      this.dbTableLabel.TabIndex = 12;
+      this.dbTableLabel.Text = "DB Table:";
+      // 
+      // dbPasswordLabel
+      // 
+      this.dbPasswordLabel.AutoSize = true;
+      this.dbPasswordLabel.Location = new System.Drawing.Point(3, 128);
+      this.dbPasswordLabel.Name = "dbPasswordLabel";
+      this.dbPasswordLabel.Size = new System.Drawing.Size(74, 13);
+      this.dbPasswordLabel.TabIndex = 11;
+      this.dbPasswordLabel.Text = "DB Password:";
+      // 
+      // dbUserLabel
+      // 
+      this.dbUserLabel.AutoSize = true;
+      this.dbUserLabel.Location = new System.Drawing.Point(3, 104);
+      this.dbUserLabel.Name = "dbUserLabel";
+      this.dbUserLabel.Size = new System.Drawing.Size(50, 13);
+      this.dbUserLabel.TabIndex = 10;
+      this.dbUserLabel.Text = "DB User:";
+      // 
+      // dbNameLabel
+      // 
+      this.dbNameLabel.AutoSize = true;
+      this.dbNameLabel.Location = new System.Drawing.Point(3, 80);
+      this.dbNameLabel.Name = "dbNameLabel";
+      this.dbNameLabel.Size = new System.Drawing.Size(56, 13);
+      this.dbNameLabel.TabIndex = 9;
+      this.dbNameLabel.Text = "DB Name:";
+      // 
+      // portLabel
+      // 
+      this.portLabel.AutoSize = true;
+      this.portLabel.Location = new System.Drawing.Point(3, 55);
+      this.portLabel.Name = "portLabel";
+      this.portLabel.Size = new System.Drawing.Size(29, 13);
+      this.portLabel.TabIndex = 8;
+      this.portLabel.Text = "Port:";
+      // 
+      // ipAddressLabel
+      // 
+      this.ipAddressLabel.AutoSize = true;
+      this.ipAddressLabel.Location = new System.Drawing.Point(3, 31);
+      this.ipAddressLabel.Name = "ipAddressLabel";
+      this.ipAddressLabel.Size = new System.Drawing.Size(61, 13);
+      this.ipAddressLabel.TabIndex = 7;
+      this.ipAddressLabel.Text = "IP Address:";
+      // 
+      // portIntDataView
+      // 
+      this.portIntDataView.Caption = "View";
+      this.portIntDataView.IntData = null;
+      this.portIntDataView.Location = new System.Drawing.Point(86, 52);
+      this.portIntDataView.Name = "portIntDataView";
+      this.portIntDataView.Size = new System.Drawing.Size(200, 26);
+      this.portIntDataView.TabIndex = 1;
+      // 
+      // ipAddressStringDataView
+      // 
+      this.ipAddressStringDataView.Caption = "View";
+      this.ipAddressStringDataView.Location = new System.Drawing.Point(86, 28);
+      this.ipAddressStringDataView.Name = "ipAddressStringDataView";
+      this.ipAddressStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.ipAddressStringDataView.StringData = null;
+      this.ipAddressStringDataView.TabIndex = 0;
+      // 
+      // odbcDriverLabel
+      // 
+      this.odbcDriverLabel.AutoSize = true;
+      this.odbcDriverLabel.Location = new System.Drawing.Point(3, 6);
+      this.odbcDriverLabel.Name = "odbcDriverLabel";
+      this.odbcDriverLabel.Size = new System.Drawing.Size(71, 13);
+      this.odbcDriverLabel.TabIndex = 13;
+      this.odbcDriverLabel.Text = "ODBC Driver:";
+      // 
+      // odbcDriverComboBox
+      // 
+      this.odbcDriverComboBox.FormattingEnabled = true;
+      this.odbcDriverComboBox.Location = new System.Drawing.Point(86, 3);
+      this.odbcDriverComboBox.Name = "odbcDriverComboBox";
+      this.odbcDriverComboBox.Size = new System.Drawing.Size(200, 21);
+      this.odbcDriverComboBox.TabIndex = 14;
+      this.odbcDriverComboBox.SelectedIndexChanged += new System.EventHandler(this.odbcDriverComboBox_SelectedIndexChanged);
+      // 
+      // MySQLOdbcDatabaseDriverConfigurationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.odbcDriverComboBox);
+      this.Controls.Add(this.odbcDriverLabel);
+      this.Controls.Add(this.dbTableGroupBox);
+      this.Controls.Add(this.dbTableStringDataView);
+      this.Controls.Add(this.dbPasswordStringDataView);
+      this.Controls.Add(this.dbUserStringDataView);
+      this.Controls.Add(this.dbNameStringDataView);
+      this.Controls.Add(this.dbTableLabel);
+      this.Controls.Add(this.dbPasswordLabel);
+      this.Controls.Add(this.dbUserLabel);
+      this.Controls.Add(this.dbNameLabel);
+      this.Controls.Add(this.portLabel);
+      this.Controls.Add(this.ipAddressLabel);
+      this.Controls.Add(this.portIntDataView);
+      this.Controls.Add(this.ipAddressStringDataView);
+      this.Name = "MySQLOdbcDatabaseDriverConfigurationView";
+      this.Size = new System.Drawing.Size(411, 284);
+      this.dbTableGroupBox.ResumeLayout(false);
+      this.dbTableGroupBox.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox dbTableGroupBox;
+    private System.Windows.Forms.Label dbIDColumnNameLabel;
+    private HeuristicLab.Data.StringDataView dbSynchronizationColumnNameStringDataView;
+    private System.Windows.Forms.Label dbCommunicationColumnNameLabel;
+    private HeuristicLab.Data.StringDataView dbCommunicationColumnNameStringDataView;
+    private System.Windows.Forms.Label dbSynchronizationColumnNameLabel;
+    private HeuristicLab.Data.StringDataView dbIDColumnNameStringDataView;
+    private HeuristicLab.Data.StringDataView dbTableStringDataView;
+    private HeuristicLab.Data.StringDataView dbPasswordStringDataView;
+    private HeuristicLab.Data.StringDataView dbUserStringDataView;
+    private HeuristicLab.Data.StringDataView dbNameStringDataView;
+    private System.Windows.Forms.Label dbTableLabel;
+    private System.Windows.Forms.Label dbPasswordLabel;
+    private System.Windows.Forms.Label dbUserLabel;
+    private System.Windows.Forms.Label dbNameLabel;
+    private System.Windows.Forms.Label portLabel;
+    private System.Windows.Forms.Label ipAddressLabel;
+    private HeuristicLab.Data.IntDataView portIntDataView;
+    private HeuristicLab.Data.StringDataView ipAddressStringDataView;
+    private System.Windows.Forms.Label odbcDriverLabel;
+    private System.Windows.Forms.ComboBox odbcDriverComboBox;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfigurationView.resx
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfigurationView.resx	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/OdbcDatabaseDriverConfigurationView.resx	(revision 584)
@@ -0,0 +1,120 @@
+<?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>
+</root>
Index: trunk/sources/HeuristicLab.Communication.Data/ProcessData.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/ProcessData.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/ProcessData.cs	(revision 584)
@@ -0,0 +1,100 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public class ProcessData : ItemBase, IDataStream {
+    private LocalProcessDriverConfiguration config;
+    public IDriverConfiguration Configuration {
+      get { return config; }
+      set { config = (LocalProcessDriverConfiguration)value; }
+    }
+    private Process process;
+    public Process Process {
+      get { return process; }
+      set { process = value; }
+    }
+
+    public ProcessData() {
+      process = null;
+      config = null;
+    }
+
+    // A process cannot be cloned
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ProcessData clone = new ProcessData();
+      clonedObjects.Add(Guid, clone);
+      clone.process = process;
+      clone.config = (LocalProcessDriverConfiguration)Auxiliary.Clone(config, clonedObjects);
+      return clone;
+    }
+
+    #region persistence
+    // A process cannot be persisted
+    // but information can be persisted that will allow it to be recreated
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode configNode = PersistenceManager.Persist("Configuration", config, document, persistedObjects);
+      node.AppendChild(configNode);
+      return node;
+    }
+
+    // A process cannot be persisted
+    // but information can be persisted that will allow it to be recreated
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      Configuration = (LocalProcessDriverConfiguration)PersistenceManager.Restore(node.SelectSingleNode("Configuration"), restoredObjects);
+      StartProcess();
+    }
+    #endregion
+
+    private void StartProcess() {
+      process = new Process();
+      process.StartInfo.FileName = config.ExecutablePath.Data;
+      process.StartInfo.Arguments = config.Arguments.Data;
+      process.StartInfo.UseShellExecute = false;
+      process.StartInfo.RedirectStandardInput = true;
+      process.StartInfo.RedirectStandardError = true;
+      process.StartInfo.RedirectStandardOutput = true;
+      process.Start();
+    }
+
+    public void Initialize(IDriverConfiguration configuration) {
+      Configuration = configuration;
+      StartProcess();
+    }
+
+    public bool Connect() {  
+      return true;
+    }
+
+    public void Close() {
+      if (!process.HasExited) process.Kill();
+      process.Close();
+      process = null;
+    }
+
+    public void Write(string s) {
+      StreamWriter writer = process.StandardInput;
+      writer.WriteLine(s);
+      writer.WriteLine(".");
+    }
+
+    public string Read() {
+      StreamReader reader = process.StandardOutput;
+      StringBuilder buffer = new StringBuilder();
+      string line = "";
+      do {
+        line = reader.ReadLine();
+        if (line.Equals(".")) break;
+        buffer.AppendLine(line);
+      } while (true);
+      return buffer.ToString();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/Properties/AssemblyInfo.frame
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/Properties/AssemblyInfo.frame	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/Properties/AssemblyInfo.frame	(revision 584)
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Communication.Data")]
+[assembly: AssemblyDescription("This assembly contains the datatypes that are used in communication")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e477780c-b901-4f5d-80d6-056991e55248")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
Index: trunk/sources/HeuristicLab.Communication.Data/Protocol.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/Protocol.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/Protocol.cs	(revision 584)
@@ -0,0 +1,122 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.Xml.XPath;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public class Protocol : ItemBase, IEditable {
+    private StringData name;
+    public StringData Name {
+      get { return name; }
+      set {
+        name = value;
+        OnChanged();
+      }
+    }
+    private ItemList<ProtocolState> states;
+    public ItemList<ProtocolState> States {
+      get { return states; }
+      set {
+        states.ItemAdded -= new EventHandler<ItemIndexEventArgs>(States_ItemAdded);
+        states.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(States_ItemRemoved);
+        states = value;
+        states.ItemAdded += new EventHandler<ItemIndexEventArgs>(States_ItemAdded);
+        states.ItemRemoved += new EventHandler<ItemIndexEventArgs>(States_ItemRemoved);
+        // if the newly assigned states don't contain the currently selected initial state
+        if (!states.Contains(initialState))
+          if (states.Count > 0)
+            initialState = states[0];
+          else initialState = null;
+        OnChanged();
+      }
+    }
+    private ProtocolState initialState;
+    public ProtocolState InitialState {
+      get { return initialState; }
+      set {
+        initialState = value;
+        OnChanged();
+      }
+    }
+
+    public Protocol() {
+      name = new StringData("Unnamed protocol");
+      states = new ItemList<ProtocolState>();
+      states.ItemAdded += new EventHandler<ItemIndexEventArgs>(States_ItemAdded);
+      states.ItemRemoved += new EventHandler<ItemIndexEventArgs>(States_ItemRemoved);
+      ProtocolState firstState = new ProtocolState();
+      firstState.Name = new StringData("InitialState");
+      firstState.AcceptingState = new BoolData(true);
+      firstState.Protocol = this;
+      states.Add(firstState);
+      initialState = firstState;
+    }
+
+    public void Dispose() {
+      states.ItemAdded -= new EventHandler<ItemIndexEventArgs>(States_ItemAdded);
+      states.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(States_ItemRemoved);
+    }
+
+    public override IView CreateView() {
+      return new ProtocolEditor(this);
+    }
+    public virtual IEditor CreateEditor() {
+      return new ProtocolEditor(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Protocol clone = new Protocol();
+      clonedObjects.Add(Guid, clone);
+      clone.Name = (StringData)Auxiliary.Clone(Name, clonedObjects);
+      clone.States = (ItemList<ProtocolState>)Auxiliary.Clone(States, clonedObjects);
+      // iterate through the states and select the appropriate state in the clone
+      for (int i = 0 ; i < states.Count ; i++)
+        if (states[i].Equals(initialState))
+          clone.InitialState = clone.States[i];
+      return clone;
+    }
+
+    #region States Events
+    void States_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      e.Item.Changed -= new EventHandler(State_Changed);
+      State_Changed(this, new EventArgs());
+    }
+
+    void States_ItemAdded(object sender, ItemIndexEventArgs e) {
+      e.Item.Changed += new EventHandler(State_Changed);
+      ((ProtocolState)e.Item).Protocol = this;
+      State_Changed(this, new EventArgs());
+    }
+    #endregion
+
+    public EventHandler StatesChanged;
+    void State_Changed(object sender, EventArgs e) {
+      if (StatesChanged != null) StatesChanged(sender, e);
+    }
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode nameNode = PersistenceManager.Persist("Name", Name, document, persistedObjects);
+      XmlNode statesNode = PersistenceManager.Persist("States", States, document, persistedObjects);
+      XmlNode initialStatesNode = PersistenceManager.Persist("InitialState", InitialState, document, persistedObjects);
+      node.AppendChild(nameNode);
+      node.AppendChild(statesNode);
+      node.AppendChild(initialStatesNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      name = (StringData)PersistenceManager.Restore(node.SelectSingleNode("Name"), restoredObjects);
+      states = (ItemList<ProtocolState>)PersistenceManager.Restore(node.SelectSingleNode("States"), restoredObjects);
+      states.ItemAdded += new EventHandler<ItemIndexEventArgs>(States_ItemAdded);
+      states.ItemRemoved += new EventHandler<ItemIndexEventArgs>(States_ItemRemoved);
+      initialState = (ProtocolState)PersistenceManager.Restore(node.SelectSingleNode("InitialState"), restoredObjects);
+    }
+    #endregion persistence
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/ProtocolEditor.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/ProtocolEditor.Designer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/ProtocolEditor.Designer.cs	(revision 584)
@@ -0,0 +1,137 @@
+namespace HeuristicLab.Communication.Data {
+  partial class ProtocolEditor {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      if (Protocol != null) Protocol.Changed -= new System.EventHandler(Protocol_Changed);
+      nameViewControl.Dispose();
+      statesItemListView.Dispose();
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      HeuristicLab.Data.StringData stringData2 = new HeuristicLab.Data.StringData();
+      this.nameViewControl = new HeuristicLab.Data.StringDataView();
+      this.protocolNameLabel = new System.Windows.Forms.Label();
+      this.initialStateLabel = new System.Windows.Forms.Label();
+      this.initialStateComboBox = new System.Windows.Forms.ComboBox();
+      this.protocolStatesLabel = new System.Windows.Forms.Label();
+      this.statesItemListView = new HeuristicLab.Data.ItemListView<ProtocolState>();
+      this.invertButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // nameViewControl
+      // 
+      this.nameViewControl.Caption = "View (StringData)";
+      this.nameViewControl.Location = new System.Drawing.Point(89, 3);
+      this.nameViewControl.Name = "nameViewControl";
+      this.nameViewControl.Size = new System.Drawing.Size(180, 28);
+      stringData2.Data = "";
+      this.nameViewControl.StringData = stringData2;
+      this.nameViewControl.TabIndex = 1;
+      // 
+      // protocolNameLabel
+      // 
+      this.protocolNameLabel.AutoSize = true;
+      this.protocolNameLabel.Location = new System.Drawing.Point(3, 6);
+      this.protocolNameLabel.Name = "protocolNameLabel";
+      this.protocolNameLabel.Size = new System.Drawing.Size(80, 13);
+      this.protocolNameLabel.TabIndex = 3;
+      this.protocolNameLabel.Text = "Protocol Name:";
+      // 
+      // initialStateLabel
+      // 
+      this.initialStateLabel.AutoSize = true;
+      this.initialStateLabel.Location = new System.Drawing.Point(275, 6);
+      this.initialStateLabel.Name = "initialStateLabel";
+      this.initialStateLabel.Size = new System.Drawing.Size(62, 13);
+      this.initialStateLabel.TabIndex = 5;
+      this.initialStateLabel.Text = "Initial State:";
+      // 
+      // initialStateComboBox
+      // 
+      this.initialStateComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.initialStateComboBox.FormattingEnabled = true;
+      this.initialStateComboBox.Location = new System.Drawing.Point(343, 3);
+      this.initialStateComboBox.Name = "initialStateComboBox";
+      this.initialStateComboBox.Size = new System.Drawing.Size(166, 21);
+      this.initialStateComboBox.TabIndex = 6;
+      this.initialStateComboBox.SelectedIndexChanged += new System.EventHandler(this.initialStateComboBox_SelectedIndexChanged);
+      // 
+      // protocolStatesLabel
+      // 
+      this.protocolStatesLabel.AutoSize = true;
+      this.protocolStatesLabel.Location = new System.Drawing.Point(3, 32);
+      this.protocolStatesLabel.Name = "protocolStatesLabel";
+      this.protocolStatesLabel.Size = new System.Drawing.Size(82, 13);
+      this.protocolStatesLabel.TabIndex = 8;
+      this.protocolStatesLabel.Text = "Protocol States:";
+      // 
+      // statesItemListView
+      // 
+      this.statesItemListView.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.statesItemListView.Caption = "View";
+      this.statesItemListView.ItemList = null;
+      this.statesItemListView.Location = new System.Drawing.Point(3, 51);
+      this.statesItemListView.Name = "statesItemListView";
+      this.statesItemListView.Size = new System.Drawing.Size(613, 308);
+      this.statesItemListView.TabIndex = 7;
+      // 
+      // invertButton
+      // 
+      this.invertButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.invertButton.Location = new System.Drawing.Point(3, 363);
+      this.invertButton.Name = "invertButton";
+      this.invertButton.Size = new System.Drawing.Size(162, 23);
+      this.invertButton.TabIndex = 9;
+      this.invertButton.Text = "Invert Send/Receive";
+      this.invertButton.UseVisualStyleBackColor = true;
+      this.invertButton.Click += new System.EventHandler(this.invertButton_Click);
+      // 
+      // ProtocolEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.invertButton);
+      this.Controls.Add(this.protocolStatesLabel);
+      this.Controls.Add(this.statesItemListView);
+      this.Controls.Add(this.initialStateComboBox);
+      this.Controls.Add(this.initialStateLabel);
+      this.Controls.Add(this.protocolNameLabel);
+      this.Controls.Add(this.nameViewControl);
+      this.Name = "ProtocolEditor";
+      this.Size = new System.Drawing.Size(619, 389);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.StringDataView nameViewControl;
+    private System.Windows.Forms.Label protocolNameLabel;
+    private System.Windows.Forms.Label initialStateLabel;
+    private System.Windows.Forms.ComboBox initialStateComboBox;
+    private System.Windows.Forms.Label protocolStatesLabel;
+    private HeuristicLab.Data.ItemListView<ProtocolState> statesItemListView;
+    private System.Windows.Forms.Button invertButton;
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/ProtocolEditor.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/ProtocolEditor.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/ProtocolEditor.cs	(revision 584)
@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public partial class ProtocolEditor : EditorBase {
+    public Protocol Protocol {
+      get { return (Protocol)Item; }
+      set { base.Item = value; }
+    }
+
+    public ProtocolEditor() {
+      InitializeComponent();
+    }
+    public ProtocolEditor(Protocol protocol)
+      : this() {
+      Protocol = protocol;
+    }
+
+    protected override void RemoveItemEvents() {
+      Protocol.Changed -= new EventHandler(Protocol_Changed);
+      Protocol.StatesChanged -= new EventHandler(States_Changed);
+      Protocol.Name.Changed -= new EventHandler(ProtocolName_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Protocol.Changed += new EventHandler(Protocol_Changed);
+      Protocol.StatesChanged += new EventHandler(States_Changed);
+      Protocol.Name.Changed += new EventHandler(ProtocolName_Changed);
+    }
+
+    private void BuildInitialStateComboBox() {
+      // Rebuild the two ComboBoxes depicting the initial and final state
+      IList<ProtocolState> states = new List<ProtocolState>(Protocol.States.Count);
+      int initialSelectedIndex = -1;
+      for (int i = 0 ; i < Protocol.States.Count ; i++) {
+        states.Add((ProtocolState)Protocol.States[i]);
+        if (Protocol.States[i].Guid.Equals(Protocol.InitialState.Guid))
+          initialSelectedIndex = i;
+      }
+      initialStateComboBox.SelectedIndexChanged -= new EventHandler(initialStateComboBox_SelectedIndexChanged);
+      BindingList<ProtocolState> bl = new BindingList<ProtocolState>(states);
+      initialStateComboBox.DataSource = bl;
+      initialStateComboBox.DisplayMember = "Name";
+      initialStateComboBox.ValueMember = "Guid";
+      initialStateComboBox.SelectedIndex = initialSelectedIndex;
+      initialStateComboBox.SelectedIndexChanged += new EventHandler(initialStateComboBox_SelectedIndexChanged);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (Protocol == null) {
+        Caption = "Protocol";
+        nameViewControl.Enabled = false;
+        nameViewControl.StringData = null;
+        statesItemListView.Enabled = false;
+        statesItemListView.ItemList = null;
+        initialStateComboBox.Enabled = false;
+        initialStateComboBox.DataSource = null;
+        initialStateComboBox.Items.Clear();
+      } else {
+        Caption = Protocol.Name.Data;
+        nameViewControl.StringData = Protocol.Name;
+        nameViewControl.Enabled = true;
+        statesItemListView.ItemList = Protocol.States;
+        statesItemListView.Enabled = true;
+        BuildInitialStateComboBox();
+        initialStateComboBox.Enabled = true;
+      }
+    }
+
+    #region Custom events
+    void Protocol_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    void States_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    void ProtocolName_Changed(object sender, EventArgs e) {
+      Caption = Protocol.Name.Data;
+    }
+    #endregion
+
+    #region ComboBox events
+    private void initialStateComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (initialStateComboBox.SelectedIndex >= 0)
+        Protocol.InitialState = (ProtocolState)initialStateComboBox.SelectedItem;
+    }
+    #endregion
+
+    private void invertButton_Click(object sender, EventArgs e) {
+      for (int i = 0 ; i < Protocol.States.Count ; i++) {
+        ConstrainedItemList tmp = ((ProtocolState)Protocol.States[i]).SendingData;
+        ((ProtocolState)Protocol.States[i]).SendingData = ((ProtocolState)Protocol.States[i]).ReceivingData;
+        ((ProtocolState)Protocol.States[i]).ReceivingData = tmp;
+      }
+      Refresh();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/ProtocolEditor.resx
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/ProtocolEditor.resx	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/ProtocolEditor.resx	(revision 584)
@@ -0,0 +1,120 @@
+<?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>
+</root>
Index: trunk/sources/HeuristicLab.Communication.Data/ProtocolState.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/ProtocolState.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/ProtocolState.cs	(revision 584)
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.Communication.Data {
+  public class ProtocolState : ItemBase {
+    private StringData name;
+    public StringData Name {
+      get { return name; }
+      set {
+        name.Changed -= new EventHandler(Name_Changed);
+        name = value;
+        name.Changed += new EventHandler(Name_Changed);
+        OnChanged();
+      }
+    }
+    private BoolData acceptingState;
+    public BoolData AcceptingState {
+      get { return acceptingState; }
+      set {
+        acceptingState = value;
+        OnChanged();
+      }
+    }
+    private ConstrainedItemList sendingData;
+    public ConstrainedItemList SendingData {
+      get { return sendingData; }
+      set {
+        sendingData = value;
+        OnChanged();
+      }
+    }
+    private ConstrainedItemList receivingData;
+    public ConstrainedItemList ReceivingData {
+      get { return receivingData; }
+      set {
+        receivingData = value;
+        OnChanged();
+      }
+    }
+    private ItemList<StateTransition> stateTransitions;
+    public ItemList<StateTransition> StateTransitions {
+      get { return stateTransitions; }
+      set {
+        stateTransitions = value;
+        OnChanged();
+      }
+    }
+    private Protocol protocol;
+    public Protocol Protocol {
+      get { return protocol; }
+      set {
+        protocol = value;
+        OnChanged();
+      }
+    }
+
+    public ProtocolState() {
+      name = new StringData("Unnamed state");
+      name.Changed += new EventHandler(Name_Changed);
+      acceptingState = new BoolData(true);
+      sendingData = new ConstrainedItemList();
+      sendingData.AddConstraint(new ItemTypeConstraint(typeof(Variable)));
+      receivingData = new ConstrainedItemList();
+      receivingData.AddConstraint(new ItemTypeConstraint(typeof(Variable)));
+      stateTransitions = null;
+      protocol = null;
+    }
+
+    public void Dispose() {
+      name.Changed -= new EventHandler(Name_Changed);
+    }
+
+    public override IView CreateView() {
+      return new ProtocolStateView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ProtocolState clone = new ProtocolState();
+      clonedObjects.Add(Guid, clone);
+      clone.name = (StringData)Auxiliary.Clone(Name, clonedObjects);
+      clone.acceptingState = (BoolData)Auxiliary.Clone(AcceptingState, clonedObjects);
+      clone.sendingData = (ConstrainedItemList)Auxiliary.Clone(SendingData, clonedObjects);
+      clone.receivingData = (ConstrainedItemList)Auxiliary.Clone(ReceivingData, clonedObjects);
+      if (StateTransitions != null)
+        clone.stateTransitions = (ItemList<StateTransition>)Auxiliary.Clone(StateTransitions, clonedObjects);
+      else clone.StateTransitions = null;
+      clone.protocol = Protocol;
+      return clone;
+    }
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode protocolNode = PersistenceManager.Persist("ParentProtocol", Protocol, document, persistedObjects);
+      node.AppendChild(protocolNode);
+      XmlNode nameNode = PersistenceManager.Persist("Name", Name, document, persistedObjects);
+      node.AppendChild(nameNode);
+      XmlNode acceptingNode = PersistenceManager.Persist("AcceptingState", AcceptingState, document, persistedObjects);
+      node.AppendChild(acceptingNode);
+      XmlNode requestNode = PersistenceManager.Persist("Request", SendingData, document, persistedObjects);
+      node.AppendChild(requestNode);
+      XmlNode responseNode = PersistenceManager.Persist("Response", ReceivingData, document, persistedObjects);
+      node.AppendChild(responseNode);
+      if (StateTransitions != null) {
+        XmlNode transitionsNode = PersistenceManager.Persist("StateTransitions", StateTransitions, document, persistedObjects);
+        node.AppendChild(transitionsNode);
+      }
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      protocol = (Protocol)PersistenceManager.Restore(node.SelectSingleNode("ParentProtocol"), restoredObjects);
+      name = (StringData)PersistenceManager.Restore(node.SelectSingleNode("Name"), restoredObjects);
+      acceptingState = (BoolData)PersistenceManager.Restore(node.SelectSingleNode("AcceptingState"), restoredObjects);
+      sendingData = (ConstrainedItemList)PersistenceManager.Restore(node.SelectSingleNode("Request"), restoredObjects);
+      receivingData = (ConstrainedItemList)PersistenceManager.Restore(node.SelectSingleNode("Response"), restoredObjects);
+      XmlNode transitions = node.SelectSingleNode("StateTransitions");
+      if (transitions != null)
+        stateTransitions = (ItemList<StateTransition>)PersistenceManager.Restore(transitions, restoredObjects);
+      else
+        stateTransitions = null;
+    }
+    #endregion persistence
+
+    private void Name_Changed(object sender, EventArgs e) {
+      OnChanged();
+    }
+
+    public override string ToString() {
+      return Name.ToString();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/ProtocolStateView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/ProtocolStateView.Designer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/ProtocolStateView.Designer.cs	(revision 584)
@@ -0,0 +1,230 @@
+namespace HeuristicLab.Communication.Data {
+  partial class ProtocolStateView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      HeuristicLab.Data.StringData stringData1 = new HeuristicLab.Data.StringData();
+      HeuristicLab.Data.BoolData boolData1 = new HeuristicLab.Data.BoolData();
+      this.nameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.communicationDataTabControl = new System.Windows.Forms.TabControl();
+      this.sendTabPage = new System.Windows.Forms.TabPage();
+      this.outboundCommunicationDataView = new HeuristicLab.Data.ConstrainedItemListView();
+      this.receiveTabPage = new System.Windows.Forms.TabPage();
+      this.inboundCommunicationDataView = new HeuristicLab.Data.ConstrainedItemListView();
+      this.transitionTabPage = new System.Windows.Forms.TabPage();
+      this.removeTransitionButton = new System.Windows.Forms.Button();
+      this.addTransitionButton = new System.Windows.Forms.Button();
+      this.stateTransitionTabControl = new System.Windows.Forms.TabControl();
+      this.acceptingStateLabel = new System.Windows.Forms.Label();
+      this.acceptingStateBoolDataView = new HeuristicLab.Data.BoolDataView();
+      this.communicationDataTabControl.SuspendLayout();
+      this.sendTabPage.SuspendLayout();
+      this.receiveTabPage.SuspendLayout();
+      this.transitionTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameStringDataView
+      // 
+      this.nameStringDataView.Caption = "View (StringData)";
+      this.nameStringDataView.Location = new System.Drawing.Point(48, 14);
+      this.nameStringDataView.Name = "nameStringDataView";
+      this.nameStringDataView.Size = new System.Drawing.Size(178, 26);
+      stringData1.Data = "";
+      this.nameStringDataView.StringData = stringData1;
+      this.nameStringDataView.TabIndex = 1;
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(4, 17);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 3;
+      this.nameLabel.Text = "Name:";
+      // 
+      // communicationDataTabControl
+      // 
+      this.communicationDataTabControl.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.communicationDataTabControl.Controls.Add(this.sendTabPage);
+      this.communicationDataTabControl.Controls.Add(this.receiveTabPage);
+      this.communicationDataTabControl.Controls.Add(this.transitionTabPage);
+      this.communicationDataTabControl.Location = new System.Drawing.Point(3, 46);
+      this.communicationDataTabControl.Name = "communicationDataTabControl";
+      this.communicationDataTabControl.SelectedIndex = 0;
+      this.communicationDataTabControl.Size = new System.Drawing.Size(483, 381);
+      this.communicationDataTabControl.TabIndex = 5;
+      // 
+      // sendTabPage
+      // 
+      this.sendTabPage.Controls.Add(this.outboundCommunicationDataView);
+      this.sendTabPage.Location = new System.Drawing.Point(4, 22);
+      this.sendTabPage.Name = "sendTabPage";
+      this.sendTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.sendTabPage.Size = new System.Drawing.Size(475, 355);
+      this.sendTabPage.TabIndex = 0;
+      this.sendTabPage.Text = "Send";
+      this.sendTabPage.UseVisualStyleBackColor = true;
+      // 
+      // outboundCommunicationDataView
+      // 
+      this.outboundCommunicationDataView.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.outboundCommunicationDataView.Caption = "View";
+      this.outboundCommunicationDataView.ConstrainedItemList = null;
+      this.outboundCommunicationDataView.Location = new System.Drawing.Point(6, 6);
+      this.outboundCommunicationDataView.Name = "outboundCommunicationDataView";
+      this.outboundCommunicationDataView.Size = new System.Drawing.Size(463, 343);
+      this.outboundCommunicationDataView.TabIndex = 0;
+      // 
+      // receiveTabPage
+      // 
+      this.receiveTabPage.Controls.Add(this.inboundCommunicationDataView);
+      this.receiveTabPage.Location = new System.Drawing.Point(4, 22);
+      this.receiveTabPage.Name = "receiveTabPage";
+      this.receiveTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.receiveTabPage.Size = new System.Drawing.Size(475, 355);
+      this.receiveTabPage.TabIndex = 1;
+      this.receiveTabPage.Text = "Receive";
+      this.receiveTabPage.UseVisualStyleBackColor = true;
+      // 
+      // inboundCommunicationDataView
+      // 
+      this.inboundCommunicationDataView.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.inboundCommunicationDataView.Caption = "View";
+      this.inboundCommunicationDataView.ConstrainedItemList = null;
+      this.inboundCommunicationDataView.Location = new System.Drawing.Point(6, 6);
+      this.inboundCommunicationDataView.Name = "inboundCommunicationDataView";
+      this.inboundCommunicationDataView.Size = new System.Drawing.Size(463, 343);
+      this.inboundCommunicationDataView.TabIndex = 0;
+      // 
+      // transitionTabPage
+      // 
+      this.transitionTabPage.Controls.Add(this.removeTransitionButton);
+      this.transitionTabPage.Controls.Add(this.addTransitionButton);
+      this.transitionTabPage.Controls.Add(this.stateTransitionTabControl);
+      this.transitionTabPage.Location = new System.Drawing.Point(4, 22);
+      this.transitionTabPage.Name = "transitionTabPage";
+      this.transitionTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.transitionTabPage.Size = new System.Drawing.Size(475, 355);
+      this.transitionTabPage.TabIndex = 2;
+      this.transitionTabPage.Text = "State Transition";
+      this.transitionTabPage.UseVisualStyleBackColor = true;
+      // 
+      // removeTransitionButton
+      // 
+      this.removeTransitionButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.removeTransitionButton.Enabled = false;
+      this.removeTransitionButton.Location = new System.Drawing.Point(365, 326);
+      this.removeTransitionButton.Name = "removeTransitionButton";
+      this.removeTransitionButton.Size = new System.Drawing.Size(104, 23);
+      this.removeTransitionButton.TabIndex = 2;
+      this.removeTransitionButton.Text = "Remove Transition";
+      this.removeTransitionButton.UseVisualStyleBackColor = true;
+      this.removeTransitionButton.Click += new System.EventHandler(this.removeTransitionButton_Click);
+      // 
+      // addTransitionButton
+      // 
+      this.addTransitionButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addTransitionButton.Location = new System.Drawing.Point(6, 326);
+      this.addTransitionButton.Name = "addTransitionButton";
+      this.addTransitionButton.Size = new System.Drawing.Size(104, 23);
+      this.addTransitionButton.TabIndex = 1;
+      this.addTransitionButton.Text = "Add Transition";
+      this.addTransitionButton.UseVisualStyleBackColor = true;
+      this.addTransitionButton.Click += new System.EventHandler(this.addTransitionButton_Click);
+      // 
+      // stateTransitionTabControl
+      // 
+      this.stateTransitionTabControl.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.stateTransitionTabControl.Location = new System.Drawing.Point(0, 0);
+      this.stateTransitionTabControl.Name = "stateTransitionTabControl";
+      this.stateTransitionTabControl.SelectedIndex = 0;
+      this.stateTransitionTabControl.Size = new System.Drawing.Size(475, 320);
+      this.stateTransitionTabControl.TabIndex = 0;
+      // 
+      // acceptingStateLabel
+      // 
+      this.acceptingStateLabel.AutoSize = true;
+      this.acceptingStateLabel.Location = new System.Drawing.Point(232, 17);
+      this.acceptingStateLabel.Name = "acceptingStateLabel";
+      this.acceptingStateLabel.Size = new System.Drawing.Size(86, 13);
+      this.acceptingStateLabel.TabIndex = 6;
+      this.acceptingStateLabel.Text = "Accepting State:";
+      // 
+      // acceptingStateBoolDataView
+      // 
+      boolData1.Data = true;
+      this.acceptingStateBoolDataView.BoolData = boolData1;
+      this.acceptingStateBoolDataView.Caption = "View";
+      this.acceptingStateBoolDataView.Enabled = false;
+      this.acceptingStateBoolDataView.Location = new System.Drawing.Point(324, 17);
+      this.acceptingStateBoolDataView.Name = "acceptingStateBoolDataView";
+      this.acceptingStateBoolDataView.Size = new System.Drawing.Size(15, 23);
+      this.acceptingStateBoolDataView.TabIndex = 7;
+      // 
+      // ProtocolStateView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.acceptingStateBoolDataView);
+      this.Controls.Add(this.acceptingStateLabel);
+      this.Controls.Add(this.communicationDataTabControl);
+      this.Controls.Add(this.nameLabel);
+      this.Controls.Add(this.nameStringDataView);
+      this.Name = "ProtocolStateView";
+      this.Size = new System.Drawing.Size(489, 430);
+      this.communicationDataTabControl.ResumeLayout(false);
+      this.sendTabPage.ResumeLayout(false);
+      this.receiveTabPage.ResumeLayout(false);
+      this.transitionTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.StringDataView nameStringDataView;
+    private System.Windows.Forms.Label nameLabel;
+    private System.Windows.Forms.TabControl communicationDataTabControl;
+    private System.Windows.Forms.TabPage sendTabPage;
+    private System.Windows.Forms.TabPage receiveTabPage;
+    private HeuristicLab.Data.ConstrainedItemListView outboundCommunicationDataView;
+    private HeuristicLab.Data.ConstrainedItemListView inboundCommunicationDataView;
+    private System.Windows.Forms.Label acceptingStateLabel;
+    private HeuristicLab.Data.BoolDataView acceptingStateBoolDataView;
+    private System.Windows.Forms.TabPage transitionTabPage;
+    private System.Windows.Forms.TabControl stateTransitionTabControl;
+    private System.Windows.Forms.Button addTransitionButton;
+    private System.Windows.Forms.Button removeTransitionButton;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/ProtocolStateView.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/ProtocolStateView.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/ProtocolStateView.cs	(revision 584)
@@ -0,0 +1,152 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public partial class ProtocolStateView : ViewBase {
+    public ProtocolState ProtocolState {
+      get { return (ProtocolState)Item; }
+      set { base.Item = value; }
+    }
+
+    public ProtocolStateView() {
+      InitializeComponent();
+    }
+    public ProtocolStateView(ProtocolState protocolState)
+      : this() {
+      ProtocolState = protocolState;
+    }
+
+    protected override void RemoveItemEvents() {
+      ProtocolState.Changed -= new EventHandler(ProtocolState_Changed);
+      ProtocolState.Protocol.StatesChanged -= new EventHandler(States_Changed);
+      if (ProtocolState.StateTransitions != null) {
+        for (int i = 0 ; i < ProtocolState.StateTransitions.Count ; i++) {
+          ProtocolState.StateTransitions[i].Changed -= new EventHandler(StateTransitions_Changed);
+        }
+      }
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ProtocolState.Changed += new EventHandler(ProtocolState_Changed);
+      ProtocolState.Protocol.StatesChanged += new EventHandler(States_Changed);
+      if (ProtocolState.StateTransitions != null) {
+        for (int i = 0 ; i < ProtocolState.StateTransitions.Count ; i++) {
+          ProtocolState.StateTransitions[i].Changed += new EventHandler(StateTransitions_Changed);
+        }
+      }
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ProtocolState == null) {
+        nameStringDataView.Enabled = false;
+        nameStringDataView.StringData = null;
+        acceptingStateBoolDataView.Enabled = false;
+        acceptingStateBoolDataView.BoolData = null;
+        outboundCommunicationDataView.Enabled = false;
+        outboundCommunicationDataView.ConstrainedItemList = null;
+        inboundCommunicationDataView.Enabled = false;
+        inboundCommunicationDataView.ConstrainedItemList = null;
+        stateTransitionTabControl.Controls.Clear();
+      } else {
+        nameStringDataView.StringData = ProtocolState.Name;
+        nameStringDataView.Enabled = true;
+        acceptingStateBoolDataView.Enabled = true;
+        acceptingStateBoolDataView.BoolData = ProtocolState.AcceptingState;
+        outboundCommunicationDataView.ConstrainedItemList = ProtocolState.SendingData;
+        outboundCommunicationDataView.Enabled = true;
+        inboundCommunicationDataView.ConstrainedItemList = ProtocolState.ReceivingData;
+        inboundCommunicationDataView.Enabled = true;
+
+        addTransitionButton.Enabled = (ProtocolState.Protocol.States.Count > 1);
+        removeTransitionButton.Enabled = (ProtocolState.StateTransitions != null && ProtocolState.StateTransitions.Count > 0);
+
+        stateTransitionTabControl.Controls.Clear();
+        ItemList<StateTransition> stateTransitions = ProtocolState.StateTransitions;
+        if (stateTransitions != null) {
+          for (int i = 0 ; i < stateTransitions.Count ; i++) {
+            StateTransition stateTransition = (StateTransition)stateTransitions[i];
+            TabPage newTransitionTabPage = new TabPage((stateTransition.TargetState == null) ? ("no target") : (stateTransition.TargetState.Name.ToString()));
+            Control stateTransitionView = (Control)stateTransition.CreateView();
+            stateTransitionTabControl.Controls.Add(newTransitionTabPage);
+
+            newTransitionTabPage.Controls.Add(stateTransitionView);
+            newTransitionTabPage.Location = new Point(4, 22);
+            newTransitionTabPage.Padding = new Padding(3);
+            newTransitionTabPage.Size = stateTransitionTabControl.ClientSize;
+            newTransitionTabPage.UseVisualStyleBackColor = true;
+
+            stateTransitionView.Location = new Point(0, 0);
+            stateTransitionView.Size = newTransitionTabPage.ClientSize;
+            stateTransitionView.Dock = DockStyle.Fill;
+            stateTransitionView.Anchor = (AnchorStyles)(AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
+          }
+        }
+      }
+    }
+
+    #region ProtocolState change handling (main underlying object)
+    void ProtocolState_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+    #endregion
+
+    #region Protocol.States change handling (parent object)
+    void States_Changed(object sender, EventArgs e) {
+      for (int i = 0 ; i < stateTransitionTabControl.TabCount ; i++)
+        stateTransitionTabControl.TabPages[i].Controls[0].Refresh();
+      addTransitionButton.Enabled = (ProtocolState.Protocol.States.Count > 1);
+    }
+    #endregion
+
+    #region StateTransitions change handling (child object)
+    void StateTransitions_Changed(object sender, EventArgs e) {
+      for (int i = 0 ; i < stateTransitionTabControl.TabCount ; i++) {
+        if (((StateTransition)ProtocolState.StateTransitions[i]).TargetState != null)
+          stateTransitionTabControl.TabPages[i].Text = ((StateTransition)ProtocolState.StateTransitions[i]).TargetState.Name.ToString();
+      }
+    }
+    #endregion
+
+    #region Button events
+    private void addTransitionButton_Click(object sender, EventArgs e) {
+      //ProtocolState.AcceptingState = new BoolData(false);
+      StateTransition stateTransition = new StateTransition();
+      stateTransition.Changed += new EventHandler(StateTransitions_Changed);
+      stateTransition.SourceState = ProtocolState;
+
+      if (ProtocolState.StateTransitions == null) {
+        ItemList<StateTransition> temp = new ItemList<StateTransition>();
+        temp.Add(stateTransition);
+        ProtocolState.StateTransitions = temp;
+      } else {
+        ProtocolState.StateTransitions.Add(stateTransition);
+        Refresh();
+      }
+      removeTransitionButton.Enabled = true;
+    }
+
+    private void removeTransitionButton_Click(object sender, EventArgs e) {
+      if (stateTransitionTabControl.TabCount > 0) {
+        int selIdx = stateTransitionTabControl.SelectedIndex;
+        ProtocolState.StateTransitions[selIdx].Changed -= new EventHandler(StateTransitions_Changed);
+        stateTransitionTabControl.Controls.RemoveAt(selIdx);
+        ProtocolState.StateTransitions.RemoveAt(selIdx);
+        if (ProtocolState.StateTransitions.Count == 0) {
+          //ProtocolState.AcceptingState = new BoolData(true);
+          ProtocolState.StateTransitions = null;
+          removeTransitionButton.Enabled = false;
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/ProtocolStateView.resx
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/ProtocolStateView.resx	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/ProtocolStateView.resx	(revision 584)
@@ -0,0 +1,120 @@
+<?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>
+</root>
Index: trunk/sources/HeuristicLab.Communication.Data/SocketData.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/SocketData.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/SocketData.cs	(revision 584)
@@ -0,0 +1,171 @@
+﻿using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public class SocketData : ItemBase, IDataStream {
+    private TcpNetworkDriverConfiguration config;
+    public IDriverConfiguration Configuration {
+      get { return config; }
+      set { config = (TcpNetworkDriverConfiguration)value; }
+    }
+
+    private TcpListener tcpListener;
+    private TcpClient tcpIn;
+    private TcpClient tcpOut;
+    private string buffer;
+
+    public SocketData() {
+      tcpListener = null;
+      tcpIn = null;
+      tcpOut = null;
+      config = null;
+      buffer = "";
+    }
+
+    #region clone & persistence
+    // A socket cannot be cloned
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      SocketData clone = new SocketData();
+      clonedObjects.Add(Guid, clone);
+      clone.tcpIn = tcpIn;
+      clone.config = (TcpNetworkDriverConfiguration)Auxiliary.Clone(config, clonedObjects);
+      clone.buffer = buffer;
+      return clone;
+    }
+
+    // A socket cannot be persisted
+    // but information can be persisted that will allow it to be recreated
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode configNode = PersistenceManager.Persist("Configuration", config, document, persistedObjects);
+      node.AppendChild(configNode);
+      XmlNode bufferNode = document.CreateNode(XmlNodeType.Element, "Buffer", null);
+      bufferNode.InnerText = buffer;
+      node.AppendChild(bufferNode);
+      return node;
+    }
+
+    // A socket cannot be persisted
+    // but information can be persisted that will allow it to be recreated
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      Configuration = (TcpNetworkDriverConfiguration)PersistenceManager.Restore(node.SelectSingleNode("Configuration"), restoredObjects);
+      buffer = node.SelectSingleNode("Buffer").InnerText;
+      if (tcpListener == null) StartListening();
+    }
+    #endregion
+
+    private void StartListening() {
+      tcpListener = new TcpListener(IPAddress.Any, config.SourcePort.Data);
+      tcpListener.Start();
+    }
+
+    public void Initialize(IDriverConfiguration configuration) {
+      Configuration = configuration;
+      StartListening();
+    }
+
+    public bool Connect() {
+      if (tcpIn == null || !tcpIn.Connected) {
+        if (tcpListener.Pending())
+          tcpIn = tcpListener.AcceptTcpClient();
+      }
+      if (tcpOut == null || !tcpOut.Connected) {
+        tcpOut = new TcpClient();
+        try {
+          tcpOut.Connect(new IPEndPoint(IPAddress.Parse(config.TargetIPAddress.Data), config.TargetPort.Data));
+        } catch (SocketException) {
+          tcpOut.Close();
+          tcpOut = null;
+        }
+      }
+      return (tcpIn != null && tcpIn.Connected) && (tcpOut != null && tcpOut.Connected);
+    }
+
+    public void Close() {
+      tcpListener.Stop();
+      if ((tcpOut != null && tcpOut.Connected) && (tcpIn != null && tcpIn.Connected)) {
+        Write("CLOSING");
+        if (Read() != null)
+          throw new InvalidOperationException("ERROR in SocketData: Out of sync during Close()");
+      }
+      if (tcpIn != null) {
+        tcpIn.Close();
+        tcpIn = null;
+      }
+      if (tcpOut != null) {
+        tcpOut.Close();
+        tcpOut = null;
+      }
+      buffer = "";
+    }
+
+    public void Write(string s) {
+      if (tcpOut == null || !tcpOut.Connected) Connect();
+      NetworkStream outStream = tcpOut.GetStream();
+
+      byte[] sendBytes = Encoding.ASCII.GetBytes(s + "\n.\n");
+      outStream.Write(sendBytes, 0, sendBytes.Length);
+      outStream.Flush();
+      return;
+    }
+
+    public string Read() {
+      if (tcpIn == null || !tcpIn.Connected) Connect();
+      NetworkStream inStream = tcpIn.GetStream();
+      byte[] receivedBytes;
+      int count = 0;
+      int messageEnd = -1;
+      int bufferCount = 0;
+      if (buffer.Length > 0) {
+        byte[] bufferBytes = Encoding.ASCII.GetBytes(buffer);
+        receivedBytes = new byte[1000 + bufferBytes.Length];
+        Array.Copy(bufferBytes, receivedBytes, bufferBytes.Length);
+        messageEnd = TerminationCheck(receivedBytes, 0, bufferBytes.Length);
+        count = bufferBytes.Length;
+        bufferCount = count;
+        buffer = "";
+      } else
+        receivedBytes = new byte[1000];
+
+      if (messageEnd < 0) {
+        byte[] tmp = new byte[1000];
+        bool done;
+        do {
+          int recvd = inStream.Read(tmp, 0, 1000);
+          if (recvd == 0) break;
+          count += recvd;
+          if (count > receivedBytes.Length) {
+            byte[] h = receivedBytes;
+            receivedBytes = new byte[2 * h.Length];
+            Array.Copy(h, receivedBytes, count - recvd);
+          }
+          Array.Copy(tmp, 0, receivedBytes, count - recvd, recvd);
+          if (count < 3) done = false;
+          else done = (receivedBytes[count - 1] == 10 && receivedBytes[count - 2] == 46 && receivedBytes[count - 3] == 10); // \n.\n
+        } while (!done);
+        messageEnd = TerminationCheck(receivedBytes, bufferCount, count - bufferCount);
+      }
+      if (messageEnd < 0) throw new InvalidOperationException("ERROR: message was not received");
+      if (messageEnd < count - 3)
+        buffer = Encoding.ASCII.GetString(receivedBytes, messageEnd + 3, count - messageEnd - 3);
+      string result = Encoding.ASCII.GetString(receivedBytes, 0, messageEnd);
+      if (result.Equals("CLOSING")) return null;
+      else return result;
+    }
+
+    private int TerminationCheck(byte[] buffer, int start, int length) {
+      for (int i = start ; i < start + length - 2 ; i++) {
+        if (buffer[i] == 10 && buffer[i + 1] == 46 && buffer[i + 2] == 10) return i;
+      }
+      return -1;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/StateTransition.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/StateTransition.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/StateTransition.cs	(revision 584)
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators.Programmable;
+
+namespace HeuristicLab.Communication.Data {
+  public class StateTransition : ItemBase {
+    private ProtocolState sourceState;
+    public ProtocolState SourceState {
+      get { return sourceState; }
+      set {
+        sourceState = value;
+        OnChanged();
+      }
+    }
+    private ProtocolState targetState;
+    public ProtocolState TargetState {
+      get { return targetState; }
+      set {
+        targetState = value;
+        OnChanged();
+      }
+    }
+    private ProgrammableOperator transitionCondition;
+    public ProgrammableOperator TransitionCondition {
+      get { return transitionCondition; }
+      set {
+        transitionCondition = value;
+        OnChanged();
+      }
+    }
+
+    public StateTransition()
+      : base() {
+      sourceState = null;
+      targetState = null;
+      transitionCondition = new ProgrammableOperator();
+    }
+
+    public override IView CreateView() {
+      return new StateTransitionView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      StateTransition clone = new StateTransition();
+      clonedObjects.Add(Guid, clone);
+      clone.sourceState = SourceState;
+      clone.targetState = TargetState;
+      clone.TransitionCondition = (ProgrammableOperator)Auxiliary.Clone(TransitionCondition, clonedObjects);
+      return clone;
+    }
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode sourceStateNode = PersistenceManager.Persist("SourceState", SourceState, document, persistedObjects);
+      node.AppendChild(sourceStateNode);
+      XmlNode targetStateNode = PersistenceManager.Persist("TargetState", TargetState, document, persistedObjects);
+      node.AppendChild(targetStateNode);
+      XmlNode transitionConditionNode = PersistenceManager.Persist("TransitionCondition", TransitionCondition, document, persistedObjects);
+      node.AppendChild(transitionConditionNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      sourceState = (ProtocolState)PersistenceManager.Restore(node.SelectSingleNode("SourceState"), restoredObjects);
+      targetState = (ProtocolState)PersistenceManager.Restore(node.SelectSingleNode("TargetState"), restoredObjects);
+      transitionCondition = (ProgrammableOperator)PersistenceManager.Restore(node.SelectSingleNode("TransitionCondition"), restoredObjects);
+    }
+    #endregion persistence
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/StateTransitionView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/StateTransitionView.Designer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/StateTransitionView.Designer.cs	(revision 584)
@@ -0,0 +1,121 @@
+namespace HeuristicLab.Communication.Data {
+  partial class StateTransitionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.targetStateLabel = new System.Windows.Forms.Label();
+      this.transitionFunctionLabel = new System.Windows.Forms.Label();
+      this.variablesListBox = new System.Windows.Forms.ListBox();
+      this.variablesLabel = new System.Windows.Forms.Label();
+      this.targetStateComboBox = new System.Windows.Forms.ComboBox();
+      this.transitionFunctionProgrammableOperatorView = new HeuristicLab.Operators.Programmable.ProgrammableOperatorView();
+      this.SuspendLayout();
+      // 
+      // targetStateLabel
+      // 
+      this.targetStateLabel.AutoSize = true;
+      this.targetStateLabel.Location = new System.Drawing.Point(3, 6);
+      this.targetStateLabel.Name = "targetStateLabel";
+      this.targetStateLabel.Size = new System.Drawing.Size(69, 13);
+      this.targetStateLabel.TabIndex = 4;
+      this.targetStateLabel.Text = "Target State:";
+      // 
+      // transitionFunctionLabel
+      // 
+      this.transitionFunctionLabel.AutoSize = true;
+      this.transitionFunctionLabel.Location = new System.Drawing.Point(3, 131);
+      this.transitionFunctionLabel.Name = "transitionFunctionLabel";
+      this.transitionFunctionLabel.Size = new System.Drawing.Size(100, 13);
+      this.transitionFunctionLabel.TabIndex = 9;
+      this.transitionFunctionLabel.Text = "Transition Function:";
+      // 
+      // variablesListBox
+      // 
+      this.variablesListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.variablesListBox.FormattingEnabled = true;
+      this.variablesListBox.Location = new System.Drawing.Point(6, 46);
+      this.variablesListBox.Name = "variablesListBox";
+      this.variablesListBox.ScrollAlwaysVisible = true;
+      this.variablesListBox.Size = new System.Drawing.Size(335, 82);
+      this.variablesListBox.TabIndex = 18;
+      // 
+      // variablesLabel
+      // 
+      this.variablesLabel.AutoSize = true;
+      this.variablesLabel.Location = new System.Drawing.Point(3, 28);
+      this.variablesLabel.Name = "variablesLabel";
+      this.variablesLabel.Size = new System.Drawing.Size(53, 13);
+      this.variablesLabel.TabIndex = 19;
+      this.variablesLabel.Text = "Variables:";
+      // 
+      // targetStateComboBox
+      // 
+      this.targetStateComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.targetStateComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.targetStateComboBox.FormattingEnabled = true;
+      this.targetStateComboBox.Location = new System.Drawing.Point(78, 3);
+      this.targetStateComboBox.Name = "targetStateComboBox";
+      this.targetStateComboBox.Size = new System.Drawing.Size(263, 21);
+      this.targetStateComboBox.TabIndex = 20;
+      // 
+      // transitionFunctionProgrammableOperatorView
+      // 
+      this.transitionFunctionProgrammableOperatorView.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.transitionFunctionProgrammableOperatorView.Caption = "View";
+      this.transitionFunctionProgrammableOperatorView.Location = new System.Drawing.Point(6, 147);
+      this.transitionFunctionProgrammableOperatorView.Name = "transitionFunctionProgrammableOperatorView";
+      this.transitionFunctionProgrammableOperatorView.ProgrammableOperator = null;
+      this.transitionFunctionProgrammableOperatorView.Size = new System.Drawing.Size(338, 241);
+      this.transitionFunctionProgrammableOperatorView.TabIndex = 21;
+      // 
+      // StateTransitionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.transitionFunctionProgrammableOperatorView);
+      this.Controls.Add(this.targetStateComboBox);
+      this.Controls.Add(this.variablesLabel);
+      this.Controls.Add(this.variablesListBox);
+      this.Controls.Add(this.transitionFunctionLabel);
+      this.Controls.Add(this.targetStateLabel);
+      this.Name = "StateTransitionView";
+      this.Size = new System.Drawing.Size(345, 388);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label targetStateLabel;
+    private System.Windows.Forms.Label transitionFunctionLabel;
+    private System.Windows.Forms.ListBox variablesListBox;
+    private System.Windows.Forms.Label variablesLabel;
+    private System.Windows.Forms.ComboBox targetStateComboBox;
+    private HeuristicLab.Operators.Programmable.ProgrammableOperatorView transitionFunctionProgrammableOperatorView;
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/StateTransitionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/StateTransitionView.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/StateTransitionView.cs	(revision 584)
@@ -0,0 +1,152 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public partial class StateTransitionView : ViewBase {
+
+    public StateTransition StateTransition {
+      get { return (StateTransition)Item; }
+      set { base.Item = value; }
+    }
+
+    public StateTransitionView() {
+      InitializeComponent();
+    }
+
+    public StateTransitionView(StateTransition stateTransition)
+      : this() {
+      StateTransition = stateTransition;
+    }
+
+    protected override void RemoveItemEvents() {
+      StateTransition.Changed -= new EventHandler(StateTransition_Changed);
+      ConstrainedItemList request = StateTransition.SourceState.SendingData;
+      ConstrainedItemList response = StateTransition.SourceState.ReceivingData;
+
+      request.Changed -= new EventHandler(VariablesList_Changed);
+      request.ItemAdded -= new EventHandler<ItemIndexEventArgs>(Parameter_Added);
+      request.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(Parameter_Removed);
+      for (int i = 0 ; i < request.Count ; i++)
+        request[i].Changed -= new EventHandler(Parameter_Changed);
+      response.Changed -= new EventHandler(VariablesList_Changed);
+      response.ItemAdded -= new EventHandler<ItemIndexEventArgs>(Parameter_Added);
+      response.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(Parameter_Removed);
+      for (int i = 0 ; i < response.Count ; i++)
+        response[i].Changed -= new EventHandler(Parameter_Changed);
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      StateTransition.Changed += new EventHandler(StateTransition_Changed);
+      ConstrainedItemList request = StateTransition.SourceState.SendingData;
+      ConstrainedItemList response = StateTransition.SourceState.ReceivingData;
+
+      request.Changed += new EventHandler(VariablesList_Changed);
+      request.ItemAdded += new EventHandler<ItemIndexEventArgs>(Parameter_Added);
+      request.ItemRemoved += new EventHandler<ItemIndexEventArgs>(Parameter_Removed);
+      for (int i = 0 ; i < request.Count ; i++)
+        request[i].Changed += new EventHandler(Parameter_Changed);
+      response.Changed += new EventHandler(VariablesList_Changed);
+      response.ItemAdded += new EventHandler<ItemIndexEventArgs>(Parameter_Added);
+      response.ItemRemoved += new EventHandler<ItemIndexEventArgs>(Parameter_Removed);
+      for (int i = 0 ; i < response.Count ; i++) {
+        response[i].Changed += new EventHandler(Parameter_Changed);
+      }
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (StateTransition == null) {
+        transitionFunctionProgrammableOperatorView.Enabled = false;
+        targetStateComboBox.Enabled = false;
+        targetStateComboBox.DataSource = null;
+        targetStateComboBox.Items.Clear();
+      } else {
+        targetStateComboBox.Enabled = true;
+        transitionFunctionProgrammableOperatorView.ProgrammableOperator = StateTransition.TransitionCondition;
+        transitionFunctionProgrammableOperatorView.Enabled = true;
+        BuildTargetStateComboBox();
+        BuildVariablesListBox();
+      }
+    }
+
+    void StateTransition_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    void VariablesList_Changed(object sender, EventArgs e) {
+      BuildVariablesListBox();
+    }
+
+    #region Events to synchronize changes in request/response variables to state transition
+    void Parameter_Changed(object sender, EventArgs e) {
+      BuildVariablesListBox();
+    }
+    void Parameter_Added(object sender, ItemIndexEventArgs e) {
+      ((IItem)e.Item).Changed += new EventHandler(Parameter_Changed);
+    }
+    void Parameter_Removed(object sender, ItemIndexEventArgs e) {
+      ((IItem)e.Item).Changed -= new EventHandler(Parameter_Changed);
+    }
+    #endregion
+
+    private void BuildTargetStateComboBox() {
+      ComboBox comboBox = targetStateComboBox;
+      ItemList<ProtocolState> states;
+      if (StateTransition.SourceState == null || StateTransition.SourceState.Protocol == null)
+        states = null;
+      else
+        states = StateTransition.SourceState.Protocol.States;
+      ProtocolState selected = StateTransition.TargetState;
+      ProtocolState forbidden = StateTransition.SourceState;
+
+      if (states != null && states.Count > 0) {
+        IList<ProtocolState> sourceList = new List<ProtocolState>(states.Count);
+        int selectedIndex = -1, counter = -1;
+        for (int i = 0 ; i < states.Count ; i++) {
+          if (forbidden == null || !states[i].Guid.Equals(forbidden.Guid)) {
+            sourceList.Add((ProtocolState)states[i]);
+            counter++;
+          }
+          if (selected != null && states[i].Guid.Equals(selected.Guid))
+            selectedIndex = counter;
+        }
+        comboBox.SelectedIndexChanged -= new EventHandler(targetStateComboBox_SelectedIndexChanged);
+        BindingList<ProtocolState> bl = new BindingList<ProtocolState>(sourceList);
+        comboBox.DataSource = bl;
+        comboBox.DisplayMember = "Name";
+        comboBox.ValueMember = "Guid";
+        comboBox.SelectedIndex = selectedIndex;
+        comboBox.SelectedIndexChanged += new EventHandler(targetStateComboBox_SelectedIndexChanged);
+      }
+    }
+
+    private void BuildVariablesListBox() {
+      ListBox variables = variablesListBox;
+      ConstrainedItemList request = StateTransition.SourceState.SendingData;
+      ConstrainedItemList response = StateTransition.SourceState.ReceivingData;
+      variables.Items.Clear();
+      variables.Items.Add("==Sending==");
+      for (int i = 0 ; i < request.Count ; i++) {
+        variables.Items.Add(request[i]);
+      }
+      variables.Items.Add("==Receiving==");
+      for (int i = 0 ; i < response.Count ; i++) {
+        variables.Items.Add(response[i]);
+      }
+    }
+
+    private void targetStateComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (targetStateComboBox.SelectedIndex >= 0) {
+        StateTransition.TargetState = (ProtocolState)targetStateComboBox.SelectedItem;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/StateTransitionView.resx
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/StateTransitionView.resx	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/StateTransitionView.resx	(revision 584)
@@ -0,0 +1,120 @@
+<?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>
+</root>
Index: trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfiguration.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfiguration.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfiguration.cs	(revision 584)
@@ -0,0 +1,77 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.Net.Sockets;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public class TcpNetworkDriverConfiguration : ItemBase, IDriverConfiguration {
+    private StringData targetIPAddress;
+    public StringData TargetIPAddress {
+      get { return targetIPAddress; }
+      set {
+        targetIPAddress = value;
+        OnChanged();
+      }
+    }
+
+    private IntData targetPort;
+    public IntData TargetPort {
+      get { return targetPort; }
+      set {
+        targetPort = value;
+        OnChanged();
+      }
+    }
+
+    private IntData sourcePort;
+    public IntData SourcePort {
+      get { return sourcePort; }
+      set {
+        sourcePort = value;
+        OnChanged();
+      }
+    }
+
+    public TcpNetworkDriverConfiguration() {
+      targetIPAddress = new StringData("127.0.0.1");
+      targetPort = new IntData(2552);
+      sourcePort = new IntData(5225);
+    }
+
+    public override IView CreateView() {
+      return new TcpNetworkDriverConfigurationView(this);
+    }
+
+    #region persistence & clone
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode ipNode = PersistenceManager.Persist("TargetIP", TargetIPAddress, document, persistedObjects);
+      node.AppendChild(ipNode);
+      XmlNode tportNode = PersistenceManager.Persist("TargetPort", TargetPort, document, persistedObjects);
+      node.AppendChild(tportNode);
+      XmlNode sportNode = PersistenceManager.Persist("SourcePort", SourcePort, document, persistedObjects);
+      node.AppendChild(sportNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      targetIPAddress = (StringData)PersistenceManager.Restore(node.SelectSingleNode("TargetIP"), restoredObjects);
+      targetPort = (IntData)PersistenceManager.Restore(node.SelectSingleNode("TargetPort"), restoredObjects);
+      sourcePort = (IntData)PersistenceManager.Restore(node.SelectSingleNode("SourcePort"), restoredObjects);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      TcpNetworkDriverConfiguration clone = new TcpNetworkDriverConfiguration();
+      clonedObjects.Add(Guid, clone);
+      clone.targetIPAddress = (StringData)Auxiliary.Clone(TargetIPAddress, clonedObjects);
+      clone.targetPort = (IntData)Auxiliary.Clone(TargetPort, clonedObjects);
+      clone.sourcePort = (IntData)Auxiliary.Clone(SourcePort, clonedObjects);
+      return clone;
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfigurationView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfigurationView.Designer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfigurationView.Designer.cs	(revision 584)
@@ -0,0 +1,114 @@
+﻿namespace HeuristicLab.Communication.Data {
+  partial class TcpNetworkDriverConfigurationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.ipAddressStringDataView = new HeuristicLab.Data.StringDataView();
+      this.ipAddressLabel = new System.Windows.Forms.Label();
+      this.targetPortLabel = new System.Windows.Forms.Label();
+      this.targetPortIntDataView = new HeuristicLab.Data.IntDataView();
+      this.sourcePortIntDataView = new HeuristicLab.Data.IntDataView();
+      this.sourcePortLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // ipAddressStringDataView
+      // 
+      this.ipAddressStringDataView.Caption = "View";
+      this.ipAddressStringDataView.Location = new System.Drawing.Point(74, 3);
+      this.ipAddressStringDataView.Name = "ipAddressStringDataView";
+      this.ipAddressStringDataView.Size = new System.Drawing.Size(200, 25);
+      this.ipAddressStringDataView.StringData = null;
+      this.ipAddressStringDataView.TabIndex = 0;
+      // 
+      // ipAddressLabel
+      // 
+      this.ipAddressLabel.AutoSize = true;
+      this.ipAddressLabel.Location = new System.Drawing.Point(7, 7);
+      this.ipAddressLabel.Name = "ipAddressLabel";
+      this.ipAddressLabel.Size = new System.Drawing.Size(61, 13);
+      this.ipAddressLabel.TabIndex = 3;
+      this.ipAddressLabel.Text = "IP Address:";
+      // 
+      // targetPortLabel
+      // 
+      this.targetPortLabel.AutoSize = true;
+      this.targetPortLabel.Location = new System.Drawing.Point(8, 33);
+      this.targetPortLabel.Name = "targetPortLabel";
+      this.targetPortLabel.Size = new System.Drawing.Size(60, 13);
+      this.targetPortLabel.TabIndex = 4;
+      this.targetPortLabel.Text = "TargetPort:";
+      // 
+      // targetPortIntDataView
+      // 
+      this.targetPortIntDataView.Caption = "View";
+      this.targetPortIntDataView.IntData = null;
+      this.targetPortIntDataView.Location = new System.Drawing.Point(74, 30);
+      this.targetPortIntDataView.Name = "targetPortIntDataView";
+      this.targetPortIntDataView.Size = new System.Drawing.Size(96, 26);
+      this.targetPortIntDataView.TabIndex = 1;
+      // 
+      // sourcePortIntDataView
+      // 
+      this.sourcePortIntDataView.Caption = "View";
+      this.sourcePortIntDataView.IntData = null;
+      this.sourcePortIntDataView.Location = new System.Drawing.Point(74, 57);
+      this.sourcePortIntDataView.Name = "sourcePortIntDataView";
+      this.sourcePortIntDataView.Size = new System.Drawing.Size(96, 26);
+      this.sourcePortIntDataView.TabIndex = 5;
+      // 
+      // sourcePortLabel
+      // 
+      this.sourcePortLabel.AutoSize = true;
+      this.sourcePortLabel.Location = new System.Drawing.Point(2, 60);
+      this.sourcePortLabel.Name = "sourcePortLabel";
+      this.sourcePortLabel.Size = new System.Drawing.Size(66, 13);
+      this.sourcePortLabel.TabIndex = 6;
+      this.sourcePortLabel.Text = "Source Port:";
+      // 
+      // TcpNetworkDriverConfigurationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.sourcePortLabel);
+      this.Controls.Add(this.sourcePortIntDataView);
+      this.Controls.Add(this.targetPortIntDataView);
+      this.Controls.Add(this.targetPortLabel);
+      this.Controls.Add(this.ipAddressLabel);
+      this.Controls.Add(this.ipAddressStringDataView);
+      this.Name = "TcpNetworkDriverConfigurationView";
+      this.Size = new System.Drawing.Size(278, 81);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.StringDataView ipAddressStringDataView;
+    private System.Windows.Forms.Label ipAddressLabel;
+    private System.Windows.Forms.Label targetPortLabel;
+    private HeuristicLab.Data.IntDataView targetPortIntDataView;
+    private HeuristicLab.Data.IntDataView sourcePortIntDataView;
+    private System.Windows.Forms.Label sourcePortLabel;
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfigurationView.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfigurationView.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfigurationView.cs	(revision 584)
@@ -0,0 +1,47 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.Net.Sockets;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Communication.Data {
+  public partial class TcpNetworkDriverConfigurationView : ViewBase {
+    private TcpNetworkDriverConfiguration TcpNetworkDriverConfiguration {
+      get { return (TcpNetworkDriverConfiguration)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public TcpNetworkDriverConfigurationView() {
+      InitializeComponent();
+    }
+
+    public TcpNetworkDriverConfigurationView(TcpNetworkDriverConfiguration tcpNetworkDriverConfiguration)
+      : this() {
+      TcpNetworkDriverConfiguration = tcpNetworkDriverConfiguration;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (TcpNetworkDriverConfiguration == null) {
+        ipAddressStringDataView.Enabled = false;
+        ipAddressStringDataView.StringData = null;
+        targetPortIntDataView.Enabled = false;
+        targetPortIntDataView.IntData = null;
+        sourcePortIntDataView.Enabled = false;
+        sourcePortIntDataView.IntData = null;
+      } else {
+        ipAddressStringDataView.StringData = TcpNetworkDriverConfiguration.TargetIPAddress;
+        ipAddressStringDataView.Enabled = true;
+        targetPortIntDataView.IntData = TcpNetworkDriverConfiguration.TargetPort;
+        targetPortIntDataView.Enabled = true;
+        sourcePortIntDataView.IntData = TcpNetworkDriverConfiguration.SourcePort;
+        sourcePortIntDataView.Enabled = true;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfigurationView.resx
===================================================================
--- trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfigurationView.resx	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Data/TcpNetworkDriverConfigurationView.resx	(revision 584)
@@ -0,0 +1,120 @@
+<?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>
+</root>
Index: trunk/sources/HeuristicLab.Communication.Operators/CurrentStateConstraintChecker.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/CurrentStateConstraintChecker.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/CurrentStateConstraintChecker.cs	(revision 584)
@@ -0,0 +1,34 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class CurrentStateConstraintChecker : OperatorBase {
+    public override string Description {
+      get {
+        return @"TODO";
+      }
+    }
+
+    public CurrentStateConstraintChecker() {
+      AddVariableInfo(new VariableInfo("CurrentState", "", typeof(ProtocolState), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+      ConstrainedItemList sendingData = (ConstrainedItemList)currentState.SendingData.Clone();
+      sendingData.BeginCombinedOperation();
+      for (int i = 0; i < sendingData.Count; i++) {
+        Variable tmp = (Variable)sendingData[i];
+        tmp.Value = scope.GetVariableValue(tmp.Name, false);
+      }
+      ICollection<IConstraint> violatedConstraints;
+      bool result = sendingData.EndCombinedOperation(out violatedConstraints);
+      if (result) return null;
+      else return new AtomicOperation(SubOperators[0], scope);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/CurrentStateInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/CurrentStateInitializer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/CurrentStateInitializer.cs	(revision 584)
@@ -0,0 +1,46 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class CurrentStateInitializer : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    public CurrentStateInitializer()
+      : base() {
+      AddVariableInfo(new VariableInfo("Protocol", "", typeof(Protocol), VariableKind.In));
+      AddVariableInfo(new VariableInfo("CurrentState", "", typeof(ProtocolState), VariableKind.New | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      Protocol p = GetVariableValue<Protocol>("Protocol", scope, true);
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true, false);
+      IVariableInfo info = GetVariableInfo("CurrentState");
+      string actualName = "";
+      if (!info.Local)
+        actualName = scope.TranslateName(info.FormalName);
+      if (currentState == null) {
+        currentState = p.InitialState;
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, currentState));
+        else
+          scope.AddVariable(new Variable(actualName, currentState));
+      } else {
+        currentState = p.InitialState;
+        if (info.Local) {
+          if (GetVariable(info.ActualName) == null) AddVariable(new Variable(info.ActualName, currentState));
+          else GetVariable(info.ActualName).Value = currentState;
+        } else {
+          if (scope.GetVariable(actualName) == null) scope.AddVariable(new Variable(actualName, currentState));
+          else scope.GetVariable(actualName).Value = currentState;
+        }
+      }
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/CurrentStateVariableInjector.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/CurrentStateVariableInjector.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/CurrentStateVariableInjector.cs	(revision 584)
@@ -0,0 +1,28 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class CurrentStateVariableInjector : OperatorBase {
+    public override string Description {
+      get { return @"TODO\r\n add description"; }
+    }
+
+    public CurrentStateVariableInjector() {
+      AddVariableInfo(new VariableInfo("CurrentState", "The current state when working up a protocol", typeof(ProtocolState), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+      ConstrainedItemList data = currentState.SendingData;
+      for (int i = 0 ; i < data.Count ; i++) {
+        scope.AddVariable((Variable)data[i].Clone(new Dictionary<Guid, object>()));
+      }
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/DataStreamCommunicator.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/DataStreamCommunicator.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/DataStreamCommunicator.cs	(revision 584)
@@ -0,0 +1,45 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class DataStreamCommunicator : OperatorBase {
+    public override string Description {
+      get {
+        return @"TODO";
+      }
+    }
+
+    public DataStreamCommunicator() {
+      AddVariableInfo(new VariableInfo("CurrentState", "", typeof(ProtocolState), VariableKind.In));
+      AddVariableInfo(new VariableInfo("DataStream", "", typeof(IDataStream), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Message", "", typeof(StringData), VariableKind.New | VariableKind.Deleted));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+      IDataStream connection = GetVariableValue<IDataStream>("DataStream", scope, true);
+      IVariableInfo info = GetVariableInfo("Message");
+      string actualName = "";
+      if (!info.Local)
+        actualName = scope.TranslateName(info.FormalName);
+
+      if (currentState.SendingData.Count > 0) {
+        string toSend = GetVariableValue<StringData>(info.FormalName, scope, false).Data;
+        connection.Write(toSend);
+        if (info.Local) RemoveVariable(info.ActualName);
+        else scope.RemoveVariable(actualName);
+      }
+
+      if (currentState.ReceivingData.Count > 0) {
+        string received = connection.Read();
+        if (info.Local) AddVariable(new Variable(info.ActualName, new StringData(received)));
+        else scope.AddVariable(new Variable(actualName, new StringData(received)));
+      }
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/DataStreamFinisher.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/DataStreamFinisher.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/DataStreamFinisher.cs	(revision 584)
@@ -0,0 +1,34 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class DataStreamFinisher : OperatorBase {
+    public override string Description {
+      get {
+        return @"TODO";
+      }
+    }
+
+    public DataStreamFinisher() {
+      AddVariableInfo(new VariableInfo("DataStream", "", typeof(IDataStream), VariableKind.Deleted));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IDataStream datastream = GetVariableValue<IDataStream>("DataStream", scope, true);
+
+      datastream.Close();
+
+      IVariableInfo info = GetVariableInfo("DataStream");
+      if (info.Local)
+        RemoveVariable(info.ActualName);
+      else
+        scope.RemoveVariable(scope.TranslateName(info.FormalName));
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/HeuristicLab.Communication.Operators.csproj
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/HeuristicLab.Communication.Operators.csproj	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/HeuristicLab.Communication.Operators.csproj	(revision 584)
@@ -0,0 +1,125 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6AEF1284-2428-4B01-B9D2-62C1FA7C2DE1}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Communication.Operators</RootNamespace>
+    <AssemblyName>HeuristicLab.Communication.Operators-3.2</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <StartupObject>
+    </StartupObject>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ItemGroup>
+    <Compile Include="CurrentStateConstraintChecker.cs" />
+    <Compile Include="CurrentStateInitializer.cs" />
+    <Compile Include="CurrentStateVariableInjector.cs" />
+    <Compile Include="DataStreamCommunicator.cs" />
+    <Compile Include="DataStreamFinisher.cs" />
+    <Compile Include="HeuristicLabCommunicationOperatorsPlugin.cs" />
+    <Compile Include="LocalProcessInitiator.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ProtocolInjector.cs" />
+    <Compile Include="ProtocolInjectorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProtocolInjectorView.designer.cs">
+      <DependentUpon>ProtocolInjectorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="SimpleReceiveItemDeserializer.cs" />
+    <Compile Include="SimpleSendItemSerializer.cs" />
+    <Compile Include="StateTransistor.cs" />
+    <Compile Include="SubscopeCurrentStateLooseDataCollector.cs" />
+    <Compile Include="SubscopeCurrentStateLooseDataDistributor.cs" />
+    <Compile Include="TcpNetworkInitiator.cs" />
+    <Compile Include="XMLConstrainedItemListDeserializer.cs" />
+    <Compile Include="XMLConstrainedItemListSerializer.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.XML" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ProtocolInjectorView.resx">
+      <DependentUpon>ProtocolInjectorView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+    <PreBuildEvent>cmd /c ""$(SolutionDir)PreBuildEvent.cmd" "$(ProjectDir).""</PreBuildEvent>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Communication.Data\HeuristicLab.Communication.Data.csproj">
+      <Project>{14E1C3E3-2496-436A-AE00-09F7B81DB15B}</Project>
+      <Name>HeuristicLab.Communication.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Constraints\HeuristicLab.Constraints.csproj">
+      <Project>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</Project>
+      <Name>HeuristicLab.Constraints</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators.Programmable\HeuristicLab.Operators.Programmable.csproj">
+      <Project>{E3CCBFC6-900C-41B6-AFB8-6646DB097435}</Project>
+      <Name>HeuristicLab.Operators.Programmable</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Random\HeuristicLab.Random.csproj">
+      <Project>{47019A74-F7F7-482E-83AA-D3F4F777E879}</Project>
+      <Name>HeuristicLab.Random</Name>
+    </ProjectReference>
+  </ItemGroup>
+</Project>
Index: trunk/sources/HeuristicLab.Communication.Operators/HeuristicLabCommunicationOperatorsPlugin.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/HeuristicLabCommunicationOperatorsPlugin.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/HeuristicLabCommunicationOperatorsPlugin.cs	(revision 584)
@@ -0,0 +1,18 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Communication.Operators {
+  [ClassInfo(Name = "HeuristicLab.Communication.Operators-3.2")]
+  [PluginFile(Filename = "HeuristicLab.Communication.Operators-3.2.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Data-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Operators-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Operators.Programmable-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Random-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Communication.Data-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Constraints-3.2")]
+  public class HeuristicLabCommunicationOperatorsPlugin : PluginBase {
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/LocalProcessInitiator.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/LocalProcessInitiator.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/LocalProcessInitiator.cs	(revision 584)
@@ -0,0 +1,33 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class LocalProcessInitiator : OperatorBase {
+
+    public override string Description {
+      get { return @"This operator will initialize and start a process with the specified configuration."; }
+    }
+    public LocalProcessInitiator() {
+      AddVariableInfo(new VariableInfo("DriverConfiguration", "", typeof(LocalProcessDriverConfiguration), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Process", "", typeof(ProcessData), VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      LocalProcessDriverConfiguration config = GetVariableValue<LocalProcessDriverConfiguration>("DriverConfiguration", scope, true);
+      ProcessData proc = new ProcessData();
+      proc.Initialize(config);
+
+      IVariableInfo info = GetVariableInfo("Process");
+      if (info.Local)
+        AddVariable(new Variable(info.ActualName, proc));
+      else
+        scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), proc));
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/Properties/AssemblyInfo.frame
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/Properties/AssemblyInfo.frame	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/Properties/AssemblyInfo.frame	(revision 584)
@@ -0,0 +1,33 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Communication.Operators")]
+[assembly: AssemblyDescription("This assembly contains operators to be used for communicating")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("62a462a9-4ceb-4174-a055-91a1be696da1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
Index: trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjector.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjector.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjector.cs	(revision 584)
@@ -0,0 +1,33 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class ProtocolInjector : OperatorBase {
+    public override string Description {
+      get { return "Injects a protocol into the data tree"; }
+    }
+
+    public ProtocolInjector()
+      : base() {
+      AddVariableInfo(new VariableInfo("Protocol", "The protocol to be used for communication", typeof(Protocol), VariableKind.New));
+      AddVariable(new Variable("Protocol", new Protocol()));
+      AddVariableInfo(new VariableInfo("Dictionary", "The dictionary to translate received variables names", typeof(ItemDictionary<StringData, StringData>), VariableKind.New));
+      AddVariable(new Variable("Dictionary", new ItemDictionary<StringData, StringData>()));
+    }
+
+    public override IView CreateView() {
+      return new ProtocolInjectorView(this);
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IDictionary<Guid, object> clonedObjects = new Dictionary<Guid, object>();
+      scope.AddVariable(new Variable(scope.TranslateName("Protocol"), (Protocol)GetVariable("Protocol").Value.Clone(clonedObjects)));
+      scope.AddVariable(new Variable(scope.TranslateName("Dictionary"), (ItemDictionary<StringData, StringData>)GetVariable("Dictionary").Value.Clone()));
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjectorView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjectorView.Designer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjectorView.Designer.cs	(revision 584)
@@ -0,0 +1,148 @@
+﻿namespace HeuristicLab.Communication.Operators {
+  partial class ProtocolInjectorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.protocolOpenFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.variableInfoTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
+      this.protocolTabPage = new System.Windows.Forms.TabPage();
+      this.protocolEditor = new HeuristicLab.Communication.Data.ProtocolEditor();
+      this.loadProtocolButton = new System.Windows.Forms.Button();
+      this.dictionaryTabPage = new System.Windows.Forms.TabPage();
+      this.tabControl.SuspendLayout();
+      this.variableInfoTabPage.SuspendLayout();
+      this.protocolTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // protocolOpenFileDialog
+      // 
+      this.protocolOpenFileDialog.Filter = "Protocol files|*.hl|All files|*.*";
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.variableInfoTabPage);
+      this.tabControl.Controls.Add(this.protocolTabPage);
+      this.tabControl.Controls.Add(this.dictionaryTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(503, 391);
+      this.tabControl.TabIndex = 2;
+      // 
+      // variableInfoTabPage
+      // 
+      this.variableInfoTabPage.Controls.Add(this.operatorBaseVariableInfosView);
+      this.variableInfoTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variableInfoTabPage.Name = "variableInfoTabPage";
+      this.variableInfoTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variableInfoTabPage.Size = new System.Drawing.Size(495, 365);
+      this.variableInfoTabPage.TabIndex = 0;
+      this.variableInfoTabPage.Text = "Variable Infos";
+      this.variableInfoTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariableInfosView
+      // 
+      this.operatorBaseVariableInfosView.Caption = "Operator";
+      this.operatorBaseVariableInfosView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariableInfosView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
+      this.operatorBaseVariableInfosView.Operator = null;
+      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(489, 359);
+      this.operatorBaseVariableInfosView.TabIndex = 1;
+      // 
+      // protocolTabPage
+      // 
+      this.protocolTabPage.Controls.Add(this.protocolEditor);
+      this.protocolTabPage.Controls.Add(this.loadProtocolButton);
+      this.protocolTabPage.Location = new System.Drawing.Point(4, 22);
+      this.protocolTabPage.Name = "protocolTabPage";
+      this.protocolTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.protocolTabPage.Size = new System.Drawing.Size(495, 365);
+      this.protocolTabPage.TabIndex = 1;
+      this.protocolTabPage.Text = "Protocol";
+      this.protocolTabPage.UseVisualStyleBackColor = true;
+      // 
+      // protocolEditor
+      // 
+      this.protocolEditor.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.protocolEditor.Caption = "Editor";
+      this.protocolEditor.Filename = null;
+      this.protocolEditor.Location = new System.Drawing.Point(6, 38);
+      this.protocolEditor.Name = "protocolEditor";
+      this.protocolEditor.Protocol = null;
+      this.protocolEditor.Size = new System.Drawing.Size(483, 321);
+      this.protocolEditor.TabIndex = 1;
+      // 
+      // loadProtocolButton
+      // 
+      this.loadProtocolButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.loadProtocolButton.Location = new System.Drawing.Point(6, 6);
+      this.loadProtocolButton.Name = "loadProtocolButton";
+      this.loadProtocolButton.Size = new System.Drawing.Size(483, 23);
+      this.loadProtocolButton.TabIndex = 0;
+      this.loadProtocolButton.Text = "Load Protocol";
+      this.loadProtocolButton.UseVisualStyleBackColor = true;
+      this.loadProtocolButton.Click += new System.EventHandler(this.loadProtocolButton_Click);
+      // 
+      // dictionaryTabPage
+      // 
+      this.dictionaryTabPage.Location = new System.Drawing.Point(4, 22);
+      this.dictionaryTabPage.Name = "dictionaryTabPage";
+      this.dictionaryTabPage.Size = new System.Drawing.Size(495, 365);
+      this.dictionaryTabPage.TabIndex = 2;
+      this.dictionaryTabPage.Text = "Dictionary";
+      this.dictionaryTabPage.UseVisualStyleBackColor = true;
+      // 
+      // ProtocolInjectorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "ProtocolInjectorView";
+      this.Size = new System.Drawing.Size(503, 391);
+      this.tabControl.ResumeLayout(false);
+      this.variableInfoTabPage.ResumeLayout(false);
+      this.protocolTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button loadProtocolButton;
+    private HeuristicLab.Core.OperatorBaseVariableInfosView operatorBaseVariableInfosView;
+    private System.Windows.Forms.OpenFileDialog protocolOpenFileDialog;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage variableInfoTabPage;
+    private System.Windows.Forms.TabPage protocolTabPage;
+    private HeuristicLab.Communication.Data.ProtocolEditor protocolEditor;
+    private System.Windows.Forms.TabPage dictionaryTabPage;
+    private HeuristicLab.Data.ItemDictionaryView<HeuristicLab.Data.StringData, HeuristicLab.Data.StringData> itemDictionaryView;
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjectorView.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjectorView.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjectorView.cs	(revision 584)
@@ -0,0 +1,87 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public partial class ProtocolInjectorView : ViewBase {
+    public ProtocolInjector ProtocolInjector {
+      get { return (ProtocolInjector)Item; }
+      set {
+        Item = value;
+      }
+    }
+
+    public ProtocolInjectorView() {
+      InitializeComponent(); // killed self included code regarding ItemDictionaryView
+      dictionaryTabPage.SuspendLayout();
+      SuspendLayout();
+      itemDictionaryView = new ItemDictionaryView<StringData, StringData>();
+      itemDictionaryView.Location = new Point(6, 6);
+      itemDictionaryView.Dock = DockStyle.Fill;
+      itemDictionaryView.Name = "itemDictionaryView";
+      dictionaryTabPage.Controls.Add(itemDictionaryView);
+      dictionaryTabPage.ResumeLayout(false);
+      ResumeLayout(false);
+    }
+
+    public ProtocolInjectorView(ProtocolInjector protocolInjector)
+      : this() {
+      ProtocolInjector = protocolInjector;
+    }
+
+    protected override void RemoveItemEvents() {
+      operatorBaseVariableInfosView.Operator = null;
+      base.RemoveItemEvents();
+    }
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      operatorBaseVariableInfosView.Operator = ProtocolInjector;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ProtocolInjector == null) {
+        loadProtocolButton.Enabled = false;
+        protocolEditor.Enabled = false;
+        protocolEditor.Protocol = null;
+        itemDictionaryView.Enabled = false;
+        itemDictionaryView.ItemDictionary = null;
+      } else {
+        loadProtocolButton.Enabled = true;
+        protocolEditor.Protocol = (Protocol)ProtocolInjector.GetVariable("Protocol").Value;
+        protocolEditor.Enabled = true;
+        IVariable dict = ProtocolInjector.GetVariable("Dictionary");
+        if (dict == null) { // BACKWARDS COMPATIBLE CODE for versions prior to 3.0.0.40
+          dict = new Variable("Dictionary", new ItemDictionary<StringData, StringData>());
+          ProtocolInjector.AddVariable(dict);
+          ProtocolInjector.AddVariableInfo(new VariableInfo("Dictionary", "The received value translation dictionary", typeof(Dictionary<StringData, StringData>), VariableKind.New));
+        }
+        itemDictionaryView.ItemDictionary = (ItemDictionary<StringData, StringData>)dict.Value;
+        itemDictionaryView.Enabled = true;
+      }
+    }
+
+    private void loadProtocolButton_Click(object sender, EventArgs e) {
+      if (protocolOpenFileDialog.ShowDialog() == DialogResult.OK) {
+        Protocol protocol = null;
+        try {
+          protocol = (Protocol)PersistenceManager.Load(protocolOpenFileDialog.FileName);
+        } catch (InvalidCastException) {
+          throw new InvalidOperationException("Document is not a protocol");
+        } catch (Exception ex) {
+          throw new InvalidOperationException("An exception has occured:\n"+ex.Message.ToString());
+        }
+        ProtocolInjector.GetVariable("Protocol").Value = protocol;
+        UpdateControls();
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjectorView.resx
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjectorView.resx	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/ProtocolInjectorView.resx	(revision 584)
@@ -0,0 +1,123 @@
+<?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="protocolOpenFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.Communication.Operators/SimpleReceiveItemDeserializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/SimpleReceiveItemDeserializer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/SimpleReceiveItemDeserializer.cs	(revision 584)
@@ -0,0 +1,87 @@
+﻿using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class SimpleReceiveItemDeserializer : OperatorBase {
+    public override string Description {
+      get {
+        return @"Deserializes data that was serialized by the SimpleSendItemSerializer";      }
+    }
+
+    public SimpleReceiveItemDeserializer() {
+      AddVariableInfo(new VariableInfo("CurrentState", "The current state defines the items which are to be sent and thus need to be serialized", typeof(ProtocolState), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SerializedItem", "The string serialization of the item", typeof(StringData), VariableKind.Deleted));
+      AddVariableInfo(new VariableInfo("Dictionary", "The dictionary that translates received variable names", typeof(ItemDictionary<StringData, StringData>), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+      ItemDictionary<StringData, StringData> dict = GetVariableValue<ItemDictionary<StringData, StringData>>("Dictionary", scope, true, false);
+      ConstrainedItemList receivingData = currentState.ReceivingData;
+
+      if (receivingData.Count > 0) {
+        string received = GetVariableValue<StringData>("SerializedItem", scope, false).Data;
+        StringReader reader = new StringReader(received);
+
+        do {
+          
+          string line = reader.ReadLine();
+          if (line == null) break;
+          string name = line;
+          line = reader.ReadLine();
+          string type = line;
+          line = reader.ReadLine();
+          string value = line;
+
+          int index = 0;
+          while (index < receivingData.Count && !name.Equals(((Variable)receivingData[index]).Name))
+            index++;
+
+          if (index != receivingData.Count) {
+            Type itemType = ((Variable)receivingData[index]).Value.GetType();
+            Variable item = (Variable)receivingData[index].Clone();
+
+            if (itemType.Equals(typeof(IntData)))
+              ((IntData)item.Value).Data = int.Parse(value);
+            else if (itemType.Equals(typeof(DoubleData)))
+              ((DoubleData)item.Value).Data = double.Parse(value);
+            else if (itemType.Equals(typeof(ConstrainedIntData)))
+              ((ConstrainedIntData)item.Value).Data = int.Parse(value);
+            else if (itemType.Equals(typeof(ConstrainedDoubleData)))
+              ((ConstrainedDoubleData)item.Value).Data = double.Parse(value);
+            else throw new NotImplementedException();
+
+            // if a dictionary exists try to lookup a translation
+            if (dict != null) {
+              StringData tmp;
+              if (dict.TryGetValue(new StringData(item.Name), out tmp))
+                item.Name = tmp.Data;
+            }
+
+            // add/overwrite the read variable to scope
+            IVariable scopeVar = scope.GetVariable(item.Name);
+            if (scopeVar == null)
+              scope.AddVariable(item);
+            else
+              scopeVar.Value = item.Value;
+          }
+        } while (true);
+        reader.Close();
+
+        IVariableInfo info = GetVariableInfo("SerializedItem");
+        if (info.Local) {
+          RemoveVariable(info.ActualName);
+        } else {
+          scope.RemoveVariable(scope.TranslateName(info.FormalName));
+        }
+      }
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/SimpleSendItemSerializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/SimpleSendItemSerializer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/SimpleSendItemSerializer.cs	(revision 584)
@@ -0,0 +1,47 @@
+﻿using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class SimpleSendItemSerializer : OperatorBase {
+    public override string Description {
+      get {
+        return @"Serializes the data defined under ""Send"" in the current state of the protocol. It uses a simple scheme that prints in each line: the name of the variable, the type of the containing value and the value itself.";
+      }
+    }
+
+    public SimpleSendItemSerializer() {
+      AddVariableInfo(new VariableInfo("CurrentState", "The current state defines the items which are to be sent and thus need to be serialized", typeof(ProtocolState), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SerializedItem", "The string serialization of the item", typeof(StringData), VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+      ConstrainedItemList sendingData = currentState.SendingData;
+
+      if (sendingData.Count > 0) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < sendingData.Count; i++) {
+          sb.AppendLine(((Variable)sendingData[i]).Name);
+          IVariable tmp = scope.GetVariable(((Variable)sendingData[i]).Name);
+          if (tmp == null) throw new InvalidOperationException("ERROR in SimpleSendItemSerializer: variable " + ((Variable)sendingData[i]).Name + " not found!");
+          sb.AppendLine(tmp.Value.GetType().ToString());
+          sb.AppendLine(tmp.Value.ToString());
+        }
+
+        IVariableInfo info = GetVariableInfo("SerializedItem");
+        if (info.Local) {
+          AddVariable(new Variable(info.ActualName, new StringData(sb.ToString())));
+        } else {
+          scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), new StringData(sb.ToString())));
+        }
+      }
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/StateTransistor.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/StateTransistor.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/StateTransistor.cs	(revision 584)
@@ -0,0 +1,95 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Operators.Programmable;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class StateTransistor : OperatorBase {
+    public override string Description {
+      get { return @"Evaluates the state transition conditions one by one and advances to the state specified as target state in the first condition that results true.
+If the choice on the transition was made and there are suboperators attached, it will call its first suboperator upon successful transition, otherwise the second suboperator is the next to be executed."; }
+    }
+
+    public StateTransistor()
+      : base() {
+      AddVariableInfo(new VariableInfo("CurrentState", "", typeof(ProtocolState), VariableKind.In | VariableKind.Out | VariableKind.New));
+      AddVariableInfo(new VariableInfo("ConditionIndex", "", typeof(IntData), VariableKind.New | VariableKind.In | VariableKind.Out | VariableKind.Deleted));
+      AddVariableInfo(new VariableInfo("Result", "", typeof(BoolData), VariableKind.New | VariableKind.In | VariableKind.Out | VariableKind.Deleted));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+      // Terminate as soon as an accepting state is reached
+      if (currentState.AcceptingState.Data) return null;
+
+      ItemList<StateTransition> transitionCondition = currentState.StateTransitions;
+      if ((transitionCondition == null || transitionCondition.Count < 1) && !currentState.AcceptingState.Data)
+        throw new InvalidOperationException("ERROR: A dead-end state (" + currentState.Name.Data + ") has been reached that is not an accepting state");
+
+      IVariableInfo conditionIndexInfo = GetVariableInfo("ConditionIndex");
+      IntData conditionIndex = GetVariableValue<IntData>("ConditionIndex", scope, false, false);
+      if (conditionIndex == null) {
+        Variable conditionIndexVar = null;
+        if (conditionIndexInfo.Local) {
+          conditionIndexVar = new Variable(conditionIndexInfo.ActualName, new IntData(0));
+          AddVariable(conditionIndexVar);
+        } else {
+          conditionIndexVar = new Variable(scope.TranslateName(conditionIndexInfo.FormalName), new IntData(0));
+          scope.AddVariable(conditionIndexVar);
+        }
+        conditionIndex = (IntData)conditionIndexVar.Value;
+      }
+
+      BoolData result = GetVariableValue<BoolData>("Result", scope, false, false);
+      if (result != null) {
+        bool done = false;
+        if (result.Data) {
+          IVariable csVar = scope.GetVariable(scope.TranslateName("CurrentState"));
+          if (csVar == null) scope.AddVariable(new Variable(scope.TranslateName("CurrentState"), ((StateTransition)transitionCondition[conditionIndex.Data - 1]).TargetState));
+          else csVar.Value = ((StateTransition)transitionCondition[conditionIndex.Data - 1]).TargetState;
+          done = true;
+        }
+        if (done || conditionIndex.Data == transitionCondition.Count) {
+          //conditionIndex.Data = 0;
+          IVariableInfo resultInfo = GetVariableInfo("Result");
+          if (resultInfo.Local) RemoveVariable(resultInfo.ActualName);
+          else scope.RemoveVariable(scope.TranslateName(resultInfo.FormalName));
+          if (conditionIndexInfo.Local) RemoveVariable(conditionIndexInfo.ActualName);
+          else scope.RemoveVariable(scope.TranslateName(conditionIndexInfo.FormalName));
+        }
+        if (!done && conditionIndex.Data == transitionCondition.Count) {
+          if (SubOperators.Count > 1) return new AtomicOperation(SubOperators[1], scope);
+          else return null;
+        } else {
+          if (SubOperators.Count > 0) return new AtomicOperation(SubOperators[0], scope);
+          else return null;
+        }
+      }
+      SequentialProcessor sp = new SequentialProcessor();
+      ProgrammableOperator tmp = (ProgrammableOperator)((StateTransition)transitionCondition[conditionIndex.Data]).TransitionCondition;
+      tmp.GetVariableInfo("Result").ActualName = GetVariableInfo("Result").ActualName;
+      sp.AddSubOperator(tmp);
+
+      StateTransistor nextTransistor = new StateTransistor();
+      nextTransistor.GetVariableInfo("CurrentState").ActualName = GetVariableInfo("CurrentState").ActualName;
+      nextTransistor.GetVariableInfo("Result").ActualName = GetVariableInfo("Result").ActualName;
+      if (conditionIndexInfo.Local) {
+        nextTransistor.AddVariable(new Variable(conditionIndexInfo.ActualName, conditionIndex));
+        nextTransistor.GetVariableInfo("ConditionIndex").Local = true;
+      }
+      nextTransistor.GetVariableInfo("ConditionIndex").ActualName = conditionIndexInfo.ActualName;
+      conditionIndex.Data++;
+
+      for (int i = 0 ; i < SubOperators.Count ; i++) {
+        nextTransistor.AddSubOperator(SubOperators[i]);
+      }
+
+      sp.AddSubOperator(nextTransistor);
+      return new AtomicOperation(sp, scope);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/SubscopeCurrentStateLooseDataCollector.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/SubscopeCurrentStateLooseDataCollector.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/SubscopeCurrentStateLooseDataCollector.cs	(revision 584)
@@ -0,0 +1,50 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class SubscopeCurrentStateLooseDataCollector : OperatorBase {
+    public override string Description {
+      get {
+        return @"Browses through all subscopes and collects the data defined under ""Send"" in the current state of the protocol";
+      }
+    }
+
+    public SubscopeCurrentStateLooseDataCollector() {
+      AddVariableInfo(new VariableInfo("CurrentState", "The current state in the execution of the protocol", typeof(ProtocolState), VariableKind.In));
+      AddVariableInfo(new VariableInfo("CombinedData", "The combinedData to be sent", typeof(StringData), VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+
+      if (currentState.SendingData.Count > 0) {
+        XmlDocument document = new XmlDocument();
+        XmlNode root = document.CreateNode(XmlNodeType.Element, "COMBINED_DATA", null);
+        document.AppendChild(root);
+        foreach (IScope subScope in scope.SubScopes) {
+          ConstrainedItemList sendingData = (ConstrainedItemList)currentState.SendingData.Clone();
+          for (int i = 0; i < sendingData.Count; i++) {
+            Variable tmp = (Variable)sendingData[i];
+            tmp.Value = subScope.GetVariableValue(tmp.Name, true);
+          }
+
+          XmlNode node = sendingData.GetXmlNode("DATA", document, new Dictionary<Guid, IStorable>());
+          root.AppendChild(node);
+        }
+
+        IVariableInfo info = GetVariableInfo("CombinedData");
+        if (info.Local) {
+          AddVariable(new Variable(info.ActualName, new StringData(document.OuterXml)));
+        } else {
+          scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), new StringData(document.OuterXml)));
+        }
+      }
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/SubscopeCurrentStateLooseDataDistributor.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/SubscopeCurrentStateLooseDataDistributor.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/SubscopeCurrentStateLooseDataDistributor.cs	(revision 584)
@@ -0,0 +1,70 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class SubscopeCurrentStateLooseDataDistributor : OperatorBase {
+    public override string Description {
+      get {
+        return base.Description;
+      }
+    }
+
+    public SubscopeCurrentStateLooseDataDistributor() {
+      AddVariableInfo(new VariableInfo("CurrentState", "The current state in the execution of the protocol", typeof(ProtocolState), VariableKind.In));
+      AddVariableInfo(new VariableInfo("ReceivedData", "The data that has been received", typeof(StringData), VariableKind.Deleted));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+      StringData data = GetVariableValue<StringData>("ReceivedData", scope, false, false);
+
+      if (data != null && currentState.ReceivingData.Count > 0) {
+        XmlDocument document = new XmlDocument();
+        document.LoadXml(data.Data);
+        XmlNode root = document.SelectSingleNode("COMBINED_DATA");
+        ConstrainedItemList definedResponse = currentState.ReceivingData;
+
+        foreach (IScope subScope in scope.SubScopes) {
+          ConstrainedItemList receivedResponse = new ConstrainedItemList();
+          XmlNode node = root.SelectSingleNode("DATA");
+          receivedResponse.Populate(node, new Dictionary<Guid, IStorable>());
+
+          int receivedResponseCount = receivedResponse.Count;
+
+          for (int i = 0; i < definedResponse.Count; i++) {
+            Variable nextDefinedVariable = (Variable)definedResponse[i];
+            int location = -1;
+            for (int j = i; j < receivedResponseCount + i; j++) {
+              Variable nextReceivedVariable = (Variable)receivedResponse[j % receivedResponseCount];
+              if (nextDefinedVariable.Name.Equals(nextReceivedVariable.Name)) {
+                location = j % receivedResponseCount;
+                break;
+              }
+            }
+            if (location < 0) throw new InvalidOperationException("did not receive variable " + nextDefinedVariable.Name); // FIXME: needs more sophisticated error handling
+            IItem value = subScope.GetVariableValue(nextDefinedVariable.Name, false, false);
+            if (value == null)
+              subScope.AddVariable((Variable)receivedResponse[location]);
+            else
+              subScope.GetVariable(nextDefinedVariable.Name).Value = ((Variable)receivedResponse[location]).Value;
+          }
+          root.RemoveChild(node);
+        }
+      }
+      if (data != null) {
+        IVariableInfo info = GetVariableInfo("ReceivedData");
+        if (info.Local) {
+          RemoveVariable(info.ActualName);
+        } else {
+          scope.RemoveVariable(scope.TranslateName(info.FormalName));
+        }
+      }
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/TcpNetworkInitiator.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/TcpNetworkInitiator.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/TcpNetworkInitiator.cs	(revision 584)
@@ -0,0 +1,37 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class TcpNetworkInitiator : OperatorBase {
+
+    public override string Description {
+      get { return @"Initiates a TCP socket, it opens one socket for sending and one socket for listening as specified in the configuration"; }
+    }
+
+    public TcpNetworkInitiator() {
+      AddVariableInfo(new VariableInfo("DriverConfiguration", "A configuration object", typeof(TcpNetworkDriverConfiguration), VariableKind.In));
+      AddVariableInfo(new VariableInfo("NetworkConnection", "A connection object", typeof(SocketData), VariableKind.New));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      TcpNetworkDriverConfiguration config = GetVariableValue<TcpNetworkDriverConfiguration>("DriverConfiguration", scope, true);
+      SocketData socket = new SocketData();
+      socket.Initialize(config);
+      while (!socket.Connect()) ;
+
+      IVariableInfo info = GetVariableInfo("NetworkConnection");
+      if (info.Local)
+        AddVariable(new Variable(info.ActualName, socket));
+      else
+        scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), socket));
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/XMLConstrainedItemListDeserializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/XMLConstrainedItemListDeserializer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/XMLConstrainedItemListDeserializer.cs	(revision 584)
@@ -0,0 +1,59 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class XMLConstrainedItemListDeserializer : OperatorBase {
+    public override string Description {
+      get {
+        return @"TODO";
+      }
+    }
+
+    public XMLConstrainedItemListDeserializer() {
+      AddVariableInfo(new VariableInfo("CurrentState", "The current state of the protocol", typeof(ProtocolState), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SerializedItem", "The string serialization that is to be deserialized", typeof(StringData), VariableKind.In | VariableKind.Deleted));
+      AddVariableInfo(new VariableInfo("Dictionary", "The dictionary that translates received variable names", typeof(ItemDictionary<StringData, StringData>), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+      ItemDictionary<StringData, StringData> dict = GetVariableValue<ItemDictionary<StringData, StringData>>("Dictionary", scope, true, false);
+      StringData serializationStringData = GetVariableValue<StringData>("SerializedItem", scope, false, false);
+
+      if (serializationStringData != null) {
+        string serialization = serializationStringData.Data;
+
+        XmlDocument document = new XmlDocument();
+        document.LoadXml(serialization);
+        ConstrainedItemList target = new ConstrainedItemList();
+        target.Populate(document.SelectSingleNode("DATA"), new Dictionary<Guid, IStorable>());
+
+        for (int i = 0; i < target.Count; i++) {
+          if (dict != null) { // if a dictionary exists try to lookup a translation
+            StringData tmp;
+            if (dict.TryGetValue(new StringData(((Variable)target[i]).Name), out tmp))
+              ((Variable)target[i]).Name = tmp.Data;
+          }
+          IVariable scopeVar = scope.GetVariable(((Variable)target[i]).Name);
+          if (scopeVar == null)
+            scope.AddVariable((Variable)target[i]);
+          else
+            scopeVar.Value = ((Variable)target[i]).Value;
+        }
+
+        IVariableInfo info = GetVariableInfo("SerializedItem");
+        if (info.Local) {
+          RemoveVariable(info.ActualName);
+        } else {
+          scope.RemoveVariable(scope.TranslateName(info.FormalName));
+        }
+      }
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Communication.Operators/XMLConstrainedItemListSerializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Communication.Operators/XMLConstrainedItemListSerializer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.Communication.Operators/XMLConstrainedItemListSerializer.cs	(revision 584)
@@ -0,0 +1,50 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Communication.Data;
+
+namespace HeuristicLab.Communication.Operators {
+  public class XMLConstrainedItemListSerializer : OperatorBase {
+    public override string Description {
+      get {
+        return @"TODO";
+      }
+    }
+
+    public XMLConstrainedItemListSerializer() {
+      AddVariableInfo(new VariableInfo("CurrentState", "The current state defines the items which are to be sent and thus need to be serialized", typeof(ProtocolState), VariableKind.In));
+      AddVariableInfo(new VariableInfo("SerializedItem", "The string serialization of the items in the current state", typeof(StringData), VariableKind.New | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ProtocolState currentState = GetVariableValue<ProtocolState>("CurrentState", scope, true);
+
+      ConstrainedItemList sendingData = (ConstrainedItemList)currentState.SendingData.Clone();
+      if (sendingData.Count > 0) {
+        for (int i = 0; i < sendingData.Count; i++) {
+          Variable tmp = (Variable)sendingData[i];
+          tmp.Value = scope.GetVariableValue(tmp.Name, false);
+        }
+        XmlDocument document = new XmlDocument();
+        string serialized = sendingData.GetXmlNode("DATA", document, new Dictionary<Guid, IStorable>()).OuterXml;
+
+        IVariableInfo info = GetVariableInfo("SerializedItem");
+        if (info.Local) {
+          AddVariable(new Variable(info.ActualName, new StringData(serialized)));
+        } else {
+          IVariable scopeVar = scope.GetVariable(scope.TranslateName(info.FormalName));
+          if (scopeVar == null) {
+            scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), new StringData(serialized)));
+          } else {
+            scopeVar.Value = new StringData(serialized);
+          }
+        }
+      }
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/DefaultInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/DefaultInitializer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/DefaultInitializer.cs	(revision 584)
@@ -0,0 +1,21 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class DefaultInitializer : SimOptInitializationOperatorBase {
+    public override string Description {
+      get { return @"Does not perform initialization of the variable, but leaves it as it is"; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      return null;
+    }
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/DefaultManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/DefaultManipulator.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/DefaultManipulator.cs	(revision 584)
@@ -0,0 +1,21 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class DefaultManipulator : SimOptManipulationOperatorBase {
+    public override string Description {
+      get { return @"Does not perform any manipulation, instead leaves the data as it is"; }
+    }
+
+    public override IOperation Apply(IScope scope) {
+      return null;
+    }
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraint.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraint.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraint.cs	(revision 584)
@@ -0,0 +1,181 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Globalization;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Constraints;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class DoubleParameterBoundConstraint : ConstraintBase {
+    private double lowerBound;
+    public double LowerBound {
+      get { return lowerBound; }
+      set {
+        lowerBound = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundIncluded;
+    public bool LowerBoundIncluded {
+      get { return lowerBoundIncluded; }
+      set {
+        lowerBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool lowerBoundEnabled;
+    public bool LowerBoundEnabled {
+      get { return lowerBoundEnabled; }
+      set {
+        lowerBoundEnabled = value;
+        OnChanged();
+      }
+    }
+    private double upperBound;
+    public double UpperBound {
+      get { return upperBound; }
+      set {
+        upperBound = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundIncluded;
+    public bool UpperBoundIncluded {
+      get { return upperBoundIncluded; }
+      set {
+        upperBoundIncluded = value;
+        OnChanged();
+      }
+    }
+    private bool upperBoundEnabled;
+    public bool UpperBoundEnabled {
+      get { return upperBoundEnabled; }
+      set {
+        upperBoundEnabled = value;
+        OnChanged();
+      }
+    }
+    private string parameterName;
+    public string ParameterName {
+      get { return parameterName; }
+      set {
+        parameterName = value;
+        OnChanged();
+      }
+    }
+
+    public override string Description {
+      get { return "The double is limited one or two sided by a lower and/or upper boundary"; }
+    }
+
+    public DoubleParameterBoundConstraint()
+      : this(double.MinValue, double.MaxValue, "undefined") {
+    }
+
+    public DoubleParameterBoundConstraint(double lowerBound, double upperBound, string parameterName)
+      : this(lowerBound, true, upperBound, true, parameterName) {
+    }
+
+    public DoubleParameterBoundConstraint(double lowerBound, bool lowerBoundIncluded, double upperBound, bool upperBoundIncluded, string parameterName)
+      : base() {
+      this.lowerBound = lowerBound;
+      this.lowerBoundIncluded = lowerBoundIncluded;
+      this.lowerBoundEnabled = true;
+      this.upperBound = upperBound;
+      this.upperBoundIncluded = upperBoundIncluded;
+      this.upperBoundEnabled = true;
+      this.parameterName = parameterName;
+    }
+
+
+    public override bool Check(IItem data) {
+      ConstrainedItemList list = (data as ConstrainedItemList);
+      if (list == null) return false;
+      for (int i = 0; i < list.Count; i++) {
+        if (list[i] is IVariable && ((IVariable)list[i]).Name.Equals(parameterName) && ((IVariable)list[i]).Value is DoubleData) {
+          if (LowerBoundEnabled && ((LowerBoundIncluded && ((IComparable)((IVariable)list[i]).Value).CompareTo(LowerBound) < 0)
+            || (!LowerBoundIncluded && ((IComparable)((IVariable)list[i]).Value).CompareTo(LowerBound) <= 0))) return false;
+          if (UpperBoundEnabled && ((UpperBoundIncluded && ((IComparable)((IVariable)list[i]).Value).CompareTo(UpperBound) > 0)
+            || (!UpperBoundIncluded && ((IComparable)((IVariable)list[i]).Value).CompareTo(UpperBound) >= 0))) return false;
+        }
+      }
+      return true;
+    }
+
+    public override IView CreateView() {
+      return new DoubleParameterBoundConstraintView(this);
+    }
+
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      DoubleParameterBoundConstraint clone = new DoubleParameterBoundConstraint();
+      clonedObjects.Add(Guid, clone);
+      clone.parameterName = (string)parameterName.Clone();
+      clone.upperBound = UpperBound;
+      clone.upperBoundIncluded = UpperBoundIncluded;
+      clone.upperBoundEnabled = UpperBoundEnabled;
+      clone.lowerBound = LowerBound;
+      clone.lowerBoundIncluded = LowerBoundIncluded;
+      clone.lowerBoundEnabled = LowerBoundEnabled;
+      return clone;
+    }
+
+    #region persistence
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute pm = document.CreateAttribute("ParameterName");
+      pm.Value = parameterName;
+      XmlAttribute lb = document.CreateAttribute("LowerBound");
+      lb.Value = LowerBound.ToString("r", CultureInfo.InvariantCulture);
+      XmlAttribute lbi = document.CreateAttribute("LowerBoundIncluded");
+      lbi.Value = lowerBoundIncluded.ToString();
+      XmlAttribute lbe = document.CreateAttribute("LowerBoundEnabled");
+      lbe.Value = lowerBoundEnabled.ToString();
+      XmlAttribute ub = document.CreateAttribute("UpperBound");
+      ub.Value = upperBound.ToString("r", CultureInfo.InvariantCulture);
+      XmlAttribute ubi = document.CreateAttribute("UpperBoundIncluded");
+      ubi.Value = upperBoundIncluded.ToString();
+      XmlAttribute ube = document.CreateAttribute("UpperBoundEnabled");
+      ube.Value = upperBoundEnabled.ToString();
+      node.Attributes.Append(pm);
+      node.Attributes.Append(lb);
+      if (!lowerBoundIncluded) node.Attributes.Append(lbi);
+      if (!lowerBoundEnabled) node.Attributes.Append(lbe);
+      node.Attributes.Append(ub);
+      if (!upperBoundIncluded) node.Attributes.Append(ubi);
+      if (!upperBoundEnabled) node.Attributes.Append(ube);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      parameterName = node.Attributes["ParameterName"].Value;
+      lowerBound = double.Parse(node.Attributes["LowerBound"].Value, CultureInfo.InvariantCulture);
+      if (node.Attributes["LowerBoundIncluded"] != null) {
+        lowerBoundIncluded = bool.Parse(node.Attributes["LowerBoundIncluded"].Value);
+      } else {
+        lowerBoundIncluded = true;
+      }
+      if (node.Attributes["LowerBoundEnabled"] != null) {
+        lowerBoundEnabled = bool.Parse(node.Attributes["LowerBoundEnabled"].Value);
+      } else {
+        lowerBoundEnabled = true;
+      }
+
+      upperBound = double.Parse(node.Attributes["UpperBound"].Value, CultureInfo.InvariantCulture);
+      if (node.Attributes["UpperBoundIncluded"] != null) {
+        upperBoundIncluded = bool.Parse(node.Attributes["UpperBoundIncluded"].Value);
+      } else {
+        upperBoundIncluded = true;
+      }
+      if (node.Attributes["UpperBoundEnabled"] != null) {
+        upperBoundEnabled = bool.Parse(node.Attributes["UpperBoundEnabled"].Value);
+      } else {
+        upperBoundEnabled = true;
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraintView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraintView.Designer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraintView.Designer.cs	(revision 584)
@@ -0,0 +1,149 @@
+﻿namespace HeuristicLab.SimOpt {
+  partial class DoubleParameterBoundConstraintView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.ubTextBox = new System.Windows.Forms.TextBox();
+      this.lbTextBox = new System.Windows.Forms.TextBox();
+      this.ubIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbIncludedCheckBox = new System.Windows.Forms.CheckBox();
+      this.ubEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.lbEnabledCheckBox = new System.Windows.Forms.CheckBox();
+      this.pmTextBox = new System.Windows.Forms.TextBox();
+      this.pmLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // ubTextBox
+      // 
+      this.ubTextBox.Location = new System.Drawing.Point(47, 107);
+      this.ubTextBox.Name = "ubTextBox";
+      this.ubTextBox.Size = new System.Drawing.Size(83, 20);
+      this.ubTextBox.TabIndex = 31;
+      this.ubTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.ubTextBox.Validated += new System.EventHandler(this.ubTextBox_Validated);
+      this.ubTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.ubTextBox_Validating);
+      // 
+      // lbTextBox
+      // 
+      this.lbTextBox.Location = new System.Drawing.Point(47, 58);
+      this.lbTextBox.Name = "lbTextBox";
+      this.lbTextBox.Size = new System.Drawing.Size(83, 20);
+      this.lbTextBox.TabIndex = 30;
+      this.lbTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+      this.lbTextBox.Validated += new System.EventHandler(this.lbTextBox_Validated);
+      this.lbTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.lbTextBox_Validating);
+      // 
+      // ubIncludedCheckBox
+      // 
+      this.ubIncludedCheckBox.AutoSize = true;
+      this.ubIncludedCheckBox.Location = new System.Drawing.Point(136, 109);
+      this.ubIncludedCheckBox.Name = "ubIncludedCheckBox";
+      this.ubIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.ubIncludedCheckBox.TabIndex = 29;
+      this.ubIncludedCheckBox.Text = "Included?";
+      this.ubIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.ubIncludedCheckBox.CheckedChanged += new System.EventHandler(this.ubIncludedCheckBox_CheckedChanged);
+      // 
+      // lbIncludedCheckBox
+      // 
+      this.lbIncludedCheckBox.AutoSize = true;
+      this.lbIncludedCheckBox.Location = new System.Drawing.Point(136, 61);
+      this.lbIncludedCheckBox.Name = "lbIncludedCheckBox";
+      this.lbIncludedCheckBox.Size = new System.Drawing.Size(73, 17);
+      this.lbIncludedCheckBox.TabIndex = 28;
+      this.lbIncludedCheckBox.Text = "Included?";
+      this.lbIncludedCheckBox.UseVisualStyleBackColor = true;
+      this.lbIncludedCheckBox.CheckedChanged += new System.EventHandler(this.lbIncludedCheckBox_CheckedChanged);
+      // 
+      // ubEnabledCheckBox
+      // 
+      this.ubEnabledCheckBox.AutoSize = true;
+      this.ubEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.ubEnabledCheckBox.Location = new System.Drawing.Point(3, 84);
+      this.ubEnabledCheckBox.Name = "ubEnabledCheckBox";
+      this.ubEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.ubEnabledCheckBox.TabIndex = 27;
+      this.ubEnabledCheckBox.Text = "Upper bound:";
+      this.ubEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.ubEnabledCheckBox.CheckedChanged += new System.EventHandler(this.ubEnabledCheckBox_CheckedChanged);
+      // 
+      // lbEnabledCheckBox
+      // 
+      this.lbEnabledCheckBox.AutoSize = true;
+      this.lbEnabledCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.lbEnabledCheckBox.Location = new System.Drawing.Point(3, 35);
+      this.lbEnabledCheckBox.Name = "lbEnabledCheckBox";
+      this.lbEnabledCheckBox.Size = new System.Drawing.Size(91, 17);
+      this.lbEnabledCheckBox.TabIndex = 26;
+      this.lbEnabledCheckBox.Text = "Lower bound:";
+      this.lbEnabledCheckBox.UseVisualStyleBackColor = true;
+      this.lbEnabledCheckBox.CheckedChanged += new System.EventHandler(this.lbEnabledCheckBox_CheckedChanged);
+      // 
+      // pmTextBox
+      // 
+      this.pmTextBox.Location = new System.Drawing.Point(47, 7);
+      this.pmTextBox.Name = "pmTextBox";
+      this.pmTextBox.Size = new System.Drawing.Size(156, 20);
+      this.pmTextBox.TabIndex = 32;
+      this.pmTextBox.TextChanged += new System.EventHandler(this.pmTextBox_TextChanged);
+      // 
+      // pmLabel
+      // 
+      this.pmLabel.AutoSize = true;
+      this.pmLabel.Location = new System.Drawing.Point(3, 10);
+      this.pmLabel.Name = "pmLabel";
+      this.pmLabel.Size = new System.Drawing.Size(38, 13);
+      this.pmLabel.TabIndex = 33;
+      this.pmLabel.Text = "Name:";
+      // 
+      // DoubleParameterBoundConstraintView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.pmLabel);
+      this.Controls.Add(this.pmTextBox);
+      this.Controls.Add(this.ubTextBox);
+      this.Controls.Add(this.lbTextBox);
+      this.Controls.Add(this.ubIncludedCheckBox);
+      this.Controls.Add(this.lbIncludedCheckBox);
+      this.Controls.Add(this.ubEnabledCheckBox);
+      this.Controls.Add(this.lbEnabledCheckBox);
+      this.Name = "DoubleParameterBoundConstraintView";
+      this.Size = new System.Drawing.Size(206, 131);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox ubTextBox;
+    private System.Windows.Forms.TextBox lbTextBox;
+    private System.Windows.Forms.CheckBox ubIncludedCheckBox;
+    private System.Windows.Forms.CheckBox lbIncludedCheckBox;
+    private System.Windows.Forms.CheckBox ubEnabledCheckBox;
+    private System.Windows.Forms.CheckBox lbEnabledCheckBox;
+    private System.Windows.Forms.TextBox pmTextBox;
+    private System.Windows.Forms.Label pmLabel;
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraintView.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraintView.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraintView.cs	(revision 584)
@@ -0,0 +1,119 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public partial class DoubleParameterBoundConstraintView : ViewBase {
+    public DoubleParameterBoundConstraint DoubleParameterBoundConstraint {
+      get { return (DoubleParameterBoundConstraint)Item; }
+      set { base.Item = value; }
+    }
+
+    public DoubleParameterBoundConstraintView() {
+      InitializeComponent();
+    }
+
+    public DoubleParameterBoundConstraintView(DoubleParameterBoundConstraint dpbc)
+      : this() {
+      DoubleParameterBoundConstraint = dpbc;
+    }
+
+    protected override void RemoveItemEvents() {
+      DoubleParameterBoundConstraint.Changed -= new EventHandler(DoubleParameterBoundConstraint_Changed);
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      DoubleParameterBoundConstraint.Changed += new EventHandler(DoubleParameterBoundConstraint_Changed);
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (DoubleParameterBoundConstraint == null) {
+        pmTextBox.Enabled = false;
+        lbTextBox.Enabled = false;
+        lbTextBox.Text = "";
+        lbIncludedCheckBox.Enabled = false;
+        lbEnabledCheckBox.Checked = false;
+
+        ubTextBox.Enabled = false;
+        ubTextBox.Text = "";
+        ubIncludedCheckBox.Checked = false;
+        ubEnabledCheckBox.Enabled = false;
+      } else {
+        pmTextBox.Text = DoubleParameterBoundConstraint.ParameterName;
+        lbTextBox.Text = DoubleParameterBoundConstraint.LowerBound.ToString("r");
+        lbTextBox.Enabled = DoubleParameterBoundConstraint.LowerBoundEnabled;
+        lbIncludedCheckBox.Checked = DoubleParameterBoundConstraint.LowerBoundIncluded;
+        lbIncludedCheckBox.Enabled = true;
+        lbEnabledCheckBox.Checked = DoubleParameterBoundConstraint.LowerBoundEnabled;
+        lbEnabledCheckBox.Enabled = true;
+
+        ubTextBox.Text = DoubleParameterBoundConstraint.UpperBound.ToString("r");
+        ubTextBox.Enabled = DoubleParameterBoundConstraint.UpperBoundEnabled;
+        ubIncludedCheckBox.Checked = DoubleParameterBoundConstraint.UpperBoundIncluded;
+        ubIncludedCheckBox.Enabled = true;
+        ubEnabledCheckBox.Checked = DoubleParameterBoundConstraint.UpperBoundEnabled;
+        ubEnabledCheckBox.Enabled = true;
+      }
+    }
+
+    void DoubleParameterBoundConstraint_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    private void lbEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleParameterBoundConstraint.LowerBoundEnabled = lbEnabledCheckBox.Checked;
+      lbTextBox.Enabled = lbEnabledCheckBox.Checked;
+      lbIncludedCheckBox.Enabled = lbEnabledCheckBox.Checked;
+    }
+
+    private void ubEnabledCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleParameterBoundConstraint.UpperBoundEnabled = ubEnabledCheckBox.Checked;
+      ubTextBox.Enabled = ubEnabledCheckBox.Checked;
+      ubIncludedCheckBox.Enabled = ubEnabledCheckBox.Checked;
+    }
+
+    private void lbIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleParameterBoundConstraint.LowerBoundIncluded = lbIncludedCheckBox.Checked;
+    }
+
+    private void ubIncludedCheckBox_CheckedChanged(object sender, EventArgs e) {
+      DoubleParameterBoundConstraint.UpperBoundIncluded = ubIncludedCheckBox.Checked;
+    }
+
+    private void lbTextBox_Validating(object sender, CancelEventArgs e) {
+      double result;
+      if (!double.TryParse(lbTextBox.Text, out result)) {
+        e.Cancel = true;
+      } 
+    }
+
+    private void ubTextBox_Validating(object sender, CancelEventArgs e) {
+      double result;
+      if (!double.TryParse(ubTextBox.Text, out result)) {
+        e.Cancel = true;
+      } 
+    }
+
+    private void lbTextBox_Validated(object sender, EventArgs e) {
+      DoubleParameterBoundConstraint.LowerBound = double.Parse(lbTextBox.Text);
+    }
+
+    private void ubTextBox_Validated(object sender, EventArgs e) {
+      DoubleParameterBoundConstraint.UpperBound = double.Parse(ubTextBox.Text);
+    }
+
+    private void pmTextBox_TextChanged(object sender, EventArgs e) {
+      DoubleParameterBoundConstraint.ParameterName = pmTextBox.Text;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraintView.resx
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraintView.resx	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/DoubleParameterBoundConstraintView.resx	(revision 584)
@@ -0,0 +1,120 @@
+<?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>
+</root>
Index: trunk/sources/HeuristicLab.SimOpt/HeuristicLab.SimOpt.csproj
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/HeuristicLab.SimOpt.csproj	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/HeuristicLab.SimOpt.csproj	(revision 584)
@@ -0,0 +1,156 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{32DAA44F-944A-465F-A5C9-1C491EE4976D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.SimOpt</RootNamespace>
+    <AssemblyName>HeuristicLab.SimOpt-3.2</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DefaultInitializer.cs" />
+    <Compile Include="DefaultManipulator.cs" />
+    <Compile Include="NormalDoubleManipulator.cs" />
+    <Compile Include="NormalIntManipulator.cs" />
+    <Compile Include="PermutationParameterCyclicCrossover.cs" />
+    <Compile Include="PermutationParameterOrderCrossover.cs" />
+    <Compile Include="PermutationParameterPartiallyMatchedCrossover.cs" />
+    <Compile Include="SimOptCrossoverBase.cs" />
+    <Compile Include="SimOptSequentialSubOperatorProcessor.cs" />
+    <Compile Include="SimOptSquentialSubOperatorCrossover.cs" />
+    <Compile Include="SubScopesRemover.cs" />
+    <Compile Include="Swap2PermutationManipulator.cs" />
+    <Compile Include="RandomDoubleInitializer.cs" />
+    <Compile Include="RandomPermutationInitializer.cs" />
+    <Compile Include="SimOptInitializationOperatorBase.cs" />
+    <Compile Include="SimOptManipulationOperatorBase.cs" />
+    <Compile Include="DoubleParameterBoundConstraint.cs" />
+    <Compile Include="DoubleParameterBoundConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleParameterBoundConstraintView.Designer.cs">
+      <DependentUpon>DoubleParameterBoundConstraintView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabSimOptPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SimOptDiscreteMultiCrossover.cs" />
+    <Compile Include="SimOptParameterExtractor.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SimOptParameterPacker.cs" />
+    <Compile Include="SimOptProblemInjector.cs" />
+    <Compile Include="SimOptProblemInjectorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SimOptProblemInjectorView.Designer.cs">
+      <DependentUpon>SimOptProblemInjectorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="SimOptSinglePointCrossover.cs" />
+    <Compile Include="TranslocationPermutationAdaptiveManipulator.cs" />
+    <Compile Include="TranslocationPermutationManipulator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="UniformIntInitializer.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DoubleParameterBoundConstraintView.resx">
+      <DependentUpon>DoubleParameterBoundConstraintView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SimOptProblemInjectorView.resx">
+      <DependentUpon>SimOptProblemInjectorView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Constraints\HeuristicLab.Constraints.csproj">
+      <Project>{FCD62C6F-4793-4593-AE9A-0BDCA256EE99}</Project>
+      <Name>HeuristicLab.Constraints</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Evolutionary\HeuristicLab.Evolutionary.csproj">
+      <Project>{F5614C53-153C-4A37-A608-121E1C087F07}</Project>
+      <Name>HeuristicLab.Evolutionary</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Operators\HeuristicLab.Operators.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Permutation\HeuristicLab.Permutation.csproj">
+      <Project>{55FDCFB3-3E8C-4FB0-837C-0CF06BEDED39}</Project>
+      <Name>HeuristicLab.Permutation</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Random\HeuristicLab.Random.csproj">
+      <Project>{47019A74-F7F7-482E-83AA-D3F4F777E879}</Project>
+      <Name>HeuristicLab.Random</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>cmd /c ""$(SolutionDir)PreBuildEvent.cmd" "$(ProjectDir).""</PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
Index: trunk/sources/HeuristicLab.SimOpt/HeuristicLabSimOptPlugin.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/HeuristicLabSimOptPlugin.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/HeuristicLabSimOptPlugin.cs	(revision 584)
@@ -0,0 +1,19 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.SimOpt {
+  [ClassInfo(Name = "HeuristicLab.SimOpt-3.2")]
+  [PluginFile(Filename = "HeuristicLab.SimOpt-3.2.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Data-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Operators-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Random-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Constraints-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Evolutionary-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Permutation-3.2")]
+  public class HeuristicLabSimOptPlugin : PluginBase {
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/NormalDoubleManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/NormalDoubleManipulator.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/NormalDoubleManipulator.cs	(revision 584)
@@ -0,0 +1,108 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.SimOpt {
+  public class NormalDoubleManipulator : SimOptManipulationOperatorBase {
+    public override string Description {
+      get { return @"Perturbs a DoubleData or ConstrainedDoubleData by a value normal distributed around 0"; }
+    }
+    /*private NormalDistributedRandom myRandom;
+    public NormalDistributedRandom Random {
+      get { return myRandom; }
+      set { myRandom = value; }
+    }
+
+    private double myShakingFactor;
+    public double ShakingFactor {
+      get { return myShakingFactor; }
+      set { myShakingFactor = value; }
+    }*/
+
+    public NormalDoubleManipulator()
+      : base() {
+      AddVariableInfo(new VariableInfo("ShakingFactor", "", typeof(DoubleData), VariableKind.In));
+      /*myRandom = new NormalDistributedRandom(new MersenneTwister(), 0.0, 1.0);
+      myShakingFactor = 1.0;*/
+    }
+
+    /*public override IView CreateView() {
+      return new NormalDoubleManipulatorView(this);
+    }*/
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+      double shakingFactor = GetVariableValue<DoubleData>("ShakingFactor", scope, true).Data;
+      NormalDistributedRandom normal = new NormalDistributedRandom(random, 0.0, shakingFactor);
+      if (item is DoubleData) {
+        ((DoubleData)item).Data += normal.NextDouble();
+        return;
+      } else if (item is ConstrainedDoubleData) {
+        ConstrainedDoubleData data = (item as ConstrainedDoubleData);
+        for (int tries = 100; tries >= 0; tries--) {
+          double newValue = data.Data + normal.NextDouble();
+
+          if (IsIntegerConstrained(data)) {
+            newValue = Math.Round(newValue);
+          }
+          if (data.TrySetData(newValue)) {
+            return;
+          }
+        }
+        throw new InvalidProgramException("Coudn't find a valid value in 100 tries");
+      } else throw new InvalidOperationException("ERROR: NormalDoubleManipulator does not know how to work with " + ((item != null) ? (item.GetType().ToString()) : ("null")) + " data");
+    }
+
+    /*public override void Visit(DoubleData data) {
+      data.Data += (myRandom.NextDouble() dat* myShakingFactor);
+    }
+
+    public override void Visit(ConstrainedDoubleData data) {
+      for (int tries = 100; tries >= 0; tries--) {
+        double newValue = data.Data + myRandom.NextDouble() * myShakingFactor;
+
+        if (IsIntegerConstrained(data)) {
+          newValue = Math.Round(newValue);
+        }
+        if (data.TrySetData(newValue)) {
+          return;
+        }
+      }
+
+      throw new InvalidProgramException("Coudn't find a valid value in 100 tries");
+    }
+
+    #region clone & persistence
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      NormalDoubleManipulator clone = new NormalDoubleManipulator();
+      clonedObjects.Add(Guid, clone);
+      clone.Random = (NormalDistributedRandom)myRandom.Clone(clonedObjects);
+      clone.ShakingFactor = myShakingFactor;
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode randomNode = PersistenceManager.Persist("Random", Random, document, persistedObjects);
+      node.AppendChild(randomNode);
+
+      XmlNode shakingFactorNode = document.CreateNode(XmlNodeType.Element, "ShakingFactor", null);
+      shakingFactorNode.InnerText = myShakingFactor.ToString(CultureInfo.InvariantCulture);
+      node.AppendChild(shakingFactorNode);
+
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myRandom = (NormalDistributedRandom)PersistenceManager.Restore(node.SelectSingleNode("Random"), restoredObjects);
+      myShakingFactor = double.Parse(node.SelectSingleNode("ShakingFactor").InnerText, CultureInfo.InvariantCulture);
+    }
+    #endregion*/
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/NormalIntManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/NormalIntManipulator.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/NormalIntManipulator.cs	(revision 584)
@@ -0,0 +1,38 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.SimOpt {
+  public class NormalIntManipulator : SimOptManipulationOperatorBase {
+    public override string Description {
+      get { return @"Perturbs an IntData or ConstrainedIntData by a value normally distributed around 0"; }
+    }
+
+    public NormalIntManipulator()
+      : base() {
+      AddVariableInfo(new VariableInfo("ShakingFactor", "Strength of the perturbation", typeof(DoubleData), VariableKind.In));
+    }
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+      double shakingFactor = GetVariableValue<DoubleData>("ShakingFactor", scope, true).Data;
+      NormalDistributedRandom normal = new NormalDistributedRandom(random, 0.0, shakingFactor);
+      if (item is IntData) {
+        ((IntData)item).Data += (int)normal.NextDouble();
+        return;
+      } else if (item is ConstrainedIntData) {
+        ConstrainedIntData data = (item as ConstrainedIntData);
+        for (int tries = 100; tries >= 0; tries--) {
+          int newValue = data.Data + (int)normal.NextDouble();
+          if (data.TrySetData(newValue)) return;
+        }
+        throw new InvalidProgramException("Coudn't find a valid value in 100 tries");
+      } else throw new InvalidOperationException("ERROR: UniformIntManipulator does not know how to work with " + ((item != null) ? (item.GetType().ToString()) : ("null")) + " data");
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/PermutationParameterCyclicCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/PermutationParameterCyclicCrossover.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/PermutationParameterCyclicCrossover.cs	(revision 584)
@@ -0,0 +1,22 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class PermutationParameterCyclicCrossover : SimOptCrossoverBase {
+    public override string Description {
+      get { return @"Applies a CX on a permutation parameter"; }
+    }
+
+    public PermutationParameterCyclicCrossover()
+      : base() {
+    }
+
+    protected override object Cross(IRandom random, object parent1, object parent2, IScope scope) {
+      return Permutation.CyclicCrossover.Apply(random, (int[])parent1, (int[])parent2);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/PermutationParameterOrderCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/PermutationParameterOrderCrossover.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/PermutationParameterOrderCrossover.cs	(revision 584)
@@ -0,0 +1,22 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class PermutationParameterOrderCrossover : SimOptCrossoverBase {
+    public override string Description {
+      get { return @"Applies an OX on a permutation parameter"; }
+    }
+
+    public PermutationParameterOrderCrossover()
+      : base() {
+    }
+
+    protected override object Cross(IRandom random, object parent1, object parent2, IScope scope) {
+      return Permutation.OrderCrossover.Apply(random, (int[])parent1, (int[])parent2);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/PermutationParameterPartiallyMatchedCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/PermutationParameterPartiallyMatchedCrossover.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/PermutationParameterPartiallyMatchedCrossover.cs	(revision 584)
@@ -0,0 +1,22 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  class PermutationParameterPartiallyMatchedCrossover : SimOptCrossoverBase {
+    public override string Description {
+      get { return @"Applies a PMX on a permutation parameter"; }
+    }
+
+    public PermutationParameterPartiallyMatchedCrossover()
+      : base() {
+    }
+
+    protected override object Cross(IRandom random, object parent1, object parent2, IScope scope) {
+      return Permutation.PartiallyMatchedCrossover.Apply(random, (int[])parent1, (int[])parent2);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/Properties/AssemblyInfo.frame
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/Properties/AssemblyInfo.frame	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/Properties/AssemblyInfo.frame	(revision 584)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.SimOpt")]
+[assembly: AssemblyDescription("Assembly containing simulation optimization operators")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("fb2b106d-27b3-4a6f-97e2-5c0bab351c64")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
Index: trunk/sources/HeuristicLab.SimOpt/RandomDoubleInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/RandomDoubleInitializer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/RandomDoubleInitializer.cs	(revision 584)
@@ -0,0 +1,40 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class RandomDoubleInitializer : SimOptInitializationOperatorBase {
+    public override string Description {
+      get { return @"Initializes a DoubleData or ConstrainedDoubleData randomly in a given interval"; }
+    }
+
+    public RandomDoubleInitializer()
+      : base() {
+      AddVariableInfo(new VariableInfo("Min", "Minimum of the desired value", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Max", "Maximum of the desired value", typeof(DoubleData), VariableKind.In));
+    }
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+      double min = GetVariableValue<DoubleData>("Min", scope, true).Data;
+      double max = GetVariableValue<DoubleData>("Max", scope, true).Data;
+      if (item is DoubleData) {
+        double r = random.NextDouble();
+        ((DoubleData)item).Data = min + (r * max - r * min);
+        return;
+      } else if (item is ConstrainedDoubleData) {
+        ConstrainedDoubleData data = (item as ConstrainedDoubleData);
+        for (int tries = 100; tries >= 0; tries--) {
+          double r = random.NextDouble();
+          double newValue = min + (r * max - r * min);
+
+          if (IsIntegerConstrained(data)) newValue = Math.Round(newValue);
+          if (data.TrySetData(newValue)) return;
+        }
+        throw new InvalidProgramException("ERROR: RandomDoubleInitializer couldn't find a valid value in 100 tries");
+      } else throw new InvalidOperationException("ERROR: RandomDoubleInitializer does not know how to work with " + ((item != null) ? (item.GetType().ToString()) : ("null")) + " data");
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/RandomPermutationInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/RandomPermutationInitializer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/RandomPermutationInitializer.cs	(revision 584)
@@ -0,0 +1,83 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.SimOpt {
+  public class RandomPermutationInitializer : SimOptInitializationOperatorBase {
+    public override string Description {
+      get { return @"Randomly initialize a permutation with values ranging from 0 to n-1"; }
+    }
+
+    /*private MersenneTwister myRandom;
+    public MersenneTwister Random {
+      get { return myRandom; }
+      set { myRandom = value; }
+    }*/
+
+    public RandomPermutationInitializer()
+      : base() {
+      //myRandom = new MersenneTwister();
+    }
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+      if (item is Permutation.Permutation || item is IntArrayData) {
+        IntArrayData data = (item as IntArrayData);
+        IList<int> number = new List<int>(data.Data.Length);
+        for (int i = 0; i < data.Data.Length; i++)
+          number.Add(i);
+        for (int i = 0; i < data.Data.Length; i++) {
+          int index = random.Next(number.Count);
+          data.Data[i] = number[index];
+          number.RemoveAt(index);
+        }
+      } else throw new InvalidOperationException("ERROR: RandomPermutationInitializer does not know how to work with " + ((item != null) ? (item.GetType().ToString()) : ("null")) + " data");
+    }
+
+    /*public override IView CreateView() {
+      return new RandomPermutationInitializerView(this);
+    }
+
+    public override void Visit(IntArrayData data) {
+      IList<int> number = new List<int>(data.Data.Length);
+      for (int i = 0; i < data.Data.Length; i++)
+        number.Add(i);
+      for (int i = 0; i < data.Data.Length; i++) {
+        int index = random.Next(number.Count);
+        data.Data[i] = number[index];
+        number.RemoveAt(index);
+      }
+    }
+
+    public override void Visit(ObjectData objectData) {
+      if (objectData is Permutation) {
+        Visit(objectData as IntArrayData);
+      } else throw new NotImplementedException();
+    }
+
+    #region clone & persistence
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      RandomPermutationInitializer clone = new RandomPermutationInitializer();
+      clonedObjects.Add(Guid, clone);
+      clone.Random = (MersenneTwister)myRandom.Clone(clonedObjects);
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode randomNode = PersistenceManager.Persist("Random", Random, document, persistedObjects);
+      node.AppendChild(randomNode);
+
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myRandom = (MersenneTwister)PersistenceManager.Restore(node.SelectSingleNode("Random"), restoredObjects);
+    }
+    #endregion*/
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptCrossoverBase.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptCrossoverBase.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptCrossoverBase.cs	(revision 584)
@@ -0,0 +1,60 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public abstract class SimOptCrossoverBase : OperatorBase {
+    public SimOptCrossoverBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "The PRNG to use", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Items", "Paramter vector", typeof(ConstrainedItemList), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("Index", "Which parameter to cross", typeof(IntData), VariableKind.In));
+      GetVariableInfo("Index").Local = true;
+      AddVariable(new Variable("Index", new IntData(-1)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      ConstrainedItemList childVector = GetVariableValue<ConstrainedItemList>("Items", scope, false);
+      int index = GetVariableValue<IntData>("Index", scope, false).Data;
+      if (index < 0 || index >= childVector.Count) throw new InvalidOperationException("ERROR in SimOptCrossover: Index is out of range of the parameter vector.");
+
+      for (int i = 1; i < scope.SubScopes.Count; i++) {
+        object parent1, parent2;
+        if (i == 1) {
+          IItem p1 = scope.SubScopes[0].GetVariableValue<ConstrainedItemList>("Items", false)[index];
+          if (p1 is IVariable)
+            parent1 = ((((IVariable)p1).Value as IObjectData).Data as ICloneable).Clone();
+          else
+            parent1 = ((p1 as IObjectData).Data as ICloneable).Clone();
+        } else {
+          IItem p1 = childVector[index];
+          if (p1 is IVariable)
+            parent1 = (((IVariable)p1).Value as IObjectData).Data;
+          else
+            parent1 = ((IObjectData)p1).Data;
+        }
+        IItem p2 = scope.SubScopes[i].GetVariableValue<ConstrainedItemList>("Items", false)[index];
+        if (p2 is IVariable)
+          parent2 = (((IVariable)p2).Value as IObjectData).Data;
+        else
+          parent2 = ((IObjectData)p2).Data;
+        
+        object child = Cross(random, parent1, parent2, scope);
+
+        IItem parameter = childVector[index];
+        if (parameter is IVariable)
+          (((IVariable)parameter).Value as IObjectData).Data = child;
+        else {
+          ((IObjectData)parameter).Data = child;
+        }
+      }
+      return null;
+    }
+
+    protected abstract object Cross(IRandom random, object parent1, object parent2, IScope scope);
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptDiscreteMultiCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptDiscreteMultiCrossover.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptDiscreteMultiCrossover.cs	(revision 584)
@@ -0,0 +1,47 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+using HeuristicLab.Evolutionary;
+
+namespace HeuristicLab.SimOpt {
+  public class SimOptDiscreteMultiCrossover : MultiCrossoverBase {
+
+    public override string Description {
+      get { return @"This operator applies a discrete recombination on the variables defined"; }
+    }
+
+    public SimOptDiscreteMultiCrossover()
+      : base() {
+      AddVariableInfo(new VariableInfo("Item", "The item list to be recombined", typeof(ConstrainedItemList), VariableKind.In));
+    }
+
+    protected override void Cross(IScope scope, IRandom random, IScope[] parents, IScope child) {
+      ICollection<IConstraint> violated;
+
+      ConstrainedItemList[] p = new ConstrainedItemList[parents.Length];
+      for (int i = 0; i < p.Length; i++) {
+        p[i] = parents[i].GetVariableValue<ConstrainedItemList>("Item", false);
+        if (i > 0 && p[i].Count != p[i-1].Count) throw new InvalidOperationException("ERROR: the lists do not contain the same number of items");
+      }
+
+      ConstrainedItemList childList = (ConstrainedItemList)p[0].Clone();
+      if (childList.Count > 1) {
+        int iter = 0;
+        do {
+          childList.BeginCombinedOperation();
+          for (int i = 0; i < childList.Count; i++) {
+            int nextParent = random.Next(0, parents.Length);
+            if (nextParent > 0) childList.TrySetAt(i, (IItem)p[nextParent].Clone(), out violated);
+          }
+        } while (!childList.EndCombinedOperation(out violated) && ++iter < 100);
+        if (violated.Count == 0) {
+          child.AddVariable(new Variable(parents[0].TranslateName("Item"), childList));
+        }
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptInitializationOperatorBase.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptInitializationOperatorBase.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptInitializationOperatorBase.cs	(revision 584)
@@ -0,0 +1,48 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.SimOpt {
+  public abstract class SimOptInitializationOperatorBase : OperatorBase {
+
+    public SimOptInitializationOperatorBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "A (uniform distributed) pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Items", "The parameter vector to initialize", typeof(ConstrainedItemList), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("Index", "Which index in the parameter vector to initialize", typeof(IntData), VariableKind.In));
+      GetVariableInfo("Index").Local = true;
+      AddVariable(new Variable("Index", new IntData(-1)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      ConstrainedItemList parameterVector = GetVariableValue<ConstrainedItemList>("Items", scope, false);
+      IntData index = GetVariableValue<IntData>("Index", scope, false);
+      int i = index.Data;
+      if (i < 0 || i >= parameterVector.Count) throw new IndexOutOfRangeException("ERROR: Index is out of range of the parameter vector");
+      IItem item = parameterVector[i];
+      if (item is Variable) {
+        item = ((Variable)item).Value;
+      }
+      Apply(scope, random, item);
+      return null;
+    }
+
+    protected abstract void Apply(IScope scope, IRandom random, IItem item);
+
+    #region helper functions
+    protected bool IsIntegerConstrained(ConstrainedDoubleData data) {
+      foreach (IConstraint constraint in data.Constraints) {
+        if (constraint is IsIntegerConstraint) {
+          return true;
+        }
+      }
+      return false;
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptManipulationOperatorBase.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptManipulationOperatorBase.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptManipulationOperatorBase.cs	(revision 584)
@@ -0,0 +1,48 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Constraints;
+
+namespace HeuristicLab.SimOpt {
+  public abstract class SimOptManipulationOperatorBase : OperatorBase {
+
+    public SimOptManipulationOperatorBase()
+      : base() {
+      AddVariableInfo(new VariableInfo("Random", "A (uniform distributed) pseudo random number generator", typeof(IRandom), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Items", "The parameter vector to manipulate", typeof(ConstrainedItemList), VariableKind.In | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("Index", "Which index in the parameter vector to manipulate", typeof(IntData), VariableKind.In));
+      GetVariableInfo("Index").Local = true;
+      AddVariable(new Variable("Index", new IntData(-1)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
+      ConstrainedItemList parameterVector = GetVariableValue<ConstrainedItemList>("Items", scope, false);
+      IntData index = GetVariableValue<IntData>("Index", scope, false);
+      int i = index.Data;
+      if (i < 0 || i >= parameterVector.Count) throw new IndexOutOfRangeException("ERROR: Index is out of range of the parameter vector");
+      IItem item = parameterVector[i];
+      if (item is Variable) {
+        item = ((Variable)item).Value;
+      }
+      Apply(scope, random, item);
+      return null;
+    }
+
+    protected abstract void Apply(IScope scope, IRandom random, IItem item);
+
+    #region helper functions
+    protected bool IsIntegerConstrained(ConstrainedDoubleData data) {
+      foreach (IConstraint constraint in data.Constraints) {
+        if (constraint is IsIntegerConstraint) {
+          return true;
+        }
+      }
+      return false;
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptParameterExtractor.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptParameterExtractor.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptParameterExtractor.cs	(revision 584)
@@ -0,0 +1,30 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class SimOptParameterExtractor : OperatorBase {
+    public override string Description {
+      get { return @"Injects the contents of a ConstrainedItemList into the scope"; }
+    }
+
+    public SimOptParameterExtractor()
+      : base() {
+      AddVariableInfo(new VariableInfo("Items", "The ConstrainedItemList to be extracted", typeof(ConstrainedItemList), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ConstrainedItemList cil = GetVariableValue<ConstrainedItemList>("Items", scope, false);
+      for (int i = 0; i < cil.Count; i++) {
+        IVariable var = scope.GetVariable(((Variable)cil[i]).Name);
+        if (var == null) scope.AddVariable((IVariable)cil[i].Clone());
+        else var.Value = (IItem)((Variable)cil[i]).Value.Clone();
+      }
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptParameterPacker.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptParameterPacker.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptParameterPacker.cs	(revision 584)
@@ -0,0 +1,33 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class SimOptParameterPacker : OperatorBase {
+    public override string Description {
+      get { return @"Updates a ConstrainedItemList with the variables in the scope and removes them afterwards."; }
+    }
+
+    public SimOptParameterPacker()
+      : base() {
+      AddVariableInfo(new VariableInfo("Items", "The ConstrainedItemList to be updated", typeof(ConstrainedItemList), VariableKind.In | VariableKind.Out));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ConstrainedItemList cil = GetVariableValue<ConstrainedItemList>("Items", scope, false);
+      for (int i = 0; i < cil.Count; i++) {
+        IVariable var = scope.GetVariable(((Variable)cil[i]).Name);
+        if (var == null) throw new InvalidOperationException("ERROR in SimOptParameterPacker: Cannot find variable " + ((Variable)cil[i]).Name + " in scope");
+        else {
+          ((Variable)cil[i]).Value = (IItem)var.Value.Clone();
+          scope.RemoveVariable(var.Name);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjector.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjector.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjector.cs	(revision 584)
@@ -0,0 +1,93 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class SimOptProblemInjector : OperatorBase {
+
+    public override string Description {
+      get { return @"Injects the parameters used for simulation parameter optimization"; }
+    }
+
+    private BoolData myMaximization;
+    public BoolData Maximization {
+      get { return myMaximization; }
+      set { myMaximization = value; }
+    }
+
+    private StringData myGeneName;
+    public StringData GeneName {
+      get { return myGeneName; }
+      set { myGeneName = value; }
+    }
+
+    private ConstrainedItemList myParameters;
+    public ConstrainedItemList Parameters {
+      get { return myParameters; }
+      set { myParameters = value; }
+    }
+
+    public SimOptProblemInjector()
+      : base() {
+      myParameters = new ConstrainedItemList();
+      myGeneName = new StringData("Items");
+      myMaximization = new BoolData(false);
+    }
+
+    public override IOperation Apply(IScope scope) {
+      scope.AddVariable(new Variable("Maximization", (BoolData)Maximization.Clone()));
+      scope.AddVariable(new Variable(myGeneName.Data, (ConstrainedItemList)Parameters.Clone()));
+      return null;
+    }
+
+    public override IView CreateView() {
+      return new SimOptProblemInjectorView(this);
+    }
+
+    #region Clone & Persistence Methods
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      SimOptProblemInjector clone = new SimOptProblemInjector();
+      clonedObjects.Add(Guid, clone);
+      clone.Maximization = (BoolData)myMaximization.Clone(clonedObjects);
+      clone.GeneName = (StringData)myGeneName.Clone(clonedObjects);
+      clone.myParameters = (ConstrainedItemList)myParameters.Clone(clonedObjects);
+      return clone;
+    }
+
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      // variable infos should not be persisted
+      XmlNode infosNode = node.SelectSingleNode("VariableInfos");
+      infosNode.RemoveAll();
+      XmlNode maxNode = PersistenceManager.Persist("Maximization", Maximization, document, persistedObjects);
+      node.AppendChild(maxNode);
+      XmlNode nameNode = PersistenceManager.Persist("GeneName", GeneName, document, persistedObjects);
+      node.AppendChild(nameNode);
+      XmlNode parametersNode = PersistenceManager.Persist("Items", Parameters, document, persistedObjects);
+      node.AppendChild(parametersNode);
+      return node;
+    }
+
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      if (node.SelectSingleNode("Maximization") != null) {
+        myMaximization = (BoolData)PersistenceManager.Restore(node.SelectSingleNode("Maximization"), restoredObjects);
+      }
+      if (node.SelectSingleNode("GeneName") != null) {
+        myGeneName = (StringData)PersistenceManager.Restore(node.SelectSingleNode("GeneName"), restoredObjects);
+      }
+      IStorable items = (ConstrainedItemList)PersistenceManager.Restore(node.SelectSingleNode("Items"), restoredObjects);
+      try {
+        myParameters = (ConstrainedItemList)items;
+      } catch (InvalidCastException ice) {
+        IVariable var = (Variable)items;
+        myParameters = (ConstrainedItemList)var.Value;
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjectorView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjectorView.Designer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjectorView.Designer.cs	(revision 584)
@@ -0,0 +1,173 @@
+﻿namespace HeuristicLab.SimOpt {
+  partial class SimOptProblemInjectorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.dataTypeTreeView = new System.Windows.Forms.TreeView();
+      this.label1 = new System.Windows.Forms.Label();
+      this.geneNameStringDataView = new HeuristicLab.Data.StringDataView();
+      this.parametersTabControl = new System.Windows.Forms.TabControl();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
+      this.objectParameterDataView = new HeuristicLab.Data.ConstrainedItemListView();
+      this.variableNameLabel = new System.Windows.Forms.Label();
+      this.maximizationBoolDataView = new HeuristicLab.Data.BoolDataView();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.parametersTabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.dataTypeTreeView);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.label1);
+      this.splitContainer1.Panel2.Controls.Add(this.geneNameStringDataView);
+      this.splitContainer1.Panel2.Controls.Add(this.parametersTabControl);
+      this.splitContainer1.Panel2.Controls.Add(this.variableNameLabel);
+      this.splitContainer1.Panel2.Controls.Add(this.maximizationBoolDataView);
+      this.splitContainer1.Size = new System.Drawing.Size(552, 439);
+      this.splitContainer1.SplitterDistance = 184;
+      this.splitContainer1.TabIndex = 0;
+      // 
+      // dataTypeTreeView
+      // 
+      this.dataTypeTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.dataTypeTreeView.Location = new System.Drawing.Point(0, 0);
+      this.dataTypeTreeView.Name = "dataTypeTreeView";
+      this.dataTypeTreeView.Size = new System.Drawing.Size(184, 439);
+      this.dataTypeTreeView.TabIndex = 0;
+      this.dataTypeTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.dataTypeTreeView_ItemDrag);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(245, 9);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(67, 13);
+      this.label1.TabIndex = 7;
+      this.label1.Text = "Maximization";
+      // 
+      // geneNameStringDataView
+      // 
+      this.geneNameStringDataView.Caption = "View";
+      this.geneNameStringDataView.Location = new System.Drawing.Point(47, 7);
+      this.geneNameStringDataView.Name = "geneNameStringDataView";
+      this.geneNameStringDataView.Size = new System.Drawing.Size(163, 19);
+      this.geneNameStringDataView.StringData = null;
+      this.geneNameStringDataView.TabIndex = 5;
+      // 
+      // parametersTabControl
+      // 
+      this.parametersTabControl.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.parametersTabControl.Controls.Add(this.parametersTabPage);
+      this.parametersTabControl.Location = new System.Drawing.Point(6, 32);
+      this.parametersTabControl.Name = "parametersTabControl";
+      this.parametersTabControl.SelectedIndex = 0;
+      this.parametersTabControl.Size = new System.Drawing.Size(358, 407);
+      this.parametersTabControl.TabIndex = 4;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.objectParameterDataView);
+      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.parametersTabPage.Name = "parametersTabPage";
+      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.parametersTabPage.Size = new System.Drawing.Size(350, 381);
+      this.parametersTabPage.TabIndex = 0;
+      this.parametersTabPage.Text = "Parameters";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // objectParameterDataView
+      // 
+      this.objectParameterDataView.AllowDrop = true;
+      this.objectParameterDataView.Caption = "View";
+      this.objectParameterDataView.ConstrainedItemList = null;
+      this.objectParameterDataView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.objectParameterDataView.Location = new System.Drawing.Point(3, 3);
+      this.objectParameterDataView.Name = "objectParameterDataView";
+      this.objectParameterDataView.Size = new System.Drawing.Size(344, 375);
+      this.objectParameterDataView.TabIndex = 1;
+      this.objectParameterDataView.DragDrop += new System.Windows.Forms.DragEventHandler(this.objectParameterDataView_DragDrop);
+      this.objectParameterDataView.DragEnter += new System.Windows.Forms.DragEventHandler(this.objectParameterDataView_DragEnter);
+      // 
+      // variableNameLabel
+      // 
+      this.variableNameLabel.AutoSize = true;
+      this.variableNameLabel.Location = new System.Drawing.Point(3, 9);
+      this.variableNameLabel.Name = "variableNameLabel";
+      this.variableNameLabel.Size = new System.Drawing.Size(38, 13);
+      this.variableNameLabel.TabIndex = 2;
+      this.variableNameLabel.Text = "Name:";
+      // 
+      // maximizationBoolDataView
+      // 
+      this.maximizationBoolDataView.BoolData = null;
+      this.maximizationBoolDataView.Caption = "Maximization";
+      this.maximizationBoolDataView.Location = new System.Drawing.Point(225, 9);
+      this.maximizationBoolDataView.Name = "maximizationBoolDataView";
+      this.maximizationBoolDataView.Size = new System.Drawing.Size(19, 18);
+      this.maximizationBoolDataView.TabIndex = 6;
+      // 
+      // SimOptProblemInjectorView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer1);
+      this.Name = "SimOptProblemInjectorView";
+      this.Size = new System.Drawing.Size(552, 439);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.Panel2.PerformLayout();
+      this.splitContainer1.ResumeLayout(false);
+      this.parametersTabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private HeuristicLab.Data.ConstrainedItemListView objectParameterDataView;
+    private System.Windows.Forms.TreeView dataTypeTreeView;
+    private System.Windows.Forms.Label variableNameLabel;
+    private System.Windows.Forms.TabControl parametersTabControl;
+    private System.Windows.Forms.TabPage parametersTabPage;
+    private HeuristicLab.Data.StringDataView geneNameStringDataView;
+    private HeuristicLab.Data.BoolDataView maximizationBoolDataView;
+    private System.Windows.Forms.Label label1;
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjectorView.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjectorView.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjectorView.cs	(revision 584)
@@ -0,0 +1,93 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public partial class SimOptProblemInjectorView : ViewBase {
+    public SimOptProblemInjector SimOptProblemInjector {
+      get { return (SimOptProblemInjector)base.Item; }
+      set { base.Item = value; }
+    }
+
+    public SimOptProblemInjectorView() {
+      InitializeComponent();
+      UpdateDataTypeTreeView();
+    }
+
+    public SimOptProblemInjectorView(SimOptProblemInjector simOptProblemInjector)
+      : this() {
+      SimOptProblemInjector = simOptProblemInjector;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (SimOptProblemInjector == null) {
+        geneNameStringDataView.Enabled = false;
+        geneNameStringDataView.StringData = null;
+        objectParameterDataView.Enabled = false;
+        objectParameterDataView.ConstrainedItemList = null;
+        maximizationBoolDataView.Enabled = false;
+        maximizationBoolDataView.BoolData = null;
+      } else {
+        objectParameterDataView.ConstrainedItemList = SimOptProblemInjector.Parameters;
+        objectParameterDataView.Enabled = true;
+        geneNameStringDataView.StringData = SimOptProblemInjector.GeneName;
+        geneNameStringDataView.Enabled = true;
+        maximizationBoolDataView.BoolData = SimOptProblemInjector.Maximization;
+        maximizationBoolDataView.Enabled = true;
+      }
+    }
+
+    private void UpdateDataTypeTreeView() {
+      dataTypeTreeView.Nodes.Clear();
+      DiscoveryService discoveryService = new DiscoveryService();
+      foreach (PluginInfo plugin in discoveryService.Plugins) {
+        TreeNode pluginNode = new TreeNode(plugin.Name);
+        pluginNode.Tag = null;
+
+        Type[] types = discoveryService.GetTypes(typeof(IObjectData), plugin);
+        foreach (Type type in types) {
+          if (!type.IsAbstract) {
+            TreeNode itemNode = new TreeNode();
+            itemNode.Text = type.Name;
+            itemNode.Tag = type;
+            pluginNode.Nodes.Add(itemNode);
+          }
+        }
+        if (pluginNode.Nodes.Count > 0) {
+          dataTypeTreeView.Nodes.Add(pluginNode);
+        }
+      }
+      if (dataTypeTreeView.Nodes.Count == 0) {
+        dataTypeTreeView.Enabled = false;
+        dataTypeTreeView.Nodes.Add(new TreeNode("No item types available"));
+      }
+    }
+
+    private void dataTypeTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      DoDragDrop(e.Item, DragDropEffects.Copy);
+    }
+
+    private void objectParameterDataView_DragDrop(object sender, DragEventArgs e) {
+      TreeNode node = (TreeNode)e.Data.GetData(typeof(TreeNode));
+      IVariable var = new Variable();
+      var.Name = "Unnamed";
+      var.Value = (IItem)Activator.CreateInstance((Type)node.Tag);
+      ICollection<IConstraint> tmp;
+      objectParameterDataView.ConstrainedItemList.TryAdd(var, out tmp);
+    }
+
+    private void objectParameterDataView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.Copy | DragDropEffects.Move;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjectorView.resx
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjectorView.resx	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptProblemInjectorView.resx	(revision 584)
@@ -0,0 +1,120 @@
+<?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>
+</root>
Index: trunk/sources/HeuristicLab.SimOpt/SimOptSequentialSubOperatorProcessor.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptSequentialSubOperatorProcessor.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptSequentialSubOperatorProcessor.cs	(revision 584)
@@ -0,0 +1,69 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class SimOptSequentialSubOperatorProcessor : OperatorBase {
+    public override string Description {
+      get {
+        return @"Applies its suboperators on the parameter vector one for each index, afterwards it checks if the parameter vector satisfies all the constraints. If not it restores the old parameter vector and tries again until a maximum amount of tries (default: 100) has been reached.";
+      }
+    }
+
+    public SimOptSequentialSubOperatorProcessor()
+      : base() {
+      AddVariableInfo(new VariableInfo("Items", "The parameter vector", typeof(ConstrainedItemList), VariableKind.New | VariableKind.In | VariableKind.Out));
+      AddVariable(new Variable("ItemsBackup", new NullData()));
+      AddVariableInfo(new VariableInfo("MaximumTries", "", typeof(IntData), VariableKind.In));
+      GetVariableInfo("MaximumTries").Local = true;
+      AddVariable(new Variable("MaximumTries", new IntData(100)));
+      AddVariable(new Variable("Tries", new IntData(0)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      ConstrainedItemList parameterVector = GetVariableValue<ConstrainedItemList>("Items", scope, false, false);
+      // Mode: The parameter vector does not yet exist in the current scope
+      if (parameterVector == null) { // the parameter does not yet exist in the current scope
+        parameterVector = GetVariableValue<ConstrainedItemList>("Items", scope, true); // search for it
+        parameterVector = (ConstrainedItemList)parameterVector.Clone(); // clone it
+        scope.AddVariable(new Variable(scope.TranslateName("Items"), parameterVector)); // and add it to the current scope
+      }
+      // Mode: The parameter vector is marked for manipulation/initialization (constraint check is suspended)
+      if (parameterVector.ConstraintCheckSuspended) {
+        ICollection<IConstraint> violatedConstraints;
+        if (parameterVector.EndCombinedOperation(out violatedConstraints)) {
+          ((IntData)GetVariable("Tries").Value).Data = 0;
+          GetVariable("ItemsBackup").Value = new NullData();
+          return null; // manipulation/initialization was successful
+        } else { // restore old vector
+          int maximumTries = GetVariableValue<IntData>("MaximumTries", scope, true).Data;
+          IntData tries = (GetVariable("Tries").Value as IntData);
+          if (tries.Data >= maximumTries) throw new InvalidOperationException("ERROR: no valid solution in " + maximumTries.ToString() + " tries");
+          parameterVector = (ConstrainedItemList)GetVariable("ItemsBackup").Value;
+          scope.GetVariable(scope.TranslateName("Items")).Value = parameterVector;
+          ((IntData)GetVariable("Tries").Value).Data++;
+        }
+      }
+      // perform the sub operators in sequential order on the indices of the parameter vector
+      GetVariable("ItemsBackup").Value = (ConstrainedItemList)parameterVector.Clone();
+      CompositeOperation co = new CompositeOperation();
+      for (int i = 0; i < SubOperators.Count; i++) {
+        if (SubOperators[i].GetVariable("Index") != null) {
+          SubOperators[i].GetVariable("Index").Value = new IntData(i);
+        }
+        if (SubOperators[i].GetVariableInfo("Items") != null) {
+          SubOperators[i].GetVariableInfo("Items").ActualName = GetVariableInfo("Items").ActualName;
+        }
+      }
+      for (int i = 0; i < SubOperators.Count; i++)
+        co.AddOperation(new AtomicOperation(SubOperators[i], scope));
+      // add self to check if the manipulation/initialization did not violate any constraints
+      co.AddOperation(new AtomicOperation(this, scope));
+      parameterVector.BeginCombinedOperation();
+      return co;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptSinglePointCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptSinglePointCrossover.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptSinglePointCrossover.cs	(revision 584)
@@ -0,0 +1,45 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Random;
+using HeuristicLab.Evolutionary;
+
+namespace HeuristicLab.SimOpt {
+  public class SimOptSinglePointCrossover : CrossoverBase {
+
+    public override string Description {
+      get { return @"This operator applies a single point crossover on the variables defined"; }
+    }
+
+    public SimOptSinglePointCrossover()
+      : base() {
+      AddVariableInfo(new VariableInfo("Item", "The item list to be crossed", typeof(ConstrainedItemList), VariableKind.In));
+    }
+
+    protected override void Cross(IScope scope, IRandom random, IScope parent1, IScope parent2, IScope child) {
+      ICollection<IConstraint> violated;
+      ConstrainedItemList p1 = parent1.GetVariableValue<ConstrainedItemList>("Item", false);
+      ConstrainedItemList p2 = parent2.GetVariableValue<ConstrainedItemList>("Item", false);
+
+      if (p1.Count != p2.Count) throw new InvalidOperationException("ERROR: the lists do not contain the same number of items");
+
+      ConstrainedItemList childList = (ConstrainedItemList)p1.Clone();
+      if (childList.Count > 1) {
+        int iter = 0;
+        do {
+          childList.BeginCombinedOperation();
+          int crossPoint = random.Next(1, childList.Count);
+          for (int i = crossPoint; i < childList.Count; i++) {
+            childList.TrySetAt(i, (IItem)p2[i].Clone(), out violated);
+          }
+        } while (!childList.EndCombinedOperation(out violated) && ++iter < 100);
+        if (violated.Count == 0) {
+          child.AddVariable(new Variable(parent1.TranslateName("Item"), childList));
+        }
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SimOptSquentialSubOperatorCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SimOptSquentialSubOperatorCrossover.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SimOptSquentialSubOperatorCrossover.cs	(revision 584)
@@ -0,0 +1,53 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Evolutionary;
+
+namespace HeuristicLab.SimOpt {
+  public class SimOptSquentialSubOperatorCrossover : OperatorBase {
+    public override string Description {
+      get { return @"Takes the parameter vector of two items and on each index applies the respectively indexed suboperator"; }
+    }
+
+    public SimOptSquentialSubOperatorCrossover()
+      : base() {
+      AddVariableInfo(new VariableInfo("Items", "The parameter vector", typeof(ConstrainedItemList), VariableKind.In | VariableKind.New));
+      AddVariableInfo(new VariableInfo("Parents", "The number of parents per child", typeof(IntData), VariableKind.In));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int parents = GetVariableValue<IntData>("Parents", scope, true).Data;
+
+      int subScopesCount = scope.SubScopes.Count;
+      if (subScopesCount < parents || (subScopesCount % parents) != 0)
+        throw new InvalidOperationException("Size of mating pool is not a multiple (>1) of the number of parents per child");
+      int children = subScopesCount / parents;
+
+      CompositeOperation co = new CompositeOperation();
+      for (int i = 0; i < SubOperators.Count; i++) {
+        if (SubOperators[i].GetVariable("Index") != null) {
+          SubOperators[i].GetVariable("Index").Value = new IntData(i);
+        }
+        if (SubOperators[i].GetVariableInfo("Items") != null) {
+          SubOperators[i].GetVariableInfo("Items").ActualName = GetVariableInfo("Items").ActualName;
+        }
+      }
+      for (int i = 0; i < children; i++) {
+        IScope child = (IScope)scope.SubScopes[0].Clone();
+        for (int j = 0; j < parents; j++) {
+          IScope parent = scope.SubScopes[0];
+          child.AddSubScope(parent);
+          scope.RemoveSubScope(parent);
+        }
+        scope.AddSubScope(child);
+        for (int n = 0 ; n < SubOperators.Count ; n++)
+          co.AddOperation(new AtomicOperation(SubOperators[n], child));
+        co.AddOperation(new AtomicOperation(new SubScopesRemover(), child));
+      }
+      return co;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/SubScopesRemover.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/SubScopesRemover.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/SubScopesRemover.cs	(revision 584)
@@ -0,0 +1,16 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.SimOpt {
+  public class SubScopesRemover : OperatorBase {
+    public override IOperation Apply(IScope scope) {
+      while (scope.SubScopes.Count > 0) {
+        scope.RemoveSubScope(scope.SubScopes[0]);
+      }
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/Swap2PermutationManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/Swap2PermutationManipulator.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/Swap2PermutationManipulator.cs	(revision 584)
@@ -0,0 +1,33 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.SimOpt {
+  public class Swap2PermutationManipulator : SimOptManipulationOperatorBase {
+    public override string Description {
+      get { return @"Swap two elements of a permutation or IntArray"; }
+    }
+
+    public Swap2PermutationManipulator()
+      : base() {
+    }
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+      if (item is Permutation.Permutation || item is IntArrayData) {
+        IntArrayData data = (item as IntArrayData);
+        int x = random.Next(data.Data.Length);
+        int y;
+        do {
+          y = random.Next(data.Data.Length);
+        } while (x == y);
+
+        int h = data.Data[x];
+        data.Data[x] = data.Data[y];
+        data.Data[y] = h;
+      } else throw new InvalidOperationException("ERROR: Swap2PermutationManipulator does not know how to work with " + ((item != null) ? (item.GetType().ToString()) : ("null")) + " data");
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/TranslocationPermutationAdaptiveManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/TranslocationPermutationAdaptiveManipulator.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/TranslocationPermutationAdaptiveManipulator.cs	(revision 584)
@@ -0,0 +1,53 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.SimOpt {
+  public class TranslocationPermutationAdaptiveManipulator : SimOptManipulationOperatorBase {
+    public override string Description {
+      get { return @"Move a certain number of consecutive elements to a different part in an IntArray or Permutation.
+Uses a shaking factor to provide an upper bound on the length of consecutive elments moved."; }
+    }
+
+    public TranslocationPermutationAdaptiveManipulator()
+      : base() {
+      AddVariableInfo(new VariableInfo("ShakingFactor", "A shaking factor that determines the maximum size of subtours which are to be translocated. The actual value is drawn from a uniform distribution between 1 and this factor (rounded)", typeof(DoubleData), VariableKind.In));
+    }
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+      double shakingFactor = GetVariableValue<DoubleData>("ShakingFactor", scope, true).Data;
+      if (item is Permutation.Permutation || item is IntArrayData) {
+        IntArrayData data = (item as IntArrayData);
+        int l = random.Next(1, (int)Math.Max(Math.Min((int)shakingFactor, data.Data.Length - 1), 2));
+        int x = random.Next(data.Data.Length - l);
+        int y;
+        do {
+          y = random.Next(data.Data.Length - l);
+        } while (x == y);
+
+        int[] h = new int[l];
+        for (int i = 0; i < h.Length; i++)
+          h[i] = data.Data[x + i];
+
+        if (x > y) {
+          while (x > y) {
+            x--;
+            data.Data[x + l] = data.Data[x];
+          }
+        } else {
+          while (x < y) {
+            data.Data[x] = data.Data[x + l];
+            x++;
+          }
+        }
+        for (int i = 0; i < h.Length; i++)
+          data.Data[y + i] = h[i];
+      } else throw new InvalidOperationException("ERROR: PermutationTranslocationManipulator does not know how to work with " + ((item != null) ? (item.GetType().ToString()) : ("null")) + " data");
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/TranslocationPermutationManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/TranslocationPermutationManipulator.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/TranslocationPermutationManipulator.cs	(revision 584)
@@ -0,0 +1,50 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.SimOpt {
+  public class TranslocationPermutationManipulator : SimOptManipulationOperatorBase {
+    public override string Description {
+      get { return @"Move a certain number of consecutive elements to a different part in an IntArray or Permutation."; }
+    }
+
+    public TranslocationPermutationManipulator()
+      : base() {
+    }
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+      if (item is Permutation.Permutation || item is IntArrayData) {
+        IntArrayData data = (item as IntArrayData);
+        int l = random.Next(1, data.Data.Length - 2);
+        int x = random.Next(data.Data.Length - l);
+        int y;
+        do {
+          y = random.Next(data.Data.Length - l);
+        } while (x == y);
+
+        int[] h = new int[l];
+        for (int i = 0; i < h.Length; i++)
+          h[i] = data.Data[x + i];
+
+        if (x > y) {
+          while (x > y) {
+            x--;
+            data.Data[x + l] = data.Data[x];
+          }
+        } else {
+          while (x < y) {
+            data.Data[x] = data.Data[x + l];
+            x++;
+          }
+        }
+        for (int i = 0; i < h.Length; i++)
+          data.Data[y + i] = h[i];
+      } else throw new InvalidOperationException("ERROR: PermutationTranslocationManipulator does not know how to work with " + ((item != null) ? (item.GetType().ToString()) : ("null")) + " data");
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SimOpt/UniformIntInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.SimOpt/UniformIntInitializer.cs	(revision 584)
+++ trunk/sources/HeuristicLab.SimOpt/UniformIntInitializer.cs	(revision 584)
@@ -0,0 +1,39 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.SimOpt {
+  public class UniformIntInitializer : SimOptInitializationOperatorBase {
+    public override string Description {
+      get { return @"Assigns an IntData or ConstrainedIntData a value uniformly distributed in the interval [min;max["; }
+    }
+
+    public UniformIntInitializer()
+      : base() {
+      AddVariableInfo(new VariableInfo("Min", "", typeof(IntData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Max", "", typeof(IntData), VariableKind.In));
+    }
+
+    protected override void Apply(IScope scope, IRandom random, IItem item) {
+      int min = GetVariableValue<IntData>("Min", scope, true).Data;
+      int max = GetVariableValue<IntData>("Max", scope, true).Data;
+
+      if (item is IntData) {
+        ((IntData)item).Data = random.Next(min, max);
+        return;
+      } else if (item is ConstrainedIntData) {
+        ConstrainedIntData data = (item as ConstrainedIntData);
+        for (int tries = 100; tries >= 0; tries--) {
+          if (data.TrySetData(random.Next(min, max))) return;
+        }
+        throw new InvalidProgramException("Coudn't find a valid value in 100 tries");
+      } else throw new InvalidOperationException("ERROR: UniformIntManipulator does not know how to work with " + ((item != null) ? (item.GetType().ToString()) : ("null")) + " data");
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.sln
===================================================================
--- trunk/sources/HeuristicLab.sln	(revision 582)
+++ trunk/sources/HeuristicLab.sln	(revision 584)
@@ -89,4 +89,10 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.CEDMA.Charting", "HeuristicLab.CEDMA.Charting\HeuristicLab.CEDMA.Charting.csproj", "{1BF17271-5350-476A-8F6D-FC74FA3E82CA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Communication.Data", "HeuristicLab.Communication.Data\HeuristicLab.Communication.Data.csproj", "{14E1C3E3-2496-436A-AE00-09F7B81DB15B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Communication.Operators", "HeuristicLab.Communication.Operators\HeuristicLab.Communication.Operators.csproj", "{6AEF1284-2428-4B01-B9D2-62C1FA7C2DE1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.SimOpt", "HeuristicLab.SimOpt\HeuristicLab.SimOpt.csproj", "{32DAA44F-944A-465F-A5C9-1C491EE4976D}"
 EndProject
 Global
@@ -426,4 +432,22 @@
 		{1BF17271-5350-476A-8F6D-FC74FA3E82CA}.Release|x86.ActiveCfg = Release|x86
 		{1BF17271-5350-476A-8F6D-FC74FA3E82CA}.Release|x86.Build.0 = Release|x86
+		{14E1C3E3-2496-436A-AE00-09F7B81DB15B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{14E1C3E3-2496-436A-AE00-09F7B81DB15B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{14E1C3E3-2496-436A-AE00-09F7B81DB15B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{14E1C3E3-2496-436A-AE00-09F7B81DB15B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{14E1C3E3-2496-436A-AE00-09F7B81DB15B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{14E1C3E3-2496-436A-AE00-09F7B81DB15B}.Release|x86.ActiveCfg = Release|Any CPU
+		{6AEF1284-2428-4B01-B9D2-62C1FA7C2DE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6AEF1284-2428-4B01-B9D2-62C1FA7C2DE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6AEF1284-2428-4B01-B9D2-62C1FA7C2DE1}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6AEF1284-2428-4B01-B9D2-62C1FA7C2DE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6AEF1284-2428-4B01-B9D2-62C1FA7C2DE1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6AEF1284-2428-4B01-B9D2-62C1FA7C2DE1}.Release|x86.ActiveCfg = Release|Any CPU
+		{32DAA44F-944A-465F-A5C9-1C491EE4976D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{32DAA44F-944A-465F-A5C9-1C491EE4976D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{32DAA44F-944A-465F-A5C9-1C491EE4976D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{32DAA44F-944A-465F-A5C9-1C491EE4976D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{32DAA44F-944A-465F-A5C9-1C491EE4976D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{32DAA44F-944A-465F-A5C9-1C491EE4976D}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: trunk/sources/HeuristicLab/CopyAssemblies.cmd
===================================================================
--- trunk/sources/HeuristicLab/CopyAssemblies.cmd	(revision 582)
+++ trunk/sources/HeuristicLab/CopyAssemblies.cmd	(revision 584)
@@ -20,4 +20,6 @@
 copy %1\HeuristicLab.Charting\%2\HeuristicLab.Charting-3.2.dll .\plugins
 copy %1\HeuristicLab.Charting.Data\%2\HeuristicLab.Charting.Data-3.2.dll .\plugins
+copy %1\HeuristicLab.Communication.Data\%2\HeuristicLab.Communication.Data-3.2.dll .\plugins
+copy %1\HeuristicLab.Communication.Operators\%2\HeuristicLab.Communication.Operators-3.2.dll .\plugins
 copy %1\HeuristicLab.Core\%2\HeuristicLab.Core-3.2.dll .\plugins
 copy %1\HeuristicLab.Constraints\%2\HeuristicLab.Constraints-3.2.dll .\plugins
@@ -43,4 +45,5 @@
 copy %1\HeuristicLab.SequentialEngine\%2\HeuristicLab.SequentialEngine-3.2.dll .\plugins
 copy %1\HeuristicLab.SGA\%2\HeuristicLab.SGA-3.2.dll .\plugins
+copy %1\HeuristicLab.SimOpt\%2\HeuristicLab.SimOpt-3.2.dll .\plugins
 copy %1\HeuristicLab.SQLite\%2\HeuristicLab.SQLite-3.2.dll .\plugins
 copy %1\HeuristicLab.SQLite\System.Data.SQLite.dll .\plugins
