Index: branches/ParameterBinding/HeuristicLab.Core/3.3/Interfaces/IParameterBinding.cs
===================================================================
--- branches/ParameterBinding/HeuristicLab.Core/3.3/Interfaces/IParameterBinding.cs	(revision 4757)
+++ branches/ParameterBinding/HeuristicLab.Core/3.3/Interfaces/IParameterBinding.cs	(revision 4757)
@@ -0,0 +1,12 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Core {
+  public interface IParameterBinding : IDeepCloneable {
+    void Bind();
+    void Unbind();
+  }
+}
Index: branches/ParameterBinding/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs
===================================================================
--- branches/ParameterBinding/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 4745)
+++ branches/ParameterBinding/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 4757)
@@ -33,4 +33,10 @@
   public abstract class ParameterizedNamedItem : NamedItem, IParameterizedNamedItem {
     [Storable]
+    private List<IParameterBinding> parameterBindingList;
+    // eventuelly this should be made public and exposed in a view so that the algorithm designer can add bindings in the GUI
+    protected List<IParameterBinding> ParameterBindingList {
+      get { return parameterBindingList; }
+    }
+    [Storable]
     private ParameterCollection parameters;
     protected ParameterCollection Parameters {
@@ -50,4 +56,5 @@
       : base(original, cloner) {
       parameters = cloner.Clone(original.parameters);
+      parameterBindingList = original.parameterBindingList.Select(x => cloner.Clone(x)).ToList();
       readOnlyParameters = null;
     }
@@ -56,4 +63,5 @@
       name = ItemName;
       description = ItemDescription;
+      parameterBindingList = new List<IParameterBinding>();
       parameters = new ParameterCollection();
       readOnlyParameters = null;
@@ -62,4 +70,5 @@
       : base(name) {
       description = ItemDescription;
+      parameterBindingList = new List<IParameterBinding>();
       parameters = new ParameterCollection();
       readOnlyParameters = null;
@@ -68,4 +77,5 @@
       : base(name) {
       description = ItemDescription;
+      parameterBindingList = new List<IParameterBinding>();
       this.parameters = parameters;
       readOnlyParameters = null;
@@ -73,4 +83,5 @@
     protected ParameterizedNamedItem(string name, string description)
       : base(name, description) {
+      parameterBindingList = new List<IParameterBinding>();
       parameters = new ParameterCollection();
       readOnlyParameters = null;
@@ -78,4 +89,5 @@
     protected ParameterizedNamedItem(string name, string description, ParameterCollection parameters)
       : base(name, description) {
+      parameterBindingList = new List<IParameterBinding>();
       this.parameters = parameters;
       readOnlyParameters = null;
Index: branches/ParameterBinding/HeuristicLab.Parameters/3.3/ParameterActualNameBinding.cs
===================================================================
--- branches/ParameterBinding/HeuristicLab.Parameters/3.3/ParameterActualNameBinding.cs	(revision 4757)
+++ branches/ParameterBinding/HeuristicLab.Parameters/3.3/ParameterActualNameBinding.cs	(revision 4757)
@@ -0,0 +1,69 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Parameters {
+  [StorableClass]
+  public class ParameterActualNameBinding : IParameterBinding {
+    [Storable]
+    private ILookupParameter source;
+    public ILookupParameter Source {
+      get { return source; }
+    }
+    [Storable]
+    private ILookupParameter destination;
+    public ILookupParameter Destination {
+      get { return destination; }
+    }
+
+    [StorableConstructor]
+    protected ParameterActualNameBinding(bool deserializing) { }
+    protected ParameterActualNameBinding(ParameterActualNameBinding original, Cloner cloner) {
+      this.source = cloner.Clone(source);
+      this.destination = cloner.Clone(destination);
+      RegisterEventHandlers();
+    }
+    public ParameterActualNameBinding(ILookupParameter source, ILookupParameter destination) {
+      if (source == null) throw new ArgumentNullException("source");
+      if (destination == null) throw new ArgumentNullException("destination");
+      this.source = source;
+      this.destination = destination;
+      RegisterEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterActualNameBinding(this, cloner);
+    }
+
+    public void Bind() {
+      RegisterEventHandlers();
+    }
+
+    public void Unbind() {
+      DeregisterEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
+      source.ActualNameChanged += new EventHandler(source_ActualNameChanged);
+    }
+
+    private void DeregisterEventHandlers() {
+      source.ActualNameChanged -= new EventHandler(source_ActualNameChanged);
+    }
+    
+
+    private void source_ActualNameChanged(object sender, EventArgs e) {
+      if (destination.ActualName != source.ActualName)
+        destination.ActualName = source.ActualName;
+    }
+  }
+}
Index: branches/ParameterBinding/HeuristicLab.Parameters/3.3/ParameterSecondLevelValueBinding.cs
===================================================================
--- branches/ParameterBinding/HeuristicLab.Parameters/3.3/ParameterSecondLevelValueBinding.cs	(revision 4757)
+++ branches/ParameterBinding/HeuristicLab.Parameters/3.3/ParameterSecondLevelValueBinding.cs	(revision 4757)
@@ -0,0 +1,111 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using System.Reflection;
+
+namespace HeuristicLab.Parameters {
+  [StorableClass]
+  public class ParameterSecondLevelActualNameBinding : IParameterBinding {
+    [Storable]
+    private IValueParameter source;
+    public IValueParameter Source {
+      get { return source; }
+    }
+    [Storable]
+    private IValueParameter destination;
+    public IValueParameter Destination {
+      get { return destination; }
+    }
+    [Storable]
+    private string sourcePropertyName;
+    public string SourcePropertyName {
+      get { return sourcePropertyName; }
+    }
+    [Storable]
+    private string destinationPropertyName;
+    public string DestinationPropertyName {
+      get { return destinationPropertyName; }
+    }
+
+    [StorableConstructor]
+    protected ParameterSecondLevelActualNameBinding(bool deserializing) { }
+    protected ParameterSecondLevelActualNameBinding(ParameterSecondLevelActualNameBinding original, Cloner cloner) {
+      this.source = cloner.Clone(source);
+      this.destination = cloner.Clone(destination);
+      RegisterEventHandlers();
+    }
+    public ParameterSecondLevelActualNameBinding(IValueParameter source, IValueParameter destination, string sourcePropertyName, string destinationPropertyName) {
+      if (source == null) throw new ArgumentNullException("source");
+      if (destination == null) throw new ArgumentNullException("destination");
+      this.source = source;
+      this.destination = destination;
+      this.sourcePropertyName = sourcePropertyName;
+      this.destinationPropertyName = destinationPropertyName;
+      RegisterEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterSecondLevelActualNameBinding(this, cloner);
+    }
+
+    public void Bind() {
+      RegisterEventHandlers();
+    }
+
+    public void Unbind() {
+      DeregisterEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
+      source.ValueChanged += new EventHandler(source_ValueChanged);
+      ILookupParameter sourceParameter = GetNestedParameter(source, sourcePropertyName);
+      if (sourceParameter != null)
+        sourceParameter.ActualNameChanged += new EventHandler(sourceParameter_ActualNameChanged);
+    }
+
+    private void DeregisterEventHandlers() {
+      source.ValueChanged -= new EventHandler(source_ValueChanged);
+
+      ILookupParameter sourceParameter = GetNestedParameter(source, sourcePropertyName);
+      if (sourceParameter != null)
+        sourceParameter.ActualNameChanged -= new EventHandler(sourceParameter_ActualNameChanged);
+    }
+
+    private ILookupParameter GetNestedParameter(IValueParameter param, string name) {
+      if (param.Value == null) return null;
+      PropertyInfo property = param.Value.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.NonPublic);
+      if (property == null) return null;
+      if (property.GetGetMethod() == null) throw new InvalidOperationException("Property " + name + " of type " + param.Value.GetType().FullName + " does not have a Get method.");
+      ILookupParameter nestedParam = (property.GetGetMethod().Invoke(param.Value, null) as ILookupParameter);
+      return nestedParam;
+    }
+
+    private void source_ValueChanged(object sender, EventArgs e) {
+      ILookupParameter sourceParameter = GetNestedParameter(source, sourcePropertyName);
+      if (sourceParameter != null) {
+        sourceParameter.ActualNameChanged += new EventHandler(sourceParameter_ActualNameChanged);
+        DoAction();
+      }
+    }
+
+    private void sourceParameter_ActualNameChanged(object sender, EventArgs e) {
+      DoAction();
+    }
+
+    private void DoAction() {
+      ILookupParameter sourceParameter = GetNestedParameter(source, sourcePropertyName);
+      ILookupParameter destinationParameter = GetNestedParameter(destination, destinationPropertyName);
+      if (destinationParameter != null)
+        destinationParameter.ActualName = sourceParameter.ActualName;
+    }
+  }
+}
Index: branches/ParameterBinding/HeuristicLab.Parameters/3.3/ParameterValueBinding.cs
===================================================================
--- branches/ParameterBinding/HeuristicLab.Parameters/3.3/ParameterValueBinding.cs	(revision 4757)
+++ branches/ParameterBinding/HeuristicLab.Parameters/3.3/ParameterValueBinding.cs	(revision 4757)
@@ -0,0 +1,68 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Parameters {
+  [StorableClass]
+  public class ParameterValueBinding : IParameterBinding {
+    [Storable]
+    private IValueParameter recipient;
+    public IValueParameter Recipient {
+      get { return recipient; }
+    }
+    [Storable]
+    private IValueParameter donor;
+    public IValueParameter Donor {
+      get { return donor; }
+    }
+
+    [StorableConstructor]
+    protected ParameterValueBinding(bool deserializing) { }
+    protected ParameterValueBinding(ParameterValueBinding original, Cloner cloner) {
+      this.donor = cloner.Clone(donor);
+      this.recipient = cloner.Clone(recipient);
+      RegisterEventHandlers();
+    }
+    public ParameterValueBinding(IValueParameter recipient, IValueParameter donor) {
+      if (recipient == null) throw new ArgumentNullException("destination");
+      if (donor == null) throw new ArgumentNullException("source");
+      this.recipient = recipient;
+      this.donor = donor;
+      RegisterEventHandlers();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterValueBinding(this, cloner);
+    }
+
+    public void Bind() {
+      RegisterEventHandlers();
+    }
+
+    public void Unbind() {
+      DeregisterEventHandlers();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
+      donor.ValueChanged += new EventHandler(source_ValueChanged);
+    }
+
+    private void DeregisterEventHandlers() {
+      donor.ValueChanged -= new EventHandler(source_ValueChanged);
+    }
+    
+
+    private void source_ValueChanged(object sender, EventArgs e) {
+      recipient.Value = (IItem)donor.Value.Clone();
+    }
+  }
+}
Index: branches/ParameterBinding/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- branches/ParameterBinding/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 4745)
+++ branches/ParameterBinding/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 4757)
@@ -239,10 +239,4 @@
       ParameterizeAnalyzers();
     }
-    private void MoveGenerator_InversionMoveParameter_ActualNameChanged(object sender, EventArgs e) {
-      string name = ((ILookupParameter<InversionMove>)sender).ActualName;
-      foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>()) {
-        op.InversionMoveParameter.ActualName = name;
-      }
-    }
     private void MoveGenerator_TranslocationMoveParameter_ActualNameChanged(object sender, EventArgs e) {
       string name = ((ILookupParameter<TranslocationMove>)sender).ActualName;
@@ -285,12 +279,20 @@
     }
     private void InitializeMoveGenerators() {
-      foreach (IPermutationInversionMoveOperator op in Operators.OfType<IPermutationInversionMoveOperator>()) {
-        if (op is IMoveGenerator) {
-          op.InversionMoveParameter.ActualNameChanged += new EventHandler(MoveGenerator_InversionMoveParameter_ActualNameChanged);
+      foreach (IPermutationInversionMoveOperator moveGen in Operators.OfType<IMoveGenerator>().OfType<IPermutationInversionMoveOperator>()) {
+        foreach (IPermutationInversionMoveOperator moveOp in Operators.Where(x => ! (x is IMoveGenerator)).OfType<IPermutationInversionMoveOperator>()) {
+          ParameterActualNameBinding binding = new ParameterActualNameBinding(
+            moveGen.InversionMoveParameter,
+            moveOp.InversionMoveParameter);
+          ParameterBindingList.Add(binding);
+          binding.Bind();
         }
       }
-      foreach (IPermutationTranslocationMoveOperator op in Operators.OfType<IPermutationTranslocationMoveOperator>()) {
-        if (op is IMoveGenerator) {
-          op.TranslocationMoveParameter.ActualNameChanged += new EventHandler(MoveGenerator_TranslocationMoveParameter_ActualNameChanged);
+      foreach (IPermutationTranslocationMoveOperator moveGen in Operators.OfType<IMoveGenerator>().OfType<IPermutationTranslocationMoveOperator>()) {
+        foreach (IPermutationTranslocationMoveOperator moveOp in Operators.Where(x => !(x is IMoveGenerator)).OfType<IPermutationTranslocationMoveOperator>()) {
+          ParameterActualNameBinding binding = new ParameterActualNameBinding(
+            moveGen.TranslocationMoveParameter,
+            moveOp.TranslocationMoveParameter);
+          ParameterBindingList.Add(binding);
+          binding.Bind();
         }
       }
@@ -310,4 +312,11 @@
     }
     private void ParameterizeEvaluator() {
+      ParameterSecondLevelActualNameBinding binding = new ParameterSecondLevelActualNameBinding(
+        SolutionCreatorParameter, EvaluatorParameter,
+        "PermutationParameter", "PermutationParameter"
+        );
+      ParameterBindingList.Add(binding);
+      binding.Bind();
+
       if (Evaluator is ITSPPathEvaluator)
         ((ITSPPathEvaluator)Evaluator).PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
