Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/BestPointInitializer.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/BestPointInitializer.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/BestPointInitializer.cs	(revision 5410)
@@ -36,18 +36,18 @@
 
     #region Parameter properties
-    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
-      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public LookupParameter<DoubleValue> BestQualityParameter {
-      get { return (LookupParameter<DoubleValue>)Parameters["BestQuality"]; }
+    public ILookupParameter<DoubleValue> BestQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["BestQuality"]; }
     }
-    public ScopeTreeLookupParameter<RealVector> PointParameter {
-      get { return (ScopeTreeLookupParameter<RealVector>)Parameters["Point"]; }
+    public IScopeTreeLookupParameter<RealVector> PointParameter {
+      get { return (IScopeTreeLookupParameter<RealVector>)Parameters["Point"]; }
     }
-    public LookupParameter<RealVector> BestPointParameter {
-      get { return (LookupParameter<RealVector>)Parameters["BestPoint"]; }
+    public ILookupParameter<RealVector> BestPointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["BestPoint"]; }
     }
-    public ValueLookupParameter<BoolValue> MaximizationParameter {
-      get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
     }
     #endregion
Index: anches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/EmptyTopologyInitializer.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/EmptyTopologyInitializer.cs	(revision 5409)
+++ 	(revision )
@@ -1,48 +1,0 @@
-﻿#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 HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-
-  [Item("Empty Topology Initializer", "Does not initialize topology vectors. Best used with the totally connected particle updater that used the global best point instead of the best neighbor point.")]
-  [StorableClass]
-  public class EmptyTopologyInitializer : TopologyInitializer {
-
-    #region Construction & Cloning
-    public EmptyTopologyInitializer() { }
-    [StorableConstructor]
-    protected EmptyTopologyInitializer(bool deserializing) : base(deserializing) { }
-    protected EmptyTopologyInitializer(EmptyTopologyInitializer original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new EmptyTopologyInitializer(this, cloner);
-    }
-    #endregion
-
-    public override IOperation Apply() {
-      return base.Apply();
-    }
-
-  }
-}
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj	(revision 5410)
@@ -117,8 +117,6 @@
     <Compile Include="RandomTopologyInitializer.cs" />
     <Compile Include="VonNeumannTopologyInitializer.cs" />
-    <Compile Include="EmptyTopologyInitializer.cs" />
     <Compile Include="RingTopologyInitializer.cs" />
     <Compile Include="ITopologyUpdater.cs" />
-    <Compile Include="IdentityTopologyUpdater.cs" />
     <Compile Include="NeighborUpdater.cs" />
     <Compile Include="TopologyInitializer.cs" />
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IParticleUpdater.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IParticleUpdater.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IParticleUpdater.cs	(revision 5410)
@@ -27,19 +27,19 @@
 namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
 
-  public interface IParticleUpdater : INamedItem {
+  public interface IParticleUpdater : IOperator {
 
-    LookupParameter<RealVector> VelocityParameter { get; }
-    LookupParameter<DoubleMatrix> VelocityBoundsParameter { get; }
+    ILookupParameter<RealVector> VelocityParameter { get; }
+    ILookupParameter<DoubleMatrix> VelocityBoundsParameter { get; }
 
-    LookupParameter<RealVector> PointParameter { get; }
-    LookupParameter<DoubleMatrix> BoundsParameter { get; }
+    ILookupParameter<RealVector> PointParameter { get; }
+    ILookupParameter<DoubleMatrix> BoundsParameter { get; }
 
-    LookupParameter<RealVector> PersonalBestPointParameter { get; }
-    LookupParameter<RealVector> BestNeighborPointParameter { get; }
-    LookupParameter<RealVector> BestPointParameter { get; }
+    ILookupParameter<RealVector> PersonalBestPointParameter { get; }
+    ILookupParameter<RealVector> BestNeighborPointParameter { get; }
+    ILookupParameter<RealVector> BestPointParameter { get; }
 
-    LookupParameter<DoubleValue> OmegaParameter { get; }
-    LookupParameter<DoubleValue> Phi_PParameter { get; }
-    LookupParameter<DoubleValue> Phi_GParameter { get; }
+    ILookupParameter<DoubleValue> OmegaParameter { get; }
+    ILookupParameter<DoubleValue> Phi_PParameter { get; }
+    ILookupParameter<DoubleValue> Phi_GParameter { get; }
   }
 
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyInitializer.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyInitializer.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyInitializer.cs	(revision 5410)
@@ -26,7 +26,7 @@
 namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
 
-  public interface ITopologyInitializer : IItem {
-    ScopeTreeLookupParameter<IntegerVector> NeighborsParameter { get; }
-    LookupParameter<IntValue> SwarmSizeParameter { get; }
+  public interface ITopologyInitializer : IOperator {
+    IScopeTreeLookupParameter<IntegerVector> NeighborsParameter { get; }
+    ILookupParameter<IntValue> SwarmSizeParameter { get; }
   }
 
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyUpdater.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyUpdater.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyUpdater.cs	(revision 5410)
@@ -26,5 +26,5 @@
 
   public interface ITopologyUpdater : IItem {
-    ScopeTreeLookupParameter<IntegerVector> NeighborsParameter { get; }
+    IScopeTreeLookupParameter<IntegerVector> NeighborsParameter { get; }
   }
 
Index: anches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IdentityTopologyUpdater.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IdentityTopologyUpdater.cs	(revision 5409)
+++ 	(revision )
@@ -1,51 +1,0 @@
-﻿using HeuristicLab.Common;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-#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 HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Core;
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-
-  [Item("Identity Topology Updater", "Does not change the topology.")]
-  [StorableClass]
-  public class IdentityTopologyUpdater : SingleSuccessorOperator, ITopologyUpdater {
-
-    public ScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
-      get { return (ScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
-    }
-
-    public IdentityTopologyUpdater() {
-      Parameters.Add(new ScopeTreeLookupParameter<IntegerVector>("Neighbors", "The list of neighbors for each particle."));
-    }
-    [StorableConstructor]
-    protected IdentityTopologyUpdater(bool deserializing) : base(deserializing) { }
-    protected IdentityTopologyUpdater(IdentityTopologyUpdater original, Cloner cloner)
-      : base(original, cloner) {
-    }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new IdentityTopologyUpdater(this, cloner);
-    }
-  }
-
-}
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/MultiPSOTopologyUpdater.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/MultiPSOTopologyUpdater.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/MultiPSOTopologyUpdater.cs	(revision 5410)
@@ -16,21 +16,21 @@
   public class MultiPSOTopologyUpdater : SingleSuccessorOperator, ITopologyUpdater, ITopologyInitializer {
     #region Parameters
-    public LookupParameter<IRandom> RandomParameter {
-      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
     }
-    public ValueLookupParameter<IntValue> NrOfConnectionsParameter {
-      get { return (ValueLookupParameter<IntValue>)Parameters["NrOfConnections"]; }
+    public IValueLookupParameter<IntValue> NrOfConnectionsParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["NrOfConnections"]; }
     }
-    public LookupParameter<IntValue> SwarmSizeParameter {
-      get { return (LookupParameter<IntValue>)Parameters["SwarmSize"]; }
+    public ILookupParameter<IntValue> SwarmSizeParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["SwarmSize"]; }
     }
-    public ScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
-      get { return (ScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
+    public IScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
+      get { return (IScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
     }
-    public LookupParameter<IntValue> CurrentIterationParameter {
-      get { return (LookupParameter<IntValue>)Parameters["CurrentIteration"]; }
+    public ILookupParameter<IntValue> CurrentIterationParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["CurrentIteration"]; }
     }
-    public ValueLookupParameter<IntValue> RegroupingPeriodParameter {
-      get { return (ValueLookupParameter<IntValue>)Parameters["RegroupingPeriod"]; }
+    public IValueLookupParameter<IntValue> RegroupingPeriodParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["RegroupingPeriod"]; }
     }
     #endregion
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborUpdater.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborUpdater.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborUpdater.cs	(revision 5410)
@@ -36,18 +36,18 @@
 
     #region Parameters
-    public ScopeTreeLookupParameter<RealVector> PointsParameter {
-      get { return (ScopeTreeLookupParameter<RealVector>)Parameters["Point"]; }
+    public IScopeTreeLookupParameter<RealVector> PointsParameter {
+      get { return (IScopeTreeLookupParameter<RealVector>)Parameters["Point"]; }
     }
-    public ScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
-      get { return (ScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
+    public IScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
+      get { return (IScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
     }
-    public ScopeTreeLookupParameter<RealVector> BestNeighborPointParameter {
-      get { return (ScopeTreeLookupParameter<RealVector>)Parameters["BestNeighborPoint"]; }
+    public IScopeTreeLookupParameter<RealVector> BestNeighborPointParameter {
+      get { return (IScopeTreeLookupParameter<RealVector>)Parameters["BestNeighborPoint"]; }
     }
-    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
-      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public LookupParameter<BoolValue> MaximizationParameter {
-      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    public ILookupParameter<BoolValue> MaximizationParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["Maximization"]; }
     }
     #endregion
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborhoodParticleUpdater.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborhoodParticleUpdater.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborhoodParticleUpdater.cs	(revision 5410)
@@ -49,9 +49,12 @@
       double r_p = Random.NextDouble();
       double r_g = Random.NextDouble();
+      double omega = Omega.Value;
+      double phi_p = Phi_P.Value;
+      double phi_g = Phi_G.Value;
       for (int i = 0; i < velocity.Length; i++) {
         velocity[i] =
-          Velocity[i] * Omega +
-          (PersonalBestPoint[i] - Point[i]) * Phi_P * r_p +
-          (BestNeighborPoint[i] - Point[i]) * Phi_G * r_g;
+          Velocity[i] * omega +
+          (PersonalBestPoint[i] - Point[i]) * phi_p * r_p +
+          (BestNeighborPoint[i] - Point[i]) * phi_g * r_g;
       }
       BoundsChecker.Apply(velocity, VelocityBounds);
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 5410)
@@ -34,4 +34,5 @@
 using HeuristicLab.PluginInfrastructure;
 using HeuristicLab.Random;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
@@ -65,39 +66,39 @@
 
     #region Parameter Properties
-    public ValueParameter<IntValue> SeedParameter {
-      get { return (ValueParameter<IntValue>)Parameters["Seed"]; }
-    }
-    public ValueParameter<BoolValue> SetSeedRandomlyParameter {
-      get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
-    }
-    public ValueParameter<IntValue> SwarmSizeParameter {
-      get { return (ValueParameter<IntValue>)Parameters["SwarmSize"]; }
-    }
-    public ValueParameter<IntValue> MaxIterationsParameter {
-      get { return (ValueParameter<IntValue>)Parameters["MaxIterations"]; }
-    }
-    public ValueParameter<DoubleValue> OmegaParameter {
-      get { return (ValueParameter<DoubleValue>)Parameters["Omega"]; }
-    }
-    public ValueParameter<DoubleValue> Phi_PParameter {
-      get { return (ValueParameter<DoubleValue>)Parameters["Phi_P"]; }
-    }
-    public ValueParameter<DoubleValue> Phi_GParameter {
-      get { return (ValueParameter<DoubleValue>)Parameters["Phi_G"]; }
-    }
-    public ValueParameter<MultiAnalyzer> AnalyzerParameter {
-      get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
-    }
-    public ValueLookupParameter<DoubleMatrix> VelocityBoundsParameter {
-      get { return (ValueLookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
+    public IValueParameter<IntValue> SeedParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Seed"]; }
+    }
+    public IValueParameter<BoolValue> SetSeedRandomlyParameter {
+      get { return (IValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
+    }
+    public IValueParameter<IntValue> SwarmSizeParameter {
+      get { return (IValueParameter<IntValue>)Parameters["SwarmSize"]; }
+    }
+    public IValueParameter<IntValue> MaxIterationsParameter {
+      get { return (IValueParameter<IntValue>)Parameters["MaxIterations"]; }
+    }
+    public IValueParameter<DoubleValue> OmegaParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Omega"]; }
+    }
+    public IValueParameter<DoubleValue> Phi_PParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Phi_P"]; }
+    }
+    public IValueParameter<DoubleValue> Phi_GParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Phi_G"]; }
+    }
+    public IValueParameter<MultiAnalyzer> AnalyzerParameter {
+      get { return (IValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
+    }
+    public IValueLookupParameter<DoubleMatrix> VelocityBoundsParameter {
+      get { return (IValueLookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
     }
     public ConstrainedValueParameter<IParticleUpdater> ParticleUpdaterParameter {
       get { return (ConstrainedValueParameter<IParticleUpdater>)Parameters["ParticleUpdater"]; }
     }
-    public ConstrainedValueParameter<ITopologyInitializer> TopologyInitializerParameter {
-      get { return (ConstrainedValueParameter<ITopologyInitializer>)Parameters["TopologyInitializer"]; }
-    }
-    public ConstrainedValueParameter<ITopologyUpdater> TopologyUpdaterParameter {
-      get { return (ConstrainedValueParameter<ITopologyUpdater>)Parameters["TopologyUpdater"]; }
+    public OptionalConstrainedValueParameter<ITopologyInitializer> TopologyInitializerParameter {
+      get { return (OptionalConstrainedValueParameter<ITopologyInitializer>)Parameters["TopologyInitializer"]; }
+    }
+    public OptionalConstrainedValueParameter<ITopologyUpdater> TopologyUpdaterParameter {
+      get { return (OptionalConstrainedValueParameter<ITopologyUpdater>)Parameters["TopologyUpdater"]; }
     }
     public OptionalConstrainedValueParameter<IDiscreteDoubleMatrixModifier> VelocityBoundsUpdaterParameter {
@@ -134,10 +135,15 @@
 
     [StorableConstructor]
-    protected ParticleSwarmOptimization(bool deserializing) : base(deserializing) {
-      Initialize();
+    protected ParticleSwarmOptimization(bool deserializing)
+      : base(deserializing) {
     }
     protected ParticleSwarmOptimization(ParticleSwarmOptimization original, Cloner cloner)
       : base(original, cloner) {
       qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      Initialize();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
       Initialize();
     }
@@ -154,14 +160,10 @@
       Parameters.Add(new ValueParameter<DoubleValue>("Phi_G", "Weight for global best position.", new DoubleValue(3.7)));
       Parameters.Add(new ValueLookupParameter<DoubleMatrix>("VelocityBounds", "Maximum Velocity in every dimension", new DoubleMatrix(new double[,] { { -1, 1 } })));
-      Parameters.Add(new ConstrainedValueParameter<IParticleUpdater>("ParticleUpdater", "Operator that calculates new position and velocity of a particle",
-        new ItemSet<IParticleUpdater>(ApplicationManager.Manager.GetInstances<IParticleUpdater>())));
-      Parameters.Add(new ConstrainedValueParameter<ITopologyInitializer>("TopologyInitializer", "Creates neighborhood description vectors",
-        new ItemSet<ITopologyInitializer>(ApplicationManager.Manager.GetInstances<ITopologyInitializer>())));
-      Parameters.Add(new ConstrainedValueParameter<ITopologyUpdater>("TopologyUpdater", "Updates the neighborhood description vectors",
-        new ItemSet<ITopologyUpdater>(ApplicationManager.Manager.GetInstances<ITopologyUpdater>())));
+      Parameters.Add(new ConstrainedValueParameter<IParticleUpdater>("ParticleUpdater", "Operator that calculates new position and velocity of a particle"));
+      Parameters.Add(new OptionalConstrainedValueParameter<ITopologyInitializer>("TopologyInitializer", "Creates neighborhood description vectors"));
+      Parameters.Add(new OptionalConstrainedValueParameter<ITopologyUpdater>("TopologyUpdater", "Updates the neighborhood description vectors"));
       Parameters.Add(new OptionalConstrainedValueParameter<IDiscreteDoubleValueModifier>("OmegaUpdater", "Updates the omega parameter"));
       Parameters.Add(new OptionalConstrainedValueParameter<IDiscreteDoubleMatrixModifier>("VelocityBoundsUpdater", "Adjusts the velocity bounds."));
       ParticleUpdaterParameter.ActualValue = ParticleUpdaterParameter.ValidValues.SingleOrDefault(v => v.GetType() == typeof(TotallyConnectedParticleUpdater));
-      TopologyInitializerParameter.ActualValue = TopologyInitializerParameter.ValidValues.SingleOrDefault(v => v.GetType() == typeof(EmptyTopologyInitializer));
 
       RandomCreator randomCreator = new RandomCreator();
@@ -274,73 +276,6 @@
       UpdateOmegaUpdater();
       InitOmegaUpdater();
+      UpdateTopologyInitializer();
       Initialize();
-    }
-
-    private void Initialize() {
-      TopologyInitializerParameter.ValueChanged += new EventHandler(TopologyInitializerParameter_ValueChanged);
-      ParticleUpdaterParameter.ValueChanged += new EventHandler(ParticleUpdaterParameter_ValueChanged);
-      TopologyUpdaterParameter.ValueChanged += new EventHandler(TopologyUpdaterParameter_ValueChanged);
-    }
-
-    void TopologyUpdaterParameter_ValueChanged(object sender, EventArgs e) {
-      if (TopologyInitializer is EmptyTopologyInitializer) { // no topology updater allowed
-        if (TopologyUpdater != null) {
-          TopologyUpdater = null;
-        }
-      }
-    }
-
-    void ParticleUpdaterParameter_ValueChanged(object sender, EventArgs e) {
-      if (TopologyInitializer is EmptyTopologyInitializer) { // only global particle updater allowed
-        if (!(ParticleUpdater is IGlobalParticleUpdater)) {
-          ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is IGlobalParticleUpdater).First();
-        }
-      } else {  // only local particle updater allowed
-        if (!(ParticleUpdater is ILocalParticleUpdater)) {
-          ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is ILocalParticleUpdater).First();
-        }
-      }
-    }
-
-    void TopologyInitializerParameter_ValueChanged(object sender, EventArgs e) {
-      if (TopologyInitializer is EmptyTopologyInitializer) {   // only allow global particle update and no topology update
-        if (ParticleUpdaterParameter.ValidValues.Count > 0) {
-          if (!(ParticleUpdater is IGlobalParticleUpdater)) {
-            ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is IGlobalParticleUpdater).First();
-          }
-        }
-        if (TopologyUpdaterParameter.ValidValues.Count > 0) {
-          if (!(TopologyUpdater != null)) {
-            TopologyUpdater = null;
-          }
-        }
-      } else { // only allow local particle update; topology change possible
-        if (ParticleUpdaterParameter.ValidValues.Count > 0) {
-          if (!(ParticleUpdater is ILocalParticleUpdater)) {
-            ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is ILocalParticleUpdater).First();
-          }
-        }
-      }
-    }
-
-    private static void InitializeParticleCreator(CombinedOperator particleCreator) {
-      Placeholder positionCreator = new Placeholder();
-      Assigner personalBestPositionAssigner = new Assigner();
-      UniformRandomRealVectorCreator velocityCreator = new UniformRandomRealVectorCreator();
-
-      particleCreator.Name = "Particle Creator";
-      particleCreator.OperatorGraph.InitialOperator = positionCreator;
-
-      positionCreator.Name = "(SolutionCreator)";
-      positionCreator.OperatorParameter.ActualName = "SolutionCreator";
-      positionCreator.Successor = personalBestPositionAssigner;
-
-      personalBestPositionAssigner.LeftSideParameter.ActualName = "PersonalBestPoint";
-      personalBestPositionAssigner.RightSideParameter.ActualName = "Point";
-      personalBestPositionAssigner.Successor = velocityCreator;
-
-      velocityCreator.LengthParameter.ActualName = "ProblemSize";
-      velocityCreator.BoundsParameter.ActualName = "VelocityBounds";
-      velocityCreator.RealVectorParameter.ActualName = "Velocity";
     }
 
@@ -369,15 +304,45 @@
       UpdateAnalyzers();
       ParameterizeAnalyzers();
-      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       base.OnProblemChanged();
     }
 
+    void TopologyInitializerParameter_ValueChanged(object sender, EventArgs e) {
+      this.UpdateTopologyParameters();
+    }
+
+    void VelocityBoundsUpdaterParameter_ValueChanged(object sender, EventArgs e) {
+      if (VelocityBoundsParameter.Value != null) {
+        foreach (IDiscreteDoubleMatrixModifier matrixOp in VelocityBoundsUpdaterParameter.Value.ScalingOperatorParameter.ValidValues) {
+          matrixOp.ValueParameter.ActualName = VelocityBoundsUpdater.ScaleParameter.Name;
+          matrixOp.StartValueParameter.Value = new DoubleValue(VelocityBoundsUpdater.ScaleParameter.ActualValue.Value);
+        }
+      }
+    }
     #endregion
 
     #region Helpers
-    private void InitializeParticleUpdaters() {
-    }
-
-    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+    private void Initialize() {
+      TopologyInitializerParameter.ValueChanged += new EventHandler(TopologyInitializerParameter_ValueChanged);
+    }
+
+    private static void InitializeParticleCreator(CombinedOperator particleCreator) {
+      Placeholder positionCreator = new Placeholder();
+      Assigner personalBestPositionAssigner = new Assigner();
+      UniformRandomRealVectorCreator velocityCreator = new UniformRandomRealVectorCreator();
+
+      particleCreator.Name = "Particle Creator";
+      particleCreator.OperatorGraph.InitialOperator = positionCreator;
+
+      positionCreator.Name = "(SolutionCreator)";
+      positionCreator.OperatorParameter.ActualName = "SolutionCreator";
+      positionCreator.Successor = personalBestPositionAssigner;
+
+      personalBestPositionAssigner.LeftSideParameter.ActualName = "PersonalBestPoint";
+      personalBestPositionAssigner.RightSideParameter.ActualName = "Point";
+      personalBestPositionAssigner.Successor = velocityCreator;
+
+      velocityCreator.LengthParameter.ActualName = "ProblemSize";
+      velocityCreator.BoundsParameter.ActualName = "VelocityBounds";
+      velocityCreator.RealVectorParameter.ActualName = "Velocity";
     }
 
@@ -385,4 +350,21 @@
       qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
       ParameterizeAnalyzers();
+    }
+
+    private void ParameterizeAnalyzers() {
+      if (Problem != null) {
+        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
+        qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
+        qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
+      }
+    }
+
+    private void UpdateAnalyzers() {
+      Analyzer.Operators.Clear();
+      if (Problem != null) {
+        foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>())
+          Analyzer.Operators.Add(analyzer);
+      }
+      Analyzer.Operators.Add(qualityAnalyzer);
     }
 
@@ -399,13 +381,4 @@
     }
 
-    void VelocityBoundsUpdaterParameter_ValueChanged(object sender, EventArgs e) {
-      if (VelocityBoundsParameter.Value != null) {
-        foreach (IDiscreteDoubleMatrixModifier matrixOp in VelocityBoundsUpdaterParameter.Value.ScalingOperatorParameter.ValidValues) {
-            matrixOp.ValueParameter.ActualName = VelocityBoundsUpdater.ScaleParameter.Name;
-            matrixOp.StartValueParameter.Value = new DoubleValue(VelocityBoundsUpdater.ScaleParameter.ActualValue.Value);
-        }
-      }
-    }
-
     private void InitOmegaUpdater() {
       foreach (IDiscreteDoubleValueModifier updater in OmegaUpdaterParameter.ValidValues) {
@@ -431,23 +404,44 @@
     }
 
-    private void ParameterizeAnalyzers() {
-      if (Problem != null) {
-        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
-        qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
-        qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
-      }
-    }
-
-    private void UpdateAnalyzers() {
-      Analyzer.Operators.Clear();
-      if (Problem != null) {
-        foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>())
-          Analyzer.Operators.Add(analyzer);
-      }
-      Analyzer.Operators.Add(qualityAnalyzer);
-    }
-
+    private void UpdateTopologyInitializer() {
+      ITopologyInitializer oldTopologyInitializer = TopologyInitializer;
+      TopologyInitializerParameter.ValidValues.Clear();
+      foreach (ITopologyInitializer topologyInitializer in ApplicationManager.Manager.GetInstances<ITopologyInitializer>().OrderBy(x => x.Name)) {
+        TopologyInitializerParameter.ValidValues.Add(topologyInitializer);
+      }
+      if (oldTopologyInitializer != null && TopologyInitializerParameter.ValidValues.Any(x => x.GetType() == oldTopologyInitializer.GetType()))
+        TopologyInitializer = TopologyInitializerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldTopologyInitializer.GetType());
+      UpdateTopologyParameters();
+    }
+
+    private void UpdateTopologyParameters() {
+      ITopologyUpdater oldTopologyUpdater = TopologyUpdater;
+      IParticleUpdater oldParticleUpdater = ParticleUpdater;
+      ClearTopologyParameters();
+      if (TopologyInitializer != null) {
+        foreach (ITopologyUpdater topologyUpdater in ApplicationManager.Manager.GetInstances<ITopologyUpdater>())
+          TopologyUpdaterParameter.ValidValues.Add(topologyUpdater);
+        foreach (IParticleUpdater particleUpdater in ApplicationManager.Manager.GetInstances<ILocalParticleUpdater>())
+          ParticleUpdaterParameter.ValidValues.Add(particleUpdater);
+      } else {
+        foreach (IParticleUpdater particleUpdater in ApplicationManager.Manager.GetInstances<IGlobalParticleUpdater>())
+          ParticleUpdaterParameter.ValidValues.Add(particleUpdater);
+      }
+      if (oldTopologyUpdater != null) {
+        ITopologyUpdater newTopologyUpdater = TopologyUpdaterParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldParticleUpdater.GetType());
+        if (newTopologyUpdater != null) TopologyUpdater = newTopologyUpdater;
+      }
+      if (oldParticleUpdater != null) {
+        IParticleUpdater newParticleUpdater = ParticleUpdaterParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldParticleUpdater.GetType());
+        if (newParticleUpdater != null) ParticleUpdater = newParticleUpdater;
+      }
+    }
+
+    private void ClearTopologyParameters() {
+      TopologyUpdaterParameter.ValidValues.Clear();
+      ParticleUpdaterParameter.ValidValues.Clear();
+    }
     #endregion
-      
+
   }
 }
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleUpdater.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleUpdater.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleUpdater.cs	(revision 5410)
@@ -34,36 +34,36 @@
 
     #region Parameter properties
-    public LookupParameter<IRandom> RandomParameter {
-      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
     }
-    public LookupParameter<RealVector> PointParameter {
-      get { return (LookupParameter<RealVector>)Parameters["Point"]; }
+    public ILookupParameter<RealVector> PointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["Point"]; }
     }
-    public LookupParameter<RealVector> VelocityParameter {
-      get { return (LookupParameter<RealVector>)Parameters["Velocity"]; }
+    public ILookupParameter<RealVector> VelocityParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["Velocity"]; }
     }
-    public LookupParameter<RealVector> PersonalBestPointParameter {
-      get { return (LookupParameter<RealVector>)Parameters["PersonalBestPoint"]; }
+    public ILookupParameter<RealVector> PersonalBestPointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["PersonalBestPoint"]; }
     }
-    public LookupParameter<RealVector> BestNeighborPointParameter {
-      get { return (LookupParameter<RealVector>)Parameters["BestNeighborPoint"]; }
+    public ILookupParameter<RealVector> BestNeighborPointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["BestNeighborPoint"]; }
     }
-    public LookupParameter<RealVector> BestPointParameter {
-      get { return (LookupParameter<RealVector>)Parameters["BestPoint"]; }
+    public ILookupParameter<RealVector> BestPointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["BestPoint"]; }
     }
-    public LookupParameter<DoubleMatrix> BoundsParameter {
-      get { return (LookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
+    public ILookupParameter<DoubleMatrix> BoundsParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
     }
-    public LookupParameter<DoubleMatrix> VelocityBoundsParameter {
-      get { return (LookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
+    public ILookupParameter<DoubleMatrix> VelocityBoundsParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
     }
-    public LookupParameter<DoubleValue> OmegaParameter {
-      get { return (LookupParameter<DoubleValue>)Parameters["Omega"]; }
+    public ILookupParameter<DoubleValue> OmegaParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Omega"]; }
     }
-    public LookupParameter<DoubleValue> Phi_PParameter {
-      get { return (LookupParameter<DoubleValue>)Parameters["Phi_P"]; }
+    public ILookupParameter<DoubleValue> Phi_PParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Phi_P"]; }
     }
-    public LookupParameter<DoubleValue> Phi_GParameter {
-      get { return (LookupParameter<DoubleValue>)Parameters["Phi_G"]; }
+    public ILookupParameter<DoubleValue> Phi_GParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Phi_G"]; }
     }
     #endregion
@@ -96,12 +96,13 @@
       get { return VelocityBoundsParameter.ActualValue; }
     }
-    public double Omega {
-      get { return OmegaParameter.ActualValue.Value; }
+
+    public DoubleValue Omega {
+      get { return OmegaParameter.ActualValue; }
     }
-    public double Phi_P {
-      get { return Phi_PParameter.ActualValue.Value; }
+    public DoubleValue Phi_P {
+      get { return Phi_PParameter.ActualValue; }
     }
-    public double Phi_G {
-      get { return Phi_GParameter.ActualValue.Value; }
+    public DoubleValue Phi_G {
+      get { return Phi_GParameter.ActualValue; }
     }
     #endregion
@@ -135,5 +136,4 @@
 
     #endregion
-
   }
 }
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/RandomTopologyInitializer.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/RandomTopologyInitializer.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/RandomTopologyInitializer.cs	(revision 5410)
@@ -35,9 +35,9 @@
 
     #region Parameters
-    public LookupParameter<IRandom> RandomParameter {
-      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
     }
-    public ValueLookupParameter<IntValue> NrOfConnectionsParameter {
-      get { return (ValueLookupParameter<IntValue>)Parameters["NrOfConnections"]; }
+    public IValueLookupParameter<IntValue> NrOfConnectionsParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["NrOfConnections"]; }
     }
     #endregion
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/SwarmUpdater.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/SwarmUpdater.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/SwarmUpdater.cs	(revision 5410)
@@ -35,24 +35,24 @@
 
     #region Parameter properties
-    public LookupParameter<DoubleValue> QualityParameter {
-      get { return (LookupParameter<DoubleValue>)Parameters["Quality"]; }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public LookupParameter<DoubleValue> PersonalBestQualityParameter {
-      get { return (LookupParameter<DoubleValue>)Parameters["PersonalBestQuality"]; }
+    public ILookupParameter<DoubleValue> PersonalBestQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["PersonalBestQuality"]; }
     }
-    public LookupParameter<DoubleValue> BestQualityParameter {
-      get { return (LookupParameter<DoubleValue>)Parameters["BestQuality"]; }
+    public ILookupParameter<DoubleValue> BestQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["BestQuality"]; }
     }
-    public LookupParameter<RealVector> PointParameter {
-      get { return (LookupParameter<RealVector>)Parameters["Point"]; }
+    public ILookupParameter<RealVector> PointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["Point"]; }
     }
-    public LookupParameter<RealVector> PersonalBestPointParameter {
-      get { return (LookupParameter<RealVector>)Parameters["PersonalBestPoint"]; }
+    public ILookupParameter<RealVector> PersonalBestPointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["PersonalBestPoint"]; }
     }
-    public LookupParameter<RealVector> BestPointParameter {
-      get { return (LookupParameter<RealVector>)Parameters["BestPoint"]; }
+    public ILookupParameter<RealVector> BestPointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["BestPoint"]; }
     }
-    public ValueLookupParameter<BoolValue> MaximizationParameter {
-      get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
     }
     #endregion
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TopologyInitializer.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TopologyInitializer.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TopologyInitializer.cs	(revision 5410)
@@ -33,9 +33,9 @@
 
     #region Parameters
-    public ScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
-      get { return (ScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
+    public IScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
+      get { return (IScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
     }
-    public LookupParameter<IntValue> SwarmSizeParameter {
-      get { return (LookupParameter<IntValue>)Parameters["SwarmSize"]; }
+    public ILookupParameter<IntValue> SwarmSizeParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["SwarmSize"]; }
     }
 
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TotallyConnectedParticleUpdater.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TotallyConnectedParticleUpdater.cs	(revision 5409)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TotallyConnectedParticleUpdater.cs	(revision 5410)
@@ -45,13 +45,17 @@
 
     public override IOperation Apply() {
+      base.Apply();
       RealVector velocity = new RealVector(Velocity.Length);
       RealVector position = new RealVector(Point.Length);
       double r_p = Random.NextDouble();
       double r_g = Random.NextDouble();
+      double omega = Omega.Value;
+      double phi_p = Phi_P.Value;
+      double phi_g = Phi_G.Value;
       for (int i = 0; i < velocity.Length; i++) {
         velocity[i] =
-          Velocity[i] * Omega +
-          (PersonalBestPoint[i] - Point[i]) * Phi_P * r_p +
-          (BestPoint[i] - Point[i]) * Phi_G * r_g;
+          Velocity[i] * omega +
+          (PersonalBestPoint[i] - Point[i]) * phi_p * r_p +
+          (BestPoint[i] - Point[i]) * phi_g * r_g;
       }
       BoundsChecker.Apply(velocity, VelocityBounds);
