diff --git a/scribus/canvasmode_normal.cpp b/scribus/canvasmode_normal.cpp
index 12c857552..b7151f1dd 100644
--- a/scribus/canvasmode_normal.cpp
+++ b/scribus/canvasmode_normal.cpp
@@ -33,6 +33,7 @@
 #include <QDebug>
 
 #include "appmodes.h"
+#include "actionmanager.h"
 #include "canvas.h"
 #include "canvasgesture_linemove.h"
 #include "canvasgesture_resize.h"
@@ -1536,9 +1537,120 @@ void CanvasMode_Normal::handleMouseEnter(PageItem* currItem)
 		handleJavaAction(currItem, Annotation::Java_EnterWidget);
 }
 
+/**
+ * - Process ESC
+ * - Process actions defined in the actionManager
+ * - Process the context menu
+ * - Process key presses that do not depend on an item being selected
+ * - Process key presses for actions with no items selected
+ * - Process key presses for actions with items selected
+ */
 void CanvasMode_Normal::keyPressEvent(QKeyEvent *e)
 {
-	commonkeyPressEvent_NormalNodeEdit(e);
+	// if we are not changing the page or zoom level in the status bar
+	if (m_view->m_ScMW->zoomSpinBox->hasFocus() || m_view->m_ScMW->pageSelector->hasFocus())
+		return;
+
+	if (m_keyRepeat)
+		return;
+	m_keyRepeat = true;
+
+	int kk = e->key();
+	Qt::KeyboardModifiers modifiers = e->modifiers();
+	ScribusMainWindow* mainWindow = m_view->m_ScMW;
+
+	if (kk == Qt::Key_Escape)
+	{
+		keyPressEscape();
+		m_keyRepeat = false;
+		return;
+	}
+
+	{
+		auto actionManager = m_view->m_ScMW->actionManager;
+
+		if (actionManager->compareKeySeqToShortcut(kk, e->modifiers(), "toolsZoomIn"))
+		{
+			mainWindow->scrActions["toolsZoomIn"]->trigger();
+			m_keyRepeat = false;
+			return;
+		}
+		if (actionManager->compareKeySeqToShortcut(kk, e->modifiers(), "toolsZoomOut"))
+		{
+			mainWindow->scrActions["toolsZoomOut"]->trigger();
+			m_keyRepeat = false;
+			return;
+		}
+		if (actionManager->compareKeySeqToShortcut(kk, e->modifiers(), "viewShowContextMenu"))
+		{
+			keyPressContextMenu();
+			m_keyRepeat = false;
+			return;
+		}
+	}
+
+	/**
+	 * We can always
+	 * - scroll with PageUp / PageDown
+	 */
+	switch (kk)
+	{
+		case Qt::Key_PageUp:
+		case Qt::Key_PageDown:
+			keyPressMovePageCanvas(modifiers, kk);
+			m_keyRepeat = false;
+			return;
+	}
+
+	/**
+	 * With no item selected we can:
+	 * - With space, get into panning mode (modePanning)
+	 */
+	if (m_doc->m_Selection->isEmpty())
+	{
+		switch (kk)
+		{
+			case Qt::Key_Space:
+				if (m_doc->appMode == modePanning)
+					m_view->requestMode(modeNormal);
+				else
+					m_view->requestMode(modePanning);
+				m_keyRepeat = false;
+				return;
+			case Qt::Key_Left:
+			case Qt::Key_Right:
+			case Qt::Key_Up:
+			case Qt::Key_Down:
+				keyPressMoveCanvas(modifiers, kk);
+				m_arrowKeyDown = true;
+				m_keyRepeat = false;
+				return;
+		}
+	}
+	else
+	{
+		switch (kk)
+		{
+			case Qt::Key_Delete:
+			case Qt::Key_Backspace:
+				if (modifiers == Qt::NoModifier)
+					m_doc->itemSelection_DeleteItem();
+				m_keyRepeat = false;
+				return;
+			case Qt::Key_Left:
+			case Qt::Key_Right:
+			case Qt::Key_Up:
+			case Qt::Key_Down:
+				if (modifiers & Qt::AltModifier)
+					keyPressResizeItem(modifiers, kk);
+				else
+					keyPressMoveItem(modifiers, kk);
+				m_arrowKeyDown = true;
+				m_keyRepeat = false;
+				return;
+		}
+	}
+	m_keyRepeat = false;
 }
 
 void CanvasMode_Normal::keyReleaseEvent(QKeyEvent *e)
