Index: /trunk/sources/HeuristicLab.Operators/CombinedOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/CombinedOperator.cs	(revision 47)
+++ /trunk/sources/HeuristicLab.Operators/CombinedOperator.cs	(revision 48)
@@ -41,14 +41,8 @@
       : base() {
       myDescription =
-        "A combined operator contains a whole operator graph. It is useful for modularization to assemble complex operators out of simpler ones.\r\n\r\n" +
-        "A combined operator can automatically inject its sub-operators into the scope it is applied on. Those operators can be extracted again in the contained operator graph by using an OperatorExtractor. So it is possible to parameterize a combined operator with custom operators. To activate sub-operator injection take a look at the local variables InjectSubOperators and SubOperatorNames.";
+        @"A combined operator contains a whole operator graph. It is useful for modularization to assemble complex operators out of simpler ones.
+
+A combined operator automatically inject its sub-operators into the scope it is applied on. Thereby the names of the sub-operators are used as variable names. Those operators can be extracted again in the contained operator graph by using an OperatorExtractor. So it is possible to parameterize a combined operator with custom operators.";
       myOperatorGraph = new OperatorGraph();
-      AddVariableInfo(new VariableInfo("InjectSubOperators", "true if the sub-operators of this combined operator should be injected into the scope", typeof(BoolData), VariableKind.In));
-      GetVariableInfo("InjectSubOperators").Local = true;
-      AddVariable(new Variable("InjectSubOperators", new BoolData(false)));
-      AddVariableInfo(new VariableInfo("SubOperatorNames", "Variable names for injecting the sub-operators", typeof(ItemList<StringData>), VariableKind.In));
-      GetVariableInfo("SubOperatorNames").Local = true;
-      ItemList<StringData> subOperatorNames = new ItemList<StringData>();
-      AddVariable(new Variable("SubOperatorNames", subOperatorNames));
     }
 
@@ -72,12 +66,8 @@
     public override IOperation Apply(IScope scope) {
       if (OperatorGraph.InitialOperator != null) {
-        bool inject = GetVariableValue<BoolData>("InjectSubOperators", scope, false).Data;
-        if (inject) {
-          ItemList<StringData> names = GetVariableValue<ItemList<StringData>>("SubOperatorNames", scope, false);
-          for (int i = 0; i < SubOperators.Count; i++) {
-            if (scope.GetVariable(names[i].Data) != null)
-              scope.RemoveVariable(names[i].Data);
-            scope.AddVariable(new Variable(names[i].Data, SubOperators[i]));
-          }
+        for (int i = 0; i < SubOperators.Count; i++) {
+          if (scope.GetVariable(SubOperators[i].Name) != null)
+            scope.RemoveVariable(SubOperators[i].Name);
+          scope.AddVariable(new Variable(SubOperators[i].Name, SubOperators[i]));
         }
         return new AtomicOperation(OperatorGraph.InitialOperator, scope);
Index: /trunk/sources/HeuristicLab.Operators/OperatorExtractor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators/OperatorExtractor.cs	(revision 47)
+++ /trunk/sources/HeuristicLab.Operators/OperatorExtractor.cs	(revision 48)
@@ -29,29 +29,15 @@
   public class OperatorExtractor : OperatorBase {
     public override string Description {
-      get { return @"TODO\r\nOperator description still missing ..."; }
+      get { return @"An operator extractor retrievs an operator from the scope it is applied on and returns a successor operation containing this operator and the current scope. Lookup for the operator is done recursively.
+
+Operator extractors can be used to get those operators again that have been injected by combined operators."; }
     }
 
     public OperatorExtractor()
       : base() {
-      AddVariableInfo(new VariableInfo("Name", "Variable name of the operator to extract and execute from the scope", typeof(StringData), VariableKind.In));
-      GetVariableInfo("Name").Local = true;
-      AddVariable(new Variable("Name", new StringData("Name")));
-      AddVariableInfo(new VariableInfo("ReplaceSubOperators", "True if the sub-operators of the extracted operator should be replaced with the sub-operators of the operator extractor", typeof(BoolData), VariableKind.In));
-      GetVariableInfo("ReplaceSubOperators").Local = true;
-      AddVariable(new Variable("ReplaceSubOperators", new BoolData(false)));
     }
 
     public override IOperation Apply(IScope scope) {
-      string name = GetVariableValue<StringData>("Name", scope, false).Data;
-      bool replace = GetVariableValue<BoolData>("ReplaceSubOperators", scope, false).Data;
-      IOperator op = scope.GetVariableValue<IOperator>(name, true);
-
-      if (replace) {
-        while (op.SubOperators.Count > 0)
-          op.RemoveSubOperator(0);
-        foreach (IOperator subOperator in SubOperators)
-          op.AddSubOperator(subOperator);
-      }
-
+      IOperator op = scope.GetVariableValue<IOperator>(Name, true, true);
       return new AtomicOperation(op, scope);
     }
