diff --git a/Scribus/scribus/pageitem.cpp b/Scribus/scribus/pageitem.cpp
index 8f6c499..b0d827c 100644
--- a/Scribus/scribus/pageitem.cpp
+++ b/Scribus/scribus/pageitem.cpp
@@ -4635,6 +4635,8 @@ void PageItem::restore(UndoState *state, bool isUndo)
 	m_Doc->setMasterPageMode(oldMPMode);
 	m_Doc->useRaster = useRasterBackup;
 	m_Doc->SnapGuides = SnapGuidesBackup;
+	if(!doc()->view()->visibleCanvas().contains(xPos(),yPos()))
+		doc()->view()->setCanvasOrigin(xPos(),yPos());
 }
 
 void PageItem::restorePasteInline(SimpleState *is, bool isUndo)
diff --git a/Scribus/scribus/pageitem_latexframe.cpp b/Scribus/scribus/pageitem_latexframe.cpp
index 4b43f1b..7be5669 100644
--- a/Scribus/scribus/pageitem_latexframe.cpp
+++ b/Scribus/scribus/pageitem_latexframe.cpp
@@ -508,6 +508,8 @@ void PageItem_LatexFrame::killProcess()
 
 void PageItem_LatexFrame::restore(UndoState *state, bool isUndo)
 {
+	if(!doc()->view()->visibleCanvas().contains(xPos(),yPos()))
+		doc()->view()->setCanvasOrigin(xPos(),yPos());
 	SimpleState *ss = dynamic_cast<SimpleState*>(state);
 	if (!ss) {
 		PageItem_ImageFrame::restore(state, isUndo);
diff --git a/Scribus/scribus/scpage.cpp b/Scribus/scribus/scpage.cpp
index 5254420..84e8c83 100644
--- a/Scribus/scribus/scpage.cpp
+++ b/Scribus/scribus/scpage.cpp
@@ -94,6 +94,8 @@ void ScPage::setPageName(const QString& newName)
 
 void ScPage::restore(UndoState* state, bool isUndo)
 {
+	if(doc()->currentPageNumber() != pageNr())
+		doc()->view()->GotoPage(pageNr());
 	SimpleState* ss = dynamic_cast<SimpleState*>(state);
 	if (ss)
 	{
@@ -311,6 +313,8 @@ void ScPage::restorePageItemCreation(ScItemState<PageItem*> *state, bool isUndo)
 		return;
 	int stateCode = state->transactionCode;
 	PageItem *ite = state->getItem();
+	if(!doc()->view()->visibleCanvas().contains(ite->xPos(),ite->yPos()))
+		doc()->view()->setCanvasOrigin(ite->xPos(),ite->yPos());
 	bool oldMPMode=m_Doc->masterPageMode();
 	if ((stateCode == 0) || (stateCode == 1))
 	{
@@ -351,6 +355,8 @@ void ScPage::restorePageItemDeletion(ScItemState< QList<PageItem*> > *state, boo
 	if (!state)
 		return;
 	QList<PageItem*> itemList = state->getItem();
+	if(!doc()->view()->visibleCanvas().contains(itemList.at(0)->xPos(),itemList.at(0)->yPos()))
+		doc()->view()->setCanvasOrigin(itemList.at(0)->xPos(),itemList.at(0)->yPos());
 	int id = state->getInt("ITEMID");
 	int id2 = state->getInt("ID");
 	if (itemList.count() <= 0) 
@@ -404,10 +410,14 @@ void ScPage::restorePageItemConversion(ScItemState<std::pair<PageItem*, PageItem
 		m_Doc->Items->replace(m_Doc->Items->indexOf(newItem), oldItem);
 		oldItem->updatePolyClip();
 		m_Doc->AdjustItemSize(oldItem);
+		if(!doc()->view()->visibleCanvas().contains(oldItem->xPos(),oldItem->yPos()))
+			doc()->view()->setCanvasOrigin(oldItem->xPos(),oldItem->yPos());
 	}
 	else
 	{
 		m_Doc->Items->replace(m_Doc->Items->indexOf(oldItem), newItem);
+		if(!doc()->view()->visibleCanvas().contains(newItem->xPos(),newItem->yPos()))
+			doc()->view()->setCanvasOrigin(newItem->xPos(),newItem->yPos());
 	}
 	m_Doc->setMasterPageMode(oldMPMode);
 }
diff --git a/Scribus/scribus/scribus.cpp b/Scribus/scribus/scribus.cpp
index ecf6a82..863ee01 100644
--- a/Scribus/scribus/scribus.cpp
+++ b/Scribus/scribus/scribus.cpp
@@ -8917,9 +8917,13 @@ void ScribusMainWindow::restoreDeletePage(SimpleState *state, bool isUndo)
 		UndoObject *tmp =
 			undoManager->replaceObject(state->getUInt("DUMMY_ID"), doc->Pages->at(pagenr - 1));
 		delete tmp;
+		if(doc->currentPageNumber() != (pagenr -1))
+			view->GotoPage(pagenr-1);
 	}
 	else
 	{
+		if(doc->currentPageNumber() != (pagenr-1))
+			view->GotoPage(pagenr-1);
 		DummyUndoObject *duo = new DummyUndoObject();
 		uint id = static_cast<uint>(duo->getUId());
 		undoManager->replaceObject(doc->Pages->at(pagenr - 1)->getUId(), duo);
@@ -8973,6 +8977,8 @@ void ScribusMainWindow::restoreAddPage(SimpleState *state, bool isUndo)
 	}
 	if (isUndo)
 	{
+		if(doc->currentPageNumber() != delFrom)
+			view->GotoPage(delFrom);
 		for (int i = delFrom - 1; i < delTo; ++i)
 		{
 			DummyUndoObject *duo = new DummyUndoObject();
@@ -9002,6 +9008,8 @@ void ScribusMainWindow::restoreAddPage(SimpleState *state, bool isUndo)
 					state->getUInt(QString("Page%1").arg(i)), doc->Pages->at(i));
 			delete tmp;
 		}
+		if(doc->currentPageNumber() != (delFrom-1))
+			view->GotoPage(delFrom-1);
 	}
 }
 
diff --git a/Scribus/scribus/scribusdoc.cpp b/Scribus/scribus/scribusdoc.cpp
index a957538..3d5ec14 100644
--- a/Scribus/scribus/scribusdoc.cpp
+++ b/Scribus/scribus/scribusdoc.cpp
@@ -2375,9 +2375,14 @@ void ScribusDoc::restoreMovePage(SimpleState *state, bool isUndo)
 		}
 		newPageTo=newPageFrom+pagesMoved;
 		movePage(newPageFrom, newPageTo, newPageDest, newPosition);
+		if(currentPageNumber() != newPageDest)
+			view()->GotoPage(newPageDest);
 	}
-	else
+	else {
 		movePage(fromPage, toPage, dest, position);
+		if(currentPageNumber() != dest)
+			view()->GotoPage(dest);
+	}
 }
 
 
@@ -4338,6 +4343,8 @@ void ScribusDoc::restoreMasterPageApplying(SimpleState *state, bool isUndo)
 		applyMasterPage(oldName, pageNumber);
 	else
 		applyMasterPage(newName, pageNumber);
+	if(currentPageNumber() != pageNumber)
+		view()->GotoPage(pageNumber);
 }
 
 
@@ -4367,7 +4374,8 @@ void ScribusDoc::restoreCopyPage(SimpleState *state, bool isUndo)
 		if(m_ScMW->outlinePalette->isVisible())
 			m_ScMW->outlinePalette->BuildTree();
 	}
-
+	if(currentPageNumber() != pnum)
+		view()->GotoPage(pnum);
 }
 
 
diff --git a/Scribus/scribus/undogui.cpp b/Scribus/scribus/undogui.cpp
index 49b6f87..4e34b2b 100644
--- a/Scribus/scribus/undogui.cpp
+++ b/Scribus/scribus/undogui.cpp
@@ -189,7 +189,7 @@ void UndoWidget::updateUndoActions()
 
 void UndoWidget::updateUndo(int steps)
 {
-	for (int i = 0; i < steps; ++i)
+	for (int i = 0; i < steps && undoItems.size() > 0; ++i)
 	{
 		redoItems.insert(redoItems.begin(), undoItems[0]);
 		undoItems.erase(undoItems.begin());
@@ -200,7 +200,7 @@ void UndoWidget::updateUndo(int steps)
 
 void UndoWidget::updateRedo(int steps)
 {
-	for (int i = 0; i < steps; ++i)
+	for (int i = 0; i < steps && redoItems.size()>0; ++i)
 	{
 		undoItems.insert(undoItems.begin(), redoItems[0]);
 		redoItems.erase(redoItems.begin());
