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();
+    }
+  }
+}
