Index: /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartControl.cs
===================================================================
--- /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartControl.cs	(revision 13761)
+++ /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartControl.cs	(revision 13762)
@@ -34,4 +34,7 @@
     protected bool RenderingRequired;
     protected Dictionary<Type, ChartMode> Modes = new Dictionary<Type, ChartMode>();
+    protected Stack<ChartMode> ModeStack = new Stack<ChartMode>();
+    protected List<ChartMode.Shortcut> Shortcuts = new List<ChartMode.Shortcut>();
+    protected ChartMode.Shortcut ActiveShortcut;
 
     protected bool SuppressEvents { get; set; }
@@ -88,9 +91,24 @@
 
     public void AddChartModes(params ChartMode[] chartModes) {
-      foreach (var chartMode in chartModes)
+      foreach (var chartMode in chartModes) {
         Modes.Add(chartMode.GetType(), chartMode);
+        foreach (var shortcut in chartMode.Shortcuts)
+          Shortcuts.Add(shortcut);
+      }
 
       ReloadModeToolBar();
       ReloadModeContextMenu();
+    }
+
+    public void SetTempChartMode(ChartMode chartMode) {
+      if (Mode == chartMode) return;
+
+      ModeStack.Push(mode);
+      Mode = chartMode;
+    }
+
+    public void ResetTempChartMode() {
+      if (ModeStack.Any())
+        Mode = ModeStack.Pop();
     }
 
@@ -203,11 +221,34 @@
 
     protected virtual void OnKeyDown(object sender, KeyEventArgs e) {
-      if (mode != null)
+      if (mode != null) {
         mode.HandleOnKeyDown(sender, e);
+
+        if (e.Handled || ActiveShortcut != null) return;
+
+        foreach (var shortcut in Shortcuts) {
+          if (e.KeyCode == shortcut.Key && e.Modifiers == shortcut.Modifiers) {
+            ActiveShortcut = shortcut;
+            shortcut.DownAction();
+            break;
+          }
+        }
+      }
     }
 
     protected virtual void OnKeyUp(object sender, KeyEventArgs e) {
-      if (mode != null)
+      if (mode != null) {
         mode.HandleOnKeyUp(sender, e);
+
+        if (e.Handled || ActiveShortcut == null) return;
+
+        var modifiers = new List<Keys>(from key in Enum.GetValues(typeof(Keys)).Cast<Keys>()
+                                       where e.Modifiers.HasFlag(key)
+                                       select key);
+
+        if (ActiveShortcut.Key == e.KeyCode || ActiveShortcut.GetModifiers().Except(modifiers).Any()) {
+          ActiveShortcut.UpAction();
+          ActiveShortcut = null;
+        }
+      }
     }
 
Index: /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartMode.cs
===================================================================
--- /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartMode.cs	(revision 13761)
+++ /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartMode.cs	(revision 13762)
@@ -21,5 +21,7 @@
 
 using System;
+using System.Collections.Generic;
 using System.Drawing;
+using System.Linq;
 using System.Windows.Forms;
 
@@ -27,4 +29,7 @@
   public abstract class ChartMode {
     protected readonly ChartControl chartControl;
+    protected readonly IList<Shortcut> globalShortcuts = new List<Shortcut>();
+    protected readonly IList<Shortcut> localShortcuts;
+    protected Shortcut activeShortcut = null;
     protected Cursor cursor;
     protected Point buttonDownPoint;
@@ -59,7 +64,12 @@
     }
 
+    public IEnumerable<Shortcut> Shortcuts { get { return globalShortcuts; } }
+
     protected ChartMode(ChartControl control) {
       chartControl = control;
       chartControl.ModeChanged += (sender, args) => Selected = chartControl.Mode == this;
+      localShortcuts = new List<Shortcut> {
+        new Shortcut(Keys.Escape) { DownAction = Deselect }
+      };
     }
 
@@ -71,12 +81,28 @@
 
     public virtual void HandleOnKeyDown(object sender, KeyEventArgs e) {
-      switch (e.KeyCode) {
-        case Keys.Escape:
-          Deselect();
+      if (activeShortcut != null) return;
+
+      foreach (var shortcut in localShortcuts) {
+        if (e.KeyCode == shortcut.Key && e.Modifiers == shortcut.Modifiers) {
+          activeShortcut = shortcut;
+          shortcut.DownAction();
           break;
+        }
       }
     }
 
-    public virtual void HandleOnKeyUp(object sender, KeyEventArgs e) { }
+    public virtual void HandleOnKeyUp(object sender, KeyEventArgs e) {
+      if (activeShortcut == null) return;
+
+      var modifiers = new List<Keys>(from key in Enum.GetValues(typeof(Keys)).Cast<Keys>()
+                                     where e.Modifiers.HasFlag(key)
+                                     select key);
+
+      if (activeShortcut.Key == e.KeyCode || activeShortcut.GetModifiers().Except(modifiers).Any()) {
+        activeShortcut.UpAction();
+        activeShortcut = null;
+      }
+    }
+
     public virtual void HandleOnMouseClick(object sender, MouseEventArgs e) { }
     public virtual void HandleOnMouseDoubleClick(object sender, MouseEventArgs e) { }
@@ -103,4 +129,23 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
+
+    public class Shortcut {
+      public Keys Key { get; private set; }
+      public Keys Modifiers { get; private set; }
+      public Action DownAction { get; set; }
+      public Action UpAction { get; set; }
+
+      public Shortcut(Keys key, Keys modifiers = Keys.None) {
+        Key = key;
+        Modifiers = modifiers;
+      }
+
+      public IEnumerable<Keys> GetModifiers() {
+        var keys = new List<Keys>(from key in Enum.GetValues(typeof(Keys)).Cast<Keys>()
+                                  where Modifiers.HasFlag(key)
+                                  select key);
+        return keys;
+      }
+    }
   }
 }
Index: /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/PanChartMode.cs
===================================================================
--- /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/PanChartMode.cs	(revision 13761)
+++ /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/PanChartMode.cs	(revision 13762)
@@ -33,5 +33,10 @@
     }
 
-    public PanChartMode(ChartControl control) : base(control) { }
+    public PanChartMode(ChartControl control) : base(control) {
+      globalShortcuts.Add(new Shortcut(Keys.Space) {
+        DownAction = () => chartControl.SetTempChartMode(this),
+        UpAction = () => chartControl.ResetTempChartMode()
+      });
+    }
 
     public override void HandleOnMouseMove(object sender, MouseEventArgs e) {
Index: /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/SelectChartMode.cs
===================================================================
--- /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/SelectChartMode.cs	(revision 13761)
+++ /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/SelectChartMode.cs	(revision 13762)
@@ -31,5 +31,7 @@
     public override string ToolTipText { get { return "Select"; } }
 
-    public SelectChartMode(ChartControl control) : base(control) { }
+    public SelectChartMode(ChartControl control) : base(control) {
+      localShortcuts.Add(new Shortcut(Keys.Delete) { DownAction = DeleteSelectedPrimitives });
+    }
 
     protected override void OnDeselected() {
@@ -41,20 +43,4 @@
         chartControl.ResumeRendering();
         base.OnDeselected();
-      }
-    }
-
-    public override void HandleOnKeyDown(object sender, KeyEventArgs e) {
-      try {
-        switch (e.KeyCode) {
-          case Keys.Delete:
-            try {
-              chartControl.SuspendRendering();
-              foreach (var p in chartControl.Chart.Group.SelectedPrimitives)
-                chartControl.Chart.Group.Remove(p);
-            } finally { chartControl.ResumeRendering(); }
-            break;
-        }
-      } finally {
-        base.HandleOnKeyDown(sender, e);
       }
     }
@@ -100,4 +86,12 @@
       }
     }
+
+    protected virtual void DeleteSelectedPrimitives() {
+      try {
+        chartControl.SuspendRendering();
+        foreach (var p in chartControl.Chart.Group.SelectedPrimitives)
+          chartControl.Chart.Group.Remove(p);
+      } finally { chartControl.ResumeRendering(); }
+    }
   }
 }
Index: /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomInChartMode.cs
===================================================================
--- /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomInChartMode.cs	(revision 13761)
+++ /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomInChartMode.cs	(revision 13762)
@@ -35,5 +35,10 @@
     }
 
-    public ZoomInChartMode(ChartControl control) : base(control) { }
+    public ZoomInChartMode(ChartControl control) : base(control) {
+      globalShortcuts.Add(new Shortcut(Keys.Z, Keys.Control) {
+        DownAction = () => chartControl.SetTempChartMode(this),
+        UpAction = () => chartControl.ResetTempChartMode()
+      });
+    }
 
     public override void HandleOnMouseUp(object sender, MouseEventArgs e) {
Index: /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomOutChartMode.cs
===================================================================
--- /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomOutChartMode.cs	(revision 13761)
+++ /branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomOutChartMode.cs	(revision 13762)
@@ -33,5 +33,10 @@
     }
 
-    public ZoomOutChartMode(ChartControl control) : base(control) { }
+    public ZoomOutChartMode(ChartControl control) : base(control) {
+      globalShortcuts.Add(new Shortcut(Keys.Z, Keys.Control | Keys.Shift) {
+        DownAction = () => chartControl.SetTempChartMode(this),
+        UpAction = () => chartControl.ResetTempChartMode()
+      });
+    }
 
     public override void HandleOnMouseUp(object sender, MouseEventArgs e) {
