Index: branches/DataAnalysis.IslandAlgorithms/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs
===================================================================
--- branches/DataAnalysis.IslandAlgorithms/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs	(revision 10178)
+++ branches/DataAnalysis.IslandAlgorithms/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithm.cs	(revision 10197)
@@ -67,4 +67,7 @@
       get { return (ValueParameter<IntValue>)Parameters["MigrationInterval"]; }
     }
+    protected IFixedValueParameter<IntValue> AnalysisIntervalParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["AnalysisInterval"]; }
+    }
     protected ValueParameter<PercentValue> MigrationRateParameter {
       get { return (ValueParameter<PercentValue>)Parameters["MigrationRate"]; }
@@ -130,4 +133,8 @@
       get { return MigrationIntervalParameter.Value; }
       set { MigrationIntervalParameter.Value = value; }
+    }
+    public int AnalysisInterval {
+      get { return AnalysisIntervalParameter.Value.Value; }
+      set { AnalysisIntervalParameter.Value.Value = value; }
     }
     public PercentValue MigrationRate {
@@ -218,4 +225,10 @@
         Parameters.Add(new FixedValueParameter<BoolValue>("ReevaluateElites", "Flag to determine if elite individuals should be reevaluated (i.e., if stochastic fitness functions are used.)", (BoolValue)new BoolValue(false).AsReadOnly()) { Hidden = true });
       }
+      if (!Parameters.ContainsKey("ReevaluateImmigrants")) {
+        Parameters.Add(new FixedValueParameter<BoolValue>("ReevaluateImmigrants", "Flag which indicates if inviduals should be reevaluated before they are immigrated.", new BoolValue(false)) { Hidden = true });
+      }
+      if (!Parameters.ContainsKey("AnalysisInterval")) {
+        Parameters.Add(new ValueParameter<IntValue>("AnalysisInterval", "The number of generations that should pass between the analyzers should be executed (should be <= MigrationInteval).", new IntValue(20)) { Hidden = true });
+      }
       #endregion
 
@@ -238,4 +251,5 @@
       Parameters.Add(new ValueParameter<IntValue>("NumberOfIslands", "The number of islands.", new IntValue(5)));
       Parameters.Add(new ValueParameter<IntValue>("MigrationInterval", "The number of generations that should pass between migration phases.", new IntValue(20)));
+      Parameters.Add(new ValueParameter<IntValue>("AnalysisInterval", "The number of generations that should pass between the analyzers should be executed (should be <= MigrationInteval).", new IntValue(20)) { Hidden = true });
       Parameters.Add(new ValueParameter<PercentValue>("MigrationRate", "The proportion of individuals that should migrate between the islands.", new PercentValue(0.15)));
       Parameters.Add(new ConstrainedValueParameter<IMigrator>("Migrator", "The migration strategy."));
Index: branches/DataAnalysis.IslandAlgorithms/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs
===================================================================
--- branches/DataAnalysis.IslandAlgorithms/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs	(revision 10178)
+++ branches/DataAnalysis.IslandAlgorithms/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/IslandGeneticAlgorithmMainLoop.cs	(revision 10197)
@@ -56,4 +56,7 @@
       get { return (ValueLookupParameter<IntValue>)Parameters["MigrationInterval"]; }
     }
+    public IValueLookupParameter<IntValue> AnalysisIntervalParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["AnalysisInterval"]; }
+    }
     public ValueLookupParameter<PercentValue> MigrationRateParameter {
       get { return (ValueLookupParameter<PercentValue>)Parameters["MigrationRate"]; }
@@ -115,4 +118,7 @@
     public ValueLookupParameter<BoolValue> Migrate {
       get { return (ValueLookupParameter<BoolValue>)Parameters["Migrate"]; }
+    }
+    public ILookupParameter<BoolValue> RunAnalysis {
+      get { return (ILookupParameter<BoolValue>)Parameters["RunAnalysis"]; }
     }
 
@@ -139,4 +145,5 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfIslands", "The number of islands."));
       Parameters.Add(new ValueLookupParameter<IntValue>("MigrationInterval", "The number of generations that should pass between migration phases."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("AnalysisInterval", "The number of generations that should pass between the analyzers should be executed (should be <= MigrationInteval)."));
       Parameters.Add(new ValueLookupParameter<PercentValue>("MigrationRate", "The proportion of individuals that should migrate between the islands."));
       Parameters.Add(new ValueLookupParameter<IOperator>("Migrator", "The migration strategy."));
@@ -159,4 +166,5 @@
       Parameters.Add(new LookupParameter<IntValue>("IslandEvaluatedSolutions", "The number of times a solution has been evaluated on one island."));
       Parameters.Add(new ValueLookupParameter<BoolValue>("Migrate", "Migrate the island?"));
+      Parameters.Add(new LookupParameter<BoolValue>("RunAnalysis", "Run Analyzers?"));
       Parameters.Add(new ValueLookupParameter<BoolValue>("ReevaluateImmigrants", "Flag which indicates if inviduals should be reevaluated before they are immigrated."));
       #endregion
@@ -189,8 +197,16 @@
       MergingReducer mergingReducer = new MergingReducer();
       IntCounter islandGenerationsCounter = new IntCounter();
+      IntCounter generationsSinceLastMigrationCounter = new IntCounter();
+      IntCounter generationsSinceLastAnalysisCounter = new IntCounter();
       Comparator checkIslandGenerationsReachedMaximum = new Comparator();
       ConditionalBranch checkContinueEvolution = new ConditionalBranch();
+      Assigner resetGenerationsSinceLastMigration = new Assigner();
+      Comparator checkIslandGenerationsForAnalysis = new Comparator();
+      ConditionalBranch checkRunAnalysis = new ConditionalBranch();
+      Assigner resetGenerationsSinceLastAnalysis = new Assigner();
       DataReducer generationsReducer = new DataReducer();
       DataReducer evaluatedSolutionsReducer = new DataReducer();
+      DataReducer migrationDataReducer = new DataReducer();
+      ConditionalBranch migrateIndividuals = new ConditionalBranch();
       Placeholder islandAnalyzer2 = new Placeholder();
       UniformSubScopesProcessor uniformSubScopesProcessor5 = new UniformSubScopesProcessor();
@@ -211,5 +227,4 @@
 
       variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Migrations", new IntValue(0)));
-      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("GenerationsSinceLastMigration", new IntValue(0)));
       variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Generations", new IntValue(0))); // Class IslandGeneticAlgorithm expects this to be called Generations
 
@@ -217,4 +232,6 @@
       islandVariableCreator.CollectedValues.Add(new ValueParameter<IntValue>("IslandGenerations", new IntValue(0)));
       islandVariableCreator.CollectedValues.Add(new ValueParameter<IntValue>("IslandEvaluatedSolutions", new IntValue(0)));
+      islandVariableCreator.CollectedValues.Add(new ValueParameter<IntValue>("IslandGenerationsSinceLastMigration", new IntValue(0)));
+      islandVariableCreator.CollectedValues.Add(new ValueParameter<IntValue>("IslandGenerationsSinceLastAnalysis", new IntValue(0)));
 
       islandAnalyzer1.Name = "Island Analyzer (placeholder)";
@@ -271,12 +288,40 @@
       islandGenerationsCounter.Increment = new IntValue(1);
 
-      checkIslandGenerationsReachedMaximum.LeftSideParameter.ActualName = IslandGenerations.Name;
+      generationsSinceLastMigrationCounter.Name = "Increment island generation since last migration";
+      generationsSinceLastMigrationCounter.ValueParameter.ActualName = "IslandGenerationsSinceLastMigration";
+      generationsSinceLastMigrationCounter.Increment = new IntValue(1);
+
+      generationsSinceLastAnalysisCounter.Name = "Increment island generation since last analysis";
+      generationsSinceLastAnalysisCounter.ValueParameter.ActualName = "IslandGenerationsSinceLastAnalysis";
+      generationsSinceLastAnalysisCounter.Increment = new IntValue(1);
+
+      checkIslandGenerationsReachedMaximum.LeftSideParameter.ActualName = "IslandGenerationsSinceLastMigration";
       checkIslandGenerationsReachedMaximum.RightSideParameter.ActualName = MigrationIntervalParameter.Name;
       checkIslandGenerationsReachedMaximum.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
       checkIslandGenerationsReachedMaximum.ResultParameter.ActualName = Migrate.Name;
 
+      resetGenerationsSinceLastMigration.Name = "Reset generations since last migration";
+      resetGenerationsSinceLastMigration.LeftSideParameter.ActualName = "IslandGenerationsSinceLastMigration";
+      resetGenerationsSinceLastMigration.RightSideParameter.Value = new IntValue(0);
+      resetGenerationsSinceLastMigration.Successor = resetGenerationsSinceLastAnalysis;
+
       checkContinueEvolution.Name = "Migrate?";
       checkContinueEvolution.ConditionParameter.ActualName = Migrate.Name;
-      checkContinueEvolution.FalseBranch = selector;
+      checkContinueEvolution.TrueBranch = resetGenerationsSinceLastMigration;
+      checkContinueEvolution.FalseBranch = checkIslandGenerationsForAnalysis;
+
+      checkIslandGenerationsForAnalysis.LeftSideParameter.ActualName = "IslandGenerationsSinceLastAnalysis";
+      checkIslandGenerationsForAnalysis.RightSideParameter.ActualName = AnalysisIntervalParameter.Name;
+      checkIslandGenerationsForAnalysis.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
+      checkIslandGenerationsForAnalysis.ResultParameter.ActualName = RunAnalysis.Name;
+
+      resetGenerationsSinceLastAnalysis.Name = "Reset generations since last analysis";
+      resetGenerationsSinceLastAnalysis.LeftSideParameter.ActualName = "IslandGenerationsSinceLastAnalysis";
+      resetGenerationsSinceLastAnalysis.RightSideParameter.Value = new IntValue(0);
+
+      checkRunAnalysis.Name = "Run Analyzers?";
+      checkRunAnalysis.ConditionParameter.ActualName = RunAnalysis.Name;
+      checkRunAnalysis.TrueBranch = resetGenerationsSinceLastAnalysis;
+      checkRunAnalysis.FalseBranch = selector;
 
       islandAnalyzer2.Name = "Island Analyzer (placeholder)";
@@ -294,4 +339,13 @@
       evaluatedSolutionsReducer.ReductionOperation.Value = new ReductionOperation(ReductionOperations.Sum);
       evaluatedSolutionsReducer.TargetOperation.Value = new ReductionOperation(ReductionOperations.Sum);
+
+      migrationDataReducer.Name = "Collect Migration Flags";
+      migrationDataReducer.ParameterToReduce.ActualName = Migrate.Name;
+      migrationDataReducer.TargetParameter.ActualName = Migrate.Name;
+      migrationDataReducer.ReductionOperation.Value = new ReductionOperation(ReductionOperations.All);
+      migrationDataReducer.TargetOperation.Value = new ReductionOperation(ReductionOperations.Assign);
+
+      migrateIndividuals.Name = "Migrate?";
+      migrateIndividuals.ConditionParameter.ActualName = Migrate.Name;
 
       emigrantsSelector.Name = "Emigrants Selector (placeholder)";
@@ -354,5 +408,8 @@
       uniformSubScopesProcessor1.Successor = generationsReducer;
       generationsReducer.Successor = evaluatedSolutionsReducer;
-      evaluatedSolutionsReducer.Successor = migrationsCounter;
+      evaluatedSolutionsReducer.Successor = migrationDataReducer;
+      migrationDataReducer.Successor = migrateIndividuals;
+      migrateIndividuals.TrueBranch = migrationsCounter;
+      migrateIndividuals.FalseBranch = generationsComparator;
       migrationsCounter.Successor = uniformSubScopesProcessor5;
       generationsAssigner.Successor = evaluatedSolutionsAssigner;
@@ -385,6 +442,10 @@
       reevaluateElitesBranch.Successor = null;
       islandAnalyzer2.Successor = islandGenerationsCounter;
-      islandGenerationsCounter.Successor = checkIslandGenerationsReachedMaximum;
+      islandGenerationsCounter.Successor = generationsSinceLastMigrationCounter;
+      generationsSinceLastMigrationCounter.Successor = generationsSinceLastAnalysisCounter;
+      generationsSinceLastAnalysisCounter.Successor = checkIslandGenerationsReachedMaximum;
       checkIslandGenerationsReachedMaximum.Successor = checkContinueEvolution;
+      checkContinueEvolution.FalseBranch = checkIslandGenerationsForAnalysis;
+      checkIslandGenerationsForAnalysis.Successor = checkRunAnalysis;
       uniformSubScopesProcessor5.Operator = emigrantsSelector;
       emigrantsSelector.Successor = null;
Index: branches/DataAnalysis.IslandAlgorithms/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs
===================================================================
--- branches/DataAnalysis.IslandAlgorithms/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs	(revision 10178)
+++ branches/DataAnalysis.IslandAlgorithms/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/IslandOffspringSelectionGeneticAlgorithm.cs	(revision 10197)
@@ -277,4 +277,7 @@
       if (!Parameters.ContainsKey("ReevaluateElites")) {
         Parameters.Add(new FixedValueParameter<BoolValue>("ReevaluateElites", "Flag to determine if elite individuals should be reevaluated (i.e., if stochastic fitness functions are used.)", (BoolValue)new BoolValue(false).AsReadOnly()) { Hidden = true });
+      }
+      if (!Parameters.ContainsKey("ReevaluateImmigrants")) {
+        Parameters.Add(new FixedValueParameter<BoolValue>("ReevaluateImmigrants", "Flag which indicates if inviduals should be reevaluated before they are immigrated.", new BoolValue(false)) { Hidden = true });
       }
       #endregion
