Index: branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj
===================================================================
--- branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj	(revision 5340)
+++ branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj	(revision 5342)
@@ -111,4 +111,6 @@
     <Compile Include="BestPointInitializer.cs" />
     <Compile Include="IDiscreteDoubleMatrixModifier.cs" />
+    <Compile Include="IGlobalParticleUpdater.cs" />
+    <Compile Include="ILocalParticleUpdater.cs" />
     <Compile Include="MultiPSOTopologyUpdater.cs" />
     <Compile Include="VelocityBoundsModifier.cs" />
Index: branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IGlobalParticleUpdater.cs
===================================================================
--- branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IGlobalParticleUpdater.cs	(revision 5342)
+++ branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IGlobalParticleUpdater.cs	(revision 5342)
@@ -0,0 +1,9 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
+  public interface IGlobalParticleUpdater : IParticleUpdater {
+  }
+}
Index: branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ILocalParticleUpdater.cs
===================================================================
--- branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ILocalParticleUpdater.cs	(revision 5342)
+++ branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ILocalParticleUpdater.cs	(revision 5342)
@@ -0,0 +1,9 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
+  public interface ILocalParticleUpdater : IParticleUpdater {
+  }
+}
Index: branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IParticleUpdater.cs
===================================================================
--- branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IParticleUpdater.cs	(revision 5340)
+++ branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/IParticleUpdater.cs	(revision 5342)
@@ -27,5 +27,5 @@
 namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
 
-  public interface IParticleUpdater : IItem {
+  public interface IParticleUpdater : INamedItem {
 
     LookupParameter<RealVector> VelocityParameter { get; }
Index: branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborhoodParticleUpdater.cs
===================================================================
--- branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborhoodParticleUpdater.cs	(revision 5340)
+++ branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/NeighborhoodParticleUpdater.cs	(revision 5342)
@@ -29,5 +29,5 @@
   [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 class NeighborhoodParticleUpdater : ParticleUpdater {
+  public class NeighborhoodParticleUpdater : ParticleUpdater, ILocalParticleUpdater {
 
     #region Construction & Cloning
Index: branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs
===================================================================
--- branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 5340)
+++ branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 5342)
@@ -115,11 +115,30 @@
     [Storable]
     private BestAverageWorstQualityAnalyzer qualityAnalyzer;
+
+    public ITopologyInitializer TopologyInitializer {
+      get { return TopologyInitializerParameter.Value; }
+      set { TopologyInitializerParameter.Value = value; }
+    }
+
+    public ITopologyUpdater TopologyUpdater {
+      get { return TopologyUpdaterParameter.Value; }
+      set { TopologyUpdaterParameter.Value = value; }
+    }
+
+    public IParticleUpdater ParticleUpdater {
+      get { return ParticleUpdaterParameter.Value; }
+      set { ParticleUpdaterParameter.Value = value; }
+    }
+
     #endregion
 
     [StorableConstructor]
-    protected ParticleSwarmOptimization(bool deserializing) : base(deserializing) { }
+    protected ParticleSwarmOptimization(bool deserializing) : base(deserializing) {
+      Initialize();
+    }
     protected ParticleSwarmOptimization(ParticleSwarmOptimization original, Cloner cloner)
       : base(original, cloner) {
       qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      Initialize();
     }
 
@@ -255,4 +274,52 @@
       UpdateOmegaUpdater();
       InitOmegaUpdater();
+      Initialize();
+    }
+
+    private void Initialize() {
+      TopologyInitializerParameter.ValueChanged += new EventHandler(TopologyInitializerParameter_ValueChanged);
+      ParticleUpdaterParameter.ValueChanged += new EventHandler(ParticleUpdaterParameter_ValueChanged);
+      TopologyUpdaterParameter.ValueChanged += new EventHandler(TopologyUpdaterParameter_ValueChanged);
+    }
+
+    void TopologyUpdaterParameter_ValueChanged(object sender, EventArgs e) {
+      if (TopologyInitializer is EmptyTopologyInitializer) { // no topology updater allowed
+        if (TopologyUpdater != null) {
+          TopologyUpdater = null;
+        }
+      }
+    }
+
+    void ParticleUpdaterParameter_ValueChanged(object sender, EventArgs e) {
+      if (TopologyInitializer is EmptyTopologyInitializer) { // only global particle updater allowed
+        if (!(ParticleUpdater is IGlobalParticleUpdater)) {
+          ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is IGlobalParticleUpdater).First();
+        }
+      } else {  // only local particle updater allowed
+        if (!(ParticleUpdater is ILocalParticleUpdater)) {
+          ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is ILocalParticleUpdater).First();
+        }
+      }
+    }
+
+    void TopologyInitializerParameter_ValueChanged(object sender, EventArgs e) {
+      if (TopologyInitializer is EmptyTopologyInitializer) {   // only allow global particle update and no topology update
+        if (ParticleUpdaterParameter.ValidValues.Count > 0) {
+          if (!(ParticleUpdater is IGlobalParticleUpdater)) {
+            ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is IGlobalParticleUpdater).First();
+          }
+        }
+        if (TopologyUpdaterParameter.ValidValues.Count > 0) {
+          if (!(TopologyUpdater != null)) {
+            TopologyUpdater = null;
+          }
+        }
+      } else { // only allow local particle update; topology change possible
+        if (ParticleUpdaterParameter.ValidValues.Count > 0) {
+          if (!(ParticleUpdater is ILocalParticleUpdater)) {
+            ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is ILocalParticleUpdater).First();
+          }
+        }
+      }
     }
 
Index: branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TotallyConnectedParticleUpdater.cs
===================================================================
--- branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TotallyConnectedParticleUpdater.cs	(revision 5340)
+++ branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/TotallyConnectedParticleUpdater.cs	(revision 5342)
@@ -29,5 +29,5 @@
   [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 class TotallyConnectedParticleUpdater : ParticleUpdater {
+  public class TotallyConnectedParticleUpdater : ParticleUpdater, IGlobalParticleUpdater {
 
     #region Construction & Cloning
