Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/BreadcrumbViewHost.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/BreadcrumbViewHost.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/BreadcrumbViewHost.Designer.cs	(revision 16770)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class BreadcrumbViewHost {
+    /// <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 && (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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/BreadcrumbViewHost.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/BreadcrumbViewHost.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/BreadcrumbViewHost.cs	(revision 16770)
@@ -0,0 +1,234 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm.WindowsForms;
+using View = HeuristicLab.MainForm.WindowsForms.View;
+
+namespace HeuristicLab.Core.Views {
+  public partial class BreadcrumbViewHost : ViewHost {
+    private const string Separator = ">>";
+    private const string Ellipsis = "...";
+
+    private readonly Font font = new Font("Microsoft Sans Serif", 7f);
+    private readonly List<Label> labels = new List<Label>();
+    private readonly LinkedList<Tuple<string, IContent>> breadcrumbs = new LinkedList<Tuple<string, IContent>>();
+
+    private Size requiredSize;
+    private Point requiredLocation;
+    private bool enableBreadcrumbs;
+    private bool showSingle;
+
+    [DefaultValue(false)]
+    public bool EnableBreadcrumbs {
+      get { return enableBreadcrumbs; }
+      set {
+        if (enableBreadcrumbs == value) return;
+        enableBreadcrumbs = value;
+        ConfigureViewLayout(ActiveView as ContentView);
+      }
+    }
+
+    [DefaultValue(false)]
+    public bool ShowSingle {
+      get { return showSingle; }
+      set {
+        if (showSingle == value) return;
+        showSingle = value;
+
+        if (enableBreadcrumbs && !breadcrumbs.Any())
+          AddBreadcrumbs(Content);
+
+        ConfigureViewLayout(ActiveView as ContentView);
+      }
+    }
+
+    public IEnumerable<IContent> Breadcrumbs { get { return breadcrumbs.Select(x => x.Item2); } }
+
+    public BreadcrumbViewHost() {
+      InitializeComponent();
+    }
+
+    #region Overrides
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        breadcrumbs.Clear();
+      } else {
+        if (enableBreadcrumbs && showSingle)
+          if (!breadcrumbs.Any())
+            AddBreadcrumbs(Content);
+          else if (breadcrumbs.Count == 1) {
+            breadcrumbs.Clear();
+            AddBreadcrumbs(Content);
+          }
+      }
+
+      UpdateBreadcrumbTrail();
+      ConfigureViewLayout(ActiveView as ContentView);
+    }
+
+    protected override void OnSizeChanged(EventArgs e) {
+      UpdateBreadcrumbTrail();
+      base.OnSizeChanged(e);
+    }
+
+    protected override void ConfigureViewLayout(View view) {
+      if (view == null) return;
+
+      base.ConfigureViewLayout(view);
+
+      requiredSize = view.Size;
+      requiredLocation = Point.Empty;
+
+      if (enableBreadcrumbs && (breadcrumbs.Count > 1 || breadcrumbs.Count == 1 && showSingle)) {
+        requiredSize.Height -= font.Height + 6;
+        requiredLocation.Y += font.Height + 8;
+
+        if (view.Dock == DockStyle.Fill)
+          view.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
+      }
+
+      view.Size = requiredSize;
+      view.Location = requiredLocation;
+    }
+    #endregion
+
+    public void AddBreadcrumbs(params IContent[] crumbs) {
+      foreach (var c in crumbs) {
+        var item = c as INamedItem;
+        string text = item != null ? item.Name : c != null ? c.ToString() : "null";
+        AddBreadcrumb(text, c);
+      }
+    }
+
+    public void AddBreadcrumb(string text, IContent content) {
+      if (breadcrumbs.Any(x => x.Item2 == content)) return;
+      breadcrumbs.AddLast(Tuple.Create(text, content));
+    }
+
+    #region Event Handlers
+    private void label_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
+      var label = (LinkLabel)sender;
+      var tuple = (Tuple<string, IContent>)label.Tag;
+
+      while (breadcrumbs.Any() && breadcrumbs.Last.Value != tuple)
+        breadcrumbs.RemoveLast();
+      if (breadcrumbs.Count == 1 && !showSingle)
+        breadcrumbs.RemoveLast();
+
+      Content = tuple.Item2;
+    }
+    #endregion
+
+    #region Helpers
+    private void UpdateBreadcrumbTrail() {
+      foreach (var l in labels)
+        Controls.Remove(l);
+      labels.Clear();
+
+      ConfigureViewLayout(ActiveView as ContentView);
+
+      if (!enableBreadcrumbs || !breadcrumbs.Any() || breadcrumbs.Count == 1 && !showSingle) return;
+
+      if (!AddLabelsLeftToRight())
+        AddLabelsRightToLeft();
+    }
+
+    private bool AddLabelsLeftToRight() {
+      var curLoc = new Point(3, 0);
+      int idx = 0;
+
+      foreach (var bc in breadcrumbs) {
+        Label label;
+
+        if (bc == breadcrumbs.Last.Value) {
+          label = new Label { Location = curLoc, AutoSize = true, Font = font, Text = bc.Item1 };
+        } else {
+          label = new LinkLabel { Location = curLoc, AutoSize = true, Font = font, Text = bc.Item1, Tag = bc };
+          ((LinkLabel)label).LinkClicked += label_LinkClicked;
+        }
+
+        labels.Add(label);
+        label.Size = label.GetPreferredSize(Size.Empty);
+        curLoc.X += label.Size.Width;
+
+        if (++idx < breadcrumbs.Count) {
+          var separator = new Label { Location = curLoc, AutoSize = true, Font = font, Text = Separator };
+          labels.Add(separator);
+          separator.Size = separator.GetPreferredSize(Size.Empty);
+          curLoc.X += separator.Size.Width;
+        }
+      }
+
+      double width = Width;
+      if (ViewsLabelVisible)
+        width -= viewsLabel.Width + viewsLabel.Margin.Left + viewsLabel.Margin.Right;
+      bool success = curLoc.X <= width;
+
+      if (success)
+        Controls.AddRange(labels.ToArray());
+
+      return success;
+    }
+
+    private void AddLabelsRightToLeft() {
+      if (!labels.Any()) return;
+
+      var curLoc = new Point(3, 0);
+
+      var ellipsis = new LinkLabel { Location = curLoc, AutoSize = true, Font = font, Text = Ellipsis };
+      labels.Insert(0, ellipsis);
+      Controls.Add(ellipsis);
+      curLoc.X += ellipsis.Size.Width;
+
+      double x = Width;
+      if (ViewsLabelVisible)
+        x -= viewsLabel.Width + viewsLabel.Margin.Left + viewsLabel.Margin.Right;
+
+      int i = labels.Count - 1;
+
+      while (i >= 1) {
+        x -= labels[i].Size.Width;
+        x -= labels[i - 1].Size.Width;
+        if (x < curLoc.X) break;
+        i -= 2;
+      }
+
+      ellipsis.Tag = breadcrumbs.ElementAt(i / 2);
+      ellipsis.LinkClicked += label_LinkClicked;
+
+      while (++i < labels.Count) {
+        var l = labels[i];
+        l.Location = curLoc;
+        Controls.Add(l);
+        curLoc.X += l.Size.Width;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.Designer.cs	(revision 16770)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class CheckedItemCollectionView<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 && (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.Inherit;
+      base.itemsListView.CheckBoxes = true;
+      base.itemsListView.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(itemsListView_ItemCheck);
+      base.itemsListView.MouseDown += new System.Windows.Forms.MouseEventHandler(itemsListView_MouseDown);
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.cs	(revision 16770)
@@ -0,0 +1,141 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("CheckedItemCollection View")]
+  [Content(typeof(ICheckedItemCollection<>), true)]
+  [Content(typeof(CheckedItemCollection<>), true)]
+  [Content(typeof(ReadOnlyCheckedItemCollection<>), true)]
+  public partial class CheckedItemCollectionView<T> : ItemCollectionView<T> where T : class, IItem {
+    public new ICheckedItemCollection<T> Content {
+      get { return (ICheckedItemCollection<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public CheckedItemCollectionView()
+      : base() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        SetNumberOfCheckItems();
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      Content.CheckedItemsChanged += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<T>(Content_CheckedItemsChanged);
+      base.RegisterContentEvents();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.CheckedItemsChanged -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<T>(Content_CheckedItemsChanged);
+      base.DeregisterContentEvents();
+    }
+
+    private Color backupColor = Color.Empty;
+    protected override void SetEnabledStateOfControls() {
+      if (backupColor == Color.Empty) backupColor = base.itemsListView.BackColor;
+      base.SetEnabledStateOfControls();
+      if (ReadOnly || Locked)
+        base.itemsListView.BackColor = ListView.DefaultBackColor;
+      else
+        base.itemsListView.BackColor = backupColor;
+    }
+
+    protected override ListViewItem CreateListViewItem(T item) {
+      ListViewItem listViewItem = base.CreateListViewItem(item);
+      listViewItem.Checked = Content.ItemChecked(item);
+      return listViewItem;
+    }
+
+    #region ListView Events
+    private bool doubleClick;
+    protected virtual void itemsListView_ItemCheck(object sender, ItemCheckEventArgs e) {
+      if (doubleClick) {
+        e.NewValue = e.CurrentValue;
+        doubleClick = false;
+      } else {
+        var checkedItem = (T)itemsListView.Items[e.Index].Tag;
+        bool check = e.NewValue == CheckState.Checked;
+        if (Content.ItemChecked(checkedItem) != check) {
+          if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
+          else e.NewValue = e.CurrentValue;
+        }
+      }
+    }
+    protected void itemsListView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
+      if (e.Clicks > 1)
+        doubleClick = true;
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_CheckedItemsChanged), sender, e);
+      else {
+        UpdateCheckedItemState(e.Items);
+        SetNumberOfCheckItems();
+      }
+    }
+    protected override void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<T> e) {
+      base.Content_CollectionReset(sender, e);
+      SetNumberOfCheckItems();
+    }
+    protected override void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) {
+      base.Content_ItemsAdded(sender, e);
+      SetNumberOfCheckItems();
+    }
+    protected override void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<T> e) {
+      base.Content_ItemsRemoved(sender, e);
+      SetNumberOfCheckItems();
+    }
+    #endregion
+
+    private void SetNumberOfCheckItems() {
+      if (InvokeRequired) {
+        Invoke((Action)SetNumberOfCheckItems);
+      } else {
+        this.itemsGroupBox.Text = String.Format("Items (Checked: {0}/{1})", Content.CheckedItems.Count(), Content.Count);
+      }
+    }
+
+    private void UpdateCheckedItemState(IEnumerable<T> items) {
+      foreach (T item in items) {
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
+          var isChecked = Content.ItemChecked(item);
+          if (listViewItem.Checked != isChecked)
+            listViewItem.Checked = isChecked;
+        }
+      }
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemListView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemListView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemListView.Designer.cs	(revision 16770)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class CheckedItemListView<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 && (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.Inherit;
+      base.itemsListView.CheckBoxes = true;
+      base.itemsListView.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(itemsListView_ItemCheck);
+      base.itemsListView.MouseDown += new System.Windows.Forms.MouseEventHandler(itemsListView_MouseDown);
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs	(revision 16770)
@@ -0,0 +1,184 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// The visual representation of a list of checked items.
+  /// </summary>
+  [View("CheckedItemList View")]
+  [Content(typeof(CheckedItemList<>), true)]
+  [Content(typeof(ICheckedItemList<>), true)]
+  [Content(typeof(ReadOnlyCheckedItemList<>), true)]
+  public partial class CheckedItemListView<T> : ItemListView<T> where T : class, IItem {
+    public new ICheckedItemList<T> Content {
+      get { return (ICheckedItemList<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public CheckedItemListView()
+      : base() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      Content.CheckedItemsChanged += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CheckedItemsChanged);
+      base.RegisterContentEvents();
+    }
+    protected override void DeregisterContentEvents() {
+      Content.CheckedItemsChanged -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CheckedItemsChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        SetNumberOfCheckItems();
+      }
+    }
+
+    private Color backupColor = Color.Empty;
+    protected override void SetEnabledStateOfControls() {
+      if (backupColor == Color.Empty) backupColor = base.itemsListView.BackColor;
+      base.SetEnabledStateOfControls();
+      if (ReadOnly || Locked)
+        base.itemsListView.BackColor = ListView.DefaultBackColor;
+      else
+        base.itemsListView.BackColor = backupColor;
+    }
+
+    protected override ListViewItem CreateListViewItem(T item) {
+      ListViewItem listViewItem = base.CreateListViewItem(item);
+      listViewItem.Checked = Content.ItemChecked(item);
+      return listViewItem;
+    }
+
+    #region ListView Events
+    private bool doubleClick;
+    protected virtual void itemsListView_ItemCheck(object sender, ItemCheckEventArgs e) {
+      if (doubleClick) {
+        e.NewValue = e.CurrentValue;
+        doubleClick = false;
+      } else {
+        var checkedItem = (T)itemsListView.Items[e.Index].Tag;
+        bool check = e.NewValue == CheckState.Checked;
+        if (Content.ItemChecked(checkedItem) != check) {
+          if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
+          else e.NewValue = e.CurrentValue;
+        }
+      }
+    }
+
+    protected void itemsListView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
+      if (e.Clicks > 1)
+        doubleClick = true;
+    }
+
+    protected override void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      if (Locked || ReadOnly) return;
+
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as ICheckedItemList<T>;
+      if (data != null)
+        validDragOperation = Content.Select(x => x.ToString()).SequenceEqual(data.Select(x => x.ToString()));
+      else
+        base.itemsListView_DragEnter(sender, e);
+    }
+
+    protected override void itemsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (!validDragOperation) return;
+
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as ICheckedItemList<T>;
+      if (data != null)
+        e.Effect = DragDropEffects.Copy;
+      else
+        base.itemsListView_DragOver(sender, e);
+    }
+
+    protected override void itemsListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect == DragDropEffects.None) return;
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as ICheckedItemList<T>;
+      if (data != null) {
+        for (int i = 0; i < Content.Count; i++) {
+          Content.SetItemCheckedState(Content[i], data.ItemChecked(data[i]));
+        }
+      } else
+        base.itemsListView_DragDrop(sender, e);
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CheckedItemsChanged), sender, e);
+      else {
+        UpdateCheckedItemState(e.Items);
+        SetNumberOfCheckItems();
+      }
+    }
+    protected override void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      base.Content_CollectionReset(sender, e);
+      SetNumberOfCheckItems();
+    }
+    protected override void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      base.Content_ItemsAdded(sender, e);
+      SetNumberOfCheckItems();
+    }
+    protected override void Content_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      base.Content_ItemsMoved(sender, e);
+      UpdateCheckedItemState(e.Items);
+      SetNumberOfCheckItems();
+    }
+    protected override void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      base.Content_ItemsRemoved(sender, e);
+      SetNumberOfCheckItems();
+    }
+    protected override void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      base.Content_ItemsReplaced(sender, e);
+      SetNumberOfCheckItems();
+    }
+    #endregion
+
+    private void SetNumberOfCheckItems() {
+      if (InvokeRequired) {
+        Invoke((Action)SetNumberOfCheckItems);
+      } else {
+        this.itemsGroupBox.Text = String.Format("Items (Checked: {0}/{1})", Content.CheckedItems.Count(), Content.Count);
+      }
+    }
+
+    private void UpdateCheckedItemState(IEnumerable<IndexedItem<T>> items) {
+      foreach (var item in items) {
+        var isChecked = Content.ItemChecked(item.Value);
+        if (itemsListView.Items[item.Index].Checked != isChecked)
+          itemsListView.Items[item.Index].Checked = isChecked;
+      }
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Clipboard.Designer.cs	(revision 16770)
@@ -0,0 +1,211 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class Clipboard<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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() {
+      this.components = new System.ComponentModel.Container();
+      this.listView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.infoPanel = new System.Windows.Forms.Panel();
+      this.progressBar = new System.Windows.Forms.ProgressBar();
+      this.infoLabel = new System.Windows.Forms.Label();
+      this.sortDescendingButton = new System.Windows.Forms.Button();
+      this.sortAscendingButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.saveButton = new System.Windows.Forms.Button();
+      this.infoPanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // listView
+      // 
+      this.listView.AllowDrop = true;
+      this.listView.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.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.listView.FullRowSelect = true;
+      this.listView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.listView.HideSelection = false;
+      this.listView.Location = new System.Drawing.Point(0, 30);
+      this.listView.Name = "listView";
+      this.listView.ShowItemToolTips = true;
+      this.listView.Size = new System.Drawing.Size(179, 432);
+      this.listView.SmallImageList = this.imageList;
+      this.listView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.listView.TabIndex = 0;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.View = System.Windows.Forms.View.Details;
+      this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged);
+      this.listView.DoubleClick += new System.EventHandler(this.listView_DoubleClick);
+      this.listView.DragDrop += new System.Windows.Forms.DragEventHandler(this.listView_DragDrop);
+      this.listView.DragEnter += new System.Windows.Forms.DragEventHandler(this.listView_DragEnter);
+      this.listView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listView_KeyDown);
+      this.listView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.listView_ItemDrag);
+      this.listView.DragOver += new System.Windows.Forms.DragEventHandler(this.listView_DragOver);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // infoPanel
+      // 
+      this.infoPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.infoPanel.Controls.Add(this.progressBar);
+      this.infoPanel.Controls.Add(this.infoLabel);
+      this.infoPanel.Enabled = false;
+      this.infoPanel.Location = new System.Drawing.Point(13, 202);
+      this.infoPanel.Name = "infoPanel";
+      this.infoPanel.Size = new System.Drawing.Size(154, 59);
+      this.infoPanel.TabIndex = 6;
+      // 
+      // progressBar
+      // 
+      this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.progressBar.Location = new System.Drawing.Point(3, 30);
+      this.progressBar.Name = "progressBar";
+      this.progressBar.Size = new System.Drawing.Size(146, 23);
+      this.progressBar.Step = 1;
+      this.progressBar.TabIndex = 1;
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.infoLabel.Location = new System.Drawing.Point(3, 4);
+      this.infoLabel.Name = "infoLabel";
+      this.infoLabel.Size = new System.Drawing.Size(146, 23);
+      this.infoLabel.TabIndex = 0;
+      this.infoLabel.Text = "Loading ...";
+      this.infoLabel.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+      // 
+      // sortDescendingButton
+      // 
+      this.sortDescendingButton.Enabled = false;
+      this.sortDescendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.SortUp;
+      this.sortDescendingButton.Location = new System.Drawing.Point(30, 0);
+      this.sortDescendingButton.Name = "sortDescendingButton";
+      this.sortDescendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortDescendingButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.sortDescendingButton, "Sort Descending");
+      this.sortDescendingButton.UseVisualStyleBackColor = true;
+      this.sortDescendingButton.Click += new System.EventHandler(this.sortDescendingButton_Click);
+      // 
+      // sortAscendingButton
+      // 
+      this.sortAscendingButton.Enabled = false;
+      this.sortAscendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Sort;
+      this.sortAscendingButton.Location = new System.Drawing.Point(60, 0);
+      this.sortAscendingButton.Name = "sortAscendingButton";
+      this.sortAscendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortAscendingButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.sortAscendingButton, "Sort Ascending");
+      this.sortAscendingButton.UseVisualStyleBackColor = true;
+      this.sortAscendingButton.Click += new System.EventHandler(this.sortAscendingButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(90, 0);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 4;
+      this.toolTip.SetToolTip(this.removeButton, "Remove Item");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(0, 0);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.addButton, "Add Item");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // saveButton
+      // 
+      this.saveButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Save;
+      this.saveButton.Location = new System.Drawing.Point(120, 0);
+      this.saveButton.Name = "saveButton";
+      this.saveButton.Size = new System.Drawing.Size(24, 24);
+      this.saveButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.saveButton, "Save All Items");
+      this.saveButton.UseVisualStyleBackColor = true;
+      this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
+      // 
+      // Clipboard
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.sortDescendingButton);
+      this.Controls.Add(this.sortAscendingButton);
+      this.Controls.Add(this.saveButton);
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.addButton);
+      this.Controls.Add(this.infoPanel);
+      this.Controls.Add(this.listView);
+      this.Name = "Clipboard";
+      this.Size = new System.Drawing.Size(179, 462);
+      this.infoPanel.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListView listView;
+    private System.Windows.Forms.Panel infoPanel;
+    private System.Windows.Forms.ProgressBar progressBar;
+    private System.Windows.Forms.Label infoLabel;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.Button sortDescendingButton;
+    private System.Windows.Forms.Button sortAscendingButton;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.Button addButton;
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button saveButton;
+
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Clipboard.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Clipboard.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Clipboard.cs	(revision 16770)
@@ -0,0 +1,433 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Threading;
+using System.Windows.Forms;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  [View("Clipboard")]
+  public sealed partial class Clipboard<T> : HeuristicLab.MainForm.WindowsForms.Sidebar where T : class, IItem {
+    private TypeSelectorDialog typeSelectorDialog;
+    private Dictionary<T, ListViewItem> itemListViewItemMapping;
+    private bool validDragOperation;
+    private bool draggedItemsAlreadyContained;
+
+    private string itemsPath;
+    public string ItemsPath {
+      get { return itemsPath; }
+      private set {
+        if (string.IsNullOrEmpty(value)) throw new ArgumentException(string.Format("Invalid items path \"{0}\".", value));
+        itemsPath = value;
+        try {
+          if (!Directory.Exists(itemsPath)) {
+            Directory.CreateDirectory(itemsPath);
+            // directory creation might take some time -> wait until it is definitively created
+            while (!Directory.Exists(itemsPath)) {
+              Thread.Sleep(100);
+              Directory.CreateDirectory(itemsPath);
+            }
+          }
+        }
+        catch (Exception ex) {
+          throw new ArgumentException(string.Format("Invalid items path \"{0}\".", itemsPath), ex);
+        }
+      }
+    }
+
+    public Clipboard() {
+      InitializeComponent();
+      ItemsPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
+                  Path.DirectorySeparatorChar + "HeuristicLab" + Path.DirectorySeparatorChar + "Clipboard";
+      itemListViewItemMapping = new Dictionary<T, ListViewItem>();
+    }
+    public Clipboard(string itemsPath) {
+      InitializeComponent();
+      ItemsPath = itemsPath;
+      itemListViewItemMapping = new Dictionary<T, ListViewItem>();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        foreach (T item in itemListViewItemMapping.Keys) {
+          item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
+          item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
+        }
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void OnInitialized(EventArgs e) {
+      base.OnInitialized(e);
+      SetEnabledStateOfControls();
+      Enabled = false;
+      infoLabel.Text = "Loading ...";
+      progressBar.Value = 0;
+      infoPanel.Visible = true;
+      ThreadPool.QueueUserWorkItem(new WaitCallback(LoadItems));
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      addButton.Enabled = !ReadOnly;
+      removeButton.Enabled = !ReadOnly && listView.SelectedItems.Count > 0;
+      saveButton.Enabled = !ReadOnly;
+    }
+
+    public void AddItem(T item) {
+      if (InvokeRequired)
+        Invoke(new Action<T>(AddItem), item);
+      else {
+        if (item == null) throw new ArgumentNullException("item", "Cannot add null item to clipboard.");
+        if (!itemListViewItemMapping.ContainsKey(item)) {
+          ListViewItem listViewItem = new ListViewItem(item.ToString());
+          listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
+          listView.SmallImageList.Images.Add(item.ItemImage);
+          listViewItem.ImageIndex = listView.SmallImageList.Images.Count - 1;
+          listViewItem.Tag = item;
+          listView.Items.Add(listViewItem);
+          itemListViewItemMapping.Add(item, listViewItem);
+          item.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
+          item.ToStringChanged += new EventHandler(Item_ToStringChanged);
+          sortAscendingButton.Enabled = sortDescendingButton.Enabled = listView.Items.Count > 1;
+          AdjustListViewColumnSizes();
+        }
+      }
+    }
+
+    private void RemoveItem(T item) {
+      if (InvokeRequired)
+        Invoke(new Action<T>(RemoveItem), item);
+      else {
+        if (itemListViewItemMapping.ContainsKey(item)) {
+          item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
+          item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
+          ListViewItem listViewItem = itemListViewItemMapping[item];
+          listViewItem.Remove();
+          itemListViewItemMapping.Remove(item);
+          sortAscendingButton.Enabled = sortDescendingButton.Enabled = listView.Items.Count > 1;
+        }
+      }
+    }
+    private void Save() {
+      if (InvokeRequired)
+        Invoke(new Action(Save));
+      else {
+        Enabled = false;
+        infoLabel.Text = "Saving ...";
+        progressBar.Value = 0;
+        infoPanel.Visible = true;
+        ThreadPool.QueueUserWorkItem(new WaitCallback(SaveItems));
+      }
+    }
+
+    #region Loading/Saving Items
+    private void LoadItems(object state) {
+      string[] items = Directory.GetFiles(ItemsPath);
+      foreach (string filename in items) {
+        try {
+          var ser = new ProtoBufSerializer();
+          T item = (T)ser.Deserialize(filename);
+          OnItemLoaded(item, progressBar.Maximum / items.Length);
+        } catch (Exception) {
+          try {
+            // try old format if protobuf deserialization fails
+            T item = XmlParser.Deserialize<T>(filename);
+            OnItemLoaded(item, progressBar.Maximum / items.Length);
+          } catch (Exception) { }
+        }
+      }
+      OnAllItemsLoaded();
+    }
+    private void OnItemLoaded(T item, int progress) {
+      if (InvokeRequired)
+        Invoke(new Action<T, int>(OnItemLoaded), item, progress);
+      else {
+        AddItem(item);
+        progressBar.Value += progress;
+      }
+    }
+    private void OnAllItemsLoaded() {
+      if (InvokeRequired)
+        Invoke(new Action(OnAllItemsLoaded));
+      else {
+        Enabled = true;
+        if (listView.Items.Count > 0) {
+          for (int i = 0; i < listView.Columns.Count; i++)
+            listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        }
+        infoPanel.Visible = false;
+      }
+    }
+    private void SaveItems(object param) {
+      Directory.Delete(ItemsPath, true);
+      Directory.CreateDirectory(ItemsPath);
+      // directory creation might take some time -> wait until it is definitively created
+      while (!Directory.Exists(ItemsPath)) {
+        Thread.Sleep(100);
+        Directory.CreateDirectory(ItemsPath);
+      }
+
+      int i = 0;
+      T[] items = GetStorableItems(itemListViewItemMapping.Keys);
+
+      foreach (T item in items) {
+        try {
+          i++;
+          SetEnabledStateOfContentViews(item, false);
+          var ser = new ProtoBufSerializer();
+          ser.Serialize(item, ItemsPath + Path.DirectorySeparatorChar + i.ToString("00000000") + ".hl");
+          OnItemSaved(item, progressBar.Maximum / listView.Items.Count);
+        }
+        catch (Exception) { }
+        finally {
+          SetEnabledStateOfContentViews(item, true);
+        }
+      }
+      OnAllItemsSaved();
+    }
+
+    private void OnItemSaved(T item, int progress) {
+      if (item != null) {
+        if (InvokeRequired)
+          Invoke(new Action<T, int>(OnItemSaved), item, progress);
+        else {
+          progressBar.Value += progress;
+        }
+      }
+    }
+    private void OnAllItemsSaved() {
+      if (InvokeRequired)
+        Invoke(new Action(OnAllItemsLoaded));
+      else {
+        Enabled = true;
+        infoPanel.Visible = false;
+      }
+    }
+
+    private void SetEnabledStateOfContentViews(IItem item, bool enabled) {
+      if (InvokeRequired)
+        Invoke((Action<IItem, bool>)SetEnabledStateOfContentViews, item, enabled);
+      else {
+        var views = MainFormManager.MainForm.Views.OfType<IContentView>().Where(v => v.Content == item).ToList();
+        views.ForEach(v => v.Enabled = enabled);
+      }
+    }
+
+    private static T[] GetStorableItems(IEnumerable<T> items) {
+      var query = from item in items
+                  let executeable = item as IExecutable
+                  let views = MainFormManager.MainForm.Views.OfType<IContentView>().Where(v => v.Content == item)
+                  where executeable == null || executeable.ExecutionState != ExecutionState.Started
+                  where !views.Any(v => v.Locked)
+                  select item;
+      T[] itemArray = query.ToArray();
+      return itemArray;
+    }
+    #endregion
+
+    #region ListView Events
+    private void listView_SelectedIndexChanged(object sender, EventArgs e) {
+      removeButton.Enabled = !ReadOnly && listView.SelectedItems.Count > 0;
+    }
+    private void listView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (!ReadOnly && (listView.SelectedItems.Count > 0)) {
+          foreach (ListViewItem item in listView.SelectedItems)
+            RemoveItem((T)item.Tag);
+          RebuildImageList();
+        }
+      }
+    }
+    private void listView_DoubleClick(object sender, EventArgs e) {
+      if (listView.SelectedItems.Count == 1) {
+        T item = (T)listView.SelectedItems[0].Tag;
+        IContentView view = MainFormManager.MainForm.ShowContent(item, true);
+      }
+    }
+    private void listView_ItemDrag(object sender, ItemDragEventArgs e) {
+      List<T> items = new List<T>();
+      foreach (ListViewItem listViewItem in listView.SelectedItems) {
+        T item = listViewItem.Tag as T;
+        if (item != null) items.Add(item);
+      }
+
+      if (items.Count > 0) {
+        DataObject data = new DataObject();
+        if (items.Count == 1) data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items[0]);
+        else data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items);
+        if (ReadOnly) {
+          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+        } else {
+          DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+          if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+            foreach (T item in items) RemoveItem(item);
+            RebuildImageList();
+          }
+        }
+      }
+    }
+    private void listView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      draggedItemsAlreadyContained = false;
+      if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T)) {
+        validDragOperation = true;
+        draggedItemsAlreadyContained = itemListViewItemMapping.ContainsKey((T)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat));
+      } else if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable)) {
+        validDragOperation = true;
+        IEnumerable items = (IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+        foreach (object item in items) {
+          validDragOperation = validDragOperation && (item is T);
+          draggedItemsAlreadyContained = draggedItemsAlreadyContained || itemListViewItemMapping.ContainsKey((T)item);
+        }
+      }
+    }
+    private void listView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (validDragOperation) {
+        if (((e.KeyState & 32) == 32) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Link;  // ALT key
+        else if (((e.KeyState & 4) == 4) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Link;
+      }
+    }
+    private void listView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        try {
+          if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T) {
+            T item = (T)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+            AddItem(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+          } else if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable) {
+            IEnumerable<T> items = ((IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat)).Cast<T>();
+            if (e.Effect.HasFlag(DragDropEffects.Copy)) {
+              Cloner cloner = new Cloner();
+              items = items.Select(x => cloner.Clone(x));
+            }
+            foreach (T item in items)
+              AddItem(item);
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addButton_Click(object sender, EventArgs e) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          AddItem((T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType());
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    private void sortAscendingButton_Click(object sender, EventArgs e) {
+      listView.Sorting = SortOrder.None;
+      listView.Sorting = SortOrder.Ascending;
+    }
+    private void sortDescendingButton_Click(object sender, EventArgs e) {
+      listView.Sorting = SortOrder.None;
+      listView.Sorting = SortOrder.Descending;
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      if (listView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in listView.SelectedItems)
+          RemoveItem((T)item.Tag);
+        RebuildImageList();
+      }
+    }
+    private void saveButton_Click(object sender, EventArgs e) {
+      IEnumerable<T> items = itemListViewItemMapping.Keys.Except(GetStorableItems(itemListViewItemMapping.Keys));
+      if (items.Any()) {
+        string itemNames = string.Join(Environment.NewLine, items.Select(item => item.ToString()).ToArray());
+        MessageBox.Show("The following items are not saved, because they are locked (e.g. used in a running algorithm):" + Environment.NewLine + Environment.NewLine +
+          itemNames + Environment.NewLine + Environment.NewLine + "All other items will be saved.", "Cannot save all items", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+      }
+      Save();
+    }
+    #endregion
+
+    #region Item Events
+    private void Item_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
+      else {
+        T item = (T)sender;
+        ListViewItem listViewItem = itemListViewItemMapping[item];
+        int i = listViewItem.ImageIndex;
+        listView.SmallImageList.Images[i] = item.ItemImage;
+        listViewItem.ImageIndex = -1;
+        listViewItem.ImageIndex = i;
+      }
+    }
+    private void Item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
+      else {
+        T item = (T)sender;
+        itemListViewItemMapping[item].Text = item.ToString();
+        listView.Sort();
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+
+    #region Helpers
+    private void AdjustListViewColumnSizes() {
+      if (listView.Items.Count > 0) {
+        for (int i = 0; i < listView.Columns.Count; i++)
+          listView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+    private void RebuildImageList() {
+      listView.SmallImageList.Images.Clear();
+      foreach (ListViewItem item in listView.Items) {
+        listView.SmallImageList.Images.Add(((T)item.Tag).ItemImage);
+        item.ImageIndex = listView.SmallImageList.Images.Count - 1;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CreateParameterDialog.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CreateParameterDialog.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CreateParameterDialog.Designer.cs	(revision 16770)
@@ -0,0 +1,167 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class CreateParameterDialog {
+    /// <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.cancelButton = new System.Windows.Forms.Button();
+      this.okButton = new System.Windows.Forms.Button();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.descriptionLabel = new System.Windows.Forms.Label();
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.parameterTypeSelector = new HeuristicLab.Core.Views.TypeSelector();
+      this.SuspendLayout();
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(455, 527);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 6;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Enabled = false;
+      this.okButton.Location = new System.Drawing.Point(374, 527);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 5;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(9, 396);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 1;
+      this.nameLabel.Text = "&Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Location = new System.Drawing.Point(78, 393);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(452, 20);
+      this.nameTextBox.TabIndex = 2;
+      // 
+      // descriptionLabel
+      // 
+      this.descriptionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.descriptionLabel.AutoSize = true;
+      this.descriptionLabel.Location = new System.Drawing.Point(9, 422);
+      this.descriptionLabel.Name = "descriptionLabel";
+      this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
+      this.descriptionLabel.TabIndex = 3;
+      this.descriptionLabel.Text = "&Description:";
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(78, 419);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(452, 102);
+      this.descriptionTextBox.TabIndex = 4;
+      // 
+      // parameterTypeSelector
+      // 
+      this.parameterTypeSelector.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.parameterTypeSelector.Caption = "Available Parameters";
+      this.parameterTypeSelector.Location = new System.Drawing.Point(12, 12);
+      this.parameterTypeSelector.Name = "parameterTypeSelector";
+      this.parameterTypeSelector.Size = new System.Drawing.Size(518, 375);
+      this.parameterTypeSelector.TabIndex = 0;
+      this.parameterTypeSelector.SelectedTypeChanged += new System.EventHandler(this.parameterTypeSelector_SelectedTypeChanged);
+      // 
+      // CreateParameterDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(542, 562);
+      this.Controls.Add(this.parameterTypeSelector);
+      this.Controls.Add(this.descriptionTextBox);
+      this.Controls.Add(this.nameTextBox);
+      this.Controls.Add(this.descriptionLabel);
+      this.Controls.Add(this.nameLabel);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "CreateParameterDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Create Parameter";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button cancelButton;
+    protected System.Windows.Forms.Button okButton;
+    protected System.Windows.Forms.Label nameLabel;
+    protected System.Windows.Forms.TextBox nameTextBox;
+    protected System.Windows.Forms.Label descriptionLabel;
+    protected System.Windows.Forms.TextBox descriptionTextBox;
+    protected TypeSelector parameterTypeSelector;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CreateParameterDialog.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CreateParameterDialog.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/CreateParameterDialog.cs	(revision 16770)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  public partial class CreateParameterDialog : Form {
+    public TypeSelector ParameterTypeSelector {
+      get { return parameterTypeSelector; }
+    }
+    public IParameter Parameter {
+      get {
+        try {
+          IParameter parameter = (IParameter)Activator.CreateInstance(parameterTypeSelector.SelectedType, nameTextBox.Text, descriptionTextBox.Text);
+          parameter.Hidden = false;
+          return parameter;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+        return null;
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="AddVariableInfoDialog"/>.
+    /// </summary>
+    public CreateParameterDialog() {
+      InitializeComponent();
+      parameterTypeSelector.Configure(typeof(IParameter), false, true);
+    }
+
+    protected virtual void parameterTypeSelector_SelectedTypeChanged(object sender, EventArgs e) {
+      okButton.Enabled = (parameterTypeSelector.SelectedType != null) && !parameterTypeSelector.SelectedType.ContainsGenericParameters;
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/EngineView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/EngineView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/EngineView.Designer.cs	(revision 16770)
@@ -0,0 +1,103 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class EngineView {
+    /// <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() {
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.logView = new HeuristicLab.Core.Views.LogView();
+      this.SuspendLayout();
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Location = new System.Drawing.Point(92, 0);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(338, 20);
+      this.executionTimeTextBox.TabIndex = 1;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.AutoSize = true;
+      this.executionTimeLabel.Location = new System.Drawing.Point(3, 3);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+      this.executionTimeLabel.TabIndex = 0;
+      this.executionTimeLabel.Text = "&Execution Time:";
+      // 
+      // logView
+      // 
+      this.logView.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.logView.Content = null;
+      this.logView.Location = new System.Drawing.Point(0, 26);
+      this.logView.Name = "logView";
+      this.logView.Size = new System.Drawing.Size(430, 328);
+      this.logView.TabIndex = 2;
+      // 
+      // EngineView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.logView);
+      this.Name = "EngineView";
+      this.Size = new System.Drawing.Size(430, 354);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox executionTimeTextBox;
+    protected System.Windows.Forms.Label executionTimeLabel;
+    protected LogView logView;
+
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/EngineView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/EngineView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/EngineView.cs	(revision 16770)
@@ -0,0 +1,100 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// Base class for editors of engines.
+  /// </summary>
+  [View("Engine View")]
+  [Content(typeof(Engine), true)]
+  [Content(typeof(IEngine), false)]
+  public partial class EngineView : ItemView {
+    /// <summary>
+    /// Gets or sets the current engine.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="EditorBase"/>.</remarks>
+    public new IEngine Content {
+      get { return (IEngine)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="EngineBaseEditor"/>.
+    /// </summary>
+    public EngineView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Removes the event handlers from the underlying <see cref="IEngine"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void DeregisterContentEvents() {
+      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
+      base.DeregisterContentEvents();
+    }
+
+    /// <summary>
+    /// Adds event handlers to the underlying <see cref="IEngine"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="EditorBase.UpdateControls"/> of base class <see cref="EditorBase"/>.</remarks>
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        logView.Content = null;
+        executionTimeTextBox.Text = "-";
+      } else {
+        logView.Content = Content.Log;
+        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) {
+        logView.Enabled = false;
+        executionTimeTextBox.Enabled = false;
+      } else {
+        logView.Enabled = true;
+        executionTimeTextBox.Enabled = true;
+      }
+    }
+
+    protected virtual void Content_ExecutionTimeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
+      else
+        executionTimeTextBox.Text = Content == null ? "-" : Content.ExecutionTime.ToString();
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj	(revision 16770)
@@ -0,0 +1,435 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E226881D-315F-423D-B419-A766FE0D8685}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Core.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Core.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Design" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="BreadcrumbViewHost.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BreadcrumbViewHost.Designer.cs">
+      <DependentUpon>BreadcrumbViewHost.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CheckedItemCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CheckedItemCollectionView.Designer.cs">
+      <DependentUpon>CheckedItemCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Clipboard.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Clipboard.Designer.cs">
+      <DependentUpon>Clipboard.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CheckedItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CheckedItemListView.Designer.cs">
+      <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>
+    </Compile>
+    <Compile Include="LogView.Designer.cs">
+      <DependentUpon>LogView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="NestingLevelErrorControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="NestingLevelErrorControl.Designer.cs">
+      <DependentUpon>NestingLevelErrorControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ParameterizedItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ParameterizedItemView.Designer.cs">
+      <DependentUpon>ParameterizedItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+    </Compile>
+    <Compile Include="VariableValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableValueView.Designer.cs">
+      <DependentUpon>VariableValueView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TextDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TextDialog.Designer.cs">
+      <DependentUpon>TextDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorTreeView.Designer.cs">
+      <DependentUpon>OperatorTreeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ParameterizedNamedItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ParameterizedNamedItemView.Designer.cs">
+      <DependentUpon>ParameterizedNamedItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ValueParameterCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ValueParameterCollectionView.Designer.cs">
+      <DependentUpon>ValueParameterCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemArrayView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemArrayView.Designer.cs">
+      <DependentUpon>ItemArrayView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CreateParameterDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CreateParameterDialog.Designer.cs">
+      <DependentUpon>CreateParameterDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EngineView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EngineView.Designer.cs">
+      <DependentUpon>EngineView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemView.Designer.cs">
+      <DependentUpon>ItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="NamedItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="NamedItemView.Designer.cs">
+      <DependentUpon>NamedItemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorGraphView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorGraphView.Designer.cs">
+      <DependentUpon>OperatorGraphView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorListView.Designer.cs">
+      <DependentUpon>OperatorListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorsSidebar.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorsSidebar.Designer.cs">
+      <DependentUpon>OperatorsSidebar.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TypeSelectorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TypeSelectorDialog.Designer.cs">
+      <DependentUpon>TypeSelectorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TypeSelector.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TypeSelector.Designer.cs">
+      <DependentUpon>TypeSelector.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorCollectionView.Designer.cs">
+      <DependentUpon>OperatorCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorSetView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorSetView.Designer.cs">
+      <DependentUpon>OperatorSetView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemSetView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemSetView.Designer.cs">
+      <DependentUpon>ItemSetView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemCollectionView.Designer.cs">
+      <DependentUpon>ItemCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ScopeListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScopeListView.Designer.cs">
+      <DependentUpon>ScopeListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemListView.Designer.cs">
+      <DependentUpon>ItemListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ScopeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScopeView.Designer.cs">
+      <DependentUpon>ScopeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VariableCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableCollectionView.Designer.cs">
+      <DependentUpon>VariableCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ParameterCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ParameterCollectionView.Designer.cs">
+      <DependentUpon>ParameterCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="NamedItemCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="NamedItemCollectionView.Designer.cs">
+      <DependentUpon>NamedItemCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="VariableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableView.Designer.cs">
+      <DependentUpon>VariableView.cs</DependentUpon>
+    </Compile>
+    <None Include="Properties\Settings.settings">
+      <Generator>PublicSettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
+      <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="HEAL.Attic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\bin\HEAL.Attic.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemArrayView.Designer.cs	(revision 16770)
@@ -0,0 +1,246 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Security.AccessControl;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Views {
+  partial class ItemArrayView<T> {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.addButton = new System.Windows.Forms.Button();
+      this.moveUpButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.moveDownButton = new System.Windows.Forms.Button();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.listViewColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.showDetailsCheckBox = new System.Windows.Forms.CheckBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.showDetailsCheckBox);
+      this.splitContainer.Panel1.Controls.Add(this.addButton);
+      this.splitContainer.Panel1.Controls.Add(this.moveUpButton);
+      this.splitContainer.Panel1.Controls.Add(this.removeButton);
+      this.splitContainer.Panel1.Controls.Add(this.moveDownButton);
+      this.splitContainer.Panel1.Controls.Add(this.itemsListView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(493, 323);
+      this.splitContainer.SplitterDistance = 200;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // addButton
+      // 
+      this.addButton.Enabled = false;
+      this.addButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(3, 3);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.addButton, "Set");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // moveUpButton
+      // 
+      this.moveUpButton.Enabled = false;
+      this.moveUpButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.ArrowUp;
+      this.moveUpButton.Location = new System.Drawing.Point(33, 3);
+      this.moveUpButton.Name = "moveUpButton";
+      this.moveUpButton.Size = new System.Drawing.Size(24, 24);
+      this.moveUpButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.moveUpButton, "Move Up");
+      this.moveUpButton.UseVisualStyleBackColor = true;
+      this.moveUpButton.Click += new System.EventHandler(this.moveUpButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(93, 3);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.removeButton, "Clear");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // moveDownButton
+      // 
+      this.moveDownButton.Enabled = false;
+      this.moveDownButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.ArrowDown;
+      this.moveDownButton.Location = new System.Drawing.Point(63, 3);
+      this.moveDownButton.Name = "moveDownButton";
+      this.moveDownButton.Size = new System.Drawing.Size(24, 24);
+      this.moveDownButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.moveDownButton, "Move Down");
+      this.moveDownButton.UseVisualStyleBackColor = true;
+      this.moveDownButton.Click += new System.EventHandler(this.moveDownButton_Click);
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.AllowDrop = true;
+      this.itemsListView.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.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.listViewColumnHeader});
+      this.itemsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(3, 33);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.ShowItemToolTips = true;
+      this.itemsListView.Size = new System.Drawing.Size(194, 286);
+      this.itemsListView.SmallImageList = this.imageList;
+      this.itemsListView.TabIndex = 5;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.itemsListView_ItemDrag);
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnter);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragOver);
+      this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
+      this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.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.detailsGroupBox.Controls.Add(this.viewHost);
+      this.detailsGroupBox.Location = new System.Drawing.Point(3, 27);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(283, 294);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // 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.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(271, 269);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.splitContainer);
+      this.itemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.itemsGroupBox.Name = "itemsGroupBox";
+      this.itemsGroupBox.Size = new System.Drawing.Size(499, 342);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "Items";
+      // 
+      // showDetailsCheckBox
+      // 
+      this.showDetailsCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsCheckBox.Checked = true;
+      this.showDetailsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.showDetailsCheckBox.Image = HeuristicLab.Common.Resources.VSImageLibrary.Properties;
+      this.showDetailsCheckBox.Location = new System.Drawing.Point(123, 3);
+      this.showDetailsCheckBox.Name = "showDetailsCheckBox";
+      this.showDetailsCheckBox.Size = new System.Drawing.Size(24, 24);
+      this.showDetailsCheckBox.TabIndex = 4;
+      this.toolTip.SetToolTip(this.showDetailsCheckBox, "Show/Hide Details");
+      this.showDetailsCheckBox.UseVisualStyleBackColor = true;
+      this.showDetailsCheckBox.CheckedChanged += new System.EventHandler(this.showDetailsCheckBox_CheckedChanged);
+      // 
+      // ItemArrayView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.itemsGroupBox);
+      this.Name = "ItemArrayView";
+      this.Size = new System.Drawing.Size(499, 342);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.ColumnHeader listViewColumnHeader;
+    protected GroupBox itemsGroupBox;
+    protected ListView itemsListView;
+    protected GroupBox detailsGroupBox;
+    protected Button moveUpButton;
+    protected Button moveDownButton;
+    protected ToolTip toolTip;
+    protected ImageList imageList;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost viewHost;
+    protected Button removeButton;
+    protected Button addButton;
+    protected CheckBox showDetailsCheckBox;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemArrayView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemArrayView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemArrayView.cs	(revision 16770)
@@ -0,0 +1,477 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  [View("ItemArray View")]
+  [Content(typeof(ItemArray<>), true)]
+  [Content(typeof(IItemArray<>), false)]
+  [Content(typeof(ReadOnlyItemArray<>), true)]
+  public partial class ItemArrayView<T> : ItemView where T : class, IItem {
+    protected Dictionary<T, List<ListViewItem>> itemListViewItemMapping;
+    protected TypeSelectorDialog typeSelectorDialog;
+    protected bool validDragOperation;
+
+    public new IItemArray<T> Content {
+      get { return (IItemArray<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ListView ItemsListView {
+      get { return itemsListView; }
+    }
+
+    public ItemArrayView() {
+      InitializeComponent();
+      itemListViewItemMapping = new Dictionary<T, List<ListViewItem>>();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced);
+      Content.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved);
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset);
+      foreach (T item in itemListViewItemMapping.Keys) {
+        DeregisterItemEvents(item);
+      }
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced);
+      Content.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved);
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset);
+    }
+    protected virtual void DeregisterItemEvents(T item) {
+      item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
+      item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
+    }
+    protected virtual void RegisterItemEvents(T item) {
+      item.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
+      item.ToStringChanged += new EventHandler(Item_ToStringChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      int selectedIndex = -1;
+      if (itemsListView.SelectedItems.Count == 1) selectedIndex = itemsListView.SelectedIndices[0];
+
+      itemsListView.Items.Clear();
+      itemListViewItemMapping.Clear();
+      RebuildImageList();
+      viewHost.Content = null;
+      if (Content != null) {
+        Caption += " (" + Content.GetType().Name + ")";
+        foreach (T item in Content)
+          AddListViewItem(CreateListViewItem(item));
+        AdjustListViewColumnSizes();
+        if ((selectedIndex != -1) && (selectedIndex < itemsListView.Items.Count))
+          itemsListView.Items[selectedIndex].Selected = true;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) {
+        addButton.Enabled = false;
+        moveUpButton.Enabled = false;
+        moveDownButton.Enabled = false;
+        removeButton.Enabled = false;
+        itemsListView.Enabled = false;
+        detailsGroupBox.Enabled = false;
+      } else {
+        addButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
+                            !Content.IsReadOnly && !ReadOnly;
+        moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                               itemsListView.SelectedIndices[0] != 0 &&
+                               !Content.IsReadOnly && !ReadOnly;
+        moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                                 itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
+                                 !Content.IsReadOnly && !ReadOnly;
+        removeButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
+                               !Content.IsReadOnly && !ReadOnly;
+        itemsListView.Enabled = true;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+      }
+    }
+
+    protected virtual T CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+    protected virtual ListViewItem CreateListViewItem(T item) {
+      ListViewItem listViewItem = new ListViewItem();
+      if (item == null) {
+        listViewItem.Text = "null";
+        itemsListView.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Nothing);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      } else {
+        listViewItem.Text = item.ToString();
+        listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
+        itemsListView.SmallImageList.Images.Add(item.ItemImage);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+        listViewItem.Tag = item;
+      }
+      return listViewItem;
+    }
+    protected virtual void AddListViewItem(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = (listViewItem.Tag as T);
+      itemsListView.Items.Add(listViewItem);
+      if (item != null) {
+        if (!itemListViewItemMapping.ContainsKey(item)) {
+          RegisterItemEvents(item);
+          itemListViewItemMapping.Add(item, new List<ListViewItem>());
+        }
+        itemListViewItemMapping[item].Add(listViewItem);
+      }
+    }
+    protected virtual void InsertListViewItem(int index, ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = (listViewItem.Tag as T);
+      itemsListView.Items.Insert(index, listViewItem);
+      if (item != null) {
+        if (!itemListViewItemMapping.ContainsKey(item)) {
+          RegisterItemEvents(item);
+          itemListViewItemMapping.Add(item, new List<ListViewItem>());
+        }
+        itemListViewItemMapping[item].Add(listViewItem);
+      }
+    }
+    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = (listViewItem.Tag as T);
+      if (item != null) {
+        itemListViewItemMapping[item].Remove(listViewItem);
+        if (itemListViewItemMapping[item].Count == 0) {
+          itemListViewItemMapping.Remove(item);
+          DeregisterItemEvents(item);
+        }
+      }
+      listViewItem.Remove();
+    }
+    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = listViewItem.Tag as T;
+      int i = listViewItem.ImageIndex;
+      itemsListView.SmallImageList.Images[i] = item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage;
+      listViewItem.ImageIndex = -1;
+      listViewItem.ImageIndex = i;
+    }
+    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = listViewItem.Tag as T;
+      listViewItem.Text = item == null ? "null" : item.ToString();
+      listViewItem.ToolTipText = item == null ? string.Empty : item.ItemName + ": " + item.ItemDescription;
+    }
+    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(T item) {
+      if (item == null) {
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (ListViewItem listViewItem in itemsListView.Items) {
+          if (listViewItem.Tag == null) listViewItems.Add(listViewItem);
+        }
+        return listViewItems;
+      } else {
+        List<ListViewItem> listViewItems = null;
+        itemListViewItemMapping.TryGetValue(item, out listViewItems);
+        return listViewItems == null ? Enumerable.Empty<ListViewItem>() : listViewItems;
+      }
+    }
+
+    #region ListView Events
+    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      addButton.Enabled = itemsListView.SelectedItems.Count > 0 && (Content != null) && !Content.IsReadOnly && !ReadOnly;
+      moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                             itemsListView.SelectedIndices[0] != 0 &&
+                             (Content != null) && !Content.IsReadOnly && !ReadOnly;
+      moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                               itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
+                               (Content != null) && !Content.IsReadOnly && !ReadOnly;
+      removeButton.Enabled = itemsListView.SelectedItems.Count > 0 && (Content != null) && !Content.IsReadOnly && !ReadOnly;
+      AdjustListViewColumnSizes();
+
+      if (showDetailsCheckBox.Checked) {
+        if (itemsListView.SelectedItems.Count == 1) {
+          T item = itemsListView.SelectedItems[0].Tag as T;
+          detailsGroupBox.Enabled = true;
+          viewHost.Content = item;
+        } else {
+          viewHost.Content = null;
+          detailsGroupBox.Enabled = false;
+        }
+      }
+    }
+
+    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly && !ReadOnly) {
+          foreach (ListViewItem item in itemsListView.SelectedItems)
+            Content[item.Index] = null;
+        }
+      } else if (e.KeyData == (Keys.Control | Keys.C)) {
+        if (itemsListView.SelectedItems.Count > 0) {
+          var builder = new StringBuilder();
+          foreach (ListViewItem selected in itemsListView.SelectedItems) {
+            builder.AppendLine(selected.Text);
+          }
+          Clipboard.SetText(builder.ToString());
+        }
+      }
+    }
+
+    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        T item = itemsListView.SelectedItems[0].Tag as T;
+        if (item != null) {
+          IContentView view = MainFormManager.MainForm.ShowContent(item);
+          if (view != null) {
+            view.ReadOnly = ReadOnly;
+            view.Locked = Locked;
+          }
+        }
+      }
+    }
+
+    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (!Locked) {
+        List<T> items = new List<T>();
+        foreach (ListViewItem listViewItem in itemsListView.SelectedItems) {
+          T item = listViewItem.Tag as T;
+          if (item != null) items.Add(item);
+        }
+
+        if (items.Count > 0) {
+          DataObject data = new DataObject();
+          if (items.Count == 1) data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items[0]);
+          else data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items);
+          if (Content.IsReadOnly || ReadOnly) {
+            DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+          } else {
+            DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+              foreach (ListViewItem listViewItem in itemsListView.SelectedItems.Cast<ListViewItem>().ToArray())
+                Content[listViewItem.Index] = null;
+            }
+          }
+        }
+      }
+    }
+    protected virtual void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = !Content.IsReadOnly && !ReadOnly && e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T;
+    }
+    protected virtual void itemsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (validDragOperation) {
+        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+        ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
+        if (listViewItem != null) {
+          if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+          else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+        }
+      }
+    }
+    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+        ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
+        T item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as T;
+        Content[listViewItem.Index] = e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item;
+      }
+    }
+    #endregion
+
+    #region Button Events
+    protected virtual void addButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count > 0) {
+        T item = CreateItem();
+        if (item != null) {
+          foreach (ListViewItem listViewItem in itemsListView.SelectedItems)
+            Content[listViewItem.Index] = item;
+        }
+      }
+    }
+    protected virtual void moveUpButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        int index = itemsListView.SelectedIndices[0];
+        Content.Reverse(index - 1, 2);
+        itemsListView.Items[index].Selected = false;
+        itemsListView.Items[index - 1].Selected = true;
+      }
+    }
+    protected virtual void moveDownButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        int index = itemsListView.SelectedIndices[0];
+        Content.Reverse(index, 2);
+        itemsListView.Items[index].Selected = false;
+        itemsListView.Items[index + 1].Selected = true;
+      }
+    }
+    protected virtual void removeButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in itemsListView.SelectedItems)
+          Content[item.Index] = null;
+      }
+    }
+    #endregion
+
+    #region CheckBox Events
+    protected virtual void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (showDetailsCheckBox.Checked) {
+        splitContainer.Panel2Collapsed = false;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+        viewHost.Content = itemsListView.SelectedItems.Count == 1 ? (T)itemsListView.SelectedItems[0].Tag : null;
+      } else {
+        splitContainer.Panel2Collapsed = true;
+        viewHost.Content = null;
+      }
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced), sender, e);
+      else {
+        int[] selected = new int[itemsListView.SelectedIndices.Count];
+        itemsListView.SelectedIndices.CopyTo(selected, 0);
+
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (IndexedItem<T> item in e.OldItems)
+          listViewItems.Add(itemsListView.Items[item.Index]);
+        foreach (ListViewItem listViewItem in listViewItems)
+          RemoveListViewItem(listViewItem);
+        RebuildImageList();
+
+        foreach (IndexedItem<T> item in e.Items)
+          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
+        AdjustListViewColumnSizes();
+
+        for (int i = 0; i < selected.Length; i++)
+          itemsListView.Items[selected[i]].Selected = true;
+      }
+    }
+    protected virtual void Content_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved), sender, e);
+      else {
+        foreach (IndexedItem<T> item in e.Items) {
+          ListViewItem listViewItem = itemsListView.Items[item.Index];
+          if (listViewItem.Tag != null)
+            itemListViewItemMapping[(T)listViewItem.Tag].Remove(listViewItem);
+          listViewItem.Tag = item.Value;
+          if (listViewItem.Tag != null)
+            itemListViewItemMapping[item.Value].Add(listViewItem);
+          UpdateListViewItemImage(listViewItem);
+          UpdateListViewItemText(listViewItem);
+        }
+      }
+    }
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset), sender, e);
+      else {
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (IndexedItem<T> item in e.OldItems)
+          listViewItems.Add(itemsListView.Items[item.Index]);
+        foreach (ListViewItem listViewItem in listViewItems)
+          RemoveListViewItem(listViewItem);
+        RebuildImageList();
+
+        foreach (IndexedItem<T> item in e.Items)
+          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+
+    #region Item Events
+    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
+      else {
+        T item = (T)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemImage(listViewItem);
+      }
+    }
+    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
+      else {
+        T item = (T)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemText(listViewItem);
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void AdjustListViewColumnSizes() {
+      if (itemsListView.Items.Count > 0) {
+        for (int i = 0; i < itemsListView.Columns.Count; i++)
+          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+    protected virtual void RebuildImageList() {
+      itemsListView.SmallImageList.Images.Clear();
+      foreach (ListViewItem listViewItem in itemsListView.Items) {
+        T item = listViewItem.Tag as T;
+        itemsListView.SmallImageList.Images.Add(item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemCollectionView.Designer.cs	(revision 16770)
@@ -0,0 +1,246 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Security.AccessControl;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Views {
+  partial class ItemCollectionView<T> {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.sortDescendingButton = new System.Windows.Forms.Button();
+      this.sortAscendingButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.showDetailsCheckBox = new System.Windows.Forms.CheckBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.showDetailsCheckBox);
+      this.splitContainer.Panel1.Controls.Add(this.itemsListView);
+      this.splitContainer.Panel1.Controls.Add(this.sortDescendingButton);
+      this.splitContainer.Panel1.Controls.Add(this.sortAscendingButton);
+      this.splitContainer.Panel1.Controls.Add(this.removeButton);
+      this.splitContainer.Panel1.Controls.Add(this.addButton);
+      this.splitContainer.Panel1MinSize = 100;
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(526, 364);
+      this.splitContainer.SplitterDistance = 250;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.AllowDrop = true;
+      this.itemsListView.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.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.itemsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(3, 33);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.ShowItemToolTips = true;
+      this.itemsListView.Size = new System.Drawing.Size(244, 327);
+      this.itemsListView.SmallImageList = this.imageList;
+      this.itemsListView.TabIndex = 5;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.itemsListView_ItemDrag);
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnter);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragOver);
+      this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
+      this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // sortDescendingButton
+      // 
+      this.sortDescendingButton.Enabled = false;
+      this.sortDescendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.SortUp;
+      this.sortDescendingButton.Location = new System.Drawing.Point(33, 3);
+      this.sortDescendingButton.Name = "sortDescendingButton";
+      this.sortDescendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortDescendingButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.sortDescendingButton, "Sort Descending");
+      this.sortDescendingButton.UseVisualStyleBackColor = true;
+      this.sortDescendingButton.Click += new System.EventHandler(this.sortDescendingButton_Click);
+      // 
+      // sortAscendingButton
+      // 
+      this.sortAscendingButton.Enabled = false;
+      this.sortAscendingButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Sort;
+      this.sortAscendingButton.Location = new System.Drawing.Point(63, 3);
+      this.sortAscendingButton.Name = "sortAscendingButton";
+      this.sortAscendingButton.Size = new System.Drawing.Size(24, 24);
+      this.sortAscendingButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.sortAscendingButton, "Sort Ascending");
+      this.sortAscendingButton.UseVisualStyleBackColor = true;
+      this.sortAscendingButton.Click += new System.EventHandler(this.sortAscendingButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(93, 3);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.removeButton, "Remove");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(3, 3);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.addButton, "Add");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.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.detailsGroupBox.Controls.Add(this.viewHost);
+      this.detailsGroupBox.Location = new System.Drawing.Point(3, 27);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(266, 335);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // 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.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(254, 310);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.splitContainer);
+      this.itemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      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";
+      // 
+      // showDetailsCheckBox
+      // 
+      this.showDetailsCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsCheckBox.Checked = true;
+      this.showDetailsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.showDetailsCheckBox.Image = HeuristicLab.Common.Resources.VSImageLibrary.Properties;
+      this.showDetailsCheckBox.Location = new System.Drawing.Point(123, 3);
+      this.showDetailsCheckBox.Name = "showDetailsCheckBox";
+      this.showDetailsCheckBox.Size = new System.Drawing.Size(24, 24);
+      this.showDetailsCheckBox.TabIndex = 4;
+      this.toolTip.SetToolTip(this.showDetailsCheckBox, "Show/Hide Details");
+      this.showDetailsCheckBox.UseVisualStyleBackColor = true;
+      this.showDetailsCheckBox.CheckedChanged += new System.EventHandler(this.showDetailsCheckBox_CheckedChanged);
+      // 
+      // ItemCollectionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.itemsGroupBox);
+      this.Name = "ItemCollectionView";
+      this.Size = new System.Drawing.Size(532, 383);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.ColumnHeader columnHeader1;
+    protected GroupBox itemsGroupBox;
+    protected ListView itemsListView;
+    protected GroupBox detailsGroupBox;
+    protected Button addButton;
+    protected Button removeButton;
+    protected ToolTip toolTip;
+    protected ImageList imageList;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost viewHost;
+    protected Button sortAscendingButton;
+    protected Button sortDescendingButton;
+    protected CheckBox showDetailsCheckBox;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 16770)
@@ -0,0 +1,452 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  [View("ItemCollection View")]
+  [Content(typeof(ItemCollection<>), true)]
+  [Content(typeof(IItemCollection<>), false)]
+  [Content(typeof(ReadOnlyItemCollection<>), true)]
+  public partial class ItemCollectionView<T> : ItemView where T : class, IItem {
+    protected Dictionary<T, List<ListViewItem>> itemListViewItemMapping;
+    protected TypeSelectorDialog typeSelectorDialog;
+    protected bool validDragOperation;
+
+    public new IItemCollection<T> Content {
+      get { return (IItemCollection<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ObservableCollection<T> ItemCollection {
+      get { return Content as ObservableCollection<T>; }
+    }
+
+    public bool ShowDetails {
+      get { return showDetailsCheckBox.Checked; }
+      set { showDetailsCheckBox.Checked = value; }
+    }
+
+    public ListView ItemsListView {
+      get { return itemsListView; }
+    }
+
+    public ItemCollectionView() {
+      InitializeComponent();
+      itemListViewItemMapping = new Dictionary<T, List<ListViewItem>>();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    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);
+      foreach (T item in itemListViewItemMapping.Keys) {
+        DeregisterItemEvents(item);
+      }
+      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 virtual void DeregisterItemEvents(T item) {
+      item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
+      item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
+    }
+    protected virtual void RegisterItemEvents(T item) {
+      item.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
+      item.ToStringChanged += new EventHandler(Item_ToStringChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      itemsListView.Items.Clear();
+      itemListViewItemMapping.Clear();
+      RebuildImageList();
+      viewHost.Content = null;
+      if (Content != null) {
+        Caption += " (" + Content.GetType().Name + ")";
+        foreach (T item in Content)
+          AddListViewItem(CreateListViewItem(item));
+        AdjustListViewColumnSizes();
+        SortItemsListView(SortOrder.Ascending);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) {
+        addButton.Enabled = false;
+        sortAscendingButton.Enabled = false;
+        sortDescendingButton.Enabled = false;
+        removeButton.Enabled = false;
+        itemsListView.Enabled = false;
+        detailsGroupBox.Enabled = false;
+      } else {
+        addButton.Enabled = !Content.IsReadOnly && !ReadOnly;
+        sortAscendingButton.Enabled = itemsListView.Items.Count > 1;
+        sortDescendingButton.Enabled = itemsListView.Items.Count > 1;
+        removeButton.Enabled = !Content.IsReadOnly && !ReadOnly && itemsListView.SelectedItems.Count > 0;
+        itemsListView.Enabled = true;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+      }
+    }
+
+    protected virtual T CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+    protected virtual ListViewItem CreateListViewItem(T item) {
+      ListViewItem listViewItem = new ListViewItem();
+      if (item == null) {
+        listViewItem.Text = "null";
+        itemsListView.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Nothing);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      } else {
+        listViewItem.Text = item.ToString();
+        listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
+        itemsListView.SmallImageList.Images.Add(item.ItemImage);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+        listViewItem.Tag = item;
+      }
+      return listViewItem;
+    }
+    protected virtual void AddListViewItem(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = (listViewItem.Tag as T);
+      itemsListView.Items.Add(listViewItem);
+      if (item != null) {
+        if (!itemListViewItemMapping.ContainsKey(item)) {
+          RegisterItemEvents(item);
+          itemListViewItemMapping.Add(item, new List<ListViewItem>());
+        }
+        itemListViewItemMapping[item].Add(listViewItem);
+      }
+      sortAscendingButton.Enabled = itemsListView.Items.Count > 1;
+      sortDescendingButton.Enabled = itemsListView.Items.Count > 1;
+    }
+    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = (listViewItem.Tag as T);
+      if (item != null) {
+        itemListViewItemMapping[item].Remove(listViewItem);
+        if (itemListViewItemMapping[item].Count == 0) {
+          itemListViewItemMapping.Remove(item);
+          DeregisterItemEvents(item);
+        }
+      }
+      listViewItem.Remove();
+      sortAscendingButton.Enabled = itemsListView.Items.Count > 1;
+      sortDescendingButton.Enabled = itemsListView.Items.Count > 1;
+    }
+    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = listViewItem.Tag as T;
+      int i = listViewItem.ImageIndex;
+      itemsListView.SmallImageList.Images[i] = item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage;
+      listViewItem.ImageIndex = -1;
+      listViewItem.ImageIndex = i;
+    }
+    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = listViewItem.Tag as T;
+      listViewItem.Text = item == null ? "null" : item.ToString();
+      listViewItem.ToolTipText = item == null ? string.Empty : item.ItemName + ": " + item.ItemDescription;
+    }
+    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(T item) {
+      if (item == null) {
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (ListViewItem listViewItem in itemsListView.Items) {
+          if (listViewItem.Tag == null) listViewItems.Add(listViewItem);
+        }
+        return listViewItems;
+      } else {
+        List<ListViewItem> listViewItems = null;
+        itemListViewItemMapping.TryGetValue(item, out listViewItems);
+        return listViewItems == null ? Enumerable.Empty<ListViewItem>() : listViewItems;
+      }
+    }
+
+    #region ListView Events
+    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      removeButton.Enabled = (Content != null) && !Content.IsReadOnly && !ReadOnly && itemsListView.SelectedItems.Count > 0;
+      AdjustListViewColumnSizes();
+      if (showDetailsCheckBox.Checked) {
+        if (itemsListView.SelectedItems.Count == 1) {
+          T item = (T)itemsListView.SelectedItems[0].Tag;
+          detailsGroupBox.Enabled = true;
+          viewHost.Content = item;
+        } else {
+          viewHost.Content = null;
+          detailsGroupBox.Enabled = false;
+        }
+      }
+    }
+    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly && !ReadOnly) {
+          if (ItemCollection != null) ItemCollection.RemoveRange(itemsListView.SelectedItems.Cast<ListViewItem>().Select(i => (T)i.Tag));
+          else {
+            foreach (ListViewItem item in itemsListView.SelectedItems)
+              Content.Remove((T)item.Tag);
+          }
+        }
+      } else if (e.KeyData == (Keys.Control | Keys.C)) {
+        if (itemsListView.SelectedItems.Count > 0) {
+          var builder = new StringBuilder();
+          foreach (ListViewItem selected in itemsListView.SelectedItems) {
+            builder.AppendLine(selected.Text);
+          }
+          Clipboard.SetText(builder.ToString());
+        }
+      }
+    }
+    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        T item = itemsListView.SelectedItems[0].Tag as T;
+        if (item != null) {
+          IContentView view = MainFormManager.MainForm.ShowContent(item);
+          if (view != null) {
+            view.ReadOnly = ReadOnly;
+            view.Locked = Locked;
+          }
+        }
+      }
+    }
+    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (!Locked) {
+        List<T> items = new List<T>();
+        foreach (ListViewItem listViewItem in itemsListView.SelectedItems) {
+          T item = listViewItem.Tag as T;
+          if (item != null) items.Add(item);
+        }
+
+        if (items.Count > 0) {
+          DataObject data = new DataObject();
+          if (items.Count == 1) data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items[0]);
+          else data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items);
+          if (Content.IsReadOnly || ReadOnly) {
+            DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+          } else {
+            DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+              foreach (T item in items) Content.Remove(item);
+            }
+          }
+        }
+      }
+    }
+    protected virtual void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      if (!Content.IsReadOnly && !ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T)) {
+        validDragOperation = true;
+      } else if (!Content.IsReadOnly && !ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable)) {
+        validDragOperation = true;
+        IEnumerable items = (IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+        foreach (object item in items)
+          validDragOperation = validDragOperation && (item is T);
+      }
+    }
+    protected virtual void itemsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (validDragOperation) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T) {
+          T item = (T)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+          Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+        } else if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable) {
+          IEnumerable<T> items = ((IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat)).Cast<T>();
+          if (e.Effect.HasFlag(DragDropEffects.Copy)) {
+            Cloner cloner = new Cloner();
+            items = items.Select(x => cloner.Clone(x));
+          }
+          if (ItemCollection != null) ItemCollection.AddRange(items);
+          else {
+            foreach (T item in items)
+              Content.Add(item);
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    protected virtual void addButton_Click(object sender, EventArgs e) {
+      T item = CreateItem();
+      if (item != null)
+        Content.Add(item);
+    }
+    protected virtual void sortAscendingButton_Click(object sender, EventArgs e) {
+      SortItemsListView(SortOrder.Ascending);
+    }
+    protected virtual void sortDescendingButton_Click(object sender, EventArgs e) {
+      SortItemsListView(SortOrder.Descending);
+    }
+    protected virtual void removeButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count > 0) {
+        if (ItemCollection != null) {
+          ItemCollection.RemoveRange(itemsListView.SelectedItems.Cast<ListViewItem>().Select(i => (T)i.Tag));
+        } else {
+          foreach (ListViewItem item in itemsListView.SelectedItems)
+            Content.Remove((T)item.Tag);
+        }
+        itemsListView.SelectedItems.Clear();
+      }
+    }
+    #endregion
+
+    #region CheckBox Events
+    protected virtual void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (showDetailsCheckBox.Checked) {
+        splitContainer.Panel2Collapsed = false;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+        viewHost.Content = itemsListView.SelectedItems.Count == 1 ? (T)itemsListView.SelectedItems[0].Tag : null;
+      } else {
+        splitContainer.Panel2Collapsed = true;
+        viewHost.Content = null;
+      }
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_ItemsAdded), sender, e);
+      else {
+        foreach (T item in e.Items)
+          AddListViewItem(CreateListViewItem(item));
+        AdjustListViewColumnSizes();
+      }
+
+    }
+    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_ItemsRemoved), sender, e);
+      else {
+        foreach (T item in e.Items) {
+          //remove only the first matching ListViewItem, because the IItem could be contained multiple times in the ItemCollection
+          ListViewItem listviewItem = GetListViewItemsForItem(item).FirstOrDefault();
+          if (listviewItem != null) RemoveListViewItem(listviewItem);
+        }
+        RebuildImageList();
+      }
+    }
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_CollectionReset), sender, e);
+      else {
+        foreach (T item in e.OldItems) {
+          //remove only the first matching ListViewItem, because the IItem could be contained multiple times in the ItemCollection
+          ListViewItem listviewItem = GetListViewItemsForItem(item).FirstOrDefault();
+          if (listviewItem != null) RemoveListViewItem(listviewItem);
+        }
+        RebuildImageList();
+        foreach (T item in e.Items)
+          AddListViewItem(CreateListViewItem(item));
+      }
+    }
+    #endregion
+
+    #region Item Events
+    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
+      else {
+        T item = (T)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemImage(listViewItem);
+      }
+    }
+    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
+      else {
+        T item = (T)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemText(listViewItem);
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void SortItemsListView(SortOrder sortOrder) {
+      itemsListView.Sorting = SortOrder.None;
+      itemsListView.Sorting = sortOrder;
+      itemsListView.Sorting = SortOrder.None;
+    }
+    protected virtual void AdjustListViewColumnSizes() {
+      if (itemsListView.Items.Count > 0) {
+        for (int i = 0; i < itemsListView.Columns.Count; i++)
+          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+    protected virtual void RebuildImageList() {
+      itemsListView.SmallImageList.Images.Clear();
+      foreach (ListViewItem listViewItem in itemsListView.Items) {
+        T item = listViewItem.Tag as T;
+        itemsListView.SmallImageList.Images.Add(item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemListView.Designer.cs	(revision 16770)
@@ -0,0 +1,244 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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 ItemListView<T> {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.showDetailsCheckBox = new System.Windows.Forms.CheckBox();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.moveUpButton = new System.Windows.Forms.Button();
+      this.moveDownButton = new System.Windows.Forms.Button();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.listViewColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.addButton = new System.Windows.Forms.Button();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.showDetailsCheckBox);
+      this.splitContainer.Panel1.Controls.Add(this.removeButton);
+      this.splitContainer.Panel1.Controls.Add(this.moveUpButton);
+      this.splitContainer.Panel1.Controls.Add(this.moveDownButton);
+      this.splitContainer.Panel1.Controls.Add(this.itemsListView);
+      this.splitContainer.Panel1.Controls.Add(this.addButton);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(493, 323);
+      this.splitContainer.SplitterDistance = 200;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // showDetailsCheckBox
+      // 
+      this.showDetailsCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsCheckBox.Checked = true;
+      this.showDetailsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.showDetailsCheckBox.Image = HeuristicLab.Common.Resources.VSImageLibrary.Properties;
+      this.showDetailsCheckBox.Location = new System.Drawing.Point(123, 3);
+      this.showDetailsCheckBox.Name = "showDetailsCheckBox";
+      this.showDetailsCheckBox.Size = new System.Drawing.Size(24, 24);
+      this.showDetailsCheckBox.TabIndex = 4;
+      this.toolTip.SetToolTip(this.showDetailsCheckBox, "Show/Hide Details");
+      this.showDetailsCheckBox.UseVisualStyleBackColor = true;
+      this.showDetailsCheckBox.CheckedChanged += new System.EventHandler(this.showDetailsCheckBox_CheckedChanged);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(93, 3);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.removeButton, "Remove");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // moveUpButton
+      // 
+      this.moveUpButton.Enabled = false;
+      this.moveUpButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.ArrowUp;
+      this.moveUpButton.Location = new System.Drawing.Point(33, 3);
+      this.moveUpButton.Name = "moveUpButton";
+      this.moveUpButton.Size = new System.Drawing.Size(24, 24);
+      this.moveUpButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.moveUpButton, "Move Up");
+      this.moveUpButton.UseVisualStyleBackColor = true;
+      this.moveUpButton.Click += new System.EventHandler(this.moveUpButton_Click);
+      // 
+      // moveDownButton
+      // 
+      this.moveDownButton.Enabled = false;
+      this.moveDownButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.ArrowDown;
+      this.moveDownButton.Location = new System.Drawing.Point(63, 3);
+      this.moveDownButton.Name = "moveDownButton";
+      this.moveDownButton.Size = new System.Drawing.Size(24, 24);
+      this.moveDownButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.moveDownButton, "Move Down");
+      this.moveDownButton.UseVisualStyleBackColor = true;
+      this.moveDownButton.Click += new System.EventHandler(this.moveDownButton_Click);
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.AllowDrop = true;
+      this.itemsListView.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.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.listViewColumnHeader});
+      this.itemsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(3, 33);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.ShowItemToolTips = true;
+      this.itemsListView.Size = new System.Drawing.Size(194, 286);
+      this.itemsListView.SmallImageList = this.imageList;
+      this.itemsListView.TabIndex = 5;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.itemsListView_ItemDrag);
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnter);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragOver);
+      this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
+      this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // addButton
+      // 
+      this.addButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(3, 3);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.addButton, "Add");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.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.detailsGroupBox.Controls.Add(this.viewHost);
+      this.detailsGroupBox.Location = new System.Drawing.Point(3, 27);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(283, 294);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // 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.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(271, 269);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.splitContainer);
+      this.itemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.itemsGroupBox.Name = "itemsGroupBox";
+      this.itemsGroupBox.Size = new System.Drawing.Size(499, 342);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "Items";
+      // 
+      // ItemListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.itemsGroupBox);
+      this.Name = "ItemListView";
+      this.Size = new System.Drawing.Size(499, 342);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.ColumnHeader listViewColumnHeader;
+    protected GroupBox itemsGroupBox;
+    protected ListView itemsListView;
+    protected GroupBox detailsGroupBox;
+    protected Button addButton;
+    protected Button removeButton;
+    protected Button moveUpButton;
+    protected Button moveDownButton;
+    protected ToolTip toolTip;
+    protected ImageList imageList;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost viewHost;
+    protected CheckBox showDetailsCheckBox;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemListView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemListView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemListView.cs	(revision 16770)
@@ -0,0 +1,518 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  [View("ItemList View")]
+  [Content(typeof(ItemList<>), true)]
+  [Content(typeof(IItemList<>), false)]
+  [Content(typeof(ReadOnlyItemList<>), true)]
+  public partial class ItemListView<T> : ItemView where T : class, IItem {
+    protected Dictionary<T, List<ListViewItem>> itemListViewItemMapping;
+    protected TypeSelectorDialog typeSelectorDialog;
+    protected bool validDragOperation;
+
+    public new IItemList<T> Content {
+      get { return (IItemList<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ListView ItemsListView {
+      get { return itemsListView; }
+    }
+
+    public ItemListView() {
+      InitializeComponent();
+      itemListViewItemMapping = new Dictionary<T, List<ListViewItem>>();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved);
+      Content.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced);
+      Content.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved);
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset);
+      foreach (T item in itemListViewItemMapping.Keys) {
+        DeregisterItemEvents(item);
+      }
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded);
+      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved);
+      Content.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced);
+      Content.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved);
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset);
+    }
+    protected virtual void DeregisterItemEvents(T item) {
+      item.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
+      item.ToStringChanged -= new EventHandler(Item_ToStringChanged);
+    }
+    protected virtual void RegisterItemEvents(T item) {
+      item.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
+      item.ToStringChanged += new EventHandler(Item_ToStringChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      int selectedIndex = -1;
+      if (itemsListView.SelectedItems.Count == 1) selectedIndex = itemsListView.SelectedIndices[0];
+
+      itemsListView.Items.Clear();
+      itemListViewItemMapping.Clear();
+      RebuildImageList();
+      viewHost.Content = null;
+      if (Content != null) {
+        foreach (T item in Content)
+          AddListViewItem(CreateListViewItem(item));
+        AdjustListViewColumnSizes();
+        if ((selectedIndex != -1) && (selectedIndex < itemsListView.Items.Count))
+          itemsListView.Items[selectedIndex].Selected = true;
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) {
+        addButton.Enabled = false;
+        moveUpButton.Enabled = false;
+        moveDownButton.Enabled = false;
+        removeButton.Enabled = false;
+        itemsListView.Enabled = false;
+        detailsGroupBox.Enabled = false;
+      } else {
+        addButton.Enabled = !Content.IsReadOnly && !ReadOnly;
+        moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                               itemsListView.SelectedIndices[0] != 0 &&
+                               !Content.IsReadOnly && !ReadOnly;
+        moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                                 itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
+                                 !Content.IsReadOnly && !ReadOnly;
+        removeButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
+                               !Content.IsReadOnly && !ReadOnly;
+        itemsListView.Enabled = true;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+      }
+    }
+
+    protected virtual T CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        } catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+    protected virtual ListViewItem CreateListViewItem(T item) {
+      ListViewItem listViewItem = new ListViewItem();
+      if (item == null) {
+        listViewItem.Text = "null";
+        itemsListView.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Nothing);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      } else {
+        listViewItem.Text = item.ToString();
+        listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
+        itemsListView.SmallImageList.Images.Add(item.ItemImage);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+        listViewItem.Tag = item;
+      }
+      return listViewItem;
+    }
+    protected virtual void AddListViewItem(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = (listViewItem.Tag as T);
+      itemsListView.Items.Add(listViewItem);
+      if (item != null) {
+        if (!itemListViewItemMapping.ContainsKey(item)) {
+          RegisterItemEvents(item);
+          itemListViewItemMapping.Add(item, new List<ListViewItem>());
+        }
+        itemListViewItemMapping[item].Add(listViewItem);
+      }
+    }
+    protected virtual void InsertListViewItem(int index, ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = (listViewItem.Tag as T);
+      itemsListView.Items.Insert(index, listViewItem);
+      if (item != null) {
+        if (!itemListViewItemMapping.ContainsKey(item)) {
+          RegisterItemEvents(item);
+          itemListViewItemMapping.Add(item, new List<ListViewItem>());
+        }
+        itemListViewItemMapping[item].Add(listViewItem);
+      }
+    }
+    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = (listViewItem.Tag as T);
+      if (item != null) {
+        itemListViewItemMapping[item].Remove(listViewItem);
+        if (itemListViewItemMapping[item].Count == 0) {
+          itemListViewItemMapping.Remove(item);
+          DeregisterItemEvents(item);
+        }
+      }
+      listViewItem.Remove();
+    }
+    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = listViewItem.Tag as T;
+      int i = listViewItem.ImageIndex;
+      itemsListView.SmallImageList.Images[i] = item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage;
+      listViewItem.ImageIndex = -1;
+      listViewItem.ImageIndex = i;
+    }
+    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
+      if (listViewItem == null) throw new ArgumentNullException();
+      T item = listViewItem.Tag as T;
+      listViewItem.Text = item == null ? "null" : item.ToString();
+      listViewItem.ToolTipText = item == null ? string.Empty : item.ItemName + ": " + item.ItemDescription;
+    }
+    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(T item) {
+      if (item == null) {
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (ListViewItem listViewItem in itemsListView.Items) {
+          if (listViewItem.Tag == null) listViewItems.Add(listViewItem);
+        }
+        return listViewItems;
+      } else {
+        List<ListViewItem> listViewItems = null;
+        itemListViewItemMapping.TryGetValue(item, out listViewItems);
+        return listViewItems == null ? Enumerable.Empty<ListViewItem>() : listViewItems;
+      }
+    }
+
+    #region ListView Events
+    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                             itemsListView.SelectedIndices[0] != 0 &&
+                             (Content != null) && !Content.IsReadOnly && !ReadOnly;
+      moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                               itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
+                               (Content != null) && !Content.IsReadOnly && !ReadOnly;
+      removeButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
+                             (Content != null) && !Content.IsReadOnly && !ReadOnly;
+      AdjustListViewColumnSizes();
+
+      if (showDetailsCheckBox.Checked) {
+        if (itemsListView.SelectedItems.Count == 1) {
+          T item = (T)itemsListView.SelectedItems[0].Tag;
+          detailsGroupBox.Enabled = true;
+          viewHost.Content = item;
+        } else {
+          viewHost.Content = null;
+          detailsGroupBox.Enabled = false;
+        }
+      }
+    }
+
+    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly && !ReadOnly) {
+          foreach (ListViewItem item in itemsListView.SelectedItems)
+            Content.RemoveAt(item.Index);
+        }
+      } else if (e.KeyData == (Keys.Control | Keys.C)) {
+        if (itemsListView.SelectedItems.Count > 0) {
+          var builder = new StringBuilder();
+          foreach (ListViewItem selected in itemsListView.SelectedItems) {
+            builder.AppendLine(selected.Text);
+          }
+          Clipboard.SetText(builder.ToString());
+        }
+      }
+    }
+
+    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        T item = itemsListView.SelectedItems[0].Tag as T;
+        if (item != null) {
+          IContentView view = MainFormManager.MainForm.ShowContent(item);
+          if (view != null) {
+            view.ReadOnly = ReadOnly;
+            view.Locked = Locked;
+          }
+        }
+      }
+    }
+
+    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (!Locked) {
+        List<T> items = new List<T>();
+        foreach (ListViewItem listViewItem in itemsListView.SelectedItems) {
+          T item = listViewItem.Tag as T;
+          if (item != null) items.Add(item);
+        }
+
+        if (items.Count > 0) {
+          DataObject data = new DataObject();
+          if (items.Count == 1) data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items[0]);
+          else data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, items);
+          if (Content.IsReadOnly || ReadOnly) {
+            DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+          } else {
+            DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
+              foreach (ListViewItem listViewItem in itemsListView.SelectedItems.Cast<ListViewItem>().ToArray()) {
+                if (listViewItem.Tag != null) Content.RemoveAt(listViewItem.Index);
+              }
+            }
+          }
+        }
+      }
+    }
+    protected virtual void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      validDragOperation = false;
+      if (!Content.IsReadOnly && !ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T)) {
+        validDragOperation = true;
+      } else if (!Content.IsReadOnly && !ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable)) {
+        validDragOperation = true;
+        IEnumerable items = (IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+        foreach (object item in items)
+          validDragOperation = validDragOperation && (item is T);
+      }
+    }
+    protected virtual void itemsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (validDragOperation) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+        ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
+
+        if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T) {
+          T item = (T)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+          if (listViewItem != null) Content.Insert(listViewItem.Index, e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+          else Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
+        } else if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable) {
+          IEnumerable<T> items = ((IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat)).Cast<T>();
+          if (e.Effect.HasFlag(DragDropEffects.Copy)) {
+            Cloner cloner = new Cloner();
+            items = items.Select(x => cloner.Clone(x));
+          }
+          foreach (T item in items) {
+            if (listViewItem != null) Content.Insert(listViewItem.Index, item);
+            else Content.Add(item);
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    protected virtual void addButton_Click(object sender, EventArgs e) {
+      T item = CreateItem();
+      if (item != null)
+        Content.Add(item);
+    }
+    protected virtual void moveUpButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        int index = itemsListView.SelectedIndices[0];
+        Content.Reverse(index - 1, 2);
+        itemsListView.Items[index].Selected = false;
+        itemsListView.Items[index - 1].Selected = true;
+      }
+    }
+    protected virtual void moveDownButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        int index = itemsListView.SelectedIndices[0];
+        Content.Reverse(index, 2);
+        itemsListView.Items[index].Selected = false;
+        itemsListView.Items[index + 1].Selected = true;
+      }
+    }
+    protected virtual void removeButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in itemsListView.SelectedItems)
+          Content.RemoveAt(item.Index);
+      }
+    }
+    #endregion
+
+    #region CheckBox Events
+    protected virtual void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (showDetailsCheckBox.Checked) {
+        splitContainer.Panel2Collapsed = false;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+        viewHost.Content = itemsListView.SelectedItems.Count == 1 ? (T)itemsListView.SelectedItems[0].Tag : null;
+      } else {
+        splitContainer.Panel2Collapsed = true;
+        viewHost.Content = null;
+      }
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded), sender, e);
+      else {
+        foreach (IndexedItem<T> item in e.Items)
+          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
+        AdjustListViewColumnSizes();
+      }
+    }
+    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved), sender, e);
+      else {
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (IndexedItem<T> item in e.Items)
+          listViewItems.Add(itemsListView.Items[item.Index]);
+        foreach (ListViewItem listViewItem in listViewItems)
+          RemoveListViewItem(listViewItem);
+        RebuildImageList();
+      }
+    }
+    protected virtual void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced), sender, e);
+      else {
+        int[] selected = new int[itemsListView.SelectedIndices.Count];
+        itemsListView.SelectedIndices.CopyTo(selected, 0);
+
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (IndexedItem<T> item in e.OldItems)
+          listViewItems.Add(itemsListView.Items[item.Index]);
+        foreach (ListViewItem listViewItem in listViewItems)
+          RemoveListViewItem(listViewItem);
+        RebuildImageList();
+
+        foreach (IndexedItem<T> item in e.Items)
+          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
+        AdjustListViewColumnSizes();
+
+        for (int i = 0; i < selected.Length; i++)
+          itemsListView.Items[selected[i]].Selected = true;
+      }
+    }
+    protected virtual void Content_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved), sender, e);
+      else {
+        foreach (IndexedItem<T> item in e.Items) {
+          ListViewItem listViewItem = itemsListView.Items[item.Index];
+          if (listViewItem.Tag != null)
+            itemListViewItemMapping[(T)listViewItem.Tag].Remove(listViewItem);
+          listViewItem.Tag = item.Value;
+          if (listViewItem.Tag != null)
+            itemListViewItemMapping[item.Value].Add(listViewItem);
+          UpdateListViewItemImage(listViewItem);
+          UpdateListViewItemText(listViewItem);
+        }
+      }
+    }
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset), sender, e);
+      else {
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (IndexedItem<T> item in e.OldItems)
+          listViewItems.Add(itemsListView.Items[item.Index]);
+        foreach (ListViewItem listViewItem in listViewItems)
+          RemoveListViewItem(listViewItem);
+        RebuildImageList();
+
+        foreach (IndexedItem<T> item in e.Items)
+          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+
+    #region Item Events
+    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
+      else {
+        T item = (T)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemImage(listViewItem);
+      }
+    }
+    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
+      else {
+        T item = (T)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemText(listViewItem);
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void AdjustListViewColumnSizes() {
+      if (itemsListView.Items.Count > 0) {
+        for (int i = 0; i < itemsListView.Columns.Count; i++)
+          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+    protected virtual void RebuildImageList() {
+      itemsListView.SmallImageList.Images.Clear();
+      foreach (ListViewItem listViewItem in itemsListView.Items) {
+        T item = listViewItem.Tag as T;
+        itemsListView.SmallImageList.Images.Add(item == null ? HeuristicLab.Common.Resources.VSImageLibrary.Nothing : item.ItemImage);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemSetView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemSetView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemSetView.Designer.cs	(revision 16770)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class ItemSetView<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.SuspendLayout();
+      // 
+      // ItemSetView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Name = "ItemSetView";
+      this.Size = new System.Drawing.Size(532, 383);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemSetView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemSetView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemSetView.cs	(revision 16770)
@@ -0,0 +1,67 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("ItemSet View")]
+  [Content(typeof(ItemSet<>), true)]
+  [Content(typeof(IItemSet<>), false)]
+  [Content(typeof(ReadOnlyItemSet<>), true)]
+  public partial class ItemSetView<T> : ItemCollectionView<T> where T : class, IItem {
+    protected bool draggedItemsAlreadyContained;
+
+    public new IItemSet<T> Content {
+      get { return (IItemSet<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ItemSetView() {
+      InitializeComponent();
+    }
+
+    protected override void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      base.itemsListView_DragEnter(sender, e);
+      draggedItemsAlreadyContained = false;
+      if (validDragOperation) {
+        if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T) {
+          draggedItemsAlreadyContained = Content.Contains((T)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat));
+        } else if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable) {
+          IEnumerable items = (IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+          foreach (object item in items)
+            draggedItemsAlreadyContained = draggedItemsAlreadyContained || Content.Contains((T)item);
+        }
+      }
+    }
+    protected override void itemsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (validDragOperation) {
+        if (((e.KeyState & 32) == 32) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Link;  // ALT key
+        else if (((e.KeyState & 4) == 4) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link) && !draggedItemsAlreadyContained) e.Effect = DragDropEffects.Link;
+      }
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemView.Designer.cs	(revision 16770)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class ItemView {
+    /// <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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ItemView.cs	(revision 16770)
@@ -0,0 +1,66 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// Base class for all visual representations.
+  /// </summary>
+  public partial class ItemView : AsynchronousContentView {
+    public new IItem Content {
+      get { return (IItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ViewBase"/> with the caption "View".
+    /// </summary>
+    public ItemView() {
+      InitializeComponent();
+    }
+
+    protected override void OnInitialized(EventArgs e) {
+      base.OnInitialized(e);
+
+      if (CountParentControls() > Properties.Settings.Default.MaximumNestedControls) {
+        //capture content, needed because it is set at a later time
+        NestingLevelErrorControl errorControl = new NestingLevelErrorControl(() => Content, this.GetType());
+        errorControl.Dock = DockStyle.Fill;
+
+        Controls.Clear();
+        Controls.Add(errorControl);
+      }
+    }
+
+    private int CountParentControls() {
+      int cnt = 0;
+      Control parent = Parent;
+      while (parent != null) {
+        parent = parent.Parent;
+        cnt++;
+      }
+      return cnt;
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/LogView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/LogView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/LogView.Designer.cs	(revision 16770)
@@ -0,0 +1,111 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class LogView {
+    /// <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() {
+      this.components = new System.ComponentModel.Container();
+      this.logTextBox = new System.Windows.Forms.TextBox();
+      this.logLabel = new System.Windows.Forms.Label();
+      this.clearButton = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // logTextBox
+      // 
+      this.logTextBox.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.logTextBox.Location = new System.Drawing.Point(0, 29);
+      this.logTextBox.Multiline = true;
+      this.logTextBox.Name = "logTextBox";
+      this.logTextBox.ReadOnly = true;
+      this.logTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+      this.logTextBox.Size = new System.Drawing.Size(430, 325);
+      this.logTextBox.TabIndex = 2;
+      this.logTextBox.WordWrap = false;
+      // 
+      // logLabel
+      // 
+      this.logLabel.AutoSize = true;
+      this.logLabel.Location = new System.Drawing.Point(3, 5);
+      this.logLabel.Name = "logLabel";
+      this.logLabel.Size = new System.Drawing.Size(28, 13);
+      this.logLabel.TabIndex = 1;
+      this.logLabel.Text = "&Log:";
+      // 
+      // clearButton
+      // 
+      this.clearButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.clearButton.Location = new System.Drawing.Point(355, 0);
+      this.clearButton.Name = "clearButton";
+      this.clearButton.Size = new System.Drawing.Size(75, 23);
+      this.clearButton.TabIndex = 0;
+      this.clearButton.Text = "&Clear Log";
+      this.toolTip.SetToolTip(this.clearButton, "Clear All Log Messages");
+      this.clearButton.UseVisualStyleBackColor = true;
+      this.clearButton.Click += new System.EventHandler(this.clearButton_Click);
+      // 
+      // LogView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.clearButton);
+      this.Controls.Add(this.logTextBox);
+      this.Controls.Add(this.logLabel);
+      this.Name = "LogView";
+      this.Size = new System.Drawing.Size(430, 354);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox logTextBox;
+    protected System.Windows.Forms.Label logLabel;
+    protected System.Windows.Forms.Button clearButton;
+    protected System.Windows.Forms.ToolTip toolTip;
+
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/LogView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/LogView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/LogView.cs	(revision 16770)
@@ -0,0 +1,108 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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 HeuristicLab.Common;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// Base class for editors of engines.
+  /// </summary>
+  [View("Log View")]
+  [Content(typeof(Log), true)]
+  [Content(typeof(ILog), false)]
+  public partial class LogView : ItemView {
+    /// <summary>
+    /// Gets or sets the current engine.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="EditorBase"/>.</remarks>
+    public new ILog Content {
+      get { return (ILog)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="EngineBaseEditor"/>.
+    /// </summary>
+    public LogView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Removes the event handlers from the underlying <see cref="IEngine"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void DeregisterContentEvents() {
+      Content.Cleared -= new EventHandler(Content_Cleared);
+      Content.MessageAdded -= new EventHandler<EventArgs<string>>(Content_MessageAdded);
+      base.DeregisterContentEvents();
+    }
+
+    /// <summary>
+    /// Adds event handlers to the underlying <see cref="IEngine"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Cleared += new EventHandler(Content_Cleared);
+      Content.MessageAdded += new EventHandler<EventArgs<string>>(Content_MessageAdded);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="EditorBase.UpdateControls"/> of base class <see cref="EditorBase"/>.</remarks>
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      logTextBox.Clear();
+      if (Content == null) {
+        logTextBox.Enabled = false;
+      } else {
+        logTextBox.Enabled = true;
+        if (Content.Messages.FirstOrDefault() != null)
+          logTextBox.Text = string.Join(Environment.NewLine, Content.Messages.ToArray());
+      }
+    }
+
+    protected virtual void Content_MessageAdded(object sender, EventArgs<string> e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<EventArgs<string>>(Content_MessageAdded), sender, e);
+      else {
+        logTextBox.Text = string.Join(Environment.NewLine, Content.Messages.ToArray());
+        logTextBox.SelectionStart = logTextBox.Text.Length;
+        logTextBox.ScrollToCaret();
+      }
+    }
+
+    protected virtual void Content_Cleared(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Cleared), sender, e);
+      else
+        logTextBox.Clear();
+    }
+
+    protected virtual void clearButton_Click(object sender, EventArgs e) {
+      Content.Clear();
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/MovieView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/MovieView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/MovieView.Designer.cs	(revision 16770)
@@ -0,0 +1,270 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.indexLabel = new System.Windows.Forms.Label();
+      this.delayComboBox = new System.Windows.Forms.ComboBox();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.nextButton = new System.Windows.Forms.Button();
+      this.lastButton = new System.Windows.Forms.Button();
+      this.playButton = new System.Windows.Forms.Button();
+      this.previousButton = new System.Windows.Forms.Button();
+      this.firstButton = new System.Windows.Forms.Button();
+      this.maximumLabel = 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.indexLabel);
+      this.itemsGroupBox.Controls.Add(this.delayComboBox);
+      this.itemsGroupBox.Controls.Add(this.stopButton);
+      this.itemsGroupBox.Controls.Add(this.nextButton);
+      this.itemsGroupBox.Controls.Add(this.lastButton);
+      this.itemsGroupBox.Controls.Add(this.playButton);
+      this.itemsGroupBox.Controls.Add(this.previousButton);
+      this.itemsGroupBox.Controls.Add(this.firstButton);
+      this.itemsGroupBox.Controls.Add(this.maximumLabel);
+      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";
+      // 
+      // 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 = 9;
+      this.indexLabel.Text = "0";
+      this.indexLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+      // 
+      // delayComboBox
+      // 
+      this.delayComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.delayComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.delayComboBox.FormattingEnabled = true;
+      this.delayComboBox.Location = new System.Drawing.Point(472, 355);
+      this.delayComboBox.Name = "delayComboBox";
+      this.delayComboBox.Size = new System.Drawing.Size(54, 21);
+      this.delayComboBox.TabIndex = 11;
+      this.toolTip.SetToolTip(this.delayComboBox, "Visualization Delay");
+      this.delayComboBox.SelectedIndexChanged += new System.EventHandler(this.delayComboBox_SelectedIndexChanged);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
+      this.stopButton.Location = new System.Drawing.Point(36, 355);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 7;
+      this.toolTip.SetToolTip(this.stopButton, "Stop");
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // nextButton
+      // 
+      this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.nextButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.MoveNext;
+      this.nextButton.Location = new System.Drawing.Point(472, 325);
+      this.nextButton.Name = "nextButton";
+      this.nextButton.Size = new System.Drawing.Size(24, 24);
+      this.nextButton.TabIndex = 4;
+      this.nextButton.UseVisualStyleBackColor = true;
+      this.nextButton.Click += new System.EventHandler(this.nextButton_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.VSImageLibrary.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 = 5;
+      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.VSImageLibrary.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 = 6;
+      this.toolTip.SetToolTip(this.playButton, "Play");
+      this.playButton.UseVisualStyleBackColor = true;
+      this.playButton.Click += new System.EventHandler(this.playButton_Click);
+      // 
+      // previousButton
+      // 
+      this.previousButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.previousButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.MovePrevious;
+      this.previousButton.Location = new System.Drawing.Point(36, 325);
+      this.previousButton.Name = "previousButton";
+      this.previousButton.Size = new System.Drawing.Size(24, 24);
+      this.previousButton.TabIndex = 2;
+      this.previousButton.UseVisualStyleBackColor = true;
+      this.previousButton.Click += new System.EventHandler(this.previousButton_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.VSImageLibrary.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(351, 364);
+      this.maximumLabel.Name = "maximumLabel";
+      this.maximumLabel.Size = new System.Drawing.Size(108, 13);
+      this.maximumLabel.TabIndex = 10;
+      this.maximumLabel.Text = "10";
+      this.maximumLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+      // 
+      // 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(73, 364);
+      this.minimumLabel.Name = "minimumLabel";
+      this.minimumLabel.Size = new System.Drawing.Size(38, 13);
+      this.minimumLabel.TabIndex = 8;
+      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(66, 316);
+      this.trackBar.Name = "trackBar";
+      this.trackBar.Size = new System.Drawing.Size(400, 45);
+      this.trackBar.TabIndex = 3;
+      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;
+    protected Button nextButton;
+    protected Button previousButton;
+    protected ComboBox delayComboBox;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/MovieView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/MovieView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/MovieView.cs	(revision 16770)
@@ -0,0 +1,221 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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 {
+    #region Delay
+    protected class Delay {
+      public string Text { get; private set; }
+      public int Milliseconds { get; private set; }
+
+      public Delay(string text, int milliseconds) {
+        Text = text;
+        Milliseconds = milliseconds;
+      }
+
+      public override string ToString() {
+        return Text;
+      }
+    }
+    #endregion
+
+    protected int delay;
+
+    public new IItemCollection<T> Content {
+      get { return (IItemCollection<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MovieView() {
+      InitializeComponent();
+
+      delayComboBox.Items.Add(new Delay("5s", 5000));
+      delayComboBox.Items.Add(new Delay("2s", 2000));
+      delayComboBox.Items.Add(new Delay("1s", 1000));
+      delayComboBox.Items.Add(new Delay("0.5s", 500));
+      delayComboBox.Items.Add(new Delay("0.1s", 100));
+      delayComboBox.Items.Add(new Delay("0.05s", 50));
+      delayComboBox.Items.Add(new Delay("0.01s", 10));
+      delayComboBox.SelectedIndex = 4;
+      delay = 100;
+    }
+
+    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) && (trackBar.Value != trackBar.Minimum) && (!backgroundWorker.IsBusy);
+      previousButton.Enabled = (Content != null) && (Content.Count > 0) && (trackBar.Value != trackBar.Minimum) && (!backgroundWorker.IsBusy);
+      trackBar.Enabled = (Content != null) && (Content.Count > 0) && (!backgroundWorker.IsBusy);
+      nextButton.Enabled = (Content != null) && (Content.Count > 0) && (trackBar.Value != trackBar.Maximum) && (!backgroundWorker.IsBusy);
+      lastButton.Enabled = (Content != null) && (Content.Count > 0) && (trackBar.Value != trackBar.Maximum) && (!backgroundWorker.IsBusy);
+      playButton.Enabled = (Content != null) && (Content.Count > 0) && (!backgroundWorker.IsBusy);
+      stopButton.Enabled = (Content != null) && (backgroundWorker.IsBusy);
+      delayComboBox.Enabled = (Content != null) && (Content.Count > 0);
+    }
+
+    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) {
+      viewHost.Content = Content == null ? null : Content.ElementAtOrDefault(trackBar.Value);
+      indexLabel.Text = trackBar.Value.ToString();
+      SetEnabledStateOfControls();
+    }
+    protected virtual void firstButton_Click(object sender, EventArgs e) {
+      if (trackBar.Value != trackBar.Minimum) trackBar.Value = trackBar.Minimum;
+    }
+    protected virtual void previousButton_Click(object sender, EventArgs e) {
+      if (trackBar.Value != trackBar.Minimum) trackBar.Value--;
+    }
+    protected virtual void nextButton_Click(object sender, EventArgs e) {
+      if (trackBar.Value != trackBar.Maximum) trackBar.Value++;
+    }
+    protected virtual void lastButton_Click(object sender, EventArgs e) {
+      if (trackBar.Value != trackBar.Maximum) trackBar.Value = trackBar.Maximum;
+    }
+    protected virtual void playButton_Click(object sender, EventArgs e) {
+      firstButton.Enabled = false;
+      previousButton.Enabled = false;
+      trackBar.Enabled = false;
+      nextButton.Enabled = false;
+      lastButton.Enabled = false;
+      playButton.Enabled = false;
+      stopButton.Enabled = true;
+      backgroundWorker.RunWorkerAsync();
+    }
+    protected virtual void stopButton_Click(object sender, EventArgs e) {
+      stopButton.Enabled = false;
+      backgroundWorker.CancelAsync();
+    }
+    protected virtual void delayComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      Delay selected = delayComboBox.SelectedItem as Delay;
+      if (selected != null) delay = selected.Milliseconds;
+    }
+    #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(delay);
+      }
+    }
+    protected virtual void backgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) {
+      firstButton.Enabled = true;
+      previousButton.Enabled = true;
+      trackBar.Enabled = true;
+      nextButton.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: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemCollectionView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemCollectionView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemCollectionView.Designer.cs	(revision 16770)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class NamedItemCollectionView<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.SuspendLayout();
+      // 
+      // NamedItemCollectionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Name = "NamedItemCollectionView";
+      this.Size = new System.Drawing.Size(532, 383);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemCollectionView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemCollectionView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemCollectionView.cs	(revision 16770)
@@ -0,0 +1,132 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("NamedItemCollection View")]
+  [Content(typeof(NamedItemCollection<>), true)]
+  public partial class NamedItemCollectionView<T> : ItemCollectionView<T> where T : class, INamedItem {
+    public new IKeyedItemCollection<string, T> Content {
+      get { return (IKeyedItemCollection<string, T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public NamedItemCollectionView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemsReplaced -= new CollectionItemsChangedEventHandler<T>(Content_ItemsReplaced);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsReplaced += new CollectionItemsChangedEventHandler<T>(Content_ItemsReplaced);
+    }
+
+    protected override void OnContentChanged() {
+      string selectedName = null;
+      if ((itemsListView.SelectedItems.Count == 1) && (itemsListView.SelectedItems[0].Tag != null &&
+        itemsListView.SelectedItems[0].Tag is T))
+        selectedName = ((T)itemsListView.SelectedItems[0].Tag).Name;
+      base.OnContentChanged();
+      if (selectedName != null) {
+        foreach (ListViewItem item in itemsListView.Items) {
+          if ((item.Tag != null) && (((T)item.Tag).Name.Equals(selectedName)))
+            item.Selected = true;
+        }
+      }
+    }
+
+    protected override T CreateItem() {
+      T item = base.CreateItem();
+      if (item != null) {
+        item.Name = GetUniqueName(item.Name);
+      }
+      return item;
+    }
+    protected override ListViewItem CreateListViewItem(T item) {
+      ListViewItem listViewItem = base.CreateListViewItem(item);
+      if ((item != null) && !string.IsNullOrEmpty(item.Description)) {
+        listViewItem.ToolTipText = item.ItemName + ": " + item.Description;
+      }
+      return listViewItem;
+    }
+    protected override void UpdateListViewItemText(ListViewItem listViewItem) {
+      base.UpdateListViewItemText(listViewItem);
+      T item = listViewItem.Tag as T;
+      if ((item != null) && !string.IsNullOrEmpty(item.Description)) {
+        listViewItem.ToolTipText = item.ItemName + ": " + item.Description;
+      }
+    }
+
+    #region ListView Events
+    protected override void itemsListView_DragEnter(object sender, DragEventArgs e) {
+      base.itemsListView_DragEnter(sender, e);
+      if (validDragOperation) {
+        if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is T) {
+          validDragOperation = validDragOperation && !Content.ContainsKey(((T)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat)).Name);
+        } else if (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IEnumerable) {
+          IEnumerable<T> items = ((IEnumerable)e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat)).Cast<T>();
+          foreach (T item in items)
+            validDragOperation = validDragOperation && !Content.ContainsKey(item.Name);
+        }
+      }
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<T> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<T>(Content_ItemsReplaced), sender, e);
+      else {
+        foreach (T item in e.Items) {
+          foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+            UpdateListViewItemText(listViewItem);
+        }
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual string GetUniqueName(string originalName) {
+      if (!Content.ContainsKey(originalName))
+        return originalName;
+      else {
+        string name = null;
+        int index = 0;
+        do {
+          index++;
+          name = originalName + index.ToString();
+        } while (Content.ContainsKey(name));
+        return name;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemView.Designer.cs	(revision 16770)
@@ -0,0 +1,116 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class NamedItemView {
+    /// <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() {
+      this.components = new System.ComponentModel.Container();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.infoLabel = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(3, 3);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 0;
+      this.nameLabel.Text = "&Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Location = new System.Drawing.Point(58, 0);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(268, 20);
+      this.nameTextBox.TabIndex = 1;
+      this.nameTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.nameTextBox_KeyDown);
+      this.nameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.nameTextBox_Validating);
+      this.nameTextBox.Validated += new System.EventHandler(this.nameTextBox_Validated);
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+      this.errorProvider.ContainerControl = this;
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Information;
+      this.infoLabel.Location = new System.Drawing.Point(332, 3);
+      this.infoLabel.Name = "infoLabel";
+      this.infoLabel.Size = new System.Drawing.Size(16, 16);
+      this.infoLabel.TabIndex = 2;
+      this.toolTip.SetToolTip(this.infoLabel, "Double-click to open description editor.");
+      this.infoLabel.DoubleClick += new System.EventHandler(this.infoLabel_DoubleClick);
+      // 
+      // NamedItemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.infoLabel);
+      this.Controls.Add(this.nameTextBox);
+      this.Controls.Add(this.nameLabel);
+      this.Name = "NamedItemView";
+      this.Size = new System.Drawing.Size(351, 28);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox nameTextBox;
+    protected System.Windows.Forms.Label nameLabel;
+    protected System.Windows.Forms.ErrorProvider errorProvider;
+    protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.Label infoLabel;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NamedItemView.cs	(revision 16770)
@@ -0,0 +1,135 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.ComponentModel;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("NamedItem View")]
+  [Content(typeof(NamedItem), false)]
+  [Content(typeof(INamedItem), false)]
+  public partial class NamedItemView : ItemView {
+    private const string infoLabelToolTipSuffix = "Double-click to open description editor.";
+
+    public new INamedItem Content {
+      get { return (INamedItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public NamedItemView() {
+      InitializeComponent();
+      errorProvider.SetIconAlignment(nameTextBox, ErrorIconAlignment.MiddleLeft);
+      errorProvider.SetIconPadding(nameTextBox, 2);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.NameChanged -= new EventHandler(Content_NameChanged);
+      Content.DescriptionChanged -= new EventHandler(Content_DescriptionChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.NameChanged += new EventHandler(Content_NameChanged);
+      Content.DescriptionChanged += new EventHandler(Content_DescriptionChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        nameTextBox.Text = string.Empty;
+        toolTip.SetToolTip(infoLabel, string.Empty);
+        if (ViewAttribute.HasViewAttribute(this.GetType()))
+          this.Caption = ViewAttribute.GetViewName(this.GetType());
+        else
+          this.Caption = "NamedItem View";
+      } else {
+        nameTextBox.Text = Content.Name;
+        toolTip.SetToolTip(infoLabel, string.IsNullOrEmpty(Content.Description) ? infoLabelToolTipSuffix : Content.Description + Environment.NewLine + Environment.NewLine + infoLabelToolTipSuffix);
+        Caption = Content.Name;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) {
+        nameTextBox.Enabled = false;
+        infoLabel.Enabled = false;
+      } else {
+        nameTextBox.Enabled = true;
+        nameTextBox.ReadOnly = ReadOnly || !Content.CanChangeName;
+        infoLabel.Enabled = true;
+      }
+    }
+
+    protected virtual void Content_NameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_NameChanged), sender, e);
+      else {
+        nameTextBox.Text = Content.Name;
+        Caption = Content.Name;
+      }
+    }
+    protected virtual void Content_DescriptionChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_DescriptionChanged), sender, e);
+      else {
+        toolTip.SetToolTip(infoLabel, string.IsNullOrEmpty(Content.Description) ? infoLabelToolTipSuffix : Content.Description + Environment.NewLine + Environment.NewLine + infoLabelToolTipSuffix);
+      }
+    }
+
+    protected virtual void nameTextBox_Validating(object sender, CancelEventArgs e) {
+      if ((Content != null) && (Content.CanChangeName)) {
+        if (string.IsNullOrEmpty(nameTextBox.Text)) {
+          e.Cancel = true;
+          errorProvider.SetError(nameTextBox, "Name cannot be empty");
+          nameTextBox.SelectAll();
+          return;
+        }
+        Content.Name = nameTextBox.Text;
+        // check if variable name was set successfully
+        if (!Content.Name.Equals(nameTextBox.Text)) {
+          e.Cancel = true;
+          errorProvider.SetError(nameTextBox, "Invalid Name");
+          nameTextBox.SelectAll();
+        }
+      }
+    }
+    protected virtual void nameTextBox_Validated(object sender, EventArgs e) {
+      errorProvider.SetError(nameTextBox, string.Empty);
+    }
+    protected virtual void nameTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if ((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return))
+        nameLabel.Focus();  // set focus on label to validate data
+      if (e.KeyCode == Keys.Escape) {
+        nameTextBox.Text = Content.Name;
+        nameLabel.Focus();  // set focus on label to validate data
+      }
+    }
+    protected virtual void infoLabel_DoubleClick(object sender, EventArgs e) {
+      using (TextDialog dialog = new TextDialog("Description of " + Content.Name, Content.Description, ReadOnly || !Content.CanChangeDescription)) {
+        if (dialog.ShowDialog(this) == DialogResult.OK)
+          Content.Description = dialog.Content;
+      }
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NestingLevelErrorControl.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NestingLevelErrorControl.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NestingLevelErrorControl.Designer.cs	(revision 16770)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class NestingLevelErrorControl {
+    /// <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 && (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() {
+      this.infoLabel = new System.Windows.Forms.Label();
+      this.showButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.AutoSize = true;
+      this.infoLabel.Location = new System.Drawing.Point(3, 3);
+      this.infoLabel.Name = "infoLabel";
+      this.infoLabel.Size = new System.Drawing.Size(382, 13);
+      this.infoLabel.TabIndex = 0;
+      this.infoLabel.Text = "Please click the button below to open a new tab for displaying the desired view.";
+      this.infoLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+      // 
+      // showButton
+      // 
+      this.showButton.Location = new System.Drawing.Point(7, 21);
+      this.showButton.Name = "showButton";
+      this.showButton.Size = new System.Drawing.Size(132, 23);
+      this.showButton.TabIndex = 1;
+      this.showButton.Text = "Show view in new tab";
+      this.showButton.UseVisualStyleBackColor = true;
+      this.showButton.Click += new System.EventHandler(this.showButton_Click);
+      // 
+      // NestingLevelErrorControl
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.showButton);
+      this.Controls.Add(this.infoLabel);
+      this.Name = "NestingLevelErrorControl";
+      this.Size = new System.Drawing.Size(387, 50);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label infoLabel;
+    private System.Windows.Forms.Button showButton;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NestingLevelErrorControl.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NestingLevelErrorControl.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/NestingLevelErrorControl.cs	(revision 16770)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  public partial class NestingLevelErrorControl : UserControl {
+    private Func<IContent> Content { get; set; }
+    private Type ViewType { get; set; }
+
+    public NestingLevelErrorControl(Func<IContent> content, Type viewType)
+      : base() {
+      InitializeComponent();
+      Content = content;
+      ViewType = viewType;
+    }
+
+    private void showButton_Click(object sender, System.EventArgs e) {
+      if (Content != null && ViewType != null) {
+        MainFormManager.MainForm.ShowContent(Content(), ViewType);
+      }
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorCollectionView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorCollectionView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorCollectionView.Designer.cs	(revision 16770)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class OperatorCollectionView {
+    /// <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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorCollectionView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorCollectionView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorCollectionView.cs	(revision 16770)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  [View("OperatorCollection View")]
+  [Content(typeof(OperatorCollection), true)]
+  [Content(typeof(IItemCollection<IOperator>), false)]
+  public partial class OperatorCollectionView : ItemCollectionView<IOperator> {
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public OperatorCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Operators";
+    }
+
+    protected override IOperator CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Operator";
+        typeSelectorDialog.TypeSelector.Caption = "Available Operators";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IOperator), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (IOperator)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorGraphView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorGraphView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorGraphView.Designer.cs	(revision 16770)
@@ -0,0 +1,158 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class OperatorGraphView {
+    /// <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() {
+      this.components = new System.ComponentModel.Container();
+      this.operatorsContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.initialOperatorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.operatorsView = new HeuristicLab.Core.Views.OperatorSetView();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.graphGroupBox = new System.Windows.Forms.GroupBox();
+      this.operatorTreeView = new HeuristicLab.Core.Views.OperatorTreeView();
+      this.operatorsContextMenuStrip.SuspendLayout();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.graphGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // operatorsContextMenuStrip
+      // 
+      this.operatorsContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.initialOperatorToolStripMenuItem});
+      this.operatorsContextMenuStrip.Name = "operatorsContextMenuStrip";
+      this.operatorsContextMenuStrip.Size = new System.Drawing.Size(154, 26);
+      this.operatorsContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.operatorsContextMenuStrip_Opening);
+      // 
+      // initialOperatorToolStripMenuItem
+      // 
+      this.initialOperatorToolStripMenuItem.CheckOnClick = true;
+      this.initialOperatorToolStripMenuItem.Name = "initialOperatorToolStripMenuItem";
+      this.initialOperatorToolStripMenuItem.Size = new System.Drawing.Size(153, 22);
+      this.initialOperatorToolStripMenuItem.Text = "&Initial Operator";
+      this.initialOperatorToolStripMenuItem.ToolTipText = "Set as initial operator";
+      this.initialOperatorToolStripMenuItem.Click += new System.EventHandler(this.initialOperatorToolStripMenuItem_Click);
+      // 
+      // operatorsView
+      // 
+      this.operatorsView.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.operatorsView.Content = null;
+      this.operatorsView.Location = new System.Drawing.Point(3, 3);
+      this.operatorsView.Name = "operatorsView";
+      this.operatorsView.Size = new System.Drawing.Size(602, 309);
+      this.operatorsView.TabIndex = 0;
+      this.operatorsView.Load += new System.EventHandler(this.operatorsView_Load);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.operatorsView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.graphGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(608, 533);
+      this.splitContainer.SplitterDistance = 315;
+      this.splitContainer.TabIndex = 3;
+      // 
+      // graphGroupBox
+      // 
+      this.graphGroupBox.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.graphGroupBox.Controls.Add(this.operatorTreeView);
+      this.graphGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.graphGroupBox.Name = "graphGroupBox";
+      this.graphGroupBox.Size = new System.Drawing.Size(602, 208);
+      this.graphGroupBox.TabIndex = 0;
+      this.graphGroupBox.TabStop = false;
+      this.graphGroupBox.Text = "Operator Graph";
+      // 
+      // operatorTreeView
+      // 
+      this.operatorTreeView.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.operatorTreeView.Content = null;
+      this.operatorTreeView.Location = new System.Drawing.Point(6, 19);
+      this.operatorTreeView.Name = "operatorTreeView";
+      this.operatorTreeView.Size = new System.Drawing.Size(590, 183);
+      this.operatorTreeView.TabIndex = 0;
+      this.operatorTreeView.SelectedOperatorChanged += new System.EventHandler(this.operatorTreeView_SelectedOperatorChanged);
+      // 
+      // OperatorGraphView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "OperatorGraphView";
+      this.Size = new System.Drawing.Size(608, 533);
+      this.operatorsContextMenuStrip.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.graphGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.ContextMenuStrip operatorsContextMenuStrip;
+    protected System.Windows.Forms.ToolStripMenuItem initialOperatorToolStripMenuItem;
+    protected OperatorSetView operatorsView;
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.GroupBox graphGroupBox;
+    private OperatorTreeView operatorTreeView;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorGraphView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorGraphView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorGraphView.cs	(revision 16770)
@@ -0,0 +1,142 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// The visual representation of an <see cref="OperatorGraph"/>.
+  /// </summary>
+  [View("OperatorGraph View (Tree)")]
+  [Content(typeof(OperatorGraph), false)]
+  public partial class OperatorGraphView : ItemView {
+    /// <summary>
+    /// Gets or sets the operator graph to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new OperatorGraph Content {
+      get { return (OperatorGraph)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorGraphView"/> with caption "Operator Graph".
+    /// </summary>
+    public OperatorGraphView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="IOperatorGraph"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void DeregisterContentEvents() {
+      Content.InitialOperatorChanged -= new EventHandler(Content_InitialOperatorChanged);
+      base.DeregisterContentEvents();
+    }
+
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IOperatorGraph"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.InitialOperatorChanged += new EventHandler(Content_InitialOperatorChanged);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      operatorsView.Content = null;
+      operatorTreeView.Content = null;
+      if (Content != null) {
+        operatorsView.Content = Content.Operators;
+        MarkInitialOperator();
+        operatorTreeView.Content = Content.InitialOperator;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      operatorsView.Enabled = Content != null;
+      operatorTreeView.Enabled = Content != null;
+      operatorsContextMenuStrip.Enabled = Content != null && !ReadOnly;
+    }
+
+    protected virtual void MarkInitialOperator() {
+      foreach (ListViewItem item in operatorsView.ItemsListView.Items) {
+        if ((Content.InitialOperator != null) && (((IOperator)item.Tag) == Content.InitialOperator))
+          item.Font = new Font(operatorsView.ItemsListView.Font, FontStyle.Bold);
+        else
+          item.Font = operatorsView.ItemsListView.Font;
+      }
+    }
+
+    #region Operator Tree View Events
+    protected virtual void operatorTreeView_SelectedOperatorChanged(object sender, EventArgs e) {
+      foreach (ListViewItem item in operatorsView.ItemsListView.Items)
+        item.Selected = item.Tag == operatorTreeView.SelectedOperator;
+    }
+    #endregion
+
+    #region Context Menu Events
+    protected virtual void operatorsView_Load(object sender, EventArgs e) {
+      operatorsView.ItemsListView.ContextMenuStrip = operatorsContextMenuStrip;
+    }
+    protected virtual void operatorsContextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      initialOperatorToolStripMenuItem.Enabled = false;
+      initialOperatorToolStripMenuItem.Checked = false;
+      if (operatorsView.ItemsListView.SelectedItems.Count == 1) {
+        IOperator op = (IOperator)operatorsView.ItemsListView.SelectedItems[0].Tag;
+        initialOperatorToolStripMenuItem.Enabled = true;
+        initialOperatorToolStripMenuItem.Tag = op;
+        if (op == Content.InitialOperator)
+          initialOperatorToolStripMenuItem.Checked = true;
+      }
+    }
+    protected virtual void initialOperatorToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (initialOperatorToolStripMenuItem.Checked)
+        Content.InitialOperator = (IOperator)initialOperatorToolStripMenuItem.Tag;
+      else
+        Content.InitialOperator = null;
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_InitialOperatorChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_InitialOperatorChanged), sender, e);
+      else {
+        MarkInitialOperator();
+        operatorTreeView.Content = Content.InitialOperator;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorListView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorListView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorListView.Designer.cs	(revision 16770)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class OperatorListView {
+    /// <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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorListView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorListView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorListView.cs	(revision 16770)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  [View("OperatorList View")]
+  [Content(typeof(OperatorList), true)]
+  [Content(typeof(IItemList<IOperator>), false)]
+  public partial class OperatorListView : ItemListView<IOperator> {
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public OperatorListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Operators";
+    }
+
+    protected override IOperator CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Operator";
+        typeSelectorDialog.TypeSelector.Caption = "Available Operators";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IOperator), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (IOperator)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorSetView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorSetView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorSetView.Designer.cs	(revision 16770)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class OperatorSetView {
+    /// <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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorSetView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorSetView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorSetView.cs	(revision 16770)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  [View("OperatorSet View")]
+  [Content(typeof(OperatorSet), true)]
+  [Content(typeof(IItemSet<IOperator>), false)]
+  public partial class OperatorSetView : ItemSetView<IOperator> {
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public OperatorSetView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Operators";
+    }
+
+    protected override IOperator CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Operator";
+        typeSelectorDialog.TypeSelector.Caption = "Available Operators";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IOperator), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (IOperator)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorTreeView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorTreeView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorTreeView.Designer.cs	(revision 16770)
@@ -0,0 +1,120 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class OperatorTreeView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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() {
+      this.components = new System.ComponentModel.Container();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.graphTreeView = new System.Windows.Forms.TreeView();
+      this.graphContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.breakpointToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.graphContextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // graphTreeView
+      // 
+      this.graphTreeView.AllowDrop = true;
+      this.graphTreeView.ContextMenuStrip = this.graphContextMenuStrip;
+      this.graphTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.graphTreeView.HideSelection = false;
+      this.graphTreeView.ImageIndex = 0;
+      this.graphTreeView.ImageList = this.imageList;
+      this.graphTreeView.Location = new System.Drawing.Point(0, 0);
+      this.graphTreeView.Name = "graphTreeView";
+      this.graphTreeView.SelectedImageIndex = 0;
+      this.graphTreeView.ShowNodeToolTips = true;
+      this.graphTreeView.Size = new System.Drawing.Size(475, 291);
+      this.graphTreeView.TabIndex = 0;
+      this.graphTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.graphTreeView_BeforeExpand);
+      this.graphTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.graphTreeView_DragDrop);
+      this.graphTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.graphTreeView_AfterSelect);
+      this.graphTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.graphTreeView_MouseDown);
+      this.graphTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.graphTreeView_DragEnterOver);
+      this.graphTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.graphTreeView_KeyDown);
+      this.graphTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.graphTreeView_ItemDrag);
+      this.graphTreeView.DragOver += new System.Windows.Forms.DragEventHandler(this.graphTreeView_DragEnterOver);
+      // 
+      // graphContextMenuStrip
+      // 
+      this.graphContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.breakpointToolStripMenuItem,
+            this.viewToolStripMenuItem});
+      this.graphContextMenuStrip.Name = "graphContextMenuStrip";
+      this.graphContextMenuStrip.Size = new System.Drawing.Size(132, 48);
+      this.graphContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.graphContextMenuStrip_Opening);
+      // 
+      // breakpointToolStripMenuItem
+      // 
+      this.breakpointToolStripMenuItem.CheckOnClick = true;
+      this.breakpointToolStripMenuItem.Name = "breakpointToolStripMenuItem";
+      this.breakpointToolStripMenuItem.Size = new System.Drawing.Size(131, 22);
+      this.breakpointToolStripMenuItem.Text = "&Breakpoint";
+      this.breakpointToolStripMenuItem.ToolTipText = "Halt engine execution after executing the operator";
+      this.breakpointToolStripMenuItem.Click += new System.EventHandler(this.breakpointToolStripMenuItem_Click);
+      // 
+      // viewToolStripMenuItem
+      // 
+      this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(131, 22);
+      this.viewToolStripMenuItem.Text = "&View...";
+      this.viewToolStripMenuItem.ToolTipText = "View operator";
+      this.viewToolStripMenuItem.Click += new System.EventHandler(this.viewToolStripMenuItem_Click);
+      // 
+      // OperatorTreeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.graphTreeView);
+      this.Name = "OperatorTreeView";
+      this.Size = new System.Drawing.Size(475, 291);
+      this.graphContextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TreeView graphTreeView;
+    private System.Windows.Forms.ContextMenuStrip graphContextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem breakpointToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+    private System.Windows.Forms.ImageList imageList;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorTreeView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorTreeView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorTreeView.cs	(revision 16770)
@@ -0,0 +1,456 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("Operator View (Successors)")]
+  [Content(typeof(IOperator), false)]
+  public sealed partial class OperatorTreeView : ItemView {
+    private Dictionary<IValueParameter, List<TreeNode>> opParamNodeTable;
+    private Dictionary<IOperator, List<TreeNode>> operatorNodeTable;
+    private Dictionary<IKeyedItemCollection<string, IParameter>, IOperator> parametersOperatorTable;
+
+    public new IOperator Content {
+      get { return (IOperator)base.Content; }
+      set { base.Content = value; }
+    }
+
+    private IOperator selectedOperator;
+    public IOperator SelectedOperator {
+      get { return selectedOperator; }
+      private set {
+        if (value != selectedOperator) {
+          selectedOperator = value;
+          OnSelectedOperatorChanged();
+        }
+      }
+    }
+
+    public OperatorTreeView() {
+      InitializeComponent();
+      graphTreeView.Sorted = true;
+      opParamNodeTable = new Dictionary<IValueParameter, List<TreeNode>>();
+      operatorNodeTable = new Dictionary<IOperator, List<TreeNode>>();
+      parametersOperatorTable = new Dictionary<IKeyedItemCollection<string, IParameter>, IOperator>();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (graphTreeView.Nodes.Count > 0) {
+          RemoveTreeNode(graphTreeView.Nodes[0]);
+          graphTreeView.Nodes.Clear();
+        }
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (graphTreeView.Nodes.Count > 0)
+        RemoveTreeNode(graphTreeView.Nodes[0]);
+      if (Content != null) {
+        TreeNode root = new TreeNode();
+        FillTreeNode(root, Content);
+        graphTreeView.Nodes.Add(root);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      graphTreeView.Enabled = Content != null;
+    }
+
+    public event EventHandler SelectedOperatorChanged;
+    private void OnSelectedOperatorChanged() {
+      if (SelectedOperatorChanged != null)
+        SelectedOperatorChanged(this, EventArgs.Empty);
+    }
+
+    #region TreeNode Management
+    private TreeNode CreateTreeNode(IValueParameter opParam) {
+      TreeNode node = new TreeNode();
+      node.Text = opParam.Name + ": ";
+      SetOperatorParameterTag(node, opParam);
+
+      if (!opParamNodeTable.ContainsKey(opParam)) {
+        opParamNodeTable.Add(opParam, new List<TreeNode>());
+        opParam.ValueChanged += new EventHandler(opParam_ValueChanged);
+      }
+      opParamNodeTable[opParam].Add(node);
+
+      FillTreeNode(node, (IOperator)opParam.Value);
+      return node;
+    }
+    private void FillTreeNode(TreeNode node, IOperator op) {
+      if (op == null) {
+        node.Text += "-";
+        node.ToolTipText = "";
+        graphTreeView.ImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Nothing);
+        node.ImageIndex = graphTreeView.ImageList.Images.Count - 1;
+        node.SelectedImageIndex = node.ImageIndex;
+        node.ForeColor = graphTreeView.ForeColor;
+      } else {
+        node.Text += op.Name;
+        node.ToolTipText = op.ItemName + ": " + op.ItemDescription;
+        graphTreeView.ImageList.Images.Add(op.ItemImage);
+        node.ImageIndex = graphTreeView.ImageList.Images.Count - 1;
+        node.SelectedImageIndex = node.ImageIndex;
+        SetOperatorTag(node, op);
+
+        if (!operatorNodeTable.ContainsKey(op)) {
+          operatorNodeTable.Add(op, new List<TreeNode>());
+          op.ItemImageChanged += new EventHandler(op_ItemImageChanged);
+          op.NameChanged += new EventHandler(op_NameChanged);
+          op.BreakpointChanged += new EventHandler(op_BreakpointChanged);
+          parametersOperatorTable.Add(op.Parameters, op);
+          op.Parameters.ItemsAdded += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsAdded);
+          op.Parameters.ItemsRemoved += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsRemoved);
+          op.Parameters.ItemsReplaced += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsReplaced);
+          op.Parameters.CollectionReset += new CollectionItemsChangedEventHandler<IParameter>(Parameters_CollectionReset);
+        }
+        operatorNodeTable[op].Add(node);
+
+        if (op.Breakpoint) node.ForeColor = Color.Red;
+        else node.ForeColor = graphTreeView.ForeColor;
+
+        foreach (IValueParameter param in op.Parameters.OfType<IValueParameter>()) {
+          if (typeof(IOperator).IsAssignableFrom(param.DataType))
+            node.Nodes.Add(new TreeNode());
+        }
+        node.Collapse();
+      }
+    }
+    private void ClearTreeNode(TreeNode node) {
+      while (node.Nodes.Count > 0)
+        RemoveTreeNode(node.Nodes[0]);
+
+      if (node.ImageIndex != -1) {
+        int i = node.ImageIndex;
+        CorrectImageIndexes(graphTreeView.Nodes, i);
+        graphTreeView.ImageList.Images.RemoveAt(i);
+      }
+
+      IOperator op = GetOperatorTag(node);
+      if (op != null) {
+        operatorNodeTable[op].Remove(node);
+        if (operatorNodeTable[op].Count == 0) {
+          op.ItemImageChanged -= new EventHandler(op_ItemImageChanged);
+          op.NameChanged -= new EventHandler(op_NameChanged);
+          op.BreakpointChanged -= new EventHandler(op_BreakpointChanged);
+          operatorNodeTable.Remove(op);
+          op.Parameters.ItemsAdded -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsAdded);
+          op.Parameters.ItemsRemoved -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsRemoved);
+          op.Parameters.ItemsReplaced -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsReplaced);
+          op.Parameters.CollectionReset -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_CollectionReset);
+          parametersOperatorTable.Remove(op.Parameters);
+        }
+      }
+      SetOperatorTag(node, null);
+    }
+    private void RemoveTreeNode(TreeNode node) {
+      ClearTreeNode(node);
+
+      IValueParameter opParam = GetOperatorParameterTag(node);
+      if (opParam != null) {
+        opParamNodeTable[opParam].Remove(node);
+        if (opParamNodeTable[opParam].Count == 0) {
+          opParam.ValueChanged -= new EventHandler(opParam_ValueChanged);
+          opParamNodeTable.Remove(opParam);
+        }
+      }
+      SetOperatorParameterTag(node, null);
+      node.Remove();
+    }
+    private void AddParameterNodes(IOperator op, IEnumerable<IParameter> parameters) {
+      foreach (IValueParameter param in parameters.OfType<IValueParameter>()) {
+        if (typeof(IOperator).IsAssignableFrom(param.DataType)) {
+          foreach (TreeNode node in operatorNodeTable[op])
+            node.Nodes.Add(CreateTreeNode(param));
+        }
+      }
+    }
+    private void RemoveParameterNodes(IEnumerable<IParameter> parameters) {
+      foreach (IValueParameter param in parameters.OfType<IValueParameter>()) {
+        if (typeof(IOperator).IsAssignableFrom(param.DataType)) {
+          while (opParamNodeTable.ContainsKey(param))
+            RemoveTreeNode(opParamNodeTable[param][0]);
+        }
+      }
+    }
+    #endregion
+
+    #region Parameter and Operator Events
+    private void opParam_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(opParam_ValueChanged), sender, e);
+      else {
+        IValueParameter opParam = (IValueParameter)sender;
+        if (opParamNodeTable.ContainsKey(opParam)) {
+          foreach (TreeNode node in opParamNodeTable[opParam].ToArray())
+            ClearTreeNode(node);
+          foreach (TreeNode node in opParamNodeTable[opParam]) {
+            node.Text = opParam.Name + ": ";
+            FillTreeNode(node, (IOperator)opParam.Value);
+          }
+        }
+      }
+    }
+    void op_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(op_ItemImageChanged), sender, e);
+      else {
+        IOperator op = (IOperator)sender;
+        foreach (TreeNode node in operatorNodeTable[op]) {
+          int i = node.ImageIndex;
+          graphTreeView.ImageList.Images[i] = op.ItemImage;
+          node.ImageIndex = -1;
+          node.SelectedImageIndex = -1;
+          node.ImageIndex = i;
+          node.SelectedImageIndex = i;
+        }
+      }
+    }
+    private void op_NameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(op_NameChanged), sender, e);
+      else {
+        IOperator op = (IOperator)sender;
+        foreach (TreeNode node in operatorNodeTable[op]) {
+          IValueParameter opParam = GetOperatorParameterTag(node);
+          if (opParam == null)
+            node.Text = op.Name + " (" + op.ItemName + ")";
+          else
+            node.Text = opParam.Name + ": " + op.Name;
+        }
+      }
+    }
+    private void op_BreakpointChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(op_BreakpointChanged), sender, e);
+      else {
+        IOperator op = (IOperator)sender;
+        foreach (TreeNode node in operatorNodeTable[op]) {
+          if (op.Breakpoint)
+            node.ForeColor = Color.Red;
+          else
+            node.ForeColor = graphTreeView.ForeColor;
+        }
+      }
+    }
+
+    private void Parameters_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsAdded), sender, e);
+      else {
+        IKeyedItemCollection<string, IParameter> coll = (IKeyedItemCollection<string, IParameter>)sender;
+        IOperator op = parametersOperatorTable[coll];
+        AddParameterNodes(op, e.Items);
+      }
+    }
+    private void Parameters_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsRemoved), sender, e);
+      else
+        RemoveParameterNodes(e.Items);
+    }
+    private void Parameters_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsReplaced), sender, e);
+      else {
+        RemoveParameterNodes(e.Items);
+        IKeyedItemCollection<string, IParameter> coll = (IKeyedItemCollection<string, IParameter>)sender;
+        IOperator op = parametersOperatorTable[coll];
+        AddParameterNodes(op, e.Items);
+      }
+    }
+    private void Parameters_CollectionReset(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IParameter>(Parameters_CollectionReset), sender, e);
+      else {
+        RemoveParameterNodes(e.Items);
+        IKeyedItemCollection<string, IParameter> coll = (IKeyedItemCollection<string, IParameter>)sender;
+        IOperator op = parametersOperatorTable[coll];
+        AddParameterNodes(op, e.Items);
+      }
+    }
+    #endregion
+
+    #region TreeView Events
+    private void graphTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
+      TreeNode node = e.Node;
+      if ((node.Nodes.Count > 0) && (node.Nodes[0].Tag == null)) {
+        node.Nodes.Clear();
+        IOperator op = GetOperatorTag(node);
+        foreach (IValueParameter param in op.Parameters.OfType<IValueParameter>()) {
+          if (typeof(IOperator).IsAssignableFrom(param.DataType)) node.Nodes.Add(CreateTreeNode(param));
+        }
+      }
+    }
+    private void graphTreeView_MouseDown(object sender, MouseEventArgs e) {
+      TreeNode node = graphTreeView.GetNodeAt(e.X, e.Y);
+      graphTreeView.SelectedNode = node;
+      graphTreeView.Refresh();
+    }
+    private void graphTreeView_KeyDown(object sender, KeyEventArgs e) {
+      if (!ReadOnly && (e.KeyCode == Keys.Delete) && (graphTreeView.SelectedNode != null)) {
+        IValueParameter opParam = GetOperatorParameterTag(graphTreeView.SelectedNode);
+        if (opParam != null) opParam.Value = null;
+      }
+    }
+    private void graphTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      SelectedOperator = graphTreeView.SelectedNode == null ? null : GetOperatorTag(graphTreeView.SelectedNode);
+    }
+    private void graphContextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      viewToolStripMenuItem.Enabled = false;
+      breakpointToolStripMenuItem.Enabled = false;
+      breakpointToolStripMenuItem.Checked = false;
+      if (graphTreeView.SelectedNode != null) {
+        IOperator op = GetOperatorTag(graphTreeView.SelectedNode);
+        if (op != null) {
+          Type viewType = MainFormManager.GetDefaultViewType(op.GetType());
+          if (viewType != null) {
+            viewToolStripMenuItem.Enabled = true;
+            viewToolStripMenuItem.Tag = op;
+          }
+          breakpointToolStripMenuItem.Enabled = !Locked;
+          breakpointToolStripMenuItem.Tag = op;
+          if (op.Breakpoint)
+            breakpointToolStripMenuItem.Checked = true;
+        }
+      }
+    }
+    private void graphTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (!Locked) {
+        TreeNode node = (TreeNode)e.Item;
+        IValueParameter opParam = GetOperatorParameterTag(node);
+        IOperator op = GetOperatorTag(node);
+        DataObject data = new DataObject();
+        data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, op);
+        if (ReadOnly || (opParam == null)) {
+          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+        } else {
+          DragDropEffects action = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+          if ((action & DragDropEffects.Move) == DragDropEffects.Move)
+            opParam.Value = null;
+        }
+      }
+    }
+    private void graphTreeView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IOperator)) {
+        TreeNode node = graphTreeView.GetNodeAt(graphTreeView.PointToClient(new Point(e.X, e.Y)));
+        if ((node != null) && !node.IsExpanded) node.Expand();
+        if ((node != null) && (GetOperatorParameterTag(node) != null)) {
+          if ((e.KeyState & 8) == 8) e.Effect = DragDropEffects.Copy;  // CTRL key
+          else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+          else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        }
+      }
+    }
+    private void graphTreeView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IOperator op = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IOperator;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) op = (IOperator)op.Clone();
+        TreeNode node = graphTreeView.GetNodeAt(graphTreeView.PointToClient(new Point(e.X, e.Y)));
+        IValueParameter opParam = GetOperatorParameterTag(node);
+        opParam.Value = op;
+      }
+    }
+    #endregion
+
+    #region Context Menu Events
+    private void viewToolStripMenuItem_Click(object sender, EventArgs e) {
+      IOperator op = ((ToolStripMenuItem)sender).Tag as IOperator;
+      IContentView view = MainFormManager.MainForm.ShowContent(op);
+      if (view != null) {
+        view.ReadOnly = this.ReadOnly;
+        view.Locked = this.Locked;
+      }
+    }
+    private void breakpointToolStripMenuItem_Click(object sender, EventArgs e) {
+      IOperator op = (IOperator)breakpointToolStripMenuItem.Tag;
+      op.Breakpoint = breakpointToolStripMenuItem.Checked;
+    }
+    #endregion
+
+    #region Helpers
+    private class Tuple<T1, T2> {
+      public T1 Item1 { get; set; }
+      public T2 Item2 { get; set; }
+
+      public Tuple() {
+        Item1 = default(T1);
+        Item2 = default(T2);
+      }
+      public Tuple(T1 item1, T2 item2) {
+        Item1 = item1;
+        Item2 = item2;
+      }
+    }
+
+    private IValueParameter GetOperatorParameterTag(TreeNode node) {
+      if (node.Tag != null)
+        return ((Tuple<IValueParameter, IOperator>)node.Tag).Item1;
+      else
+        return null;
+    }
+    private void SetOperatorParameterTag(TreeNode node, IValueParameter opParam) {
+      if (node.Tag == null)
+        node.Tag = new Tuple<IValueParameter, IOperator>(opParam, null);
+      else
+        ((Tuple<IValueParameter, IOperator>)node.Tag).Item1 = opParam;
+    }
+    private IOperator GetOperatorTag(TreeNode node) {
+      if (node.Tag != null)
+        return ((Tuple<IValueParameter, IOperator>)node.Tag).Item2;
+      else
+        return null;
+    }
+    private void SetOperatorTag(TreeNode node, IOperator op) {
+      if (node.Tag == null)
+        node.Tag = new Tuple<IValueParameter, IOperator>(null, op);
+      else
+        ((Tuple<IValueParameter, IOperator>)node.Tag).Item2 = op;
+    }
+
+    private void CorrectImageIndexes(TreeNodeCollection nodes, int removedIndex) {
+      foreach (TreeNode node in nodes) {
+        if (node.ImageIndex > removedIndex) {
+          node.ImageIndex--;
+          node.SelectedImageIndex--;
+        }
+        CorrectImageIndexes(node.Nodes, removedIndex);
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorsSidebar.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorsSidebar.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorsSidebar.Designer.cs	(revision 16770)
@@ -0,0 +1,75 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class OperatorsSidebar {
+    /// <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() {
+      this.typeSelector = new HeuristicLab.Core.Views.TypeSelector();
+      this.SuspendLayout();
+      // 
+      // typeSelector
+      // 
+      this.typeSelector.Caption = "Available Operators";
+      this.typeSelector.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.typeSelector.Location = new System.Drawing.Point(0, 0);
+      this.typeSelector.Name = "typeSelector";
+      this.typeSelector.Size = new System.Drawing.Size(316, 296);
+      this.typeSelector.TabIndex = 0;
+      // 
+      // OperatorsSidebar
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Caption = "Operators";
+      this.Controls.Add(this.typeSelector);
+      this.Name = "OperatorsSidebar";
+      this.Size = new System.Drawing.Size(316, 296);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected TypeSelector typeSelector;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorsSidebar.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorsSidebar.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/OperatorsSidebar.cs	(revision 16770)
@@ -0,0 +1,38 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("Operators Sidebar")]
+  public partial class OperatorsSidebar : HeuristicLab.MainForm.WindowsForms.Sidebar {
+    public OperatorsSidebar() {
+      InitializeComponent();
+    }
+
+    protected override void OnInitialized(EventArgs e) {
+      base.OnInitialized(e);
+      typeSelector.Configure(typeof(IOperator), false, true);
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterCollectionView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterCollectionView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterCollectionView.Designer.cs	(revision 16770)
@@ -0,0 +1,108 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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 ParameterCollectionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.showHiddenParametersCheckBox = new System.Windows.Forms.CheckBox();
+      this.itemsListViewContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.showHideParametersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.itemsListViewContextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.showHiddenParametersCheckBox);
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.ContextMenuStrip = this.itemsListViewContextMenuStrip;
+      this.itemsListView.TabIndex = 6;
+      // 
+      // showHiddenParametersCheckBox
+      // 
+      this.showHiddenParametersCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showHiddenParametersCheckBox.Checked = false;
+      this.showHiddenParametersCheckBox.CheckState = System.Windows.Forms.CheckState.Unchecked;
+      this.showHiddenParametersCheckBox.Image = HeuristicLab.Common.Resources.VSImageLibrary.HiddenField;
+      this.showHiddenParametersCheckBox.Location = new System.Drawing.Point(153, 3);
+      this.showHiddenParametersCheckBox.Name = "showHiddenParametersCheckBox";
+      this.showHiddenParametersCheckBox.Size = new System.Drawing.Size(24, 24);
+      this.showHiddenParametersCheckBox.TabIndex = 5;
+      this.toolTip.SetToolTip(this.showHiddenParametersCheckBox, "Show Hidden Parameters");
+      this.showHiddenParametersCheckBox.UseVisualStyleBackColor = true;
+      this.showHiddenParametersCheckBox.CheckedChanged += new System.EventHandler(showHiddenParametersCheckBox_CheckedChanged);
+      // 
+      // itemsListViewContextMenuStrip
+      // 
+      this.itemsListViewContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.showHideParametersToolStripMenuItem});
+      this.itemsListViewContextMenuStrip.Name = "itemsListViewContextMenuStrip";
+      this.itemsListViewContextMenuStrip.Size = new System.Drawing.Size(161, 26);
+      this.itemsListViewContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(itemsListViewContextMenuStrip_Opening);
+      // 
+      // showHideParametersToolStripMenuItem
+      // 
+      this.showHideParametersToolStripMenuItem.Name = "showHideParametersToolStripMenuItem";
+      this.showHideParametersToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
+      this.showHideParametersToolStripMenuItem.Text = "Show/Hide Parameters";
+      this.showHideParametersToolStripMenuItem.Click += new System.EventHandler(showHideParametersToolStripMenuItem_Click);
+      // 
+      // ParameterCollectionView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Name = "ParameterCollectionView";
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.itemsListViewContextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+    }
+
+    #endregion
+
+    protected CheckBox showHiddenParametersCheckBox;
+    protected ContextMenuStrip itemsListViewContextMenuStrip;
+    protected ToolStripMenuItem showHideParametersToolStripMenuItem;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterCollectionView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterCollectionView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterCollectionView.cs	(revision 16770)
@@ -0,0 +1,244 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("ParameterCollection View")]
+  [Content(typeof(ParameterCollection), true)]
+  [Content(typeof(IKeyedItemCollection<string, IParameter>), false)]
+  public partial class ParameterCollectionView : NamedItemCollectionView<IParameter> {
+    protected CreateParameterDialog createParameterDialog;
+
+    protected bool allowEditingOfHiddenParameters;
+    public virtual bool AllowEditingOfHiddenParameters {
+      get { return allowEditingOfHiddenParameters; }
+      set {
+        if (value != allowEditingOfHiddenParameters) {
+          allowEditingOfHiddenParameters = value;
+          SetEnabledStateOfControls();
+        }
+      }
+    }
+
+    public ParameterCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Parameters";
+      allowEditingOfHiddenParameters = true;
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (createParameterDialog != null) createParameterDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterItemEvents(IParameter item) {
+      item.HiddenChanged -= new EventHandler(Item_HiddenChanged);
+      base.DeregisterItemEvents(item);
+    }
+    protected override void RegisterItemEvents(IParameter item) {
+      base.RegisterItemEvents(item);
+      item.HiddenChanged += new EventHandler(Item_HiddenChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if ((Content == null) || !Content.Any(x => x.Hidden))
+        showHiddenParametersCheckBox.Checked = false;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      showHiddenParametersCheckBox.Enabled = (Content != null) && Content.Any(x => x.Hidden);
+      viewHost.ReadOnly = ReadOnly || ((viewHost.Content is IParameter) && (((IParameter)viewHost.Content).Hidden) && !AllowEditingOfHiddenParameters);
+    }
+
+    protected override IParameter CreateItem() {
+      if (createParameterDialog == null) createParameterDialog = new CreateParameterDialog();
+
+      if (createParameterDialog.ShowDialog(this) == DialogResult.OK) {
+        IParameter param = createParameterDialog.Parameter;
+        if ((param != null) && Content.ContainsKey(param.Name))
+          param = (IParameter)Activator.CreateInstance(param.GetType(), GetUniqueName(param.Name), param.Description);
+        return param;
+      }
+      return null;
+    }
+
+    protected override ListViewItem CreateListViewItem(IParameter item) {
+      ListViewItem listViewItem = base.CreateListViewItem(item);
+      if ((item != null) && item.Hidden) {
+        listViewItem.Font = new Font(listViewItem.Font, FontStyle.Italic);
+        listViewItem.ForeColor = Color.LightGray;
+      }
+      return listViewItem;
+    }
+
+    protected override void AddListViewItem(ListViewItem listViewItem) {
+      base.AddListViewItem(listViewItem);
+      IParameter parameter = listViewItem.Tag as IParameter;
+      if ((parameter != null) && parameter.Hidden && !showHiddenParametersCheckBox.Checked) {
+        itemsListView.Items.Remove(listViewItem);
+        RebuildImageList();
+      }
+    }
+
+    protected virtual void UpdateParameterVisibility(IParameter parameter) {
+      foreach (ListViewItem listViewItem in GetListViewItemsForItem(parameter)) {
+        if (parameter.Hidden) {
+          listViewItem.Font = new Font(listViewItem.Font, FontStyle.Italic);
+          listViewItem.ForeColor = Color.LightGray;
+          if (!showHiddenParametersCheckBox.Checked)
+            itemsListView.Items.Remove(listViewItem);
+        } else {
+          listViewItem.Font = new Font(listViewItem.Font, FontStyle.Regular);
+          listViewItem.ForeColor = itemsListView.ForeColor;
+          if (!showHiddenParametersCheckBox.Checked)
+            itemsListView.Items.Add(listViewItem);
+        }
+      }
+      RebuildImageList();
+      AdjustListViewColumnSizes();
+      if (!Content.Any(x => x.Hidden)) showHiddenParametersCheckBox.Checked = false;
+      showHiddenParametersCheckBox.Enabled = (Content != null) && Content.Any(x => x.Hidden);
+    }
+
+    #region Control Events
+    protected virtual void showHiddenParametersCheckBox_CheckedChanged(object sender, System.EventArgs e) {
+      if (Content != null) {
+        foreach (IParameter parameter in itemListViewItemMapping.Keys.Where(x => x.Hidden).OrderBy(x => x.ToString())) {
+          foreach (ListViewItem listViewItem in GetListViewItemsForItem(parameter)) {
+            if (showHiddenParametersCheckBox.Checked)
+              itemsListView.Items.Add(listViewItem);
+            else
+              itemsListView.Items.Remove(listViewItem);
+          }
+        }
+        RebuildImageList();
+        AdjustListViewColumnSizes();
+      }
+    }
+    protected override void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      base.itemsListView_SelectedIndexChanged(sender, e);
+      SetEnabledStateOfControls();
+    }
+    protected override void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        IParameter item = itemsListView.SelectedItems[0].Tag as IParameter;
+        if (item != null) {
+          IContentView view = MainFormManager.MainForm.ShowContent(item);
+          if (view != null) {
+            view.ReadOnly = ReadOnly || (item.Hidden && !AllowEditingOfHiddenParameters);
+            view.Locked = Locked;
+          }
+        }
+      }
+    }
+    protected virtual void itemsListViewContextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e) {
+      showHideParametersToolStripMenuItem.Text = "Show/Hide Parameters";
+      showHideParametersToolStripMenuItem.Enabled = false;
+      if (itemsListView.SelectedItems.Count == 0) {
+        e.Cancel = true;
+      } else if (!ReadOnly && !Locked && AllowEditingOfHiddenParameters) {
+        List<IParameter> parameters = new List<IParameter>();
+        foreach (ListViewItem listViewItem in itemsListView.SelectedItems) {
+          IParameter parameter = listViewItem.Tag as IParameter;
+          if (parameter != null) parameters.Add(parameter);
+        }
+        showHideParametersToolStripMenuItem.Enabled = parameters.Count > 0;
+        if (parameters.Count == 1) showHideParametersToolStripMenuItem.Text = parameters[0].Hidden ? "Show Parameter" : "Hide Parameter";
+        else if ((parameters.Count > 1) && parameters.All(x => x.Hidden == parameters[0].Hidden)) showHideParametersToolStripMenuItem.Text = parameters[0].Hidden ? "Show Parameters" : "Hide Parameters";
+        showHideParametersToolStripMenuItem.Tag = parameters;
+      }
+    }
+    protected virtual void showHideParametersToolStripMenuItem_Click(object sender, System.EventArgs e) {
+      foreach (IParameter parameter in (IEnumerable<IParameter>)showHideParametersToolStripMenuItem.Tag)
+        parameter.Hidden = !parameter.Hidden;
+    }
+    protected override void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      base.showDetailsCheckBox_CheckedChanged(sender, e);
+      SetEnabledStateOfControls();
+    }
+    #endregion
+
+    #region Content Events
+    protected override void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IParameter>(Content_ItemsAdded), sender, e);
+      else {
+        base.Content_ItemsAdded(sender, e);
+        showHiddenParametersCheckBox.Enabled = Content.Any(x => x.Hidden);
+      }
+    }
+    protected override void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IParameter>(Content_ItemsRemoved), sender, e);
+      else {
+        base.Content_ItemsRemoved(sender, e);
+        if (!Content.Any(x => x.Hidden)) showHiddenParametersCheckBox.Checked = false;
+        showHiddenParametersCheckBox.Enabled = Content.Any(x => x.Hidden);
+      }
+    }
+    protected override void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IParameter>(Content_CollectionReset), sender, e);
+      else {
+        base.Content_CollectionReset(sender, e);
+        if (!Content.Any(x => x.Hidden)) showHiddenParametersCheckBox.Checked = false;
+        showHiddenParametersCheckBox.Enabled = Content.Any(x => x.Hidden);
+      }
+    }
+    #endregion
+
+    #region Item Events
+    protected virtual void Item_HiddenChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_HiddenChanged), sender, e);
+      else
+        UpdateParameterVisibility((IParameter)sender);
+    }
+    #endregion
+
+    #region Helpers
+    protected override void RebuildImageList() {
+      base.RebuildImageList();
+      if (!showHiddenParametersCheckBox.Checked) {
+        // update image of hidden list view items
+        foreach (IParameter parameter in itemListViewItemMapping.Keys.Where(x => x.Hidden)) {
+          foreach (ListViewItem listViewItem in GetListViewItemsForItem(parameter)) {
+            itemsListView.SmallImageList.Images.Add(parameter.ItemImage);
+            listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+          }
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedItemView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedItemView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedItemView.Designer.cs	(revision 16770)
@@ -0,0 +1,80 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class ParameterizedItemView {
+    /// <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() {
+      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      this.SuspendLayout();
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.AllowEditingOfHiddenParameters = true;
+      this.parameterCollectionView.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.parameterCollectionView.Caption = "ParameterCollection View";
+      this.parameterCollectionView.Content = null;
+      this.parameterCollectionView.Location = new System.Drawing.Point(0, 0);
+      this.parameterCollectionView.Name = "parameterCollectionView";
+      this.parameterCollectionView.ReadOnly = false;
+      this.parameterCollectionView.ShowDetails = true;
+      this.parameterCollectionView.Size = new System.Drawing.Size(490, 353);
+      this.parameterCollectionView.TabIndex = 0;
+      // 
+      // ParameterizedItemView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.parameterCollectionView);
+      this.Name = "ParameterizedItemView";
+      this.Size = new System.Drawing.Size(490, 353);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected ParameterCollectionView parameterCollectionView;
+
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedItemView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedItemView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedItemView.cs	(revision 16770)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("ParameterizedItem View")]
+  [Content(typeof(IParameterizedItem), false)]
+  public partial class ParameterizedItemView : ItemView {
+    public new IParameterizedItem Content {
+      get { return (IParameterizedItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ParameterizedItemView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      parameterCollectionView.Content = Content == null ? null : Content.Parameters;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      parameterCollectionView.Enabled = Content != null;
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedNamedItemView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedNamedItemView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedNamedItemView.Designer.cs	(revision 16770)
@@ -0,0 +1,97 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class ParameterizedNamedItemView {
+    /// <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() {
+      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(59, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(406, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(471, 3);
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.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.parameterCollectionView.Caption = "ParameterCollection View";
+      this.parameterCollectionView.Content = null;
+      this.parameterCollectionView.Location = new System.Drawing.Point(0, 26);
+      this.parameterCollectionView.Name = "parameterCollectionView";
+      this.parameterCollectionView.ReadOnly = false;
+      this.parameterCollectionView.Size = new System.Drawing.Size(490, 327);
+      this.parameterCollectionView.TabIndex = 3;
+      // 
+      // ParameterizedNamedItemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.parameterCollectionView);
+      this.Name = "ParameterizedNamedItemView";
+      this.Size = new System.Drawing.Size(490, 353);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected ParameterCollectionView parameterCollectionView;
+
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedNamedItemView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedNamedItemView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ParameterizedNamedItemView.cs	(revision 16770)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [View("ParameterizedNamedItem View")]
+  [Content(typeof(ParameterizedNamedItem), true)]
+  [Content(typeof(IParameterizedNamedItem), false)]
+  public partial class ParameterizedNamedItemView : NamedItemView {
+    public new IParameterizedNamedItem Content {
+      get { return (IParameterizedNamedItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public ParameterizedNamedItemView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      parameterCollectionView.Content = Content == null ? null : Content.Parameters;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      parameterCollectionView.Enabled = Content != null;
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Plugin.cs.frame	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Plugin.cs.frame	(revision 16770)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Core.Views plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Core.Views", "3.3.15.$WCREV$")]
+  [PluginFile("HeuristicLab.Core.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Attic", "1.0")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabCoreViewsPlugin : PluginBase {
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 16770)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Core.Views")]
+[assembly: AssemblyDescription("Views of the HeuristicLab core classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2018 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("d157d7c1-3f66-47e8-a069-0281af8ec4b4")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.15.$WCREV$")]
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Properties/Settings.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Properties/Settings.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Properties/Settings.Designer.cs	(revision 16770)
@@ -0,0 +1,38 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Core.Views.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
+    public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("35")]
+        public int MaximumNestedControls {
+            get {
+                return ((int)(this["MaximumNestedControls"]));
+            }
+            set {
+                this["MaximumNestedControls"] = value;
+            }
+        }
+    }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Properties/Settings.settings
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Properties/Settings.settings	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/Properties/Settings.settings	(revision 16770)
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="HeuristicLab.Core.Views.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="MaximumNestedControls" Type="System.Int32" Scope="User">
+      <Value Profile="(Default)">35</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeListView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeListView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeListView.Designer.cs	(revision 16770)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class ScopeListView {
+    /// <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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeListView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeListView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeListView.cs	(revision 16770)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("ScopeList View")]
+  [Content(typeof(ScopeList), true)]
+  [Content(typeof(IItemList<IScope>), false)]
+  public partial class ScopeListView : ItemListView<IScope> {
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public ScopeListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Scopes";
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeView.Designer.cs	(revision 16770)
@@ -0,0 +1,128 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class ScopeView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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() {
+      this.scopesTreeView = new System.Windows.Forms.TreeView();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.scopesGroupBox = new System.Windows.Forms.GroupBox();
+      this.variableCollectionView = new HeuristicLab.Core.Views.VariableCollectionView();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.scopesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // scopesTreeView
+      // 
+      this.scopesTreeView.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.scopesTreeView.HideSelection = false;
+      this.scopesTreeView.Location = new System.Drawing.Point(6, 19);
+      this.scopesTreeView.Name = "scopesTreeView";
+      this.scopesTreeView.ShowNodeToolTips = true;
+      this.scopesTreeView.Size = new System.Drawing.Size(382, 169);
+      this.scopesTreeView.TabIndex = 0;
+      this.scopesTreeView.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.scopesTreeView_AfterCollapse);
+      this.scopesTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.scopesTreeView_BeforeExpand);
+      this.scopesTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.scopesTreeView_AfterSelect);
+      this.scopesTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.scopesTreeView_MouseDown);
+      this.scopesTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.scopesTreeView_ItemDrag);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.scopesGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.variableCollectionView);
+      this.splitContainer.Size = new System.Drawing.Size(400, 400);
+      this.splitContainer.SplitterDistance = 200;
+      this.splitContainer.TabIndex = 1;
+      // 
+      // scopesGroupBox
+      // 
+      this.scopesGroupBox.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.scopesGroupBox.Controls.Add(this.scopesTreeView);
+      this.scopesGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.scopesGroupBox.Name = "scopesGroupBox";
+      this.scopesGroupBox.Size = new System.Drawing.Size(394, 194);
+      this.scopesGroupBox.TabIndex = 0;
+      this.scopesGroupBox.TabStop = false;
+      this.scopesGroupBox.Text = "Scopes";
+      // 
+      // variableCollectionView
+      // 
+      this.variableCollectionView.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.variableCollectionView.Content = null;
+      this.variableCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.variableCollectionView.Name = "variableCollectionView";
+      this.variableCollectionView.ReadOnly = false;
+      this.variableCollectionView.Size = new System.Drawing.Size(394, 190);
+      this.variableCollectionView.TabIndex = 0;
+      // 
+      // ScopeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ScopeView";
+      this.Size = new System.Drawing.Size(400, 400);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.scopesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TreeView scopesTreeView;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.GroupBox scopesGroupBox;
+    private VariableCollectionView variableCollectionView;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ScopeView.cs	(revision 16770)
@@ -0,0 +1,326 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// The visual represenation of <see cref="Scope"/>.
+  /// </summary>
+  [View("Scope View")]
+  [Content(typeof(Scope), true)]
+  [Content(typeof(IScope), false)]
+  public sealed partial class ScopeView : ItemView {
+    private Dictionary<IScope, TreeNode> scopeNodeTable;
+    private Dictionary<ScopeList, IScope> subScopesScopeTable;
+
+    /// <summary>
+    /// Gets or sets the scope to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new IScope Content {
+      get { return (IScope)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ScopeView"/> with caption "Scope" and 
+    /// property <see cref="AutomaticUpdating"/> set to <c>false</c>.
+    /// </summary>
+    public ScopeView() {
+      InitializeComponent();
+      scopeNodeTable = new Dictionary<IScope, TreeNode>();
+      subScopesScopeTable = new Dictionary<ScopeList, IScope>();
+    }
+
+    /// <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 (scopesTreeView.Nodes.Count > 0) {
+          ClearTreeNode(scopesTreeView.Nodes[0]);
+        }
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (scopesTreeView.Nodes.Count > 0)
+        ClearTreeNode(scopesTreeView.Nodes[0]);
+      scopesTreeView.Nodes.Clear();
+      variableCollectionView.Content = null;
+      if (Content != null) {
+        scopesTreeView.Nodes.Add(CreateTreeNode(Content));
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      scopesTreeView.Enabled = Content != null;
+      variableCollectionView.Enabled = scopesTreeView.SelectedNode != null;
+    }
+
+    #region TreeNode Management
+    private TreeNode CreateTreeNode(IScope scope) {
+      TreeNode node = new TreeNode();
+      node.Text = scope.Name;
+      node.Tag = scope;
+
+      scopeNodeTable.Add(scope, node);
+      scope.NameChanged += new EventHandler(Scope_NameChanged);
+      subScopesScopeTable.Add(scope.SubScopes, scope);
+      scope.SubScopes.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded);
+      scope.SubScopes.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved);
+      scope.SubScopes.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
+      scope.SubScopes.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsMoved);
+      scope.SubScopes.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
+      if (scope.SubScopes.Count > 0)
+        node.Nodes.Add(new TreeNode());
+      return node;
+    }
+
+    private void ClearTreeNode(TreeNode node) {
+      if (scopesTreeView.SelectedNode == node) {
+        scopesTreeView.SelectedNode = null;
+        UpdateVariables();
+      }
+
+      foreach (TreeNode child in node.Nodes)
+        ClearTreeNode(child);
+
+      IScope scope = node.Tag as IScope;
+      if (scope != null) {
+        scope.NameChanged -= new EventHandler(Scope_NameChanged);
+        scopeNodeTable.Remove(scope);
+        scope.SubScopes.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded);
+        scope.SubScopes.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved);
+        scope.SubScopes.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
+        scope.SubScopes.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsMoved);
+        scope.SubScopes.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
+        subScopesScopeTable.Remove(scope.SubScopes);
+      }
+    }
+    #endregion
+
+    #region TreeView Events
+    private void scopesTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      UpdateVariables();
+    }
+    private void scopesTreeView_MouseDown(object sender, MouseEventArgs e) {
+      TreeNode node = scopesTreeView.GetNodeAt(e.X, e.Y);
+      scopesTreeView.SelectedNode = node;
+      UpdateVariables();
+    }
+    private void scopesTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
+      TreeNode node = e.Node;
+      IScope scope = (IScope)node.Tag;
+
+      node.Nodes.Clear();
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        node.Nodes.Add(CreateTreeNode(scope.SubScopes[i]));
+    }
+    private void scopesTreeView_AfterCollapse(object sender, System.Windows.Forms.TreeViewEventArgs e) {
+      TreeNode node = e.Node;
+      IScope scope = (IScope)node.Tag;
+
+      if (node.Nodes.Count > 0) {
+        for (int i = 0; i < node.Nodes.Count; i++)
+          ClearTreeNode(node.Nodes[i]);
+        node.Nodes.Clear();
+        node.Nodes.Add(new TreeNode());
+      }
+    }
+    private void scopesTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (!Locked) {
+        TreeNode node = (TreeNode)e.Item;
+        IScope scope = node.Tag as IScope;
+        if (scope != null) {
+          DataObject data = new DataObject();
+          data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, scope);
+          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+        }
+      }
+    }
+    #endregion
+
+    #region Content Events
+    private void Scope_NameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Scope_NameChanged), sender, e);
+      else {
+        IScope scope = (IScope)sender;
+        TreeNode node = null;
+        scopeNodeTable.TryGetValue(scope, out node);
+        if (node != null) node.Text = scope.Name;
+      }
+    }
+    private void SubScopes_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded), sender, e);
+      else {
+        IScope parentScope = null;
+        subScopesScopeTable.TryGetValue((ScopeList)sender, out parentScope);
+        if (parentScope != null) {
+          TreeNode parentNode = null;
+          scopeNodeTable.TryGetValue(parentScope, out parentNode);
+          if (parentNode != null) {
+            scopesTreeView.BeginUpdate();
+            if (parentNode.IsExpanded) {
+              foreach (IndexedItem<IScope> item in e.Items) {
+                TreeNode node = CreateTreeNode(item.Value);
+                parentNode.Nodes.Insert(item.Index, node);
+              }
+            } else if (parentNode.Nodes.Count == 0) {
+              parentNode.Nodes.Add(new TreeNode());
+            }
+            scopesTreeView.EndUpdate();
+          }
+        }
+      }
+    }
+    private void SubScopes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved), sender, e);
+      else {
+        IScope parentScope = null;
+        subScopesScopeTable.TryGetValue((ScopeList)sender, out parentScope);
+        if (parentScope != null) {
+          TreeNode parentNode = null;
+          scopeNodeTable.TryGetValue(parentScope, out parentNode);
+          if (parentNode != null) {
+            scopesTreeView.BeginUpdate();
+            if (parentNode.IsExpanded) {
+              foreach (IndexedItem<IScope> item in e.Items) {
+                TreeNode node = scopeNodeTable[item.Value];
+                ClearTreeNode(node);
+                node.Remove();
+              }
+            } else if (parentScope.SubScopes.Count == 0) {
+              parentNode.Nodes.Clear();
+            }
+            scopesTreeView.EndUpdate();
+          }
+        }
+      }
+    }
+    private void SubScopes_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced), sender, e);
+      else {
+        IScope parentScope = null;
+        subScopesScopeTable.TryGetValue((ScopeList)sender, out parentScope);
+        if (parentScope != null) {
+          TreeNode parentNode = null;
+          scopeNodeTable.TryGetValue(parentScope, out parentNode);
+          if (parentNode != null) {
+            scopesTreeView.BeginUpdate();
+            if (parentNode.IsExpanded) {
+              foreach (IndexedItem<IScope> item in e.Items) {
+                TreeNode node = parentNode.Nodes[item.Index];
+                ClearTreeNode(node);
+                node.Remove();
+                node = CreateTreeNode(item.Value);
+                parentNode.Nodes.Insert(item.Index, node);
+              }
+              scopesTreeView.EndUpdate();
+            }
+          }
+        }
+      }
+    }
+    private void SubScopes_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsMoved), sender, e);
+      else {
+        IScope parentScope = null;
+        subScopesScopeTable.TryGetValue((ScopeList)sender, out parentScope);
+        if (parentScope != null) {
+          TreeNode parentNode = null;
+          scopeNodeTable.TryGetValue(parentScope, out parentNode);
+          if (parentNode != null) {
+            scopesTreeView.BeginUpdate();
+            if (parentNode.IsExpanded) {
+              parentNode.Nodes.Clear();
+              foreach (IndexedItem<IScope> item in e.Items)
+                parentNode.Nodes.Insert(item.Index, scopeNodeTable[item.Value]);
+            }
+            scopesTreeView.EndUpdate();
+          }
+        }
+      }
+    }
+    private void SubScopes_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset), sender, e);
+      else {
+        IScope parentScope = null;
+        subScopesScopeTable.TryGetValue((ScopeList)sender, out parentScope);
+        if (parentScope != null) {
+          TreeNode parentNode = null;
+          scopeNodeTable.TryGetValue(parentScope, out parentNode);
+          if (parentNode != null) {
+            scopesTreeView.BeginUpdate();
+            if (parentNode.IsExpanded) {
+              foreach (TreeNode node in parentNode.Nodes)
+                ClearTreeNode(node);
+              parentNode.Nodes.Clear();
+              foreach (IndexedItem<IScope> item in e.Items) {
+                TreeNode node = CreateTreeNode(item.Value);
+                parentNode.Nodes.Insert(item.Index, node);
+              }
+            } else {
+              parentNode.Nodes.Clear();
+              if (parentScope.SubScopes.Count > 0)
+                parentNode.Nodes.Add(new TreeNode());
+            }
+            scopesTreeView.EndUpdate();
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Helpers
+    private void UpdateVariables() {
+      if (scopesTreeView.SelectedNode == null) {
+        variableCollectionView.Content = null;
+        variableCollectionView.Enabled = false;
+      } else {
+        variableCollectionView.Enabled = true;
+        variableCollectionView.Content = ((IScope)scopesTreeView.SelectedNode.Tag).Variables;
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TextDialog.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TextDialog.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TextDialog.Designer.cs	(revision 16770)
@@ -0,0 +1,115 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class TextDialog {
+    /// <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.cancelButton = new System.Windows.Forms.Button();
+      this.okButton = new System.Windows.Forms.Button();
+      this.textTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(549, 309);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 1;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Enabled = false;
+      this.okButton.Location = new System.Drawing.Point(468, 309);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // textTextBox
+      // 
+      this.textTextBox.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.textTextBox.Location = new System.Drawing.Point(12, 12);
+      this.textTextBox.Multiline = true;
+      this.textTextBox.Name = "textTextBox";
+      this.textTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.textTextBox.Size = new System.Drawing.Size(612, 291);
+      this.textTextBox.TabIndex = 2;
+      // 
+      // TextDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(636, 344);
+      this.Controls.Add(this.textTextBox);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "TextDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Enter Text";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button cancelButton;
+    protected System.Windows.Forms.Button okButton;
+    protected System.Windows.Forms.TextBox textTextBox;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TextDialog.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TextDialog.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TextDialog.cs	(revision 16770)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+
+namespace HeuristicLab.Core.Views {
+  public partial class TextDialog : Form {
+    public string Caption {
+      get { return this.Text; }
+      set {
+        if (InvokeRequired)
+          Invoke(new Action<string>(x => this.Caption = x), value);
+        else
+          this.Text = value;
+      }
+    }
+    public string Content {
+      get { return textTextBox.Text; }
+      set {
+        if (InvokeRequired)
+          Invoke(new Action<string>(x => this.Content = x), value);
+        else
+          textTextBox.Text = value;
+      }
+    }
+    public bool ReadOnly {
+      get { return textTextBox.ReadOnly; }
+      set {
+        if (InvokeRequired)
+          Invoke(new Action<bool>(x => this.ReadOnly = x), value);
+        else {
+          textTextBox.ReadOnly = value;
+          okButton.Enabled = !value;
+        }
+      }
+    }
+
+    public TextDialog() {
+      InitializeComponent();
+    }
+    public TextDialog(string caption, string content, bool readOnly)
+      : this() {
+      Caption = caption;
+      Content = content;
+      ReadOnly = readOnly;
+    }
+
+    protected virtual void okButton_Click(object sender, EventArgs e) {
+      Close();
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelector.Designer.cs	(revision 16770)
@@ -0,0 +1,328 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class TypeSelector {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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() {
+      this.components = new System.ComponentModel.Container();
+      this.typesTreeView = new System.Windows.Forms.TreeView();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.typesGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.typeParametersSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.searchLabel = new System.Windows.Forms.Label();
+      this.searchTextBox = new System.Windows.Forms.TextBox();
+      this.clearSearchButton = new System.Windows.Forms.Button();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.expandToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.expandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.collapseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.collapseAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.typeParametersGroupBox = new System.Windows.Forms.GroupBox();
+      this.setTypeParameterButton = new System.Windows.Forms.Button();
+      this.typeParametersListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.typesGroupBox.SuspendLayout();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.typeParametersSplitContainer.Panel1.SuspendLayout();
+      this.typeParametersSplitContainer.Panel2.SuspendLayout();
+      this.typeParametersSplitContainer.SuspendLayout();
+      this.typeParametersGroupBox.SuspendLayout();
+      this.contextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // typesTreeView
+      // 
+      this.typesTreeView.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.typesTreeView.HideSelection = false;
+      this.typesTreeView.ImageIndex = 0;
+      this.typesTreeView.ImageList = this.imageList;
+      this.typesTreeView.Location = new System.Drawing.Point(3, 29);
+      this.typesTreeView.Name = "typesTreeView";
+      this.typesTreeView.SelectedImageIndex = 0;
+      this.typesTreeView.ShowNodeToolTips = true;
+      this.typesTreeView.Size = new System.Drawing.Size(219, 287);
+      this.typesTreeView.TabIndex = 2;
+      this.typesTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.typesTreeView_ItemDrag);
+      this.typesTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.typesTreeView_AfterSelect);
+      this.typesTreeView.VisibleChanged += new System.EventHandler(this.typesTreeView_VisibleChanged);
+      this.typesTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.typesTreeView_MouseDown);
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // typesGroupBox
+      // 
+      this.typesGroupBox.Controls.Add(this.splitContainer);
+      this.typesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.typesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.typesGroupBox.Name = "typesGroupBox";
+      this.typesGroupBox.Size = new System.Drawing.Size(231, 614);
+      this.typesGroupBox.TabIndex = 0;
+      this.typesGroupBox.TabStop = false;
+      this.typesGroupBox.Text = "Available Types";
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.typeParametersSplitContainer);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.descriptionTextBox);
+      this.splitContainer.Size = new System.Drawing.Size(225, 595);
+      this.splitContainer.SplitterDistance = 471;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // typeParametersSplitContainer
+      // 
+      this.typeParametersSplitContainer.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.typeParametersSplitContainer.Location = new System.Drawing.Point(0, 0);
+      this.typeParametersSplitContainer.Name = "typeParametersSplitContainer";
+      this.typeParametersSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // typeParametersSplitContainer.Panel1
+      // 
+      this.typeParametersSplitContainer.Panel1.Controls.Add(this.typesTreeView);
+      this.typeParametersSplitContainer.Panel1.Controls.Add(this.searchLabel);
+      this.typeParametersSplitContainer.Panel1.Controls.Add(this.searchTextBox);
+      // 
+      // typeParametersSplitContainer.Panel2
+      // 
+      this.typeParametersSplitContainer.Panel2.Controls.Add(this.typeParametersGroupBox);
+      this.typeParametersSplitContainer.Size = new System.Drawing.Size(225, 472);
+      this.typeParametersSplitContainer.SplitterDistance = 319;
+      this.typeParametersSplitContainer.TabIndex = 0;
+      // 
+      // searchLabel
+      // 
+      this.searchLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Zoom;
+      this.searchLabel.Location = new System.Drawing.Point(3, 3);
+      this.searchLabel.Name = "searchLabel";
+      this.searchLabel.Size = new System.Drawing.Size(20, 20);
+      this.searchLabel.TabIndex = 0;
+      this.toolTip.SetToolTip(this.searchLabel, "Enter string to search for types");
+      // 
+      // searchTextBox
+      // 
+      this.searchTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.searchTextBox.Controls.Add(this.clearSearchButton);
+      this.searchTextBox.Location = new System.Drawing.Point(29, 3);
+      this.searchTextBox.Name = "searchTextBox";
+      this.searchTextBox.Size = new System.Drawing.Size(193, 20);
+      this.searchTextBox.TabIndex = 1;
+      this.toolTip.SetToolTip(this.searchTextBox, "Filters the available Types.\r\nThe search term is tokenized by space and a name ha" +
+        "s to contain all tokens to be displayed.\r\n(E.g. \"Sym Reg\" matches \"SymbolicRegr" +
+        "ession\")");
+      this.searchTextBox.TextChanged += new System.EventHandler(this.searchTextBox_TextChanged);
+      this.searchTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.searchTextBox_KeyDown);
+      // 
+      // clearSearchButton
+      // 
+      this.clearSearchButton.BackColor = System.Drawing.Color.Transparent;
+      this.clearSearchButton.Cursor = System.Windows.Forms.Cursors.Default;
+      this.clearSearchButton.Dock = System.Windows.Forms.DockStyle.Right;
+      this.clearSearchButton.FlatAppearance.BorderSize = 0;
+      this.clearSearchButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+      this.clearSearchButton.ForeColor = System.Drawing.Color.Transparent;
+      this.clearSearchButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Delete;
+      this.clearSearchButton.Location = new System.Drawing.Point(543, 0);
+      this.clearSearchButton.Margin = new System.Windows.Forms.Padding(0);
+      this.clearSearchButton.Name = "clearSearchButton";
+      this.clearSearchButton.Size = new System.Drawing.Size(15, 16);
+      this.clearSearchButton.TabIndex = 0;
+      this.clearSearchButton.TabStop = false;
+      this.clearSearchButton.UseVisualStyleBackColor = false;
+      this.clearSearchButton.Click += new System.EventHandler(this.clearSearchButton_Click);
+      // 
+      // typeParametersGroupBox
+      // 
+      this.typeParametersGroupBox.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.typeParametersGroupBox.Controls.Add(this.setTypeParameterButton);
+      this.typeParametersGroupBox.Controls.Add(this.typeParametersListView);
+      this.typeParametersGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.typeParametersGroupBox.Name = "typeParametersGroupBox";
+      this.typeParametersGroupBox.Size = new System.Drawing.Size(219, 143);
+      this.typeParametersGroupBox.TabIndex = 0;
+      this.typeParametersGroupBox.TabStop = false;
+      this.typeParametersGroupBox.Text = "Type Parameters";
+      // 
+      // setTypeParameterButton
+      // 
+      this.setTypeParameterButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.setTypeParameterButton.Enabled = false;
+      this.setTypeParameterButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setTypeParameterButton.Location = new System.Drawing.Point(189, 19);
+      this.setTypeParameterButton.Name = "setTypeParameterButton";
+      this.setTypeParameterButton.Size = new System.Drawing.Size(24, 24);
+      this.setTypeParameterButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.setTypeParameterButton, "Set Type Parameter");
+      this.setTypeParameterButton.UseVisualStyleBackColor = true;
+      this.setTypeParameterButton.Click += new System.EventHandler(this.setTypeParameterButton_Click);
+      // 
+      // typeParametersListView
+      // 
+      this.typeParametersListView.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.typeParametersListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.typeParametersListView.FullRowSelect = true;
+      this.typeParametersListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.typeParametersListView.Location = new System.Drawing.Point(6, 19);
+      this.typeParametersListView.MultiSelect = false;
+      this.typeParametersListView.Name = "typeParametersListView";
+      this.typeParametersListView.ShowItemToolTips = true;
+      this.typeParametersListView.Size = new System.Drawing.Size(177, 118);
+      this.typeParametersListView.TabIndex = 0;
+      this.typeParametersListView.UseCompatibleStateImageBehavior = false;
+      this.typeParametersListView.View = System.Windows.Forms.View.Details;
+      this.typeParametersListView.SelectedIndexChanged += new System.EventHandler(this.typeParametersListView_SelectedIndexChanged);
+      this.typeParametersListView.DoubleClick += new System.EventHandler(this.typeParametersListView_DoubleClick);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.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.descriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(3, 3);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ReadOnly = true;
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(219, 114);
+      this.descriptionTextBox.TabIndex = 0;
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.expandToolStripMenuItem,
+            this.expandAllToolStripMenuItem,
+            this.collapseToolStripMenuItem,
+            this.collapseAllToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(137, 92);
+      // 
+      // expandToolStripMenuItem
+      // 
+      this.expandToolStripMenuItem.Name = "expandToolStripMenuItem";
+      this.expandToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.expandToolStripMenuItem.Text = "Expand";
+      this.expandToolStripMenuItem.Click += new System.EventHandler(this.expandToolStripMenuItem_Click);
+      // 
+      // expandAllToolStripMenuItem
+      // 
+      this.expandAllToolStripMenuItem.Name = "expandAllToolStripMenuItem";
+      this.expandAllToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.expandAllToolStripMenuItem.Text = "Expand All";
+      this.expandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click);
+      // 
+      // collapseToolStripMenuItem
+      // 
+      this.collapseToolStripMenuItem.Name = "collapseToolStripMenuItem";
+      this.collapseToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.collapseToolStripMenuItem.Text = "Collapse";
+      this.collapseToolStripMenuItem.Click += new System.EventHandler(this.collapseToolStripMenuItem_Click);
+      // 
+      // collapseAllToolStripMenuItem
+      // 
+      this.collapseAllToolStripMenuItem.Name = "collapseAllToolStripMenuItem";
+      this.collapseAllToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.collapseAllToolStripMenuItem.Text = "Collapse All";
+      this.collapseAllToolStripMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click);
+      // 
+      // TypeSelector
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.typesGroupBox);
+      this.Name = "TypeSelector";
+      this.Size = new System.Drawing.Size(231, 614);
+      this.typesGroupBox.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.Panel2.PerformLayout();
+      this.splitContainer.ResumeLayout(false);
+      this.typeParametersSplitContainer.Panel1.ResumeLayout(false);
+      this.typeParametersSplitContainer.Panel1.PerformLayout();
+      this.typeParametersSplitContainer.Panel2.ResumeLayout(false);
+      this.typeParametersSplitContainer.ResumeLayout(false);
+      this.typeParametersGroupBox.ResumeLayout(false);
+      this.contextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox typesGroupBox;
+    protected System.Windows.Forms.TextBox descriptionTextBox;
+    protected System.Windows.Forms.ImageList imageList;
+    protected System.Windows.Forms.TreeView typesTreeView;
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.Label searchLabel;
+    protected System.Windows.Forms.TextBox searchTextBox;
+    protected System.Windows.Forms.Button clearSearchButton;
+    protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    protected System.Windows.Forms.ToolStripMenuItem expandToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem expandAllToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem collapseToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem collapseAllToolStripMenuItem;
+    protected System.Windows.Forms.SplitContainer typeParametersSplitContainer;
+    protected System.Windows.Forms.GroupBox typeParametersGroupBox;
+    protected System.Windows.Forms.ListView typeParametersListView;
+    protected System.Windows.Forms.Button setTypeParameterButton;
+    protected System.Windows.Forms.ColumnHeader columnHeader1;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelector.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelector.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelector.cs	(revision 16770)
@@ -0,0 +1,478 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Drawing;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  public partial class TypeSelector : UserControl {
+    protected List<TreeNode> treeNodes;
+    protected string currentSearchString;
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    protected IEnumerable<Type> baseTypes;
+    public IEnumerable<Type> BaseTypes {
+      get { return baseTypes; }
+    }
+    protected bool showNotInstantiableTypes;
+    public bool ShowNotInstantiableTypes {
+      get { return showNotInstantiableTypes; }
+    }
+    protected bool showGenericTypes;
+    public bool ShowGenericTypes {
+      get { return showGenericTypes; }
+    }
+    public string Caption {
+      get { return typesGroupBox.Text; }
+      set {
+        if (InvokeRequired)
+          Invoke(new Action<string>(delegate(string s) { Caption = s; }), value);
+        else
+          typesGroupBox.Text = value;
+      }
+    }
+    public TreeView TypesTreeView {
+      get { return typesTreeView; }
+    }
+    protected Type selectedType;
+    public Type SelectedType {
+      get { return selectedType; }
+      private set {
+        if (value != selectedType) {
+          selectedType = value;
+          OnSelectedTypeChanged();
+        }
+      }
+    }
+
+    public TypeSelector() {
+      InitializeComponent();
+      treeNodes = new List<TreeNode>();
+      currentSearchString = string.Empty;
+      selectedType = null;
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    public virtual void Configure(Type baseType, bool showNotInstantiableTypes, bool showGenericTypes) {
+      Configure(baseType, showNotInstantiableTypes, showGenericTypes, (t) => true);
+    }
+
+    public virtual void Configure(Type baseType, bool showNotInstantiableTypes, bool showGenericTypes, Func<Type, bool> typeCondition) {
+      Configure(new List<Type>() { baseType }, showNotInstantiableTypes, showGenericTypes, true, typeCondition);
+    }
+
+    public virtual void Configure(IEnumerable<Type> baseTypes, bool showNotInstantiableTypes, bool showGenericTypes, bool assignableToAllTypes) {
+      Configure(baseTypes, showNotInstantiableTypes, showGenericTypes, assignableToAllTypes, (t) => { return true; });
+    }
+
+    public virtual void Configure(IEnumerable<Type> baseTypes, bool showNotInstantiableTypes, bool showGenericTypes, bool assignableToAllTypes, Func<Type, bool> typeCondition) {
+      if (baseTypes == null) throw new ArgumentNullException();
+      if (InvokeRequired)
+        Invoke(new Action<IEnumerable<Type>, bool, bool, bool, Func<Type, bool>>(Configure), baseTypes, showNotInstantiableTypes, showGenericTypes, assignableToAllTypes, typeCondition);
+      else {
+        this.baseTypes = baseTypes;
+        this.showNotInstantiableTypes = showNotInstantiableTypes;
+        this.showGenericTypes = showGenericTypes;
+        bool selectedTypeFound = false;
+
+        typeParametersSplitContainer.Panel2Collapsed = !showGenericTypes;
+
+        TreeNode selectedNode = typesTreeView.SelectedNode;
+        typesTreeView.Nodes.Clear();
+        treeNodes.Clear();
+
+        imageList.Images.Clear();
+        imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Class);      // default icon
+        imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Namespace);  // plugins
+        imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Interface);  // interfaces
+        imageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.Template);   // generic types
+        // additional dictionary for image indexes as imageList.ContainsKey and imageList.IndexOfKey are very slow!
+        var imageNames = new Dictionary<string, int>();
+
+        var plugins = from p in ApplicationManager.Manager.Plugins
+                      orderby p.Name, p.Version ascending
+                      select p;
+        foreach (IPluginDescription plugin in plugins) {
+          TreeNode pluginNode = new TreeNode();
+          pluginNode.Text = string.Format("{0} {1}.{2}", plugin.Name, plugin.Version.Major, plugin.Version.Minor);
+          pluginNode.ImageIndex = 1;
+          pluginNode.SelectedImageIndex = pluginNode.ImageIndex;
+          pluginNode.Tag = plugin;
+
+          var types = from t in ApplicationManager.Manager.GetTypes(BaseTypes, plugin, !ShowNotInstantiableTypes, ShowGenericTypes, assignableToAllTypes)
+                      where typeCondition(t)
+                      orderby t.Name ascending
+                      select t;
+          foreach (Type type in types) {
+            bool valid = (ShowNotInstantiableTypes || type.GetConstructor(Type.EmptyTypes) != null); //check for public default ctor
+            if (valid) {
+              TreeNode typeNode = new TreeNode();
+              string name = ItemAttribute.GetName(type);
+              typeNode.Text = name != null ? name : type.GetPrettyName();
+              typeNode.ImageIndex = 0;
+              if (type.IsInterface) typeNode.ImageIndex = 2;
+              else if (type.ContainsGenericParameters) typeNode.ImageIndex = 3;
+              else if (imageNames.ContainsKey(type.FullName)) typeNode.ImageIndex = imageNames[type.FullName];
+              else {
+                var image = ItemAttribute.GetImage(type);
+                if (image != null) {
+                  imageList.Images.Add(image);
+                  typeNode.ImageIndex = imageList.Images.Count - 1;
+                  imageNames.Add(type.FullName, imageList.Images.Count - 1);
+                }
+              }
+              typeNode.SelectedImageIndex = typeNode.ImageIndex;
+              typeNode.Tag = type;
+              pluginNode.Nodes.Add(typeNode);
+              if (type.Equals(selectedType)) selectedTypeFound = true;
+            }
+          }
+          if (pluginNode.Nodes.Count > 0)
+            treeNodes.Add(pluginNode);
+        }
+        if (!selectedTypeFound) SelectedType = null;
+        foreach (TreeNode node in treeNodes)
+          typesTreeView.Nodes.Add((TreeNode)node.Clone());
+        RestoreSelectedNode(selectedNode);
+        Filter(searchTextBox.Text);
+
+        UpdateTypeParameters();
+      }
+    }
+
+    public virtual void Filter(string searchString) {
+      if (InvokeRequired)
+        Invoke(new Action<string>(Filter), searchString);
+      else {
+        searchString = searchString.ToLower();
+        TreeNode selectedNode = typesTreeView.SelectedNode;
+
+        if (!searchString.Contains(currentSearchString)) {
+          typesTreeView.BeginUpdate();
+          // expand search -> restore all tree nodes
+          typesTreeView.Nodes.Clear();
+          foreach (TreeNode node in treeNodes)
+            typesTreeView.Nodes.Add((TreeNode)node.Clone());
+          typesTreeView.EndUpdate();
+        }
+
+        // remove nodes
+        typesTreeView.BeginUpdate();
+        var searchTokens = searchString.Split(' ');
+        int i = 0;
+        while (i < typesTreeView.Nodes.Count) {
+          var node = typesTreeView.Nodes[i];
+          bool remove = FilterNode(node, searchTokens);
+          if (remove)
+            typesTreeView.Nodes.RemoveAt(i);
+          else i++;
+        }
+        typesTreeView.EndUpdate();
+        currentSearchString = searchString;
+
+        // select first item
+        typesTreeView.BeginUpdate();
+        var firstNode = typesTreeView.Nodes.Count > 0 ? typesTreeView.Nodes[0] : null;
+        while (firstNode != null && !(firstNode.Tag is Type))
+          firstNode = firstNode.NextVisibleNode;
+        if (firstNode != null)
+          typesTreeView.SelectedNode = firstNode;
+
+        if (typesTreeView.Nodes.Count == 0) {
+          SelectedType = null;
+          typesTreeView.Enabled = false;
+        } else {
+          SetTreeNodeVisibility();
+          typesTreeView.Enabled = true;
+        }
+        typesTreeView.EndUpdate();
+
+        RestoreSelectedNode(selectedNode);
+        UpdateDescription();
+      }
+    }
+
+    private bool FilterNode(TreeNode node, string[] searchTokens) {
+      if (node.Tag is IPluginDescription) { // Plugin node
+        int i = 0;
+        while (i < node.Nodes.Count) {
+          bool remove = FilterNode(node.Nodes[i], searchTokens);
+          if (remove)
+            node.Nodes.RemoveAt(i);
+          else i++;
+        }
+        return node.Nodes.Count == 0;
+      }
+      if (node.Tag is Type) { // Type node
+        var text = node.Text;
+        if (searchTokens.Any(searchToken => !text.ToLower().Contains(searchToken))) {
+          var typeTag = (Type)node.Tag;
+          if (typeTag == SelectedType) {
+            SelectedType = null;
+            typesTreeView.SelectedNode = null;
+          }
+          return true;
+        }
+        return false;
+      }
+      throw new InvalidOperationException("Encountered neither a plugin nor a type node during tree traversal.");
+    }
+
+    public virtual object CreateInstanceOfSelectedType(params object[] args) {
+      if (SelectedType == null)
+        throw new InvalidOperationException("No type selected.");
+      else
+        return Activator.CreateInstance(SelectedType, args);
+    }
+
+    protected virtual void UpdateTypeParameters() {
+      typeParametersListView.Items.Clear();
+      if ((SelectedType == null) || !SelectedType.ContainsGenericParameters) {
+        typeParametersGroupBox.Enabled = false;
+        typeParametersSplitContainer.Panel2Collapsed = true;
+      } else {
+        typeParametersGroupBox.Enabled = true;
+        typeParametersSplitContainer.Panel2Collapsed = false;
+        setTypeParameterButton.Enabled = false;
+
+        foreach (Type param in SelectedType.GetGenericArguments()) {
+          if (param.IsGenericParameter) {
+            ListViewItem item = new ListViewItem();
+            item.Text = param.Name;
+
+            item.ToolTipText = "Constraints:";
+            Type[] constraints = param.GetGenericParameterConstraints();
+            if (constraints.Length == 0) {
+              item.ToolTipText += " none";
+            } else {
+              foreach (Type constraint in constraints)
+                item.ToolTipText += " " + constraint.GetPrettyName();
+            }
+
+            item.Tag = param;
+            typeParametersListView.Items.Add(item);
+          }
+        }
+        typeParametersListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+
+    protected virtual void SetTypeParameter() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Type of Generic Type Parameter";
+      }
+      Type param = typeParametersListView.SelectedItems[0].Tag as Type;
+      Type[] constraints = param.GetGenericParameterConstraints();
+      bool showNotInstantiableTypes = !param.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint);
+      typeSelectorDialog.TypeSelector.Configure(constraints, showNotInstantiableTypes, true, true);
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        Type selected = typeSelectorDialog.TypeSelector.SelectedType;
+        Type[] parameters = SelectedType.GetGenericArguments();
+        parameters[param.GenericParameterPosition] = selected;
+        SelectedType = SelectedType.GetGenericTypeDefinition().MakeGenericType(parameters);
+
+        typeParametersListView.SelectedItems[0].Text = param.Name + ": " + selected.GetPrettyName();
+        typeParametersListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+
+    protected virtual void UpdateDescription() {
+      descriptionTextBox.Text = string.Empty;
+
+      if (typesTreeView.SelectedNode != null) {
+        IPluginDescription plugin = typesTreeView.SelectedNode.Tag as IPluginDescription;
+        if (plugin != null) {
+          StringBuilder sb = new StringBuilder();
+          sb.Append("Plugin: ").Append(plugin.Name).Append(Environment.NewLine);
+          sb.Append("Version: ").Append(plugin.Version.ToString()).Append(Environment.NewLine);
+          descriptionTextBox.Text = sb.ToString();
+        }
+        Type type = typesTreeView.SelectedNode.Tag as Type;
+        if (type != null) {
+          string description = ItemAttribute.GetDescription(type);
+          if (description != null)
+            descriptionTextBox.Text = description;
+        }
+      } else if (typesTreeView.Nodes.Count == 0) {
+        descriptionTextBox.Text = "No types found";
+      }
+    }
+
+    #region Events
+    public event EventHandler SelectedTypeChanged;
+    protected virtual void OnSelectedTypeChanged() {
+      if (SelectedTypeChanged != null)
+        SelectedTypeChanged(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Control Events
+    protected virtual void searchTextBox_TextChanged(object sender, System.EventArgs e) {
+      Filter(searchTextBox.Text);
+    }
+
+    protected virtual void typesTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      if (typesTreeView.SelectedNode == null) SelectedType = null;
+      else SelectedType = typesTreeView.SelectedNode.Tag as Type;
+      UpdateTypeParameters();
+      UpdateDescription();
+    }
+    protected virtual void typesTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = (TreeNode)e.Item;
+      Type type = node.Tag as Type;
+      if ((type != null) && (!type.IsInterface) && (!type.IsAbstract) && (!type.HasElementType) && (!type.ContainsGenericParameters)) {
+        object o = Activator.CreateInstance(type);
+        DataObject data = new DataObject();
+        data.SetData(HeuristicLab.Common.Constants.DragDropDataFormat, o);
+        DoDragDrop(data, DragDropEffects.Copy);
+      }
+    }
+    protected virtual void typesTreeView_VisibleChanged(object sender, EventArgs e) {
+      if (Visible) SetTreeNodeVisibility();
+    }
+
+    protected virtual void typeParametersListView_SelectedIndexChanged(object sender, EventArgs e) {
+      setTypeParameterButton.Enabled = typeParametersListView.SelectedItems.Count == 1;
+    }
+    protected virtual void typeParametersListView_DoubleClick(object sender, EventArgs e) {
+      if (typeParametersListView.SelectedItems.Count == 1)
+        SetTypeParameter();
+    }
+
+    protected virtual void setTypeParameterButton_Click(object sender, EventArgs e) {
+      SetTypeParameter();
+    }
+    private void searchTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if (typesTreeView.Nodes.Count == 0)
+        return;
+
+      if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down) {
+        var selectedNode = typesTreeView.SelectedNode;
+
+        if (selectedNode == null) { // nothing selected => select first
+          if (e.KeyCode == Keys.Down) typesTreeView.SelectedNode = typesTreeView.Nodes.Count > 0 ? typesTreeView.Nodes[0] : null;
+        } else {
+          if (e.KeyCode == Keys.Down && selectedNode.NextVisibleNode != null)
+            typesTreeView.SelectedNode = selectedNode.NextVisibleNode;
+          if (e.KeyCode == Keys.Up && selectedNode.PrevVisibleNode != null)
+            typesTreeView.SelectedNode = selectedNode.PrevVisibleNode;
+        }
+        e.Handled = true;
+      }
+    }
+    private void clearSearchButton_Click(object sender, EventArgs e) {
+      searchTextBox.Text = string.Empty;
+      searchTextBox.Focus();
+    }
+
+    private TreeNode toolStripMenuNode = null;
+    private void typesTreeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button == MouseButtons.Right) {
+        Point coordinates = typesTreeView.PointToClient(Cursor.Position);
+        toolStripMenuNode = typesTreeView.GetNodeAt(coordinates);
+
+        if (toolStripMenuNode != null && coordinates.X >= toolStripMenuNode.Bounds.Left &&
+            coordinates.X <= toolStripMenuNode.Bounds.Right) {
+          typesTreeView.SelectedNode = toolStripMenuNode;
+
+          expandToolStripMenuItem.Enabled =
+            expandToolStripMenuItem.Visible = !toolStripMenuNode.IsExpanded && toolStripMenuNode.Nodes.Count > 0;
+          collapseToolStripMenuItem.Enabled = collapseToolStripMenuItem.Visible = toolStripMenuNode.IsExpanded;
+        } else {
+          expandToolStripMenuItem.Enabled = expandToolStripMenuItem.Visible = false;
+          collapseToolStripMenuItem.Enabled = collapseToolStripMenuItem.Visible = false;
+        }
+        expandAllToolStripMenuItem.Enabled =
+          expandAllToolStripMenuItem.Visible =
+            !typesTreeView.Nodes.OfType<TreeNode>().All(x => TreeNodeIsFullyExpanded(x));
+        collapseAllToolStripMenuItem.Enabled =
+          collapseAllToolStripMenuItem.Visible = typesTreeView.Nodes.OfType<TreeNode>().Any(x => x.IsExpanded);
+        if (contextMenuStrip.Items.Cast<ToolStripMenuItem>().Any(item => item.Enabled))
+          contextMenuStrip.Show(Cursor.Position);
+      }
+    }
+    private bool TreeNodeIsFullyExpanded(TreeNode node) {
+      return (node.Nodes.Count == 0) || (node.IsExpanded && node.Nodes.OfType<TreeNode>().All(x => TreeNodeIsFullyExpanded(x)));
+    }
+    private void expandToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      if (toolStripMenuNode != null) toolStripMenuNode.ExpandAll();
+      typesTreeView.EndUpdate();
+    }
+    private void expandAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      typesTreeView.ExpandAll();
+      typesTreeView.EndUpdate();
+    }
+    private void collapseToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      if (toolStripMenuNode != null) toolStripMenuNode.Collapse();
+      typesTreeView.EndUpdate();
+    }
+    private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e) {
+      typesTreeView.BeginUpdate();
+      typesTreeView.CollapseAll();
+      typesTreeView.EndUpdate();
+    }
+    #endregion
+
+    #region Helpers
+    private void RestoreSelectedNode(TreeNode selectedNode) {
+      if (selectedNode != null) {
+        foreach (TreeNode node in typesTreeView.Nodes) {
+          if (node.Text.Equals(selectedNode.Text)) typesTreeView.SelectedNode = node;
+          foreach (TreeNode child in node.Nodes) {
+            if ((child.Text.Equals(selectedNode.Text)) && (child.Tag == selectedNode.Tag))
+              typesTreeView.SelectedNode = child;
+          }
+        }
+        if (typesTreeView.SelectedNode == null) SelectedType = null;
+      }
+    }
+    private void SetTreeNodeVisibility() {
+      TreeNode selectedNode = typesTreeView.SelectedNode;
+      if (string.IsNullOrEmpty(currentSearchString) && (typesTreeView.Nodes.Count > 1)) {
+        typesTreeView.CollapseAll();
+        if (selectedNode != null) typesTreeView.SelectedNode = selectedNode;
+      } else {
+        typesTreeView.ExpandAll();
+      }
+      if (selectedNode != null) selectedNode.EnsureVisible();
+    }
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.Designer.cs	(revision 16770)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class TypeSelectorDialog {
+    /// <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 && (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.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.typeSelector = new HeuristicLab.Core.Views.TypeSelector();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(440, 538);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 1;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(521, 538);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 2;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // typeSelector
+      // 
+      this.typeSelector.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.typeSelector.Caption = "Available Types";
+      this.typeSelector.Location = new System.Drawing.Point(12, 12);
+      this.typeSelector.Name = "typeSelector";
+      this.typeSelector.Size = new System.Drawing.Size(584, 520);
+      this.typeSelector.TabIndex = 0;
+      this.typeSelector.SelectedTypeChanged += new System.EventHandler(this.typeSelector_SelectedTypeChanged);
+      // 
+      // TypeSelectorDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(608, 573);
+      this.Controls.Add(this.typeSelector);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "TypeSelectorDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Select Type";
+      this.Load += new System.EventHandler(this.TypeSelectorDialog_Load);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button okButton;
+    protected System.Windows.Forms.Button cancelButton;
+    protected TypeSelector typeSelector;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/TypeSelectorDialog.cs	(revision 16770)
@@ -0,0 +1,69 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// A dialog to select a specific type.
+  /// </summary>
+  public partial class TypeSelectorDialog : Form {
+    /// <summary>
+    /// Gets or sets the caption of the dialog.
+    /// </summary>
+    /// <remarks>Uses property <see cref="Form.Text"/> of base class <see cref="Form"/>.
+    /// No own data storage present.</remarks>
+    public string Caption {
+      get { return Text; }
+      set {
+        if (InvokeRequired)
+          Invoke(new Action<string>(delegate(string s) { Caption = s; }), value);
+        else
+          Text = value;
+      }
+    }
+    public TypeSelector TypeSelector {
+      get { return typeSelector; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ChooseTypeDialog"/>.
+    /// </summary>
+    public TypeSelectorDialog() {
+      InitializeComponent();
+      okButton.Enabled = typeSelector.SelectedType != null;
+    }
+
+    protected virtual void TypeSelectorDialog_Load(object sender, EventArgs e) {
+      this.typeSelector.TypesTreeView.DoubleClick += new System.EventHandler(TypesTreeView_DoubleClick);
+    }
+    protected virtual void typeSelector_SelectedTypeChanged(object sender, EventArgs e) {
+      okButton.Enabled = typeSelector.SelectedType != null;
+    }
+    protected virtual void TypesTreeView_DoubleClick(object sender, System.EventArgs e) {
+      if (typeSelector.SelectedType != null) {
+        DialogResult = DialogResult.OK;
+        Close();
+      }
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ValueParameterCollectionView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ValueParameterCollectionView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ValueParameterCollectionView.Designer.cs	(revision 16770)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class ValueParameterCollectionView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ValueParameterCollectionView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ValueParameterCollectionView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/ValueParameterCollectionView.cs	(revision 16770)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("ValueParameterCollection View")]
+  [Content(typeof(ValueParameterCollection), true)]
+  [Content(typeof(IKeyedItemCollection<string, IValueParameter>), false)]
+  public partial class ValueParameterCollectionView : NamedItemCollectionView<IValueParameter> {
+    protected CreateParameterDialog createParameterDialog;
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public ValueParameterCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Parameters";
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (createParameterDialog != null) createParameterDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override IValueParameter CreateItem() {
+      if (createParameterDialog == null) {
+        createParameterDialog = new CreateParameterDialog();
+        createParameterDialog.ParameterTypeSelector.Configure(typeof(IValueParameter), false, true);
+      }
+
+      if (createParameterDialog.ShowDialog(this) == DialogResult.OK) {
+        IValueParameter param = (IValueParameter)createParameterDialog.Parameter;
+        if ((param != null) && Content.ContainsKey(param.Name))
+          param = (IValueParameter)Activator.CreateInstance(param.GetType(), GetUniqueName(param.Name), param.Description);
+        return param;
+      }
+      return null;
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableCollectionView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableCollectionView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableCollectionView.Designer.cs	(revision 16770)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class VariableCollectionView {
+    /// <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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableCollectionView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableCollectionView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableCollectionView.cs	(revision 16770)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("VariableCollection View")]
+  [Content(typeof(VariableCollection), true)]
+  [Content(typeof(IKeyedItemCollection<string, IVariable>), false)]
+  public partial class VariableCollectionView : NamedItemCollectionView<IVariable> {
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public VariableCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Variables";
+    }
+
+    protected override IVariable CreateItem() {
+      IVariable item = new Variable();
+      item.Name = GetUniqueName(item.Name);
+      return item;
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableValueView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableValueView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableValueView.Designer.cs	(revision 16770)
@@ -0,0 +1,103 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class VariableValueView {
+    /// <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() {
+      this.components = new System.ComponentModel.Container();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.infoLabel = new System.Windows.Forms.Label();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // 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(0, 0);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(334, 274);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = true;
+      this.viewHost.ViewType = null;
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Information;
+      this.infoLabel.Location = new System.Drawing.Point(340, 3);
+      this.infoLabel.Name = "infoLabel";
+      this.infoLabel.Size = new System.Drawing.Size(16, 16);
+      this.infoLabel.TabIndex = 1;
+      this.toolTip.SetToolTip(this.infoLabel, "Double-click to open description editor.");
+      this.infoLabel.DoubleClick += new System.EventHandler(this.infoLabel_DoubleClick);
+      // 
+      // VariableValueView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.infoLabel);
+      this.Controls.Add(this.viewHost);
+      this.Name = "VariableValueView";
+      this.Size = new System.Drawing.Size(359, 274);
+      this.DragDrop += new System.Windows.Forms.DragEventHandler(this.VariableValueView_DragDrop);
+      this.DragEnter += new System.Windows.Forms.DragEventHandler(this.VariableValueView_DragEnterOver);
+      this.DragOver += new System.Windows.Forms.DragEventHandler(this.VariableValueView_DragEnterOver);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected MainForm.WindowsForms.ViewHost viewHost;
+    private System.Windows.Forms.Label infoLabel;
+    private System.Windows.Forms.ToolTip toolTip;
+
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableValueView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableValueView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableValueView.cs	(revision 16770)
@@ -0,0 +1,124 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Core.Views {
+  [View("Variable Value View")]
+  [Content(typeof(Variable), false)]
+  [Content(typeof(IVariable), false)]
+  public partial class VariableValueView : ItemView {
+    private const string infoLabelToolTipSuffix = "Double-click to open description editor.";
+
+    public new IVariable Content {
+      get { return (IVariable)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public VariableValueView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.NameChanged -= new EventHandler(Content_NameChanged);
+      Content.DescriptionChanged -= new EventHandler(Content_DescriptionChanged);
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.NameChanged += new EventHandler(Content_NameChanged);
+      Content.DescriptionChanged += new EventHandler(Content_DescriptionChanged);
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        viewHost.Content = null;
+        toolTip.SetToolTip(infoLabel, string.Empty);
+        if (ViewAttribute.HasViewAttribute(this.GetType()))
+          this.Caption = ViewAttribute.GetViewName(this.GetType());
+        else
+          this.Caption = "VariableValue View";
+      } else {
+        viewHost.ViewType = null;
+        viewHost.Content = Content.Value;
+        toolTip.SetToolTip(infoLabel, string.IsNullOrEmpty(Content.Description) ? infoLabelToolTipSuffix : Content.Description + Environment.NewLine + Environment.NewLine + infoLabelToolTipSuffix);
+        Caption = Content.Name;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      viewHost.Enabled = Content != null;
+      viewHost.ReadOnly = this.ReadOnly;
+      infoLabel.Enabled = Content != null;
+    }
+
+    protected virtual void Content_NameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_NameChanged), sender, e);
+      else
+        Caption = Content.Name;
+    }
+    protected virtual void Content_DescriptionChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_DescriptionChanged), sender, e);
+      else
+        toolTip.SetToolTip(infoLabel, string.IsNullOrEmpty(Content.Description) ? infoLabelToolTipSuffix : Content.Description + Environment.NewLine + Environment.NewLine + infoLabelToolTipSuffix);
+    }
+    protected virtual void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else {
+        viewHost.ViewType = null;
+        viewHost.Content = Content.Value;
+      }
+    }
+
+    protected virtual void VariableValueView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IItem)) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void VariableValueView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IItem item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IItem;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) item = (IItem)item.Clone();
+        Content.Value = item;
+      }
+    }
+    protected virtual void infoLabel_DoubleClick(object sender, EventArgs e) {
+      using (TextDialog dialog = new TextDialog("Description of " + Content.Name, Content.Description, ReadOnly || !Content.CanChangeDescription)) {
+        if (dialog.ShowDialog(this) == DialogResult.OK)
+          Content.Description = dialog.Content;
+      }
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableView.Designer.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableView.Designer.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableView.Designer.cs	(revision 16770)
@@ -0,0 +1,177 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Core.Views {
+  partial class VariableView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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() {
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.dataTypeTextBox = new System.Windows.Forms.TextBox();
+      this.valueGroupBox = new System.Windows.Forms.GroupBox();
+      this.valuePanel = new System.Windows.Forms.Panel();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.clearValueButton = new System.Windows.Forms.Button();
+      this.setValueButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.valueGroupBox.SuspendLayout();
+      this.valuePanel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(69, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(265, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(340, 3);
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 29);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(60, 13);
+      this.dataTypeLabel.TabIndex = 3;
+      this.dataTypeLabel.Text = "Data &Type:";
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTextBox.Location = new System.Drawing.Point(69, 26);
+      this.dataTypeTextBox.Name = "dataTypeTextBox";
+      this.dataTypeTextBox.ReadOnly = true;
+      this.dataTypeTextBox.Size = new System.Drawing.Size(290, 20);
+      this.dataTypeTextBox.TabIndex = 4;
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.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.valueGroupBox.Controls.Add(this.valuePanel);
+      this.valueGroupBox.Controls.Add(this.clearValueButton);
+      this.valueGroupBox.Controls.Add(this.setValueButton);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 52);
+      this.valueGroupBox.Name = "valueGroupBox";
+      this.valueGroupBox.Size = new System.Drawing.Size(359, 222);
+      this.valueGroupBox.TabIndex = 5;
+      this.valueGroupBox.TabStop = false;
+      this.valueGroupBox.Text = "Value";
+      // 
+      // valuePanel
+      // 
+      this.valuePanel.AllowDrop = true;
+      this.valuePanel.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.valuePanel.Controls.Add(this.viewHost);
+      this.valuePanel.Location = new System.Drawing.Point(6, 49);
+      this.valuePanel.Name = "valuePanel";
+      this.valuePanel.Size = new System.Drawing.Size(347, 167);
+      this.valuePanel.TabIndex = 2;
+      this.valuePanel.DragDrop += new System.Windows.Forms.DragEventHandler(this.valuePanel_DragDrop);
+      this.valuePanel.DragEnter += new System.Windows.Forms.DragEventHandler(this.valuePanel_DragEnterOver);
+      this.valuePanel.DragOver += new System.Windows.Forms.DragEventHandler(this.valuePanel_DragEnterOver);
+      // 
+      // viewHost
+      // 
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(0, 0);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(347, 167);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = true;
+      this.viewHost.ViewType = null;
+      // 
+      // clearValueButton
+      // 
+      this.clearValueButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearValueButton.Location = new System.Drawing.Point(36, 19);
+      this.clearValueButton.Name = "clearValueButton";
+      this.clearValueButton.Size = new System.Drawing.Size(24, 24);
+      this.clearValueButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.clearValueButton, "Clear Value");
+      this.clearValueButton.UseVisualStyleBackColor = true;
+      this.clearValueButton.Click += new System.EventHandler(this.clearValueButton_Click);
+      // 
+      // setValueButton
+      // 
+      this.setValueButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setValueButton.Location = new System.Drawing.Point(6, 19);
+      this.setValueButton.Name = "setValueButton";
+      this.setValueButton.Size = new System.Drawing.Size(24, 24);
+      this.setValueButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.setValueButton, "Set Value");
+      this.setValueButton.UseVisualStyleBackColor = true;
+      this.setValueButton.Click += new System.EventHandler(this.setValueButton_Click);
+      // 
+      // VariableView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.valueGroupBox);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.dataTypeTextBox);
+      this.Name = "VariableView";
+      this.Size = new System.Drawing.Size(359, 274);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.dataTypeTextBox, 0);
+      this.Controls.SetChildIndex(this.dataTypeLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.valueGroupBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.valueGroupBox.ResumeLayout(false);
+      this.valuePanel.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Label dataTypeLabel;
+    protected System.Windows.Forms.TextBox dataTypeTextBox;
+    protected System.Windows.Forms.GroupBox valueGroupBox;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost viewHost;
+    protected System.Windows.Forms.Button clearValueButton;
+    protected System.Windows.Forms.Button setValueButton;
+    protected System.Windows.Forms.Panel valuePanel;
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableView.cs
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableView.cs	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/VariableView.cs	(revision 16770)
@@ -0,0 +1,153 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="Variable"/>.
+  /// </summary>
+  [View("Variable View")]
+  [Content(typeof(Variable), true)]
+  [Content(typeof(IVariable), false)]
+  public partial class VariableView : NamedItemView {
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new IVariable Content {
+      get { return (IVariable)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableView"/> with caption "Variable".
+    /// </summary>
+    public VariableView() {
+      InitializeComponent();
+    }
+
+    /// <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 (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="Variable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="Variable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        dataTypeTextBox.Text = "-";
+        viewHost.Content = null;
+      } else {
+        dataTypeTextBox.Text = Content.Value == null ? "-" : Content.Value.GetType().GetPrettyName();
+        viewHost.ViewType = null;
+        viewHost.Content = Content.Value;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      dataTypeTextBox.Enabled = Content != null && Content.Value != null;
+      setValueButton.Enabled = Content != null && !ReadOnly;
+      clearValueButton.Enabled = Content != null && Content.Value != null && !ReadOnly;
+      valueGroupBox.Enabled = Content != null;
+    }
+
+    protected virtual void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else {
+        dataTypeTextBox.Text = Content.Value == null ? "-" : Content.Value.GetType().GetPrettyName();
+        dataTypeTextBox.Enabled = Content.Value != null;
+        clearValueButton.Enabled = Content.Value != null;
+        viewHost.ViewType = null;
+        viewHost.Content = Content.Value;
+      }
+    }
+
+    protected virtual void setValueButton_Click(object sender, EventArgs e) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Value";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IItem), false, true);
+      }
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.Value = (IItem)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    protected virtual void clearValueButton_Click(object sender, EventArgs e) {
+      Content.Value = null;
+    }
+    protected virtual void valuePanel_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IItem)) {
+        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
+        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void valuePanel_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IItem item = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IItem;
+        if (e.Effect.HasFlag(DragDropEffects.Copy)) item = (IItem)item.Clone();
+        Content.Value = item;
+      }
+    }
+  }
+}
Index: /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/app.config
===================================================================
--- /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/app.config	(revision 16770)
+++ /branches/2971_named_intervals/HeuristicLab.Core.Views/3.3/app.config	(revision 16770)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="HeuristicLab.Core.Views.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <userSettings>
+        <HeuristicLab.Core.Views.Properties.Settings>
+            <setting name="MaximumNestedControls" serializeAs="String">
+                <value>35</value>
+            </setting>
+        </HeuristicLab.Core.Views.Properties.Settings>
+    </userSettings>
+</configuration>
