Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj	(revision 5527)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj	(revision 5560)
@@ -107,24 +107,15 @@
   <ItemGroup>
     <Compile Include="BestPointInitializer.cs" />
-    <Compile Include="IDiscreteDoubleMatrixModifier.cs" />
-    <Compile Include="IGlobalParticleUpdater.cs" />
-    <Compile Include="ILocalParticleUpdater.cs" />
     <Compile Include="MultiPSOTopologyUpdater.cs" />
+    <Compile Include="ParticleSwarmOptimizationMainLoop.cs" />
     <Compile Include="VelocityBoundsModifier.cs" />
     <Compile Include="RandomTopologyInitializer.cs" />
     <Compile Include="VonNeumannTopologyInitializer.cs" />
     <Compile Include="RingTopologyInitializer.cs" />
-    <Compile Include="ITopologyUpdater.cs" />
     <Compile Include="NeighborUpdater.cs" />
     <Compile Include="TopologyInitializer.cs" />
-    <Compile Include="ITopologyInitializer.cs" />
-    <Compile Include="NeighborhoodParticleUpdater.cs" />
-    <Compile Include="IParticleUpdater.cs" />
-    <Compile Include="TotallyConnectedParticleUpdater.cs" />
     <Compile Include="HeuristicLabAlgorithmsParticleSwarmOptimizationPlugin.cs" />
     <Compile Include="ParticleSwarmOptimization.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="ParticleUpdater.cs" />
-    <Compile Include="SwarmUpdater.cs" />
   </ItemGroup>
   <ItemGroup>
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLabAlgorithmsParticleSwarmOptimizationPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLabAlgorithmsParticleSwarmOptimizationPlugin.cs.frame	(revision 5527)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLabAlgorithmsParticleSwarmOptimizationPlugin.cs.frame	(revision 5560)
@@ -34,5 +34,4 @@
   [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")]
-  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IDiscreteDoubleMatrixModifier.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IDiscreteDoubleMatrixModifier.cs	(revision 5527)
+++ 	(revision )
@@ -1,38 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  public interface IDiscreteDoubleMatrixModifier : IItem {
-    ILookupParameter<DoubleMatrix> ValueParameter { get; }
-    ILookupParameter<DoubleValue> ScaleParameter { get; }
-    ConstrainedValueParameter<IDiscreteDoubleValueModifier> ScalingOperatorParameter { get; }
-    IValueLookupParameter<DoubleValue> StartValueParameter { get; }
-    IValueLookupParameter<DoubleValue> EndValueParameter { get; }
-    ILookupParameter<IntValue> IndexParameter { get; }
-    IValueLookupParameter<IntValue> StartIndexParameter { get; }
-    IValueLookupParameter<IntValue> EndIndexParameter { get; }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IGlobalParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IGlobalParticleUpdater.cs	(revision 5527)
+++ 	(revision )
@@ -1,25 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  public interface IGlobalParticleUpdater : IParticleUpdater {
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ILocalParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ILocalParticleUpdater.cs	(revision 5527)
+++ 	(revision )
@@ -1,25 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  public interface ILocalParticleUpdater : IParticleUpdater {
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IParticleUpdater.cs	(revision 5527)
+++ 	(revision )
@@ -1,44 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.RealVectorEncoding;
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  public interface IParticleUpdater : IOperator {
-
-    ILookupParameter<RealVector> VelocityParameter { get; }
-    ILookupParameter<DoubleMatrix> VelocityBoundsParameter { get; }
-
-    ILookupParameter<RealVector> PointParameter { get; }
-    ILookupParameter<DoubleMatrix> BoundsParameter { get; }
-
-    ILookupParameter<RealVector> PersonalBestPointParameter { get; }
-    ILookupParameter<RealVector> BestNeighborPointParameter { get; }
-    ILookupParameter<RealVector> BestPointParameter { get; }
-
-    ILookupParameter<DoubleValue> OmegaParameter { get; }
-    ILookupParameter<DoubleValue> Phi_PParameter { get; }
-    ILookupParameter<DoubleValue> Phi_GParameter { get; }
-  }
-
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyInitializer.cs	(revision 5527)
+++ 	(revision )
@@ -1,31 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  public interface ITopologyInitializer : IOperator {
-    IScopeTreeLookupParameter<IntegerVector> NeighborsParameter { get; }
-    ILookupParameter<IntValue> SwarmSizeParameter { get; }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ITopologyUpdater.cs	(revision 5527)
+++ 	(revision )
@@ -1,29 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.Core;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  public interface ITopologyUpdater : IOperator {
-    IScopeTreeLookupParameter<IntegerVector> NeighborsParameter { get; }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/MultiPSOTopologyUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/MultiPSOTopologyUpdater.cs	(revision 5527)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/MultiPSOTopologyUpdater.cs	(revision 5560)
@@ -25,13 +25,13 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  [Item("Multi PSO Topology Initializer/Updater", "Splits swarm into swarmsize / (nrOfConnections + 1) non-overlapping sub-swarms. Swarms are re-grouped every regroupingPeriod iteration. The operator is implemented as described in Liang, J.J. and Suganthan, P.N 2005. Dynamic multi-swarm particle swarm optimizer. IEEE Swarm Intelligence Symposium, pp. 124-129.")]
+  [Item("Multi PSO Topology Updater", "Splits swarm into swarmsize / (nrOfConnections + 1) non-overlapping sub-swarms. Swarms are re-grouped every regroupingPeriod iteration. The operator is implemented as described in Liang, J.J. and Suganthan, P.N 2005. Dynamic multi-swarm particle swarm optimizer. IEEE Swarm Intelligence Symposium, pp. 124-129.")]
   [StorableClass]
-  public sealed class MultiPSOTopologyUpdater : SingleSuccessorOperator, ITopologyUpdater, ITopologyInitializer {
+  public sealed class MultiPSOTopologyUpdater : SingleSuccessorOperator, ITopologyUpdater {
     public override bool CanChangeName {
       get { return false; }
@@ -48,6 +48,6 @@
       get { return (ILookupParameter<IntValue>)Parameters["SwarmSize"]; }
     }
-    public IScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
-      get { return (IScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
+    public IScopeTreeLookupParameter<IntArray> NeighborsParameter {
+      get { return (IScopeTreeLookupParameter<IntArray>)Parameters["Neighbors"]; }
     }
     public ILookupParameter<IntValue> CurrentIterationParameter {
@@ -69,5 +69,5 @@
       get { return SwarmSizeParameter.ActualValue.Value; }
     }
-    private ItemArray<IntegerVector> Neighbors {
+    private ItemArray<IntArray> Neighbors {
       get { return NeighborsParameter.ActualValue; }
       set { NeighborsParameter.ActualValue = value; }
@@ -84,4 +84,5 @@
     private MultiPSOTopologyUpdater(bool deserializing) : base(deserializing) { }
     private MultiPSOTopologyUpdater(MultiPSOTopologyUpdater original, Cloner cloner) : base(original, cloner) { }
+    
     public MultiPSOTopologyUpdater()
       : base() {
@@ -89,5 +90,5 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("NrOfConnections", "Nr of connected neighbors.", new IntValue(3)));
       Parameters.Add(new LookupParameter<IntValue>("SwarmSize", "Number of particles in the swarm."));
-      Parameters.Add(new ScopeTreeLookupParameter<IntegerVector>("Neighbors", "The list of neighbors for each particle."));
+      Parameters.Add(new ScopeTreeLookupParameter<IntArray>("Neighbors", "The list of neighbors for each particle."));
       Parameters.Add(new LookupParameter<IntValue>("CurrentIteration", "The current iteration of the algorithm."));
       Parameters.Add(new ValueLookupParameter<IntValue>("RegroupingPeriod", "Update interval (=iterations) for regrouping of neighborhoods.", new IntValue(5)));
@@ -100,6 +101,6 @@
     // Splits the swarm into non-overlapping sub swarms
     public override IOperation Apply() {
-      if (CurrentIteration % RegroupingPeriod == 0) {
-        ItemArray<IntegerVector> neighbors = new ItemArray<IntegerVector>(SwarmSize);
+      if (CurrentIteration > 0 && CurrentIteration % RegroupingPeriod == 0) {
+        ItemArray<IntArray> neighbors = new ItemArray<IntArray>(SwarmSize);
         Dictionary<int, List<int>> neighborsPerParticle = new Dictionary<int, List<int>>();
         for (int i = 0; i < SwarmSize; i++) {
@@ -135,5 +136,5 @@
 
         for (int particle = 0; particle < neighborsPerParticle.Count; particle++) {
-          neighbors[particle] = new IntegerVector(neighborsPerParticle[particle].ToArray());
+          neighbors[particle] = new IntArray(neighborsPerParticle[particle].ToArray());
         }
         Neighbors = neighbors;
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborUpdater.cs	(revision 5527)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborUpdater.cs	(revision 5560)
@@ -24,5 +24,4 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Operators;
@@ -42,6 +41,6 @@
       get { return (IScopeTreeLookupParameter<RealVector>)Parameters["Point"]; }
     }
-    public IScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
-      get { return (IScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
+    public IScopeTreeLookupParameter<IntArray> NeighborsParameter {
+      get { return (IScopeTreeLookupParameter<IntArray>)Parameters["Neighbors"]; }
     }
     public IScopeTreeLookupParameter<RealVector> BestNeighborPointParameter {
@@ -60,5 +59,5 @@
       get { return PointsParameter.ActualValue; }
     }
-    private ItemArray<IntegerVector> Neighbors {
+    private ItemArray<IntArray> Neighbors {
       get { return NeighborsParameter.ActualValue; }
     }
@@ -80,6 +79,6 @@
     private NeighborUpdater(NeighborUpdater original, Cloner cloner) : base(original, cloner) { }
     public NeighborUpdater() {
-      Parameters.Add(new ScopeTreeLookupParameter<RealVector>("Point", "The position of the particle."));
-      Parameters.Add(new ScopeTreeLookupParameter<IntegerVector>("Neighbors", "The list of neighbors for each particle."));
+      Parameters.Add(new ScopeTreeLookupParameter<RealVector>("RealVector", "The position of the particle."));
+      Parameters.Add(new ScopeTreeLookupParameter<IntArray>("Neighbors", "The list of neighbors for each particle."));
       Parameters.Add(new ScopeTreeLookupParameter<RealVector>("BestNeighborPoint", "The position of the best neighboring particle."));
       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The list of qualities of all particles."));
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborhoodParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborhoodParticleUpdater.cs	(revision 5527)
+++ 	(revision )
@@ -1,66 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.Encodings.RealVectorEncoding;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  [Item("Neighborhood Particle Updater", "Updates the particle's position using (among other things) the best neighbor's position. Point = Point + Velocity*Omega + (PersonalBestPoint-Point)*Phi_P*r_p + (BestNeighborPoint-Point)*Phi_G*r_g.")]
-  [StorableClass]
-  public sealed class NeighborhoodParticleUpdater : ParticleUpdater, ILocalParticleUpdater {
-
-    [StorableConstructor]
-    private NeighborhoodParticleUpdater(bool deserializing) : base(deserializing) { }
-    private NeighborhoodParticleUpdater(NeighborhoodParticleUpdater original, Cloner cloner) : base(original, cloner) { }
-    public NeighborhoodParticleUpdater() : base() { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new NeighborhoodParticleUpdater(this, cloner);
-    }
-
-    public override IOperation 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 +
-          (BestNeighborPoint[i] - Point[i]) * phi_g * r_g;
-      }
-      BoundsChecker.Apply(velocity, VelocityBounds);
-      for (int i = 0; i < velocity.Length; i++) {
-        position[i] = Point[i] + velocity[i];
-      }
-      BoundsChecker.Apply(position, Bounds);
-      Point = position;
-      Velocity = velocity;
-
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 5527)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 5560)
@@ -53,11 +53,7 @@
       set { AnalyzerParameter.Value = value; }
     }
-    public IDiscreteDoubleValueModifier OmegaUpdater {
-      get { return OmegaUpdaterParameter.Value; }
-      set { OmegaUpdaterParameter.Value = value; }
-    }
-    public IDiscreteDoubleMatrixModifier VelocityBoundsUpdater {
-      get { return VelocityBoundsUpdaterParameter.Value; }
-      set { VelocityBoundsUpdaterParameter.Value = value; }
+    public IDiscreteDoubleValueModifier InertiaUpdater {
+      get { return InertiaUpdaterParameter.Value; }
+      set { InertiaUpdaterParameter.Value = value; }
     }
     #endregion
@@ -76,18 +72,18 @@
       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<DoubleValue> InertiaParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Inertia"]; }
+    }
+    public IValueParameter<DoubleValue> PersonalBestAttractionParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["PersonalBestAttraction"]; }
+    }
+    public IValueParameter<DoubleValue> NeighborsBestAttractionParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["NeighborsBestAttraction"]; }
     }
     public IValueParameter<MultiAnalyzer> AnalyzerParameter {
       get { return (IValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
     }
-    public IValueLookupParameter<DoubleMatrix> VelocityBoundsParameter {
-      get { return (IValueLookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
+    public ConstrainedValueParameter<IParticleCreator> ParticleCreatorParameter {
+      get { return (ConstrainedValueParameter<IParticleCreator>)Parameters["ParticleCreator"]; }
     }
     public ConstrainedValueParameter<IParticleUpdater> ParticleUpdaterParameter {
@@ -100,9 +96,6 @@
       get { return (OptionalConstrainedValueParameter<ITopologyUpdater>)Parameters["TopologyUpdater"]; }
     }
-    public OptionalConstrainedValueParameter<IDiscreteDoubleMatrixModifier> VelocityBoundsUpdaterParameter {
-      get { return (OptionalConstrainedValueParameter<IDiscreteDoubleMatrixModifier>)Parameters["VelocityBoundsUpdater"]; }
-    }
-    public OptionalConstrainedValueParameter<IDiscreteDoubleValueModifier> OmegaUpdaterParameter {
-      get { return (OptionalConstrainedValueParameter<IDiscreteDoubleValueModifier>)Parameters["OmegaUpdater"]; }
+    public OptionalConstrainedValueParameter<IDiscreteDoubleValueModifier> InertiaUpdaterParameter {
+      get { return (OptionalConstrainedValueParameter<IDiscreteDoubleValueModifier>)Parameters["InertiaUpdater"]; }
     }
     #endregion
@@ -114,4 +107,10 @@
     [Storable]
     private BestAverageWorstQualityAnalyzer qualityAnalyzer;
+
+    [Storable]
+    private SolutionsCreator solutionsCreator;
+
+    [Storable]
+    private ParticleSwarmOptimizationMainLoop mainLoop;
 
     public ITopologyInitializer TopologyInitializer {
@@ -125,9 +124,13 @@
     }
 
+    public IParticleCreator ParticleCreator {
+      get { return ParticleCreatorParameter.Value; }
+      set { ParticleCreatorParameter.Value = value; }
+    }
+
     public IParticleUpdater ParticleUpdater {
       get { return ParticleUpdaterParameter.Value; }
       set { ParticleUpdaterParameter.Value = value; }
     }
-
     #endregion
 
@@ -137,4 +140,6 @@
       : base(original, cloner) {
       qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      solutionsCreator = cloner.Clone(original.solutionsCreator);
+      mainLoop = cloner.Clone(original.mainLoop); 
       Initialize();
     }
@@ -146,39 +151,21 @@
       Parameters.Add(new ValueParameter<IntValue>("MaxIterations", "Maximal number of iterations.", new IntValue(1000)));
       Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze each generation.", new MultiAnalyzer()));
-      Parameters.Add(new ValueParameter<DoubleValue>("Omega", "Weight for particle's velocity vector.", new DoubleValue(-0.2)));
-      Parameters.Add(new ValueParameter<DoubleValue>("Phi_P", "Weight for particle's personal best position.", new DoubleValue(-0.01)));
-      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"));
-      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));
+      Parameters.Add(new ValueParameter<DoubleValue>("Inertia", "Inertia weight on a particle's movement (omega).", new DoubleValue(-0.2)));
+      Parameters.Add(new ValueParameter<DoubleValue>("PersonalBestAttraction", "Weight for particle's pull towards its personal best soution (phi_p).", new DoubleValue(-0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>("NeighborsBestAttraction", "Weight for pull towards the neighborhood best solution or global best solution in case of a totally connected topology (phi_g).", new DoubleValue(3.7)));
+      Parameters.Add(new ConstrainedValueParameter<IParticleCreator>("ParticleCreator", "Operator creates a new particle."));
+      Parameters.Add(new ConstrainedValueParameter<IParticleUpdater>("ParticleUpdater", "Operator that updates 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>("InertiaUpdater", "Updates the omega parameter."));
 
       RandomCreator randomCreator = new RandomCreator();
       VariableCreator variableCreator = new VariableCreator();
-      SolutionsCreator solutionsCreator = new SolutionsCreator();
-      CombinedOperator particleCreator = new CombinedOperator();
-      Placeholder evaluatorPlaceholder = new Placeholder();
-      Assigner bestPersonalQualityAssigner = new Assigner();
-      BestPointInitializer bestPositionInitializer = new BestPointInitializer();
+      solutionsCreator = new SolutionsCreator();
       Placeholder topologyInitializerPlaceholder = new Placeholder();
-      NeighborUpdater neighborUpdater = new NeighborUpdater();
+      ResultsCollector resultsCollector = new ResultsCollector(); 
       Placeholder analyzerPlaceholder = new Placeholder();
-      UniformSubScopesProcessor uniformSubScopeProcessor = new UniformSubScopesProcessor();
-      Placeholder particleUpdaterPlaceholder = new Placeholder();
-      Placeholder topologyUpdaterPlaceholder = new Placeholder();
-      UniformSubScopesProcessor uniformSubscopesProcessor2 = new UniformSubScopesProcessor();
-      UniformSubScopesProcessor evaluationProcessor = new UniformSubScopesProcessor();
-      NeighborUpdater neighborUpdater2 = new NeighborUpdater();
-      Placeholder evaluatorPlaceholder2 = new Placeholder();
-      SwarmUpdater swarmUpdater = new SwarmUpdater();
-      Placeholder analyzerPlaceholder2 = new Placeholder();
-      IntCounter currentIterationCounter = new IntCounter();
-      Comparator currentIterationComparator = new Comparator();
-      ConditionalBranch conditionalBranch = new ConditionalBranch();
-      Placeholder velocityBoundsUpdaterPlaceholder = new Placeholder();
-      Placeholder omegaUpdaterPlaceholder = new Placeholder();
+      RealVectorSwarmUpdater swarmUpdater = new RealVectorSwarmUpdater();
+      mainLoop = new ParticleSwarmOptimizationMainLoop();
 
       OperatorGraph.InitialOperator = randomCreator;
@@ -192,84 +179,44 @@
 
       solutionsCreator.NumberOfSolutionsParameter.ActualName = "SwarmSize";
-      solutionsCreator.EvaluatorParameter.Value = evaluatorPlaceholder;
-      solutionsCreator.SolutionCreatorParameter.Value = particleCreator;
-      solutionsCreator.Successor = bestPositionInitializer;
-
-      InitializeParticleCreator(particleCreator);
-
-      evaluatorPlaceholder.Name = "(Evaluator)";
-      evaluatorPlaceholder.OperatorParameter.ActualName = "Evaluator";
-      evaluatorPlaceholder.Successor = bestPersonalQualityAssigner;
-
-      bestPersonalQualityAssigner.LeftSideParameter.ActualName = "PersonalBestQuality";
-      bestPersonalQualityAssigner.RightSideParameter.ActualName = "Quality";
-
-      bestPositionInitializer.Successor = topologyInitializerPlaceholder;
+      ParameterizeSolutionsCreator(); 
+      solutionsCreator.Successor = topologyInitializerPlaceholder; 
 
       topologyInitializerPlaceholder.Name = "(TopologyInitializer)";
       topologyInitializerPlaceholder.OperatorParameter.ActualName = "TopologyInitializer";
-      topologyInitializerPlaceholder.Successor = neighborUpdater;
-
-      neighborUpdater.Successor = analyzerPlaceholder;
-
-      analyzerPlaceholder.Name = "(Analyzer)";
-      analyzerPlaceholder.OperatorParameter.ActualName = "Analyzer";
-      analyzerPlaceholder.Successor = uniformSubScopeProcessor;
-
-      uniformSubScopeProcessor.Operator = particleUpdaterPlaceholder;
-      uniformSubScopeProcessor.Successor = evaluationProcessor;
-
-      particleUpdaterPlaceholder.Name = "(ParticleUpdater)";
-      particleUpdaterPlaceholder.OperatorParameter.ActualName = "ParticleUpdater";
-
-      evaluationProcessor.Parallel = new BoolValue(true);
-      evaluationProcessor.Operator = evaluatorPlaceholder2;
-      evaluationProcessor.Successor = topologyUpdaterPlaceholder;
-
-      evaluatorPlaceholder2.Name = "(Evaluator)";
-      evaluatorPlaceholder2.OperatorParameter.ActualName = "Evaluator";
-
-      topologyUpdaterPlaceholder.Name = "(TopologyUpdater)";
-      topologyUpdaterPlaceholder.OperatorParameter.ActualName = "TopologyUpdater";
-      topologyUpdaterPlaceholder.Successor = neighborUpdater2;
-
-      neighborUpdater2.Successor = uniformSubscopesProcessor2;
-
-      uniformSubscopesProcessor2.Operator = swarmUpdater;
-      uniformSubscopesProcessor2.Successor = analyzerPlaceholder2;
-
-      analyzerPlaceholder2.Name = "(Analyzer)";
-      analyzerPlaceholder2.OperatorParameter.ActualName = "Analyzer";
-      analyzerPlaceholder2.Successor = currentIterationCounter;
-
-      currentIterationCounter.Name = "CurrentIteration++";
-      currentIterationCounter.ValueParameter.ActualName = "CurrentIteration";
-      currentIterationCounter.Successor = omegaUpdaterPlaceholder;
-
-      omegaUpdaterPlaceholder.Name = "(Omega Updater)";
-      omegaUpdaterPlaceholder.OperatorParameter.ActualName = "OmegaUpdater";
-      omegaUpdaterPlaceholder.Successor = velocityBoundsUpdaterPlaceholder;
-
-      velocityBoundsUpdaterPlaceholder.Name = "(Velocity Bounds Updater)";
-      velocityBoundsUpdaterPlaceholder.OperatorParameter.ActualName = "VelocityBoundsUpdater";
-      velocityBoundsUpdaterPlaceholder.Successor = currentIterationComparator;
-
-      currentIterationComparator.LeftSideParameter.ActualName = "CurrentIteration";
-      currentIterationComparator.Comparison = new Comparison(ComparisonType.Less);
-      currentIterationComparator.RightSideParameter.ActualName = "MaxIterations";
-      currentIterationComparator.ResultParameter.ActualName = "ContinueIteration";
-      currentIterationComparator.Successor = conditionalBranch;
-
-      conditionalBranch.Name = "ContinueIteration?";
-      conditionalBranch.ConditionParameter.ActualName = "ContinueIteration";
-      conditionalBranch.TrueBranch = uniformSubScopeProcessor;
+      topologyInitializerPlaceholder.Successor = swarmUpdater;
+
+      swarmUpdater.Successor = resultsCollector;
+
+      resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Iterations", null, "CurrentIteration"));
+      //resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Current Inertia", null, "Inertia"));
+      //resultsCollector.CollectedValues.Add(new LookupParameter<IntValue>("Evaluated Solutions", null, "EvaluatedSolutions"));
+      resultsCollector.ResultsParameter.ActualName = "Results";
+      resultsCollector.Successor = mainLoop;
+
+      mainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name;
+      mainLoop.InertiaParameter.ActualName = InertiaParameter.Name;
+      mainLoop.MaxIterationsParameter.ActualName = MaxIterationsParameter.Name;
+      mainLoop.NeighborsBestAttractionParameter.ActualName = NeighborsBestAttractionParameter.Name;
+      mainLoop.InertiaUpdaterParameter.ActualName = InertiaUpdaterParameter.Name;
+      mainLoop.ParticleUpdaterParameter.ActualName = ParticleUpdaterParameter.Name;
+      mainLoop.PersonalBestAttractionParameter.ActualName = PersonalBestAttractionParameter.Name;
+      mainLoop.RandomParameter.ActualName = randomCreator.RandomParameter.ActualName;
+      mainLoop.SwarmSizeParameter.ActualName = SwarmSizeParameter.Name; 
+      mainLoop.TopologyUpdaterParameter.ActualName = TopologyUpdaterParameter.Name; 
+      mainLoop.RandomParameter.ActualName = randomCreator.RandomParameter.ActualName;
+      mainLoop.ResultsParameter.ActualName = "Results";
+      mainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name; 
+     // mainLoop.EvaluatedMovesParameter.ActualName = "EvaluatedMoves";
 
       InitializeAnalyzers();
-      InitVelocityBoundsUpdater();
+      ////InitVelocityBoundsUpdater();
+      InitializeParticleCreator();
+      ParameterizeSolutionsCreator(); 
       UpdateAnalyzers();
-      UpdateOmegaUpdater();
-      InitOmegaUpdater();
+      UpdateInertiaUpdater();
+      InitInertiaUpdater();
       UpdateTopologyInitializer();
       Initialize();
+      ParameterizeMainLoop(); 
     }
 
@@ -284,16 +231,16 @@
 
     public override void Prepare() {
-      if (Problem != null) {
+      if (Problem != null && ParticleCreator != null && ParticleUpdater != null) {
         base.Prepare();
-        if (OmegaUpdater != null && OmegaUpdater.StartValueParameter.Value != null) {
-          this.OmegaParameter.ActualValue = new DoubleValue(OmegaUpdaterParameter.Value.StartValueParameter.Value.Value);
+        if (InertiaUpdater != null && InertiaUpdater.StartValueParameter.Value != null) {
+          this.InertiaParameter.ActualValue = new DoubleValue(InertiaUpdaterParameter.Value.StartValueParameter.Value.Value);
         }
-        if (VelocityBoundsUpdater != null && VelocityBoundsUpdater.StartValueParameter.Value != null && VelocityBoundsParameter.Value != null) {
-          DoubleMatrix matrix = VelocityBoundsParameter.Value;
-          for (int i = 0; i < matrix.Rows; i++) {
-            matrix[i, 0] = -VelocityBoundsUpdater.StartValueParameter.Value.Value;
-            matrix[i, 1] = VelocityBoundsUpdater.StartValueParameter.Value.Value;
-          }
-        }
+        //if (VelocityBoundsUpdater != null && VelocityBoundsUpdater.StartValueParameter.Value != null && VelocityBoundsParameter.Value != null) {
+        //  DoubleMatrix matrix = VelocityBoundsParameter.Value;
+        //  for (int i = 0; i < matrix.Rows; i++) {
+        //    matrix[i, 0] = -VelocityBoundsUpdater.StartValueParameter.Value.Value;
+        //    matrix[i, 1] = VelocityBoundsUpdater.StartValueParameter.Value.Value;
+        //  }
+        //}
       }
     }
@@ -303,4 +250,7 @@
       UpdateAnalyzers();
       ParameterizeAnalyzers();
+      UpdateTopologyParameters();
+      InitializeParticleCreator();
+      ParameterizeSolutionsCreator(); 
       base.OnProblemChanged();
     }
@@ -310,12 +260,12 @@
     }
 
-    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);
-        }
-      }
-    }
+    //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
 
@@ -325,23 +275,16 @@
     }
 
-    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";
+    private void InitializeParticleCreator() {
+      if (Problem != null) {
+        IParticleCreator oldParticleCreator = ParticleCreator;
+        ParticleCreatorParameter.ValidValues.Clear();
+        foreach (IParticleCreator Creator in Problem.Operators.OfType<IParticleCreator>().OrderBy(x => x.Name)) {
+          ParticleCreatorParameter.ValidValues.Add(Creator);
+        }
+        if (oldParticleCreator != null) {
+          IParticleCreator creator = ParticleCreatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldParticleCreator.GetType());
+          if (creator != null) ParticleCreator = creator;
+        }  
+      }
     }
 
@@ -368,22 +311,22 @@
     }
 
-    private void InitVelocityBoundsUpdater() {
-      foreach (IDiscreteDoubleMatrixModifier matrixOp in ApplicationManager.Manager.GetInstances<IDiscreteDoubleMatrixModifier>()) {
-        VelocityBoundsUpdaterParameter.ValidValues.Add(matrixOp);
-        matrixOp.ValueParameter.ActualName = VelocityBoundsParameter.Name;
-        matrixOp.EndIndexParameter.ActualName = MaxIterationsParameter.Name;
-        matrixOp.StartIndexParameter.Value = new IntValue(0);
-        matrixOp.IndexParameter.ActualName = "CurrentIteration";
-        matrixOp.EndValueParameter.Value = new DoubleValue(0);
-      }
-      VelocityBoundsUpdaterParameter.ValueChanged += new EventHandler(VelocityBoundsUpdaterParameter_ValueChanged);
-    }
-
-    private void InitOmegaUpdater() {
-      foreach (IDiscreteDoubleValueModifier updater in OmegaUpdaterParameter.ValidValues) {
+    //private void InitVelocityBoundsUpdater() {
+    //  foreach (IDiscreteDoubleMatrixModifier matrixOp in ApplicationManager.Manager.GetInstances<IDiscreteDoubleMatrixModifier>()) {
+    //    VelocityBoundsUpdaterParameter.ValidValues.Add(matrixOp);
+    //    matrixOp.ValueParameter.ActualName = VelocityBoundsParameter.Name;
+    //    matrixOp.EndIndexParameter.ActualName = MaxIterationsParameter.Name;
+    //    matrixOp.StartIndexParameter.Value = new IntValue(0);
+    //    matrixOp.IndexParameter.ActualName = "CurrentIteration";
+    //    matrixOp.EndValueParameter.Value = new DoubleValue(0);
+    //  }
+    //  VelocityBoundsUpdaterParameter.ValueChanged += new EventHandler(VelocityBoundsUpdaterParameter_ValueChanged);
+    //}
+
+    private void InitInertiaUpdater() {
+      foreach (IDiscreteDoubleValueModifier updater in InertiaUpdaterParameter.ValidValues) {
         updater.EndIndexParameter.ActualName = MaxIterationsParameter.Name;
         updater.StartIndexParameter.Value = new IntValue(0);
         updater.IndexParameter.ActualName = "CurrentIteration";
-        updater.ValueParameter.ActualName = OmegaParameter.Name;
+        updater.ValueParameter.ActualName = InertiaParameter.Name;
         updater.StartValueParameter.Value = new DoubleValue(1);
         updater.EndValueParameter.Value = new DoubleValue(0);
@@ -391,13 +334,13 @@
     }
 
-    private void UpdateOmegaUpdater() {
-      IDiscreteDoubleValueModifier oldOmegaUpdater = OmegaUpdater;
-      OmegaUpdaterParameter.ValidValues.Clear();
+    private void UpdateInertiaUpdater() {
+      IDiscreteDoubleValueModifier oldInertiaUpdater = InertiaUpdater;
+      InertiaUpdaterParameter.ValidValues.Clear();
       foreach (IDiscreteDoubleValueModifier updater in ApplicationManager.Manager.GetInstances<IDiscreteDoubleValueModifier>().OrderBy(x => x.Name)) {
-        OmegaUpdaterParameter.ValidValues.Add(updater);
-      }
-      if (oldOmegaUpdater != null) {
-        IDiscreteDoubleValueModifier updater = OmegaUpdaterParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldOmegaUpdater.GetType());
-        if (updater != null) OmegaUpdaterParameter.Value = updater;
+        InertiaUpdaterParameter.ValidValues.Add(updater);
+      }
+      if (oldInertiaUpdater != null) {
+        IDiscreteDoubleValueModifier updater = InertiaUpdaterParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldInertiaUpdater.GetType());
+        if (updater != null) InertiaUpdaterParameter.Value = updater;
       }
     }
@@ -418,20 +361,22 @@
       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;
+      if (Problem != null) {
+        if (TopologyInitializer != null) {
+          foreach (ITopologyUpdater topologyUpdater in ApplicationManager.Manager.GetInstances<ITopologyUpdater>())
+            TopologyUpdaterParameter.ValidValues.Add(topologyUpdater);
+          foreach (IParticleUpdater particleUpdater in Problem.Operators.OfType<ILocalParticleUpdater>().OrderBy(x => x.Name))
+            ParticleUpdaterParameter.ValidValues.Add(particleUpdater);
+        } else {
+          foreach (IParticleUpdater particleUpdater in Problem.Operators.OfType<IGlobalParticleUpdater>().OrderBy(x => x.Name))
+            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;
+        }
       }
     }
@@ -441,4 +386,15 @@
       ParticleUpdaterParameter.ValidValues.Clear();
     }
+
+    private void ParameterizeSolutionsCreator() {
+      if (Problem != null) {
+        solutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
+        solutionsCreator.SolutionCreatorParameter.ActualName = ParticleCreatorParameter.Name;
+      }
+    }
+
+    private void ParameterizeMainLoop() {
+      mainLoop.MaxIterationsParameter.ActualName = MaxIterationsParameter.Name;
+    }
     #endregion
 
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimizationMainLoop.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimizationMainLoop.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimizationMainLoop.cs	(revision 5560)
@@ -0,0 +1,199 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+using HeuristicLab.Analysis;
+using HeuristicLab.Optimization;
+using HeuristicLab.Random;
+using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Encodings.RealVectorEncoding;
+
+namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
+  [Item("ParticleSwarmOptimizationMainLoop", "An operator which represents the main loop of a particle swarm optimization algorithm.")]
+  [StorableClass]
+  public class ParticleSwarmOptimizationMainLoop : AlgorithmOperator {
+    #region Parameter Properties
+    public IValueLookupParameter<IRandom> RandomParameter {
+      get { return (IValueLookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> SwarmSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SwarmSize"]; }
+    }
+    public IValueLookupParameter<IntValue> MaxIterationsParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["MaxIterations"]; }
+    }
+    public IValueLookupParameter<IOperator> AnalyzerParameter {
+      get { return (IValueLookupParameter<IOperator>)Parameters["Analyzer"]; }
+    }
+    public IValueLookupParameter<DoubleValue> InertiaParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters["Inertia"]; }
+    }
+    public IValueLookupParameter<DoubleValue> PersonalBestAttractionParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters["PersonalBestAttraction"]; }
+    }
+    public IValueLookupParameter<DoubleValue> NeighborsBestAttractionParameter {
+      get { return (IValueLookupParameter<DoubleValue>)Parameters["NeighborsBestAttraction"]; }
+    }
+    public IValueLookupParameter<DoubleMatrix> VelocityBoundsParameter {
+      get { return (IValueLookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
+    }                                     
+    public IValueLookupParameter<IOperator> ParticleUpdaterParameter {
+      get { return (IValueLookupParameter<IOperator>)Parameters["ParticleUpdater"]; }
+    }
+    public IValueLookupParameter<IOperator> TopologyUpdaterParameter {
+      get { return (IValueLookupParameter<IOperator>)Parameters["TopologyUpdater"]; }
+    }
+    public IValueLookupParameter<IOperator> InertiaUpdaterParameter {
+      get { return (IValueLookupParameter<IOperator>)Parameters["InertiaUpdater"]; }
+    }
+    public IValueLookupParameter<VariableCollection> ResultsParameter {
+      get { return (IValueLookupParameter<VariableCollection>)Parameters["Results"]; }
+    }
+    public IValueLookupParameter<IOperator> EvaluatorParameter {
+      get { return (IValueLookupParameter<IOperator>)Parameters["Evaluator"]; }
+    }
+    #endregion
+                                                                 
+    public ParticleSwarmOptimizationMainLoop()
+      : base() {
+      Initialize();
+    }
+
+    [StorableConstructor]
+    protected ParticleSwarmOptimizationMainLoop(bool deserializing) : base(deserializing) { }
+    protected ParticleSwarmOptimizationMainLoop(ParticleSwarmOptimizationMainLoop original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParticleSwarmOptimizationMainLoop(this, cloner);
+    }
+
+    private void Initialize() {
+      #region Create parameters
+      Parameters.Add(new ValueLookupParameter<IRandom>("Random", "A pseudo random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SwarmSize", "Size of the particle swarm.", new IntValue(10)));
+      Parameters.Add(new ValueLookupParameter<IntValue>("MaxIterations", "Maximal number of iterations.", new IntValue(1000)));
+      
+      Parameters.Add(new ValueLookupParameter<IOperator>("Analyzer", "The operator used to analyze each generation."));
+
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("Inertia", "Inertia weight on a particle's movement (omega)."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("PersonalBestAttraction", "Weight for particle's pull towards its personal best soution (phi_p)."));
+      Parameters.Add(new ValueLookupParameter<DoubleValue>("NeighborsBestAttraction", "Weight for pull towards the neighborhood best solution or global best solution in case of a totally connected topology (phi_g)."));
+     
+      Parameters.Add(new ValueLookupParameter<IOperator>("ParticleUpdater", "Operator that calculates new position and velocity of a particle"));
+      Parameters.Add(new ValueLookupParameter<IOperator>("TopologyUpdater", "Updates the neighborhood description vectors"));
+      Parameters.Add(new ValueLookupParameter<IOperator>("InertiaUpdater", "Updates the omega parameter"));
+      Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "Evaluates a particle solution."));
+
+      Parameters.Add(new ValueLookupParameter<VariableCollection>("Results", "The variable collection where results should be stored."));
+      #endregion
+
+      #region Create operators
+      Placeholder evaluatorPlaceholder = new Placeholder();
+      Placeholder analyzerPlaceholder = new Placeholder();
+      UniformSubScopesProcessor uniformSubScopeProcessor = new UniformSubScopesProcessor();
+      Placeholder particleUpdaterPlaceholder = new Placeholder();
+      Placeholder topologyUpdaterPlaceholder = new Placeholder();
+      UniformSubScopesProcessor uniformSubscopesProcessor2 = new UniformSubScopesProcessor();
+      UniformSubScopesProcessor evaluationProcessor = new UniformSubScopesProcessor();
+      NeighborUpdater neighborUpdater = new NeighborUpdater();
+      ISwarmUpdater swarmUpdater = new RealVectorSwarmUpdater();
+      IntCounter currentIterationCounter = new IntCounter();
+      Comparator currentIterationComparator = new Comparator();
+      ConditionalBranch conditionalBranch = new ConditionalBranch();
+      Placeholder velocityBoundsUpdaterPlaceholder = new Placeholder();
+      Placeholder omegaUpdaterPlaceholder = new Placeholder();
+      #endregion
+
+      #region Create operator graph
+      //OperatorGraph.InitialOperator = analyzerPlaceholder;
+
+      //analyzerPlaceholder.Name = "(Analyzer)";
+      //analyzerPlaceholder.OperatorParameter.ActualName = "Analyzer";
+      //analyzerPlaceholder.Successor = uniformSubScopeProcessor;
+
+      //uniformSubScopeProcessor.Operator = particleUpdaterPlaceholder;
+      //uniformSubScopeProcessor.Successor = evaluationProcessor;
+
+      //particleUpdaterPlaceholder.Name = "(ParticleUpdater)";
+      //particleUpdaterPlaceholder.OperatorParameter.ActualName = "ParticleUpdater";
+
+      //evaluationProcessor.Parallel = new BoolValue(true);
+      //evaluationProcessor.Operator = evaluatorPlaceholder;
+      //evaluationProcessor.Successor = topologyUpdaterPlaceholder;
+
+      //evaluatorPlaceholder.Name = "(Evaluator)";
+      //evaluatorPlaceholder.OperatorParameter.ActualName = "Evaluator";
+
+      //topologyUpdaterPlaceholder.Name = "(TopologyUpdater)";
+      //topologyUpdaterPlaceholder.OperatorParameter.ActualName = "TopologyUpdater";
+      //topologyUpdaterPlaceholder.Successor = neighborUpdater;
+
+      //neighborUpdater.Successor = uniformSubscopesProcessor2;
+
+      //uniformSubscopesProcessor2.Operator = swarmUpdater;
+      //uniformSubscopesProcessor2.Successor = analyzerPlaceholder;
+
+      //analyzerPlaceholder.Name = "(Analyzer)";
+      //analyzerPlaceholder.OperatorParameter.ActualName = "Analyzer";
+      //analyzerPlaceholder.Successor = currentIterationCounter;
+
+      //currentIterationCounter.Name = "CurrentIteration++";
+      //currentIterationCounter.ValueParameter.ActualName = "CurrentIteration";
+      //currentIterationCounter.Successor = omegaUpdaterPlaceholder;
+
+      //omegaUpdaterPlaceholder.Name = "(Inertia Updater)";
+      //omegaUpdaterPlaceholder.OperatorParameter.ActualName = "InertiaUpdater";
+      //omegaUpdaterPlaceholder.Successor = velocityBoundsUpdaterPlaceholder;
+
+      //velocityBoundsUpdaterPlaceholder.Name = "(Velocity Bounds Updater)";
+      //velocityBoundsUpdaterPlaceholder.OperatorParameter.ActualName = "VelocityBoundsUpdater";
+      //velocityBoundsUpdaterPlaceholder.Successor = currentIterationComparator;
+
+      //currentIterationComparator.LeftSideParameter.ActualName = "CurrentIteration";
+      //currentIterationComparator.Comparison = new Comparison(ComparisonType.Less);
+      //currentIterationComparator.RightSideParameter.ActualName = "MaxIterations";
+      //currentIterationComparator.ResultParameter.ActualName = "ContinueIteration";
+      //currentIterationComparator.Successor = conditionalBranch;
+
+      //conditionalBranch.Name = "ContinueIteration?";
+      //conditionalBranch.ConditionParameter.ActualName = "ContinueIteration";
+      //conditionalBranch.TrueBranch = uniformSubScopeProcessor;
+      #endregion
+    }
+
+    public override IOperation Apply() {
+      if (this.ParticleUpdaterParameter.ActualValue == null)
+        return null;
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleUpdater.cs	(revision 5527)
+++ 	(revision )
@@ -1,134 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.Data;
-using HeuristicLab.Encodings.RealVectorEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  [Item("ParticleUpdater", "Updates a certain particle taking the current position and velocity into account, as well as the best point and the best point in a local neighborhood.")]
-  [StorableClass]
-  public abstract class ParticleUpdater : SingleSuccessorOperator, IParticleUpdater {
-    public override bool CanChangeName {
-      get { return false; }
-    }
-
-    #region Parameter properties
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
-    }
-    public ILookupParameter<RealVector> PointParameter {
-      get { return (ILookupParameter<RealVector>)Parameters["Point"]; }
-    }
-    public ILookupParameter<RealVector> VelocityParameter {
-      get { return (ILookupParameter<RealVector>)Parameters["Velocity"]; }
-    }
-    public ILookupParameter<RealVector> PersonalBestPointParameter {
-      get { return (ILookupParameter<RealVector>)Parameters["PersonalBestPoint"]; }
-    }
-    public ILookupParameter<RealVector> BestNeighborPointParameter {
-      get { return (ILookupParameter<RealVector>)Parameters["BestNeighborPoint"]; }
-    }
-    public ILookupParameter<RealVector> BestPointParameter {
-      get { return (ILookupParameter<RealVector>)Parameters["BestPoint"]; }
-    }
-    public ILookupParameter<DoubleMatrix> BoundsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
-    }
-    public ILookupParameter<DoubleMatrix> VelocityBoundsParameter {
-      get { return (ILookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
-    }
-    public ILookupParameter<DoubleValue> OmegaParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Omega"]; }
-    }
-    public ILookupParameter<DoubleValue> Phi_PParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Phi_P"]; }
-    }
-    public ILookupParameter<DoubleValue> Phi_GParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Phi_G"]; }
-    }
-    #endregion
-
-    #region Parameter Values
-    protected IRandom Random {
-      get { return RandomParameter.ActualValue; }
-    }
-    protected RealVector Point {
-      get { return PointParameter.ActualValue; }
-      set { PointParameter.ActualValue = value; }
-    }
-    protected RealVector Velocity {
-      get { return VelocityParameter.ActualValue; }
-      set { VelocityParameter.ActualValue = value; }
-    }
-    protected RealVector PersonalBestPoint {
-      get { return PersonalBestPointParameter.ActualValue; }
-    }
-    protected RealVector BestPoint {
-      get { return BestPointParameter.ActualValue; }
-    }
-    protected RealVector BestNeighborPoint {
-      get { return BestNeighborPointParameter.ActualValue; }
-    }
-    protected DoubleMatrix Bounds {
-      get { return BoundsParameter.ActualValue; }
-    }
-    protected DoubleMatrix VelocityBounds {
-      get { return VelocityBoundsParameter.ActualValue; }
-    }
-    protected DoubleValue Omega {
-      get { return OmegaParameter.ActualValue; }
-    }
-    protected DoubleValue Phi_P {
-      get { return Phi_PParameter.ActualValue; }
-    }
-    protected DoubleValue Phi_G {
-      get { return Phi_GParameter.ActualValue; }
-    }
-    #endregion
-
-    #region Construction & Cloning
-
-    [StorableConstructor]
-    protected ParticleUpdater(bool deserializing) : base(deserializing) { }
-    protected ParticleUpdater(ParticleUpdater original, Cloner cloner) : base(original, cloner) { }
-    public ParticleUpdater()
-      : base() {
-      Parameters.Add(new LookupParameter<IRandom>("Random", "Random number generator."));
-      Parameters.Add(new LookupParameter<RealVector>("Point", "Particle's current position"));
-      Parameters.Add(new LookupParameter<RealVector>("Velocity", "Particle's current velocity."));
-      Parameters.Add(new LookupParameter<RealVector>("PersonalBestPoint", "Particle's personal best position"));
-      Parameters.Add(new LookupParameter<RealVector>("BestPoint", "Global best position"));
-      Parameters.Add(new LookupParameter<RealVector>("BestNeighborPoint", "Best neighboring position"));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("Bounds", "The lower and upper bounds for each dimension of the position vector for the current problem."));
-      Parameters.Add(new LookupParameter<DoubleMatrix>("VelocityBounds", "Upper and lower bounds for the particle's velocity vector."));
-      Parameters.Add(new LookupParameter<DoubleValue>("Omega", "The weight for the particle's velocity vector."));
-      Parameters.Add(new LookupParameter<DoubleValue>("Phi_P", "The weight for the particle's personal best position."));
-      Parameters.Add(new LookupParameter<DoubleValue>("Phi_G", "The weight for the global best position."));
-    }
-
-    #endregion
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/RandomTopologyInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/RandomTopologyInitializer.cs	(revision 5527)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/RandomTopologyInitializer.cs	(revision 5560)
@@ -25,5 +25,4 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -66,5 +65,5 @@
 
     public override IOperation Apply() {
-      ItemArray<IntegerVector> neighbors = new ItemArray<IntegerVector>(SwarmSize);
+      ItemArray<IntArray> neighbors = new ItemArray<IntArray>(SwarmSize);
       for (int i = 0; i < SwarmSize; i++) {
         var numbers = Enumerable.Range(0, SwarmSize).ToList();
@@ -76,5 +75,5 @@
           numbers.RemoveAt(index);
         }
-        neighbors[i] = new IntegerVector(selectedNumbers.ToArray());
+        neighbors[i] = new IntArray(selectedNumbers.ToArray());
       }
       Neighbors = neighbors;
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/RingTopologyInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/RingTopologyInitializer.cs	(revision 5527)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/RingTopologyInitializer.cs	(revision 5560)
@@ -22,6 +22,6 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
 
 namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
@@ -43,7 +43,7 @@
 
     public override IOperation Apply() {
-      ItemArray<IntegerVector> neighbors = new ItemArray<IntegerVector>(SwarmSize);
+      ItemArray<IntArray> neighbors = new ItemArray<IntArray>(SwarmSize);
       for (int i = 0; i < SwarmSize; i++) {
-        neighbors[i] = new IntegerVector(new[] { (SwarmSize + i - 1) % SwarmSize, (i + 1) % SwarmSize });
+        neighbors[i] = new IntArray(new[] { (SwarmSize + i - 1) % SwarmSize, (i + 1) % SwarmSize });
       }
       Neighbors = neighbors;
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/SwarmUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/SwarmUpdater.cs	(revision 5527)
+++ 	(revision )
@@ -1,126 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.Data;
-using HeuristicLab.Encodings.RealVectorEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  [Item("Swarm Updater", "Updates personal best point and quality as well as global best point and quality.")]
-  [StorableClass]
-  public sealed class SwarmUpdater : SingleSuccessorOperator {
-    public override bool CanChangeName {
-      get { return false; }
-    }
-
-    #region Parameter properties
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
-    }
-    public ILookupParameter<DoubleValue> PersonalBestQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["PersonalBestQuality"]; }
-    }
-    public ILookupParameter<DoubleValue> BestQualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["BestQuality"]; }
-    }
-    public ILookupParameter<RealVector> PointParameter {
-      get { return (ILookupParameter<RealVector>)Parameters["Point"]; }
-    }
-    public ILookupParameter<RealVector> PersonalBestPointParameter {
-      get { return (ILookupParameter<RealVector>)Parameters["PersonalBestPoint"]; }
-    }
-    public ILookupParameter<RealVector> BestPointParameter {
-      get { return (ILookupParameter<RealVector>)Parameters["BestPoint"]; }
-    }
-    public IValueLookupParameter<BoolValue> MaximizationParameter {
-      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
-    }
-    #endregion
-
-    #region Parameter values
-    private double Quality {
-      get { return QualityParameter.ActualValue.Value; }
-    }
-    private double PersonalBestQuality {
-      get { return PersonalBestQualityParameter.ActualValue.Value; }
-      set { PersonalBestQualityParameter.ActualValue = new DoubleValue(value); }
-    }
-    private double BestQuality {
-      get { return BestQualityParameter.ActualValue.Value; }
-      set { BestQualityParameter.ActualValue = new DoubleValue(value); }
-    }
-    private RealVector Point {
-      get { return PointParameter.ActualValue; }
-    }
-    private RealVector PersonalBestPoint {
-      get { return PersonalBestPointParameter.ActualValue; }
-      set { PersonalBestPointParameter.ActualValue = value; }
-    }
-    private RealVector BestPoint {
-      get { return BestPointParameter.ActualValue; }
-      set { BestPointParameter.ActualValue = value; }
-    }
-    private bool Maximization {
-      get { return MaximizationParameter.ActualValue.Value; }
-    }
-    #endregion
-
-    #region Construction & Cloning
-
-    [StorableConstructor]
-    private SwarmUpdater(bool deserializing) : base(deserializing) { }
-    private SwarmUpdater(SwarmUpdater original, Cloner cloner) : base(original, cloner) { }
-    public SwarmUpdater()
-      : base() {
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "Particle's quality"));
-      Parameters.Add(new LookupParameter<DoubleValue>("PersonalBestQuality", "Particle's personal best quality"));
-      Parameters.Add(new LookupParameter<DoubleValue>("BestQuality", "Global best particle quality"));
-      Parameters.Add(new LookupParameter<RealVector>("Point", "Particle's position"));
-      Parameters.Add(new LookupParameter<RealVector>("PersonalBestPoint", "Particle's personal best position"));
-      Parameters.Add(new LookupParameter<RealVector>("BestPoint", "Globa best particle position"));
-      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false."));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new SwarmUpdater(this, cloner);
-    }
-
-    #endregion
-
-    public override IOperation Apply() {
-      if (Maximization && Quality > PersonalBestQuality ||
-         !Maximization && Quality < PersonalBestQuality) {
-        PersonalBestQuality = Quality;
-        PersonalBestPoint = Point;
-        if (Maximization && PersonalBestQuality > BestQuality ||
-           !Maximization && PersonalBestQuality < BestQuality) {
-          BestQuality = PersonalBestQuality;
-          BestPoint = PersonalBestPoint;
-        }
-      }
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TopologyInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TopologyInitializer.cs	(revision 5527)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TopologyInitializer.cs	(revision 5560)
@@ -23,6 +23,6 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization; 
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -37,7 +37,8 @@
 
     #region Parameters
-    public IScopeTreeLookupParameter<IntegerVector> NeighborsParameter {
-      get { return (IScopeTreeLookupParameter<IntegerVector>)Parameters["Neighbors"]; }
+    public IScopeTreeLookupParameter<IntArray> NeighborsParameter {
+      get { return (IScopeTreeLookupParameter<IntArray>)Parameters["Neighbors"]; }
     }
+
     public ILookupParameter<IntValue> SwarmSizeParameter {
       get { return (ILookupParameter<IntValue>)Parameters["SwarmSize"]; }
@@ -47,5 +48,5 @@
 
     #region Parameter Values
-    protected ItemArray<IntegerVector> Neighbors {
+    protected ItemArray<IntArray> Neighbors {
       get { return NeighborsParameter.ActualValue; }
       set { NeighborsParameter.ActualValue = value; }
@@ -60,10 +61,10 @@
     protected TopologyInitializer(bool deserializing) : base(deserializing) { }
     protected TopologyInitializer(TopologyInitializer original, Cloner cloner) : base(original, cloner) { }
+    
     public TopologyInitializer() {
-      Parameters.Add(new ScopeTreeLookupParameter<IntegerVector>("Neighbors", "The list of neighbors for each particle."));
+      Parameters.Add(new ScopeTreeLookupParameter<IntArray>("Neighbors", "The list of neighbors for each particle."));
       Parameters.Add(new LookupParameter<IntValue>("SwarmSize", "Number of particles in the swarm."));
     }
     #endregion
-
   }
 
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TotallyConnectedParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TotallyConnectedParticleUpdater.cs	(revision 5527)
+++ 	(revision )
@@ -1,71 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.Encodings.RealVectorEncoding;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
-  [Item("Totally Connected Particle Updater", "Updates the particle's position using (among other things) the global best position. Use together with the empty topology initialzer. Point = Point + Velocity*Omega + (PersonalBestPoint-Point)*Phi_P*r_p + (BestPoint-Point)*Phi_G*r_g")]
-  [StorableClass]
-  public sealed class TotallyConnectedParticleUpdater : ParticleUpdater, IGlobalParticleUpdater {
-
-    #region Construction & Cloning
-
-    [StorableConstructor]
-    private TotallyConnectedParticleUpdater(bool deserializing) : base(deserializing) { }
-    private TotallyConnectedParticleUpdater(TotallyConnectedParticleUpdater original, Cloner cloner) : base(original, cloner) { }
-    public TotallyConnectedParticleUpdater() : base() { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new TotallyConnectedParticleUpdater(this, cloner);
-    }
-
-    #endregion
-
-    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;
-      }
-      BoundsChecker.Apply(velocity, VelocityBounds);
-      for (int i = 0; i < velocity.Length; i++) {
-        position[i] = Point[i] + velocity[i];
-      }
-      BoundsChecker.Apply(position, Bounds);
-      Point = position;
-      Velocity = velocity;
-
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/VonNeumannTopologyInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/VonNeumannTopologyInitializer.cs	(revision 5527)
+++ trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/VonNeumannTopologyInitializer.cs	(revision 5560)
@@ -22,6 +22,6 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
 
 namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
@@ -44,7 +44,7 @@
 
     public override IOperation Apply() {
-      ItemArray<IntegerVector> neighbors = new ItemArray<IntegerVector>(SwarmSize);
+      ItemArray<IntArray> neighbors = new ItemArray<IntArray>(SwarmSize);
       for (int i = 0; i < SwarmSize; i++) {
-        neighbors[i] = new IntegerVector(new[] {
+        neighbors[i] = new IntArray(new[] {
           (SwarmSize + i-2) % SwarmSize,
           (SwarmSize + i-1) % SwarmSize,
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj	(revision 5527)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj	(revision 5560)
@@ -104,4 +104,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ParticleOperators\RealVectorParticleCreator.cs" />
     <Compile Include="Crossovers\BlendAlphaBetaCrossover.cs" />
     <Compile Include="Interfaces\IRealVectorManipulator.cs" />
@@ -111,5 +112,12 @@
     <Compile Include="BoundsChecker.cs" />
     <Compile Include="Creators\UniformRandomRealVectorCreator.cs" />
+    <Compile Include="Interfaces\IRealVectorParticleCreator.cs" />
+    <Compile Include="Interfaces\IRealVectorParticleUpdater.cs" />
+    <Compile Include="Interfaces\IRealVectorSwarmUpdater.cs" />
     <Compile Include="Manipulators\SelfAdaptiveNormalAllPositionsManipulator.cs" />
+    <Compile Include="ParticleOperators\RealVectorNeighborhoodParticleUpdater.cs" />
+    <Compile Include="ParticleOperators\RealVectorParticleUpdater.cs" />
+    <Compile Include="ParticleOperators\RealVectorSwarmUpdater.cs" />
+    <Compile Include="ParticleOperators\RealVectorTotallyConnectedParticleUpdater.cs" />
     <Compile Include="RealVectorCreator.cs" />
     <Compile Include="RealVectorCrossover.cs" />
@@ -230,4 +238,5 @@
     </BootstrapperPackage>
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorParticleCreator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorParticleCreator.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorParticleCreator.cs	(revision 5560)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  public interface IRealVectorParticleCreator : IParticleCreator, IRealVectorOperator {
+    ILookupParameter<IntValue> ProblemSizeParameter { get; }
+    ILookupParameter<RealVector> RealVectorParameter { get; }
+    ILookupParameter<RealVector> PersonalBestParameter { get; }
+    IValueLookupParameter<DoubleMatrix> BoundsParameter { get; }
+    ILookupParameter<RealVector> VelocityParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorParticleUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorParticleUpdater.cs	(revision 5560)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  public interface IRealVectorParticleUpdater : IParticleUpdater, IRealVectorOperator {
+    ILookupParameter<RealVector> VelocityParameter { get; }
+    ILookupParameter<DoubleMatrix> VelocityBoundsParameter { get; }
+    ILookupParameter<RealVector> RealVectorParameter { get; }
+    ILookupParameter<DoubleMatrix> BoundsParameter { get; }
+    ILookupParameter<RealVector> PersonalBestParameter { get; }
+    ILookupParameter<RealVector> NeighborsBestParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorSwarmUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorSwarmUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorSwarmUpdater.cs	(revision 5560)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Core;
+using HeuristicLab.Optimization; 
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  public interface IRealVectorSwarmUpdater : ISwarmUpdater, IRealVectorOperator {
+    ILookupParameter<RealVector> NeighborsBestParameter { get; }
+    ILookupParameter<RealVector> PersonalBestParameter { get; }
+    ILookupParameter<RealVector> RealVectorParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorNeighborhoodParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorNeighborhoodParticleUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorNeighborhoodParticleUpdater.cs	(revision 5560)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Encodings.RealVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  [Item("Neighborhood Particle Updater", "Updates the particle's position using (among other things) the best neighbor's position. Point = Point + Velocity*Inertia + (PersonalBestPoint-Point)*Phi_P*r_p + (BestNeighborPoint-Point)*Phi_G*r_g.")]
+  [StorableClass]
+  public sealed class RealVectorNeighborhoodParticleUpdater : RealVectorParticleUpdater, ILocalParticleUpdater {
+
+    [StorableConstructor]
+    private RealVectorNeighborhoodParticleUpdater(bool deserializing) : base(deserializing) { }
+    private RealVectorNeighborhoodParticleUpdater(RealVectorNeighborhoodParticleUpdater original, Cloner cloner) : base(original, cloner) { }
+    public RealVectorNeighborhoodParticleUpdater() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RealVectorNeighborhoodParticleUpdater(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      RealVector velocity = new RealVector(Velocity.Length);
+      RealVector position = new RealVector(RealVector.Length);
+      double r_p = Random.NextDouble();
+      double r_g = Random.NextDouble();
+      double omega = Inertia.Value;
+      double phi_p = PersonalBestAttraction.Value;
+      double phi_g = NeighborsBestAttraction.Value;
+      for (int i = 0; i < velocity.Length; i++) {
+        velocity[i] =
+          Velocity[i] * omega +
+          (PersonalBest[i] - RealVector[i]) * phi_p * r_p +
+          (NeighborsBest[i] - RealVector[i]) * phi_g * r_g;
+      }
+      BoundsChecker.Apply(velocity, VelocityBounds);
+      for (int i = 0; i < velocity.Length; i++) {
+        position[i] = RealVector[i] + velocity[i];
+      }
+      BoundsChecker.Apply(position, Bounds);
+      RealVector = position;
+      Velocity = velocity;
+
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorParticleCreator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorParticleCreator.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorParticleCreator.cs	(revision 5560)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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; 
+using HeuristicLab.Operators;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  [Item("RealVectorParticleCreator", "Creates a particle with position, zero velocity vector and personal best.")]
+  [StorableClass]
+  public class RealVectorParticleCreator : SingleSuccessorOperator, IRealVectorParticleCreator {
+    #region IRealVectorParticleCreator Members
+    public ILookupParameter<IntValue> ProblemSizeParameter {
+     get { return (ILookupParameter<IntValue>)Parameters["ProblemSize"]; }
+    }
+
+    public ILookupParameter<RealVector> RealVectorParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["RealVector"]; }
+    }
+
+    public ILookupParameter<RealVector> PersonalBestParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["PersonalBest"]; }
+    }
+
+    public IValueLookupParameter<DoubleMatrix> BoundsParameter {
+      get { return (IValueLookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
+    }
+
+    public ILookupParameter<RealVector> VelocityParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["Velocity"]; }
+    }
+
+    #endregion
+
+    public RealVectorParticleCreator() : base() {
+      Parameters.Add(new LookupParameter<IntValue>("ProblemSize", "The dimension of the problem."));
+      Parameters.Add(new ValueLookupParameter<DoubleMatrix>("Bounds", "The lower and upper bounds in each dimension."));
+      Parameters.Add(new LookupParameter<RealVector>("RealVector", "Particle's current solution"));
+      Parameters.Add(new LookupParameter<RealVector>("PersonalBest", "Particle's personal best solution."));
+      Parameters.Add(new LookupParameter<RealVector>("Velocity", "Particle's current velocity."));   
+    }
+
+    public override IOperation Apply() {
+      VelocityParameter.ActualValue = new RealVector(ProblemSizeParameter.ActualValue.Value);
+      UniformRandomRealVectorCreator realVectorCreater = new UniformRandomRealVectorCreator(); 
+      Assigner personalBestPositionAssigner = new Assigner();
+
+      this.Name = "Particle Creator";
+
+      //realVectorCreater.Name = "(SolutionCreator)";
+      realVectorCreater.RealVectorParameter.ActualName = "RealVector";
+      realVectorCreater.LengthParameter.ActualName = ProblemSizeParameter.Name;
+      realVectorCreater.BoundsParameter.ActualName = BoundsParameter.Name; 
+      realVectorCreater.Successor = personalBestPositionAssigner;
+
+      personalBestPositionAssigner.LeftSideParameter.ActualName = "PersonalBest";
+      personalBestPositionAssigner.RightSideParameter.ActualName = "RealVector";
+      personalBestPositionAssigner.Successor = null; 
+
+      OperationCollection next = new OperationCollection();
+      next.Add(ExecutionContext.CreateChildOperation(realVectorCreater));
+      next.Add(base.Apply());
+      return next;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RealVectorParticleCreator(this, cloner);
+    }
+
+    protected RealVectorParticleCreator(RealVectorParticleCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    protected RealVectorParticleCreator(bool deserializing) : base(deserializing) { }
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorParticleUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorParticleUpdater.cs	(revision 5560)
@@ -0,0 +1,128 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  [Item("RealVectorParticleUpdater", "Updates a certain particle taking the current position and velocity into account, as well as the best point and the best point in a local neighborhood.")]
+  [StorableClass]
+  public abstract class RealVectorParticleUpdater : SingleSuccessorOperator, IRealVectorParticleUpdater {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    #region Parameter properties
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<RealVector> VelocityParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["Velocity"]; }
+    }
+    public ILookupParameter<RealVector> PersonalBestParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["PersonalBestParameter"]; }
+    }
+    public ILookupParameter<RealVector> NeighborsBestParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["NeighborsBest"]; }
+    }
+    public ILookupParameter<RealVector> RealVectorParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["RealVector"]; }
+    }
+    public ILookupParameter<DoubleMatrix> BoundsParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Bounds"]; }
+    }
+    public ILookupParameter<DoubleMatrix> VelocityBoundsParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
+    }
+    public ILookupParameter<DoubleValue> InertiaParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Inertia"]; }
+    }
+    public ILookupParameter<DoubleValue> PersonalBestAttractionParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["PersonalBestAttraction"]; }
+    }
+    public ILookupParameter<DoubleValue> NeighborsBestAttractionParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["NeighborsBestAttraction"]; }
+    }
+    #endregion
+
+    #region Parameter Values
+    protected IRandom Random {
+      get { return RandomParameter.ActualValue; }
+    }
+    protected RealVector Velocity {
+      get { return VelocityParameter.ActualValue; }
+      set { VelocityParameter.ActualValue = value; }
+    }
+    protected RealVector PersonalBest {
+      get { return PersonalBestParameter.ActualValue; }
+    }
+    protected RealVector RealVector {
+      get { return RealVectorParameter.ActualValue; }
+      set { RealVectorParameter.ActualValue = value; }
+    }
+    protected RealVector NeighborsBest {
+      get { return NeighborsBestParameter.ActualValue; }
+    }
+    protected DoubleMatrix Bounds {
+      get { return BoundsParameter.ActualValue; }
+    }
+    protected DoubleMatrix VelocityBounds {
+      get { return VelocityBoundsParameter.ActualValue; }
+    }
+    protected DoubleValue Inertia {
+      get { return InertiaParameter.ActualValue; }
+    }
+    protected DoubleValue PersonalBestAttraction {
+      get { return PersonalBestAttractionParameter.ActualValue; }
+    }
+    protected DoubleValue NeighborsBestAttraction {
+      get { return NeighborsBestAttractionParameter.ActualValue; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    protected RealVectorParticleUpdater(bool deserializing) : base(deserializing) { }
+    protected RealVectorParticleUpdater(RealVectorParticleUpdater original, Cloner cloner) : base(original, cloner) { }
+    
+    public RealVectorParticleUpdater()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "Random number generator."));
+      Parameters.Add(new LookupParameter<RealVector>("RealVector", "Particle's current solution"));
+      Parameters.Add(new LookupParameter<RealVector>("Velocity", "Particle's current velocity."));
+      Parameters.Add(new LookupParameter<RealVector>("PersonalBest", "Particle's personal best solution."));
+      Parameters.Add(new LookupParameter<RealVector>("BestPoint", "Global best position."));
+      Parameters.Add(new LookupParameter<RealVector>("NeighborsBest", "Best neighboring solution."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Bounds", "The lower and upper bounds for each dimension of the position vector for the current problem."));
+      Parameters.Add(new LookupParameter<DoubleMatrix>("VelocityBounds", "Upper and lower bounds for the particle's velocity vector."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Inertia", "The weight for the particle's velocity vector."));
+      Parameters.Add(new LookupParameter<DoubleValue>("PersonalBestAttraction", "The weight for the particle's personal best position."));
+      Parameters.Add(new LookupParameter<DoubleValue>("NeighborsBestAttraction", "The weight for the global best position."));
+    }
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorSwarmUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorSwarmUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorSwarmUpdater.cs	(revision 5560)
@@ -0,0 +1,126 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  [Item("Swarm Updater", "Updates personal best point and quality as well as global best point and quality.")]
+  [StorableClass]
+  public sealed class RealVectorSwarmUpdater : SingleSuccessorOperator, IRealVectorSwarmUpdater {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    #region Parameter properties
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> PersonalBestQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["PersonalBestQuality"]; }
+    }
+    public ILookupParameter<DoubleValue> NeighborsBestQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["NeighborsBestQuality"]; }
+    }
+    public ILookupParameter<RealVector> RealVectorParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["RealVector"]; }
+    }
+    public ILookupParameter<RealVector> PersonalBestParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["PersonalBest"]; }
+    }
+    public ILookupParameter<RealVector> NeighborsBestParameter {
+      get { return (ILookupParameter<RealVector>)Parameters["NeighborsBest"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    #endregion
+
+    #region Parameter values
+    private double Quality {
+      get { return QualityParameter.ActualValue.Value; }
+    }
+    private double PersonalBestQuality {
+      get { return PersonalBestQualityParameter.ActualValue.Value; }
+      set { PersonalBestQualityParameter.ActualValue = new DoubleValue(value); }
+    }
+    private double NeighborsBestQuality {
+      get { return NeighborsBestQualityParameter.ActualValue.Value; }
+      set { NeighborsBestQualityParameter.ActualValue = new DoubleValue(value); }
+    }
+    private RealVector RealVector {
+      get { return RealVectorParameter.ActualValue; }
+    }
+    private RealVector PersonalBest {
+      get { return PersonalBestParameter.ActualValue; }
+      set { PersonalBestParameter.ActualValue = value; }
+    }
+    private RealVector NeighborsBest {
+      get { return NeighborsBestParameter.ActualValue; }
+      set { NeighborsBestParameter.ActualValue = value; }
+    }
+    private bool Maximization {
+      get { return MaximizationParameter.ActualValue.Value; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    private RealVectorSwarmUpdater(bool deserializing) : base(deserializing) { }
+    private RealVectorSwarmUpdater(RealVectorSwarmUpdater original, Cloner cloner) : base(original, cloner) { }
+    public RealVectorSwarmUpdater()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "Particle's quality"));
+      Parameters.Add(new LookupParameter<DoubleValue>("PersonalBestQuality", "Particle's personal best quality"));
+      Parameters.Add(new LookupParameter<DoubleValue>("NeighborsBestQuality", "Global best particle quality"));
+      Parameters.Add(new LookupParameter<RealVector>("RealVector", "Particle's position"));
+      Parameters.Add(new LookupParameter<RealVector>("PersonalBest", "Particle's personal best position"));
+      Parameters.Add(new LookupParameter<RealVector>("NeighborsBest", "Neighborhood (or global in case of totally connected neighborhood) best particle position"));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RealVectorSwarmUpdater(this, cloner);
+    }
+
+    #endregion
+
+    public override IOperation Apply() {
+      if (Maximization && Quality > PersonalBestQuality ||
+         !Maximization && Quality < PersonalBestQuality) {
+        PersonalBestQuality = Quality;
+        PersonalBest = RealVector;
+        if (Maximization && PersonalBestQuality > NeighborsBestQuality ||
+           !Maximization && PersonalBestQuality < NeighborsBestQuality) {
+             NeighborsBestQuality = PersonalBestQuality;
+             NeighborsBest = PersonalBest;
+        }
+      }
+      return base.Apply();
+    }
+
+  }
+}
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorTotallyConnectedParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorTotallyConnectedParticleUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorTotallyConnectedParticleUpdater.cs	(revision 5560)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  [Item("Totally Connected Particle Updater", "Updates the particle's position using (among other things) the global best position. Use together with the empty topology initialzer. Point = Point + Velocity*Inertia + (PersonalBestPoint-Point)*Phi_P*r_p + (BestPoint-Point)*Phi_G*r_g")]
+  [StorableClass]
+  public sealed class RealVectorTotallyConnectedParticleUpdater : RealVectorParticleUpdater, IGlobalParticleUpdater {
+
+    #region Construction & Cloning
+
+    [StorableConstructor]
+    private RealVectorTotallyConnectedParticleUpdater(bool deserializing) : base(deserializing) { }
+    private RealVectorTotallyConnectedParticleUpdater(RealVectorTotallyConnectedParticleUpdater original, Cloner cloner) : base(original, cloner) { }
+    public RealVectorTotallyConnectedParticleUpdater() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RealVectorTotallyConnectedParticleUpdater(this, cloner);
+    }
+
+    #endregion
+
+    public override IOperation Apply() {
+      base.Apply();
+      RealVector velocity = new RealVector(Velocity.Length);
+      RealVector position = new RealVector(RealVector.Length);
+      double r_p = Random.NextDouble();
+      double r_g = Random.NextDouble();
+      double omega = Inertia.Value;
+      double phi_p = PersonalBestAttraction.Value;
+      double phi_g = NeighborsBestAttraction.Value;
+      for (int i = 0; i < velocity.Length; i++) {
+        velocity[i] =
+          Velocity[i] * omega +
+          (PersonalBest[i] - RealVector[i]) * phi_p * r_p +
+          (NeighborsBest[i] - RealVector[i]) * phi_g * r_g;
+      }
+      BoundsChecker.Apply(velocity, VelocityBounds);
+      for (int i = 0; i < velocity.Length; i++) {
+        position[i] = RealVector[i] + velocity[i];
+      }
+      BoundsChecker.Apply(position, Bounds);
+      RealVector = position;
+      Velocity = velocity;
+
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 5527)
+++ trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 5560)
@@ -114,6 +114,14 @@
     <Compile Include="Algorithm.cs" />
     <Compile Include="BatchRun.cs" />
+    <Compile Include="Interfaces\IDiscreteDoubleMatrixModifier.cs" />
+    <Compile Include="Interfaces\IGlobalParticleUpdater.cs" />
+    <Compile Include="Interfaces\ILocalParticleUpdater.cs" />
     <Compile Include="Interfaces\IMultiAnalyzer.cs" />
     <Compile Include="Interfaces\IIterationBasedOperator.cs" />
+    <Compile Include="Interfaces\IParticleCreator.cs" />
+    <Compile Include="Interfaces\IParticleUpdater.cs" />
+    <Compile Include="Interfaces\ISwarmUpdater.cs" />
+    <Compile Include="Interfaces\ITopologyInitializer.cs" />
+    <Compile Include="Interfaces\ITopologyUpdater.cs" />
     <Compile Include="MultiObjectiveProblem.cs" />
     <Compile Include="Problem.cs" />
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IDiscreteDoubleMatrixModifier.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IDiscreteDoubleMatrixModifier.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IDiscreteDoubleMatrixModifier.cs	(revision 5560)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Optimization {
+  public interface IDiscreteDoubleMatrixModifier : IItem {
+    ILookupParameter<DoubleMatrix> ValueParameter { get; }
+    ILookupParameter<DoubleValue> ScaleParameter { get; }
+    ConstrainedValueParameter<IDiscreteDoubleValueModifier> ScalingOperatorParameter { get; }
+    IValueLookupParameter<DoubleValue> StartValueParameter { get; }
+    IValueLookupParameter<DoubleValue> EndValueParameter { get; }
+    ILookupParameter<IntValue> IndexParameter { get; }
+    IValueLookupParameter<IntValue> StartIndexParameter { get; }
+    IValueLookupParameter<IntValue> EndIndexParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IGlobalParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IGlobalParticleUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IGlobalParticleUpdater.cs	(revision 5560)
@@ -0,0 +1,25 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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
+
+namespace HeuristicLab.Optimization {
+  public interface IGlobalParticleUpdater : IParticleUpdater {
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ILocalParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ILocalParticleUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ILocalParticleUpdater.cs	(revision 5560)
@@ -0,0 +1,25 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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
+
+namespace HeuristicLab.Optimization {
+  public interface ILocalParticleUpdater : IParticleUpdater {
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IParticleCreator.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IParticleCreator.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IParticleCreator.cs	(revision 5560)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Core;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// Interface to represent an operator that generates a particle. 
+  /// </summary>
+  public interface IParticleCreator : ISolutionCreator {
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IParticleUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IParticleUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/IParticleUpdater.cs	(revision 5560)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// Interface to represent an operator that updates a particle 
+  /// </summary>
+  public interface IParticleUpdater : IOperator {
+    ILookupParameter<DoubleValue> InertiaParameter { get; }
+    ILookupParameter<DoubleValue> NeighborsBestAttractionParameter { get; }
+    ILookupParameter<DoubleValue> PersonalBestAttractionParameter { get; }
+    ILookupParameter<IRandom> RandomParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISwarmUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISwarmUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISwarmUpdater.cs	(revision 5560)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Optimization {
+  public interface ISwarmUpdater : IOperator {
+    ILookupParameter<DoubleValue> QualityParameter { get; }
+    ILookupParameter<DoubleValue> NeighborsBestQualityParameter { get; }
+    ILookupParameter<DoubleValue> PersonalBestQualityParameter { get; }
+    IValueLookupParameter<BoolValue> MaximizationParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ITopologyInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ITopologyInitializer.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ITopologyInitializer.cs	(revision 5560)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Optimization {
+  public interface ITopologyInitializer : IOperator {
+    IScopeTreeLookupParameter<IntArray> NeighborsParameter { get; }
+    ILookupParameter<IntValue> SwarmSizeParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ITopologyUpdater.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ITopologyUpdater.cs	(revision 5560)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ITopologyUpdater.cs	(revision 5560)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Optimization {
+  public interface ITopologyUpdater : IOperator {
+    IScopeTreeLookupParameter<IntArray> NeighborsParameter { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 5527)
+++ trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 5560)
@@ -403,4 +403,13 @@
         op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
       }
+      foreach (IRealVectorParticleCreator op in Operators.OfType<IRealVectorParticleCreator>()) {
+        op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.BoundsParameter.ActualName = BoundsParameter.Name;
+        op.ProblemSizeParameter.ActualName = ProblemSizeParameter.Name; 
+      }
+      foreach (IRealVectorParticleUpdater op in Operators.OfType<IRealVectorParticleUpdater>()) {
+        op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.BoundsParameter.ActualName = BoundsParameter.Name; 
+      }
     }
     private void UpdateStrategyVectorBounds() {
