Index: trunk/sources/HeuristicLab.Operators/3.3/AlgorithmOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/AlgorithmOperator.cs	(revision 2830)
+++ trunk/sources/HeuristicLab.Operators/3.3/AlgorithmOperator.cs	(revision 2830)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Drawing;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Operators {
+  /// <summary>
+  /// An operator which represents an algorithm represented as an operator graph.
+  /// </summary>
+  [Item("AlgorithmOperator", "An operator which represents an algorithm represented as an operator graph.")]
+  public abstract class AlgorithmOperator : SingleSuccessorOperator {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Module; }
+    }
+    [Storable]
+    private OperatorGraph operatorGraph;
+    public OperatorGraph OperatorGraph {
+      get { return operatorGraph; }
+    }
+
+    protected AlgorithmOperator()
+      : base() {
+      operatorGraph = new OperatorGraph();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      AlgorithmOperator clone = (AlgorithmOperator)base.Clone(cloner);
+      clone.operatorGraph = (OperatorGraph)cloner.Clone(operatorGraph);
+      return clone;
+    }
+
+    public override IExecutionSequence Apply() {
+      ExecutionContextCollection next = new ExecutionContextCollection(base.Apply());
+      if (operatorGraph.InitialOperator != null)
+        next.Insert(0, ExecutionContext.CreateChildContext(operatorGraph.InitialOperator));
+      return next;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs	(revision 2818)
+++ trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs	(revision 2830)
@@ -27,17 +27,9 @@
 namespace HeuristicLab.Operators {
   /// <summary>
-  /// Operator which contains an operator graph.
+  /// An operator which contains an operator graph.
   /// </summary>
   [Item("CombinedOperator", "An operator which contains an operator graph.")]
   [Creatable("Test")]
-  public sealed class CombinedOperator : SingleSuccessorOperator, IOperator {
-    public override Image ItemImage {
-      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Module; }
-    }
-    [Storable]
-    private OperatorGraph operatorGraph;
-    public OperatorGraph OperatorGraph {
-      get { return operatorGraph; }
-    }
+  public sealed class CombinedOperator : AlgorithmOperator, IOperator {
     public new ParameterCollection Parameters {
       get {
@@ -52,21 +44,5 @@
     }
 
-    public CombinedOperator()
-      : base() {
-      operatorGraph = new OperatorGraph();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      CombinedOperator clone = (CombinedOperator)base.Clone(cloner);
-      clone.operatorGraph = (OperatorGraph)cloner.Clone(operatorGraph);
-      return clone;
-    }
-
-    public override IExecutionSequence Apply() {
-      ExecutionContextCollection next = new ExecutionContextCollection(base.Apply());
-      if (operatorGraph.InitialOperator != null)
-        next.Insert(0, ExecutionContext.CreateChildContext(operatorGraph.InitialOperator));
-      return next;
-    }
+    public CombinedOperator() : base() { }
   }
 }
Index: trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 2818)
+++ trunk/sources/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 2830)
@@ -90,4 +90,5 @@
     <Compile Include="Comparator.cs" />
     <Compile Include="Assigner.cs" />
+    <Compile Include="AlgorithmOperator.cs" />
     <Compile Include="MultipleCallsOperator.cs" />
     <Compile Include="Operator.cs" />
Index: trunk/sources/HeuristicLab.Operators/3.3/ParallelSubScopesProcessor.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/ParallelSubScopesProcessor.cs	(revision 2818)
+++ trunk/sources/HeuristicLab.Operators/3.3/ParallelSubScopesProcessor.cs	(revision 2830)
@@ -39,5 +39,5 @@
         inner.Parallel = true;
         for (int i = 0; (i < ExecutionContext.Scope.SubScopes.Count) && (i < Operators.Count); i++)
-          inner.Add(ExecutionContext.CreateContext(Operators[i], ExecutionContext.Scope.SubScopes[i]));
+          if (Operators[i] != null) inner.Add(ExecutionContext.CreateContext(Operators[i], ExecutionContext.Scope.SubScopes[i]));
         next.Insert(0, inner);
       }
Index: trunk/sources/HeuristicLab.Operators/3.3/SequentialSubScopesProcessor.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/SequentialSubScopesProcessor.cs	(revision 2818)
+++ trunk/sources/HeuristicLab.Operators/3.3/SequentialSubScopesProcessor.cs	(revision 2830)
@@ -38,5 +38,5 @@
         ExecutionContextCollection inner = new ExecutionContextCollection();
         for (int i = 0; (i < ExecutionContext.Scope.SubScopes.Count) && (i < Operators.Count); i++)
-          inner.Add(ExecutionContext.CreateContext(Operators[i], ExecutionContext.Scope.SubScopes[i]));
+          if (Operators[i] != null) inner.Add(ExecutionContext.CreateContext(Operators[i], ExecutionContext.Scope.SubScopes[i]));
         next.Insert(0, inner);
       }
Index: trunk/sources/HeuristicLab.Operators/3.3/SubScopesRemover.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/SubScopesRemover.cs	(revision 2818)
+++ trunk/sources/HeuristicLab.Operators/3.3/SubScopesRemover.cs	(revision 2830)
@@ -27,15 +27,23 @@
 namespace HeuristicLab.Operators {
   /// <summary>
-  /// An operator which removes one specified or (if not specified) all sub-scopes from the current scope.
+  /// An operator which removes all sub-scopes or one specified sub-scope from the current scope.
   /// </summary>
-  [Item("SubScopesRemover", "An operator which removes one specified or (if not specified) all sub-scopes from the current scope.")]
+  [Item("SubScopesRemover", "An operator which removes all sub-scopes or one specified sub-scope from the current scope.")]
   [EmptyStorableClass]
   [Creatable("Test")]
-  public class SubScopesRemover : SingleSuccessorOperator {
+  public sealed class SubScopesRemover : SingleSuccessorOperator {
+    private ValueParameter<BoolData> RemoveAllSubScopesParameter {
+      get { return (ValueParameter<BoolData>)Parameters["RemoveAllSubScopes"]; }
+    }
     public ValueLookupParameter<IntData> SubScopeIndexParameter {
       get { return (ValueLookupParameter<IntData>)Parameters["SubScopeIndex"]; }
     }
-    protected ScopeParameter CurrentScopeParameter {
+    private ScopeParameter CurrentScopeParameter {
       get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    public bool RemoveAllSubScopes {
+      get { return RemoveAllSubScopesParameter.Value.Value; }
+      set { RemoveAllSubScopesParameter.Value.Value = value; }
     }
     public IScope CurrentScope {
@@ -45,14 +53,15 @@
     public SubScopesRemover()
       : base() {
-      Parameters.Add(new ValueLookupParameter<IntData>("SubScopeIndex", "The index of the sub-scope which should be removed. If this parameter has no value, all sub-scopes of the current scope are removed."));
+      Parameters.Add(new ValueParameter<BoolData>("RemoveAllSubScopes", "True if all sub-scopes of the current scope should be removed, otherwise false.", new BoolData(true)));
+      Parameters.Add(new ValueLookupParameter<IntData>("SubScopeIndex", "The index of the sub-scope which should be removed. This parameter is ignored, if RemoveAllSubScopes is true."));
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope from which one or all sub-scopes should be removed."));
     }
 
     public override IExecutionSequence Apply() {
-      IntData index = SubScopeIndexParameter.ActualValue;
-      if (index != null)
-        CurrentScope.SubScopes.RemoveAt(index.Value);
-      else
+      if (RemoveAllSubScopes)
         CurrentScope.SubScopes.Clear();
+      else {
+        CurrentScope.SubScopes.RemoveAt(SubScopeIndexParameter.ActualValue.Value);
+      }
       return base.Apply();
     }
