diff --git a/src/canvas.cpp b/src/canvas.cpp
index 2038dcc9deae6b5b08c4da725b3a92742c7e70aa..0301499433d24cc159a1fb589dceefc932b7bd05 100644
--- a/src/canvas.cpp
+++ b/src/canvas.cpp
@@ -116,8 +116,10 @@ Canvas::Canvas(Viewer *v, QWidget *parent) :
 	setup_keys(beamer);
 	if (cur_layout == presenter_layout) {
 		beamer->show();
+		viewer->show_progress(true);
 	} else {
 		beamer->hide();
+		viewer->show_progress(false);
 	}
 }
 
@@ -309,6 +311,7 @@ void Canvas::set_presentation_layout() {
 	cur_layout = presentation_layout;
 	update();
 	viewer->get_beamer()->hide();
+	viewer->show_progress(false);
 	viewer->activateWindow();
 }
 
@@ -318,6 +321,7 @@ void Canvas::set_grid_layout() {
 	cur_layout = grid_layout;
 	update();
 	viewer->get_beamer()->hide();
+	viewer->show_progress(false);
 	viewer->activateWindow();
 }
 
@@ -336,6 +340,7 @@ void Canvas::set_presenter_layout() {
 //	}
 	viewer->get_beamer()->get_layout()->scroll_page(cur_layout->get_page(), false);
 	viewer->get_beamer()->show();
+	viewer->show_progress(true);
 }
 
 void Canvas::toggle_overlay() {
diff --git a/src/viewer.cpp b/src/viewer.cpp
index e06636f75aa38d6773a2374fddb26f8c947e73bf..b1dd9e4610531b062ac1cbf7fe9b64fab988be17 100644
--- a/src/viewer.cpp
+++ b/src/viewer.cpp
@@ -124,7 +124,14 @@ Viewer::Viewer(const QString &file, QWidget *parent) :
 
 	update_info_widget();
 
+	presenter_progress.setMinimum(1);
+ 	presenter_progress.setMaximum(res->get_page_count());
+ 	presenter_progress.setValue(canvas->get_layout()->get_page() + 1);
+//	presenter_progress.setFormat("%v/%m");
+ 	presenter_progress.setTextVisible(true);
+
 	layout->addWidget(splitter);
+	layout->addWidget(&presenter_progress);
 	layout->addWidget(search_bar);
 	setLayout(layout);
 
@@ -143,6 +150,7 @@ Viewer::Viewer(const QString &file, QWidget *parent) :
 
 	// enable transparency, but only in the right places
 	setAttribute(Qt::WA_TranslucentBackground);
+	presenter_progress.setAutoFillBackground(true);
 	search_bar->setAutoFillBackground(true);
 	info_widget.setAutoFillBackground(true);
 	toc->setAutoFillBackground(true);
@@ -178,6 +186,8 @@ void Viewer::reload(bool clamp) {
 
 	res->load(res->get_file(), info_password.text().toLatin1());
 
+ 	presenter_progress.setMaximum(res->get_page_count());
+
 	search_bar->reset_search(); // TODO restart search if loading the same document?
 	search_bar->load(res->get_file(), info_password.text().toLatin1());
 
@@ -491,11 +501,16 @@ void Viewer::layout_updated(int new_page, bool page_changed) {
 			beamer->get_layout()->scroll_page(new_page, false);
 		}
 		// TODO unfold toc tree to show current entry?
+		presenter_progress.setValue(new_page + 1);
 	}
 	canvas->update();
 	beamer->update();
 }
 
+void Viewer::show_progress(bool show) {
+	presenter_progress.setVisible(show);
+}
+
 void Viewer::signal_slot() {
 	sig_notifier->setEnabled(false);
 	char tmp;
diff --git a/src/viewer.h b/src/viewer.h
index 17a122bea499390ccd2d778e643304059d2a8bca..cd91be9192524072185dc25d722f2c92b121cfdd 100644
--- a/src/viewer.h
+++ b/src/viewer.h
@@ -7,6 +7,7 @@
 #include <QSocketNotifier>
 #include <QLabel>
 #include <QLineEdit>
+#include <QProgressBar>
 
 
 class ResourceManager;
@@ -32,6 +33,7 @@ public:
 	BeamerWindow *get_beamer() const;
 
 	void layout_updated(int new_page, bool page_changed);
+	void show_progress(bool show);
 
 public slots:
 	void signal_slot(); // reloads on SIGUSR1
@@ -87,6 +89,7 @@ private:
 	Splitter *splitter;
 	Toc *toc;
 	Canvas *canvas;
+	QProgressBar presenter_progress;
 	SearchBar *search_bar;
 	QVBoxLayout *layout;