Index: trunk/sources/HeuristicLab.StructureIdentification/DelegatingOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.StructureIdentification/DelegatingOperator.cs	(revision 88)
+++ trunk/sources/HeuristicLab.StructureIdentification/DelegatingOperator.cs	(revision 88)
@@ -0,0 +1,42 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.StructureIdentification {
+  public abstract class DelegatingOperator : OperatorBase {
+    public override IOperation Execute(IScope scope) {
+      myCanceled = false;
+
+      // copied from CombinedOperator (gkronber 22.3.08)
+      if(scope.GetVariable(Guid.ToString()) == null) { // contained operator not yet executed
+        // add marker
+        scope.AddVariable(new Variable(Guid.ToString(), new NullData()));
+
+        // add aliases
+        foreach(IVariableInfo variableInfo in VariableInfos)
+          scope.AddAlias(variableInfo.FormalName, variableInfo.ActualName);
+
+        CompositeOperation next = new CompositeOperation();
+        next.AddOperation(Apply(scope));
+        // execute combined operator again after contained operators have been executed
+        next.AddOperation(new AtomicOperation(this, scope));
+
+        OnExecuted();
+        return next;
+      } else {  // contained operator already executed
+        // remove marker
+        scope.RemoveVariable(Guid.ToString());
+
+        // remove aliases
+        foreach(IVariableInfo variableInfo in VariableInfos)
+          scope.RemoveAlias(variableInfo.FormalName);
+
+        OnExecuted();
+        return null;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj
===================================================================
--- trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj	(revision 77)
+++ trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj	(revision 88)
@@ -48,4 +48,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="DelegatingOperator.cs" />
     <Compile Include="Evaluation\CoefficientOfDeterminationEvaluator.cs" />
     <Compile Include="Evaluation\FunctionEvaluator.cs">
Index: trunk/sources/HeuristicLab.StructureIdentification/Manipulation/FullTreeShaker.cs
===================================================================
--- trunk/sources/HeuristicLab.StructureIdentification/Manipulation/FullTreeShaker.cs	(revision 77)
+++ trunk/sources/HeuristicLab.StructureIdentification/Manipulation/FullTreeShaker.cs	(revision 88)
@@ -31,5 +31,5 @@
 
 namespace HeuristicLab.StructureIdentification {
-  public class FullTreeShaker : OperatorBase {
+  public class FullTreeShaker : DelegatingOperator {
     public override string Description {
       get { return "Manipulates all tree nodes for which a '"+GPOperatorLibrary.MANIPULATION+"' variable is defined."; }
Index: trunk/sources/HeuristicLab.StructureIdentification/Manipulation/OnePointShaker.cs
===================================================================
--- trunk/sources/HeuristicLab.StructureIdentification/Manipulation/OnePointShaker.cs	(revision 77)
+++ trunk/sources/HeuristicLab.StructureIdentification/Manipulation/OnePointShaker.cs	(revision 88)
@@ -31,5 +31,5 @@
 
 namespace HeuristicLab.StructureIdentification {
-  public class OnePointShaker : OperatorBase {
+  public class OnePointShaker : DelegatingOperator {
     public override string Description {
       get { return "Selects a random node of all tree-nodes that have a '"+GPOperatorLibrary.MANIPULATION+"' variable defined and manipulates the selected node."; }
@@ -60,4 +60,7 @@
       // store all local variables into a temporary scope
       Scope tempScope = new Scope("Temp. manipulation scope");
+      // add aliases
+      foreach(IVariableInfo variableInfo in VariableInfos)
+        tempScope.AddAlias(variableInfo.FormalName, variableInfo.ActualName);
 
       foreach(IVariableInfo info in selectedOp.VariableInfos) {
