Index: stable/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.cs
===================================================================
--- stable/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.cs	(revision 17143)
+++ stable/HeuristicLab.Core.Views/3.3/CheckedItemCollectionView.cs	(revision 17147)
@@ -34,4 +34,6 @@
   [Content(typeof(ReadOnlyCheckedItemCollection<>), true)]
   public partial class CheckedItemCollectionView<T> : ItemCollectionView<T> where T : class, IItem {
+    private bool suppressCheckedEvents;
+
     public new ICheckedItemCollection<T> Content {
       get { return (ICheckedItemCollection<T>)base.Content; }
@@ -82,17 +84,24 @@
       if (doubleClick) {
         e.NewValue = e.CurrentValue;
-        doubleClick = false;
       } else {
+        bool check = e.NewValue == CheckState.Checked;
         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;
-        }
+        if (Content.ItemChecked(checkedItem) == check) return;
+
+        suppressCheckedEvents = true;
+        try {
+          if (itemsListView.SelectedIndices.Count > 1
+            && itemsListView.SelectedIndices.Contains(e.Index)) {
+            if (!ReadOnly && !Locked) Content.SetItemCheckedState(itemsListView.SelectedItems.Cast<ListViewItem>().Select(x => (T)x.Tag), check);
+            else e.NewValue = e.CurrentValue;
+          } else {
+            if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
+            else e.NewValue = e.CurrentValue;
+          }
+        } finally { suppressCheckedEvents = false; }
       }
     }
-    protected void itemsListView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
-      if (e.Clicks > 1)
-        doubleClick = true;
+    protected void itemsListView_MouseDown(object sender, MouseEventArgs e) {
+      doubleClick = e.Clicks > 1;
     }
     #endregion
@@ -103,5 +112,5 @@
         Invoke(new CollectionItemsChangedEventHandler<T>(Content_CheckedItemsChanged), sender, e);
       else {
-        UpdateCheckedItemState(e.Items);
+        if (!suppressCheckedEvents) UpdateCheckedItemState(e.Items);
         SetNumberOfCheckItems();
       }
@@ -130,11 +139,14 @@
 
     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;
+      itemsListView.BeginUpdate();
+      try {
+        foreach (T item in items) {
+          foreach (ListViewItem listViewItem in GetListViewItemsForItem(item)) {
+            var isChecked = Content.ItemChecked(item);
+            if (listViewItem.Checked != isChecked)
+              listViewItem.Checked = isChecked;
+          }
         }
-      }
+      } finally { itemsListView.EndUpdate(); itemsListView.Refresh(); }
     }
   }
Index: stable/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs
===================================================================
--- stable/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs	(revision 17143)
+++ stable/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs	(revision 17147)
@@ -37,4 +37,6 @@
   [Content(typeof(ReadOnlyCheckedItemList<>), true)]
   public partial class CheckedItemListView<T> : ItemListView<T> where T : class, IItem {
+    private bool suppressCheckedEvents;
+
     public new ICheckedItemList<T> Content {
       get { return (ICheckedItemList<T>)base.Content; }
@@ -84,18 +86,25 @@
       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;
-        }
+        if (Content.ItemChecked(e.Index) == check) return;
+
+        suppressCheckedEvents = true;
+        try {
+          if (itemsListView.SelectedIndices.Count > 1
+            && itemsListView.SelectedIndices.Contains(e.Index)) {
+            if (!ReadOnly && !Locked) Content.SetItemCheckedState(itemsListView.SelectedIndices.Cast<int>(), check);
+            else e.NewValue = e.CurrentValue;
+          } else {
+            var checkedItem = (T)itemsListView.Items[e.Index].Tag;
+            if (!ReadOnly && !Locked) Content.SetItemCheckedState(checkedItem, check);
+            else e.NewValue = e.CurrentValue;
+          }
+        } finally { suppressCheckedEvents = false; }
       }
     }
 
     protected void itemsListView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
-      if (e.Clicks > 1)
-        doubleClick = true;
+      doubleClick = e.Clicks > 1;
     }
 
@@ -139,5 +148,5 @@
         Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CheckedItemsChanged), sender, e);
       else {
-        UpdateCheckedItemState(e.Items);
+        if (!suppressCheckedEvents) UpdateCheckedItemState(e.Items);
         SetNumberOfCheckItems();
       }
@@ -175,9 +184,12 @@
 
     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;
-      }
+      itemsListView.BeginUpdate();
+      try {
+        foreach (var item in items) {
+          var isChecked = Content.ItemChecked(item.Value);
+          if (itemsListView.Items[item.Index].Checked != isChecked)
+            itemsListView.Items[item.Index].Checked = isChecked;
+        }
+      } finally { itemsListView.EndUpdate(); itemsListView.Refresh(); }
     }
   }
Index: stable/HeuristicLab.Core/3.3/Collections/CheckedItemCollection.cs
===================================================================
--- stable/HeuristicLab.Core/3.3/Collections/CheckedItemCollection.cs	(revision 17143)
+++ stable/HeuristicLab.Core/3.3/Collections/CheckedItemCollection.cs	(revision 17147)
@@ -23,7 +23,7 @@
 using System.Collections.Generic;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
-using HEAL.Attic;
 
 namespace HeuristicLab.Core {
@@ -108,4 +108,21 @@
 
     /// <summary>
+    /// Sets the checked state of <paramref name="items"/> to <paramref name="checkedState"/>.
+    /// </summary>
+    /// <param name="items">The items to set the checked state for.</param>
+    /// <param name="checkedState">The new checked state of <paramref name="item"/></param>
+    public void SetItemCheckedState(IEnumerable<T> items, bool checkedState) {
+      var changed = new List<T>();
+      foreach (var item in items) {
+        if (!this.checkedState.TryGetValue(item, out bool currentState)) throw new ArgumentException();
+        if (currentState != checkedState) {
+          this.checkedState[item] = checkedState;
+          changed.Add(item);
+        }
+      }
+      if (changed.Count > 0) OnCheckedItemsChanged(changed);
+    }
+
+    /// <summary>
     /// Adds a new <paramref name="item"/> with the given <paramref name="checkedState"/>.
     /// </summary>
Index: stable/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs
===================================================================
--- stable/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs	(revision 17143)
+++ stable/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs	(revision 17147)
@@ -23,7 +23,7 @@
 using System.Collections.Generic;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
-using HEAL.Attic;
 
 namespace HeuristicLab.Core {
@@ -111,12 +111,31 @@
     /// Sets the checked state of <paramref name="item"/> to <paramref name="checkedState"/>.
     /// </summary>
+    /// <remarks>
+    /// This method is slower than <see cref="SetItemCheckedState(int, bool)"/>.
+    /// </remarks>
     /// <param name="item">The item to set the checked state for.</param>
     /// <param name="checkedState">The new checked state of <paramref name="item"/></param>
     public void SetItemCheckedState(T item, bool checkedState) {
-      if (!this.checkedState.ContainsKey(item)) throw new ArgumentException();
-      if (this.checkedState[item] != checkedState) {
-        this.checkedState[item] = checkedState;
-        OnCheckedItemsChanged(new IndexedItem<T>[] { new IndexedItem<T>(IndexOf(item), item) });
-      }
+      SetItemCheckedState(IndexOf(item), checkedState);
+    }
+
+    /// <summary>
+    /// Sets the checked state of <paramref name="items"/> to <paramref name="checkedState"/>.
+    /// </summary>
+    /// <remarks>
+    /// This method is slower than <see cref="SetItemCheckedState(IEnumerable{int}, bool)"/>.
+    /// </remarks>
+    /// <param name="items">The items to set the checked state for.</param>
+    /// <param name="checkedState">The new checked state of <paramref name="item"/></param>
+    public void SetItemCheckedState(IEnumerable<T> items, bool checkedState) {
+      var changed = new List<IndexedItem<T>>();
+      foreach (var item in items) {
+        if (!this.checkedState.TryGetValue(item, out bool currentState)) throw new ArgumentException();
+        if (currentState != checkedState) {
+          this.checkedState[item] = checkedState;
+          changed.Add(new IndexedItem<T>(IndexOf(item), item));
+        }
+      }
+      if (changed.Count > 0) OnCheckedItemsChanged(changed);
     }
 
@@ -127,5 +146,28 @@
     /// <param name="checkedState">The new checked state of the item.</param>
     public void SetItemCheckedState(int itemIndex, bool checkedState) {
-      SetItemCheckedState(this[itemIndex], checkedState);
+      var item = list[itemIndex];
+      if (!this.checkedState.TryGetValue(item, out bool currentState)) throw new ArgumentException();
+      if (currentState != checkedState) {
+        this.checkedState[item] = checkedState;
+        OnCheckedItemsChanged(new IndexedItem<T>[] { new IndexedItem<T>(itemIndex, item) });
+      }
+    }
+
+    /// <summary>
+    /// Sets the checked state of all <paramref name="itemIndices"/> to <paramref name="checkedState"/>.
+    /// </summary>
+    /// <param name="itemIndices">The indices of all items to set the checked state for.</param>
+    /// <param name="checkedState">The new checked state of the item.</param>
+    public void SetItemCheckedState(IEnumerable<int> itemIndices, bool checkedState) {
+      var changed = new List<IndexedItem<T>>();
+      foreach (var index in itemIndices) {
+        var item = list[index];
+        if (!this.checkedState.TryGetValue(item, out bool currentState)) throw new ArgumentException();
+        if (currentState != checkedState) {
+          this.checkedState[item] = checkedState;
+          changed.Add(new IndexedItem<T>(index, item));
+        }
+      }
+      if (changed.Count > 0) OnCheckedItemsChanged(changed);
     }
 
Index: stable/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemCollection.cs
===================================================================
--- stable/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemCollection.cs	(revision 17143)
+++ stable/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemCollection.cs	(revision 17147)
@@ -22,7 +22,7 @@
 using System;
 using System.Collections.Generic;
+using HEAL.Attic;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
-using HEAL.Attic;
 
 namespace HeuristicLab.Core {
@@ -75,4 +75,8 @@
     }
 
+    public void SetItemCheckedState(IEnumerable<T> items, bool checkedState) {
+      CheckedItemCollection.SetItemCheckedState(items, checkedState);
+    }
+
     public void Add(T item, bool checkedState) {
       throw new NotSupportedException();
Index: stable/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemList.cs
===================================================================
--- stable/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemList.cs	(revision 17143)
+++ stable/HeuristicLab.Core/3.3/Collections/ReadOnlyCheckedItemList.cs	(revision 17147)
@@ -22,7 +22,7 @@
 using System;
 using System.Collections.Generic;
+using HEAL.Attic;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
-using HEAL.Attic;
 
 namespace HeuristicLab.Core {
@@ -72,6 +72,22 @@
     }
 
+    public bool ItemChecked(int itemIndex) {
+      return CheckedItemList.ItemChecked(itemIndex);
+    }
+
     public void SetItemCheckedState(T item, bool checkedState) {
       CheckedItemList.SetItemCheckedState(item, checkedState);
+    }
+
+    public void SetItemCheckedState(IEnumerable<T> items, bool checkedState) {
+      CheckedItemList.SetItemCheckedState(items, checkedState);
+    }
+
+    public void SetItemCheckedState(int itemIndex, bool checkedState) {
+      CheckedItemList.SetItemCheckedState(itemIndex, checkedState);
+    }
+
+    public void SetItemCheckedState(IEnumerable<int> itemIndices, bool checkedState) {
+      CheckedItemList.SetItemCheckedState(itemIndices, checkedState);
     }
 
Index: stable/HeuristicLab.Core/3.3/Interfaces/ICheckedItemCollection.cs
===================================================================
--- stable/HeuristicLab.Core/3.3/Interfaces/ICheckedItemCollection.cs	(revision 17143)
+++ stable/HeuristicLab.Core/3.3/Interfaces/ICheckedItemCollection.cs	(revision 17147)
@@ -21,6 +21,6 @@
 
 using System.Collections.Generic;
+using HEAL.Attic;
 using HeuristicLab.Collections;
-using HEAL.Attic;
 
 namespace HeuristicLab.Core {
@@ -31,4 +31,5 @@
     bool ItemChecked(T item);
     void SetItemCheckedState(T item, bool checkedState);
+    void SetItemCheckedState(IEnumerable<T> item, bool checkedState);
     void Add(T item, bool checkedState);
   }
Index: stable/HeuristicLab.Core/3.3/Interfaces/ICheckedItemList.cs
===================================================================
--- stable/HeuristicLab.Core/3.3/Interfaces/ICheckedItemList.cs	(revision 17143)
+++ stable/HeuristicLab.Core/3.3/Interfaces/ICheckedItemList.cs	(revision 17147)
@@ -21,6 +21,6 @@
 
 using System.Collections.Generic;
+using HEAL.Attic;
 using HeuristicLab.Collections;
-using HEAL.Attic;
 
 namespace HeuristicLab.Core {
@@ -30,5 +30,9 @@
     IEnumerable<IndexedItem<T>> CheckedItems { get; }
     bool ItemChecked(T item);
+    bool ItemChecked(int itemIndex);
     void SetItemCheckedState(T item, bool checkedState);
+    void SetItemCheckedState(IEnumerable<T> items, bool checkedState);
+    void SetItemCheckedState(int itemIndex, bool checkedState);
+    void SetItemCheckedState(IEnumerable<int> itemIndices, bool checkedState);
     void Add(T item, bool checkedState);
     void Insert(int index, T item, bool checkedState);
