Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionHistoryView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionHistoryView.Designer.cs	(revision 4641)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionHistoryView.Designer.cs	(revision 4641)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Analysis.Views {
+  partial class AlleleFrequencyCollectionHistoryView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionHistoryView.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionHistoryView.cs	(revision 4641)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionHistoryView.cs	(revision 4641)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Analysis.Views {
+  [View("AlleleFrequencyCollectionHistory View")]
+  [Content(typeof(AlleleFrequencyCollectionHistory), true)]
+  public partial class AlleleFrequencyCollectionHistoryView : MovieView<AlleleFrequencyCollection> {
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public AlleleFrequencyCollectionHistoryView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Allele Frequencies";
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionView.Designer.cs	(revision 4640)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionView.Designer.cs	(revision 4641)
@@ -61,9 +61,9 @@
       chartArea1.AxisX.IntervalAutoMode = System.Windows.Forms.DataVisualization.Charting.IntervalAutoMode.VariableCount;
       chartArea1.AxisX.LabelAutoFitStyle = ((System.Windows.Forms.DataVisualization.Charting.LabelAutoFitStyles)((System.Windows.Forms.DataVisualization.Charting.LabelAutoFitStyles.IncreaseFont | System.Windows.Forms.DataVisualization.Charting.LabelAutoFitStyles.DecreaseFont)));
-      chartArea1.AxisX.Title = "Alleles";
+      chartArea1.AxisX.Title = "Allele Index";
       chartArea1.AxisY.Maximum = 1D;
       chartArea1.AxisY.Minimum = 0D;
       chartArea1.AxisY.Title = "Relative Frequency";
-      chartArea1.AxisY2.Title = "Average Solution Quality / Average Impact";
+      chartArea1.AxisY2.Title = "Average Solution Quality";
       chartArea1.CursorX.IsUserEnabled = true;
       chartArea1.CursorX.IsUserSelectionEnabled = true;
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionView.cs	(revision 4640)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/AlleleFrequencyCollectionView.cs	(revision 4641)
@@ -83,5 +83,4 @@
       qualities.YValueType = ChartValueType.Double;
       qualities.YAxisType = AxisType.Secondary;
-      qualities.ToolTip = "#VAL";
       chart.Series.Add(qualities);
 
@@ -91,6 +90,6 @@
       impacts.YValueType = ChartValueType.Double;
       impacts.YAxisType = AxisType.Secondary;
-      impacts.ToolTip = "#VAL";
       chart.Series.Add(impacts);
+      invisibleSeries.Add(impacts);
     }
 
@@ -106,9 +105,16 @@
       impacts.Points.Clear();
 
+      if (!invisibleSeries.Contains(qualities) && !invisibleSeries.Contains(impacts))
+        chart.ChartAreas["Default"].AxisY2.Title = "Average Solution Quality / Average Impact";
+      else if (!invisibleSeries.Contains(qualities))
+        chart.ChartAreas["Default"].AxisY2.Title = "Average Solution Quality";
+      else if (!invisibleSeries.Contains(impacts))
+        chart.ChartAreas["Default"].AxisY2.Title = "Average Impact";
+
       if (!invisibleSeries.Contains(bestKnown)) {
         foreach (AlleleFrequency af in Content.Where(x => x.ContainedInBestKnownSolution).OrderBy(x => x.AverageImpact)) {
-          bestKnown.Points.Add(CreateFrequencyDataPoint(index, af));
-          if (!invisibleSeries.Contains(qualities)) qualities.Points.AddXY(index, af.AverageSolutionQuality);
-          if (!invisibleSeries.Contains(impacts)) impacts.Points.AddXY(index, af.AverageImpact);
+          bestKnown.Points.Add(CreateDataPoint(index, af.Frequency, af));
+          if (!invisibleSeries.Contains(qualities)) qualities.Points.Add(CreateDataPoint(index, af.AverageSolutionQuality, af));
+          if (!invisibleSeries.Contains(impacts)) impacts.Points.Add(CreateDataPoint(index, af.AverageImpact, af));
           index++;
         }
@@ -116,7 +122,7 @@
       if (!invisibleSeries.Contains(others)) {
         foreach (AlleleFrequency af in Content.Where(x => !x.ContainedInBestKnownSolution).OrderBy(x => x.AverageImpact)) {
-          others.Points.Add(CreateFrequencyDataPoint(index, af));
-          if (!invisibleSeries.Contains(qualities)) qualities.Points.AddXY(index, af.AverageSolutionQuality);
-          if (!invisibleSeries.Contains(impacts)) impacts.Points.AddXY(index, af.AverageImpact);
+          others.Points.Add(CreateDataPoint(index, af.Frequency, af));
+          if (!invisibleSeries.Contains(qualities)) qualities.Points.Add(CreateDataPoint(index, af.AverageSolutionQuality, af));
+          if (!invisibleSeries.Contains(impacts)) impacts.Points.Add(CreateDataPoint(index, af.AverageImpact, af));
           index++;
         }
@@ -124,9 +130,7 @@
     }
 
-    protected virtual DataPoint CreateFrequencyDataPoint(int index, AlleleFrequency af) {
+    protected virtual DataPoint CreateDataPoint(int index, double value, AlleleFrequency af) {
       string nl = Environment.NewLine;
-
-      DataPoint p = new DataPoint(index, af.Frequency);
-      p.AxisLabel = af.Id;
+      DataPoint p = new DataPoint(index, value);
       p.ToolTip = string.Format("Id: {0}" + nl +
                                 "Relative Frequency: {1}" + nl +
@@ -136,4 +140,5 @@
                                 "Contained in Best Solution: {5}",
                                 af.Id, af.Frequency, af.AverageSolutionQuality, af.AverageImpact, af.ContainedInBestKnownSolution, af.ContainedInBestSolution);
+      p.IsEmpty = value == 0;
       return p;
     }
Index: trunk/sources/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj	(revision 4640)
+++ trunk/sources/HeuristicLab.Analysis.Views/3.3/HeuristicLab.Analysis.Views-3.3.csproj	(revision 4641)
@@ -117,5 +117,7 @@
   <ItemGroup>
     <None Include="HeuristicLabAnalysisViewsPlugin.cs.frame" />
-    <Compile Include="AlleleFrequencyCollectionView.cs" />
+    <Compile Include="AlleleFrequencyCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="AlleleFrequencyCollectionView.Designer.cs">
       <DependentUpon>AlleleFrequencyCollectionView.cs</DependentUpon>
@@ -127,4 +129,10 @@
     <Compile Include="AlleleFrequencyView.Designer.cs">
       <DependentUpon>AlleleFrequencyView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="AlleleFrequencyCollectionHistoryView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="AlleleFrequencyCollectionHistoryView.Designer.cs">
+      <DependentUpon>AlleleFrequencyCollectionHistoryView.cs</DependentUpon>
     </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalyzer.cs	(revision 4640)
+++ trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalyzer.cs	(revision 4641)
@@ -70,15 +70,17 @@
       Parameters.Add(new ValueParameter<BoolValue>("StoreAlleleFrequenciesHistory", "True if the history of all allele frequencies should be stored.", new BoolValue(false)));
       Parameters.Add(new ValueParameter<IntValue>("UpdateInterval", "The interval in which the allele frequency analysis should be applied.", new IntValue(1)));
-      Parameters.Add(new LookupParameter<IntValue>("UpdateCounter", "The value which counts how many times the operator was called since the last update."));
+      Parameters.Add(new LookupParameter<IntValue>("UpdateCounter", "The value which counts how many times the operator was called since the last update.", "AlleleFrequencyAnalyzerUpdateCounter"));
     }
 
-    private class AlleleFrequencyEqualityComparer : IEqualityComparer<AlleleFrequency> {
+    #region AlleleFrequencyIdEqualityComparer
+    private class AlleleFrequencyIdEqualityComparer : IEqualityComparer<AlleleFrequency> {
       public bool Equals(AlleleFrequency x, AlleleFrequency y) {
         return x.Id == y.Id;
       }
       public int GetHashCode(AlleleFrequency obj) {
-        return obj.GetHashCode();
+        return obj.Id.GetHashCode();
       }
     }
+    #endregion
 
     public override IOperation Apply() {
@@ -121,5 +123,5 @@
 
         // calculate dummy allele frequencies of alleles of best known solution which did not occur
-        var bestKnownFrequencies = bestKnownAlleles.Select(x => new AlleleFrequency(x.Id, 0, x.Impact, 0, true, false)).Except(frequencies, new AlleleFrequencyEqualityComparer());
+        var bestKnownFrequencies = bestKnownAlleles.Select(x => new AlleleFrequency(x.Id, 0, x.Impact, 0, true, false)).Except(frequencies, new AlleleFrequencyIdEqualityComparer());
 
         // fetch results collection
@@ -142,9 +144,9 @@
         if (storeHistory) {
           if (!results.ContainsKey("Allele Frequencies History")) {
-            AlleleFrequencyCollectionCollection history = new AlleleFrequencyCollectionCollection();
+            AlleleFrequencyCollectionHistory history = new AlleleFrequencyCollectionHistory();
             history.Add(frequenciesCollection);
             results.Add(new Result("Allele Frequencies History", history));
           } else {
-            ((AlleleFrequencyCollectionCollection)results["Allele Frequencies History"].Value).Add(frequenciesCollection);
+            ((AlleleFrequencyCollectionHistory)results["Allele Frequencies History"].Value).Add(frequenciesCollection);
           }
         }
Index: trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyCollectionCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyCollectionCollection.cs	(revision 4640)
+++ 	(revision )
@@ -1,38 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System.Collections.Generic;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Analysis {
-  /// <summary>
-  /// Represents a collection of allele frequencies collections.
-  /// </summary>
-  [Item("AlleleFrequencyCollectionCollection", "Represents a collection of allele frequencies collections.")]
-  [StorableClass]
-  public class AlleleFrequencyCollectionCollection : ItemCollection<AlleleFrequencyCollection> {
-    public AlleleFrequencyCollectionCollection() : base() { }
-    public AlleleFrequencyCollectionCollection(IEnumerable<AlleleFrequencyCollection> collections) : base(new ItemCollection<AlleleFrequencyCollection>(collections)) { }
-    [StorableConstructor]
-    protected AlleleFrequencyCollectionCollection(bool deserializing) : base(deserializing) { }
-  }
-}
Index: trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyCollectionHistory.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyCollectionHistory.cs	(revision 4641)
+++ trunk/sources/HeuristicLab.Analysis/3.3/AlleleFrequencyCollectionHistory.cs	(revision 4641)
@@ -0,0 +1,38 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis {
+  /// <summary>
+  /// Represents history values of allele frequencies collections.
+  /// </summary>
+  [Item("AlleleFrequencyCollectionHistory", "Represents history values of allele frequencies collections.")]
+  [StorableClass]
+  public class AlleleFrequencyCollectionHistory : ItemCollection<AlleleFrequencyCollection> {
+    public AlleleFrequencyCollectionHistory() : base() { }
+    public AlleleFrequencyCollectionHistory(IEnumerable<AlleleFrequencyCollection> collections) : base(new ItemCollection<AlleleFrequencyCollection>(collections)) { }
+    [StorableConstructor]
+    protected AlleleFrequencyCollectionHistory(bool deserializing) : base(deserializing) { }
+  }
+}
Index: trunk/sources/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 4640)
+++ trunk/sources/HeuristicLab.Analysis/3.3/HeuristicLab.Analysis-3.3.csproj	(revision 4641)
@@ -111,4 +111,5 @@
     <None Include="HeuristicLabAnalysisPlugin.cs.frame" />
     <Compile Include="AlleleFrequencyCollection.cs" />
+    <Compile Include="AlleleFrequencyCollectionHistory.cs" />
     <Compile Include="BestAverageWorstQualityAnalyzer.cs" />
     <Compile Include="BestAverageWorstQualityCalculator.cs" />
@@ -117,5 +118,4 @@
     <Compile Include="Allele.cs" />
     <Compile Include="AlleleFrequency.cs" />
-    <Compile Include="AlleleFrequencyCollectionCollection.cs" />
     <Compile Include="QualityAnalyzer.cs" />
     <Compile Include="MinAverageMaxValueAnalyzer.cs" />
Index: trunk/sources/HeuristicLab.Analysis/3.3/MultiAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/MultiAnalyzer.cs	(revision 4640)
+++ trunk/sources/HeuristicLab.Analysis/3.3/MultiAnalyzer.cs	(revision 4641)
@@ -54,5 +54,5 @@
       : base() {
       Parameters.Add(new ValueLookupParameter<IntValue>("UpdateInterval", "The interval in which the contained analyzers should be applied.", new IntValue(1)));
-      Parameters.Add(new LookupParameter<IntValue>("UpdateCounter", "The value which counts how many times the MultiAnalyzer was called since the last update."));
+      Parameters.Add(new LookupParameter<IntValue>("UpdateCounter", "The value which counts how many times the MultiAnalyzer was called since the last update.", "MultiAnalyzerUpdateCounter"));
     }
     [StorableConstructor]
Index: trunk/sources/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj	(revision 4640)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj	(revision 4641)
@@ -130,4 +130,10 @@
       <DependentUpon>CheckedItemListView.cs</DependentUpon>
     </Compile>
+    <Compile Include="MovieView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MovieView.Designer.cs">
+      <DependentUpon>MovieView.cs</DependentUpon>
+    </Compile>
     <Compile Include="LogView.cs">
       <SubType>UserControl</SubType>
Index: trunk/sources/HeuristicLab.Core.Views/3.3/MovieView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/MovieView.Designer.cs	(revision 4641)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/MovieView.Designer.cs	(revision 4641)
@@ -0,0 +1,227 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Views {
+  partial class MovieView<T> {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.lastButton = new System.Windows.Forms.Button();
+      this.playButton = new System.Windows.Forms.Button();
+      this.firstButton = new System.Windows.Forms.Button();
+      this.maximumLabel = new System.Windows.Forms.Label();
+      this.indexLabel = new System.Windows.Forms.Label();
+      this.minimumLabel = new System.Windows.Forms.Label();
+      this.trackBar = new System.Windows.Forms.TrackBar();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.backgroundWorker = new System.ComponentModel.BackgroundWorker();
+      this.itemsGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.trackBar)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.itemsGroupBox.Controls.Add(this.stopButton);
+      this.itemsGroupBox.Controls.Add(this.lastButton);
+      this.itemsGroupBox.Controls.Add(this.playButton);
+      this.itemsGroupBox.Controls.Add(this.firstButton);
+      this.itemsGroupBox.Controls.Add(this.maximumLabel);
+      this.itemsGroupBox.Controls.Add(this.indexLabel);
+      this.itemsGroupBox.Controls.Add(this.minimumLabel);
+      this.itemsGroupBox.Controls.Add(this.trackBar);
+      this.itemsGroupBox.Controls.Add(this.viewHost);
+      this.itemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.itemsGroupBox.Name = "itemsGroupBox";
+      this.itemsGroupBox.Size = new System.Drawing.Size(532, 383);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "Items";
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.stopButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Stop;
+      this.stopButton.Location = new System.Drawing.Point(502, 355);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.stopButton, "Stop");
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // lastButton
+      // 
+      this.lastButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.lastButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.MoveLast;
+      this.lastButton.Location = new System.Drawing.Point(502, 325);
+      this.lastButton.Name = "lastButton";
+      this.lastButton.Size = new System.Drawing.Size(24, 24);
+      this.lastButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.lastButton, "Move to Last");
+      this.lastButton.UseVisualStyleBackColor = true;
+      this.lastButton.Click += new System.EventHandler(this.lastButton_Click);
+      // 
+      // playButton
+      // 
+      this.playButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.playButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Play;
+      this.playButton.Location = new System.Drawing.Point(6, 355);
+      this.playButton.Name = "playButton";
+      this.playButton.Size = new System.Drawing.Size(24, 24);
+      this.playButton.TabIndex = 4;
+      this.toolTip.SetToolTip(this.playButton, "Play");
+      this.playButton.UseVisualStyleBackColor = true;
+      this.playButton.Click += new System.EventHandler(this.playButton_Click);
+      // 
+      // firstButton
+      // 
+      this.firstButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.firstButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.MoveFirst;
+      this.firstButton.Location = new System.Drawing.Point(6, 325);
+      this.firstButton.Name = "firstButton";
+      this.firstButton.Size = new System.Drawing.Size(24, 24);
+      this.firstButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.firstButton, "Move to First");
+      this.firstButton.UseVisualStyleBackColor = true;
+      this.firstButton.Click += new System.EventHandler(this.firstButton_Click);
+      // 
+      // maximumLabel
+      // 
+      this.maximumLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.maximumLabel.Location = new System.Drawing.Point(388, 364);
+      this.maximumLabel.Name = "maximumLabel";
+      this.maximumLabel.Size = new System.Drawing.Size(108, 13);
+      this.maximumLabel.TabIndex = 8;
+      this.maximumLabel.Text = "10";
+      this.maximumLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+      // 
+      // indexLabel
+      // 
+      this.indexLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.indexLabel.Location = new System.Drawing.Point(173, 364);
+      this.indexLabel.Name = "indexLabel";
+      this.indexLabel.Size = new System.Drawing.Size(186, 13);
+      this.indexLabel.TabIndex = 7;
+      this.indexLabel.Text = "0";
+      this.indexLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+      // 
+      // minimumLabel
+      // 
+      this.minimumLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.minimumLabel.Location = new System.Drawing.Point(36, 364);
+      this.minimumLabel.Name = "minimumLabel";
+      this.minimumLabel.Size = new System.Drawing.Size(38, 13);
+      this.minimumLabel.TabIndex = 6;
+      this.minimumLabel.Text = "0";
+      this.minimumLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // trackBar
+      // 
+      this.trackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.trackBar.LargeChange = 1;
+      this.trackBar.Location = new System.Drawing.Point(36, 316);
+      this.trackBar.Name = "trackBar";
+      this.trackBar.Size = new System.Drawing.Size(460, 45);
+      this.trackBar.TabIndex = 2;
+      this.trackBar.TickStyle = System.Windows.Forms.TickStyle.Both;
+      this.trackBar.ValueChanged += new System.EventHandler(this.trackBar_ValueChanged);
+      // 
+      // viewHost
+      // 
+      this.viewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(520, 291);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // backgroundWorker
+      // 
+      this.backgroundWorker.WorkerSupportsCancellation = true;
+      this.backgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker_DoWork);
+      this.backgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker_RunWorkerCompleted);
+      // 
+      // MovieView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.itemsGroupBox);
+      this.Name = "MovieView";
+      this.Size = new System.Drawing.Size(532, 383);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.itemsGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.trackBar)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected GroupBox itemsGroupBox;
+    protected ToolTip toolTip;
+    protected MainForm.WindowsForms.ViewHost viewHost;
+    protected TrackBar trackBar;
+    protected Button stopButton;
+    protected Button lastButton;
+    protected Button playButton;
+    protected Button firstButton;
+    protected Label maximumLabel;
+    protected Label indexLabel;
+    protected Label minimumLabel;
+    protected System.ComponentModel.BackgroundWorker backgroundWorker;
+  }
+}
Index: trunk/sources/HeuristicLab.Core.Views/3.3/MovieView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/MovieView.cs	(revision 4641)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/MovieView.cs	(revision 4641)
@@ -0,0 +1,176 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Threading;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Core.Views {
+  [View("Movie View")]
+  public partial class MovieView<T> : ItemView where T : class, IItem {
+    public new IItemCollection<T> Content {
+      get { return (IItemCollection<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MovieView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved);
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<T>(Content_CollectionReset);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded);
+      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved);
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<T>(Content_CollectionReset);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (backgroundWorker.IsBusy) backgroundWorker.CancelAsync();
+      if (Content == null) {
+        trackBar.Maximum = 10;
+        viewHost.Content = null;
+      } else {
+        Caption += " (" + Content.GetType().Name + ")";
+        trackBar.Maximum = Content.Count - 1;
+        viewHost.Content = Content.FirstOrDefault();
+      }
+      trackBar.Value = 0;
+      UpdateLables();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      firstButton.Enabled = (Content != null) && (Content.Count > 0) && (!backgroundWorker.IsBusy);
+      trackBar.Enabled = (Content != null) && (Content.Count > 0) && (!backgroundWorker.IsBusy);
+      lastButton.Enabled = (Content != null) && (Content.Count > 0) && (!backgroundWorker.IsBusy);
+      playButton.Enabled = (Content != null) && (Content.Count > 0) && (!backgroundWorker.IsBusy);
+      stopButton.Enabled = (Content != null) && (backgroundWorker.IsBusy);
+    }
+
+    protected override void OnClosed(FormClosedEventArgs e) {
+      base.OnClosed(e);
+      if (backgroundWorker.IsBusy) backgroundWorker.CancelAsync();
+    }
+
+    #region Content Events
+    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded), sender, e);
+      else {
+        trackBar.Maximum = Content.Count - 1;
+        maximumLabel.Text = trackBar.Maximum.ToString();
+        if (viewHost.Content == null) {
+          viewHost.Content = Content.FirstOrDefault();
+          SetEnabledStateOfControls();
+        }
+      }
+    }
+    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved), sender, e);
+      else {
+        trackBar.Maximum = Content.Count - 1;
+        maximumLabel.Text = trackBar.Maximum.ToString();
+        if (e.Items.Contains((T)viewHost.Content)) {
+          trackBar.Value = 0;
+          viewHost.Content = Content.FirstOrDefault();
+          UpdateLables();
+          SetEnabledStateOfControls();
+        }
+      }
+    }
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_CollectionReset), sender, e);
+      else {
+        trackBar.Maximum = Content.Count - 1;
+        trackBar.Value = 0;
+        viewHost.Content = Content.FirstOrDefault();
+        UpdateLables();
+        SetEnabledStateOfControls();
+      }
+    }
+    #endregion
+
+    #region Control Events
+    protected virtual void trackBar_ValueChanged(object sender, EventArgs e) {
+      indexLabel.Text = trackBar.Value.ToString();
+      viewHost.Content = Content == null ? null : Content.ElementAtOrDefault(trackBar.Value);
+    }
+    protected virtual void firstButton_Click(object sender, EventArgs e) {
+      trackBar.Value = trackBar.Minimum;
+    }
+    protected virtual void lastButton_Click(object sender, EventArgs e) {
+      trackBar.Value = trackBar.Maximum;
+    }
+    protected virtual void playButton_Click(object sender, EventArgs e) {
+      firstButton.Enabled = false;
+      trackBar.Enabled = false;
+      lastButton.Enabled = false;
+      playButton.Enabled = false;
+      stopButton.Enabled = true;
+      backgroundWorker.RunWorkerAsync();
+    }
+    protected virtual void stopButton_Click(object sender, EventArgs e) {
+      backgroundWorker.CancelAsync();
+    }
+    #endregion
+
+    #region BackgroundWorker Events
+    protected virtual void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {
+      bool terminate = false;
+      while (!backgroundWorker.CancellationPending && !terminate) {
+        Invoke((Action)delegate() {
+          if (trackBar.Value < trackBar.Maximum) trackBar.Value++;
+          terminate = trackBar.Value == trackBar.Maximum;
+        });
+        Thread.Sleep(100);
+      }
+    }
+    protected virtual void backgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) {
+      firstButton.Enabled = true;
+      trackBar.Enabled = true;
+      lastButton.Enabled = true;
+      playButton.Enabled = true;
+      stopButton.Enabled = false;
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void UpdateLables() {
+      minimumLabel.Text = trackBar.Minimum.ToString();
+      indexLabel.Text = trackBar.Value.ToString();
+      maximumLabel.Text = trackBar.Maximum.ToString();
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 4640)
+++ trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 4641)
@@ -315,18 +315,22 @@
     }
     private void ParameterizeAnalyzers() {
-      BestTSPSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
-      BestTSPSolutionAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
-      BestTSPSolutionAnalyzer.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
-      BestTSPSolutionAnalyzer.ResultsParameter.ActualName = "Results";
-      BestTSPSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      BestTSPSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
-      BestTSPSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
-
-      TSPAlleleFrequencyAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      TSPAlleleFrequencyAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
-      TSPAlleleFrequencyAnalyzer.SolutionParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
-      TSPAlleleFrequencyAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
-      TSPAlleleFrequencyAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
-      TSPAlleleFrequencyAnalyzer.ResultsParameter.ActualName = "Results";
+      if (BestTSPSolutionAnalyzer != null) {
+        BestTSPSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+        BestTSPSolutionAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        BestTSPSolutionAnalyzer.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+        BestTSPSolutionAnalyzer.ResultsParameter.ActualName = "Results";
+        BestTSPSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
+        BestTSPSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
+        BestTSPSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
+      }
+
+      if (TSPAlleleFrequencyAnalyzer != null) {
+        TSPAlleleFrequencyAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
+        TSPAlleleFrequencyAnalyzer.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
+        TSPAlleleFrequencyAnalyzer.SolutionParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+        TSPAlleleFrequencyAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+        TSPAlleleFrequencyAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
+        TSPAlleleFrequencyAnalyzer.ResultsParameter.ActualName = "Results";
+      }
     }
     private void ParameterizeOperators() {
