diff --git a/src/main.cpp b/src/main.cpp
index b85bd62652606b8c35da1b4cc542501ad8ec8356..f4b4ebafa586e68d57b2e616476bbca74b655ec4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -36,9 +36,12 @@ int main(int argc, char *argv[])
     app.installTranslator(&appTranslator);
 
     PulsatingScience window;
+    app.installEventFilter(&window);
+
     if(argc == 2 && QString(argv[1]) == "--demo") {
         window.toggleHiddenDemoMode();
     }
+
     window.show();
 
     return app.exec();
diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp
index fdb07f8f247b18e79e5bdad17f1e0d81d3eac6db..faa727259f8ac8987e1cf954ad345f842e60c4b4 100644
--- a/src/pulsaranimationwidget.cpp
+++ b/src/pulsaranimationwidget.cpp
@@ -772,6 +772,22 @@ void PulsarAnimationWidget::setPulsarBeamAngle(const int degrees)
     updateGL();
 }
 
+void PulsarAnimationWidget::getCameraPosition(double& cameraAngleH, double& cameraAngleV, double& cameraZoom)
+{
+    cameraAngleH = m_mouseAngleH;
+    cameraAngleV = m_mouseAngleV;
+    cameraZoom = m_cameraZoom;
+}
+
+void PulsarAnimationWidget::resetCameraPosition(const double angleH, const double angleV, const double zoom)
+{
+    m_mouseAngleH = angleH;
+    m_mouseAngleV = angleV;
+    m_cameraZoom = zoom;
+
+    updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom);
+}
+
 void PulsarAnimationWidget::updateOrbitPeriod()
 {
     m_orbitalPeriod = 3.1553e7 * sqrt(
diff --git a/src/pulsaranimationwidget.h b/src/pulsaranimationwidget.h
index 45369f9b4113db0571340a4b61d0ec14c917f3bd..0985e09f69730a656144eb31ba250dd4f105ef83 100644
--- a/src/pulsaranimationwidget.h
+++ b/src/pulsaranimationwidget.h
@@ -53,6 +53,8 @@ public:
     void setPulsarMagneticAxisInclination(const int degrees);
     void setPulsarSemiMajorAxis(const double length);
     void setPulsarBeamAngle(const int degrees);
+    void getCameraPosition(double& cameraAngleH, double& cameraAngleV, double& cameraZoom);
+    void resetCameraPosition(const double angleH, const double angleV, const double zoom);
 
 public slots:
     void runAnimation();
diff --git a/src/pulsatingscience.cpp b/src/pulsatingscience.cpp
index 441c83aee0b6834782872094f06ef8f5ce689e00..407a3f5eb76112bc34c398df4b288d1305d9b3c2 100644
--- a/src/pulsatingscience.cpp
+++ b/src/pulsatingscience.cpp
@@ -121,6 +121,11 @@ PulsatingScience::PulsatingScience(QWidget *parent) : QMainWindow(parent)
     connect(m_hiddenShortcut, SIGNAL(activated()),
             this, SLOT(toggleHiddenDemoMode()));
 
+    // prepare inactivity timer
+    saveOrRestoreInitialAnimationSettings();
+    m_inactivityTimer = new QTimer(this);
+    connect(m_inactivityTimer, SIGNAL(timeout()), this, SLOT(userInactivityCallback()));
+
     // restore previously saved window and splitter layout
     QCoreApplication::setOrganizationName("Max-Planck-Insitut für Gravitationsphysik");
     QCoreApplication::setOrganizationDomain("aei.mpg.de");
@@ -183,6 +188,10 @@ PulsatingScience::~PulsatingScience()
         m_hiddenShortcut->disconnect();
         delete m_hiddenShortcut;
     }
+
+    if(m_inactivityTimer) {
+        delete m_inactivityTimer;
+    }
 }
 
 void PulsatingScience::closeEvent(QCloseEvent *event)
@@ -523,6 +532,7 @@ void PulsatingScience::toggleHiddenDemoMode()
         ui.dockAnimControl->setFeatures(QDockWidget::DockWidgetClosable
                                         | QDockWidget::DockWidgetMovable
                                         | QDockWidget::DockWidgetFloatable);
+        m_inactivityTimer->stop();
         m_hiddenDemoModeActivated = false;
     }
     else {
@@ -541,6 +551,74 @@ void PulsatingScience::toggleHiddenDemoMode()
         ui.actionMenu_bar->setChecked(false);
         window()->setWindowState(windowState() | Qt::WindowFullScreen);
         ui.dockAnimControl->setFeatures(QDockWidget::NoDockWidgetFeatures);
+        m_inactivityTimer->start(600000);
         m_hiddenDemoModeActivated = true;
     }
 }
+
+bool PulsatingScience::eventFilter(QObject *obj, QEvent *event)
+{
+    if(event->type() == QEvent::MouseButtonPress) {
+        userActivity();
+    }
+
+    // return original event (we don't want to change any behavior)
+    return QObject::eventFilter(obj, event);
+}
+
+void PulsatingScience::userActivity()
+{
+    if(m_hiddenDemoModeActivated) {
+        // restart existing timer
+        m_inactivityTimer->start();
+    }
+}
+
+void PulsatingScience::userInactivityCallback()
+{
+    saveOrRestoreInitialAnimationSettings();
+}
+
+void PulsatingScience::saveOrRestoreInitialAnimationSettings()
+{
+    static bool initialized = false;
+
+    static bool radioCompanionWD;
+    static bool radioCompanionSun;
+    static bool radioCompanionNS;
+    static int sliderPulsarMass;
+    static int sliderPulsarSpinFrequency;
+    static int sliderPulsarSpinAxisInclination;
+    static int sliderPulsarMagneticAxisInclination;
+    static int sliderPulsarSemiMajorAxis;
+
+    static double cameraAngleH;
+    static double cameraAngleV;
+    static double cameraZoom;
+
+    if(initialized) {
+        // restore intial settings
+        ui.radioCompanionWD->setChecked(radioCompanionWD);
+        ui.radioCompanionSun->setChecked(radioCompanionSun);
+        ui.radioCompanionNS->setChecked(radioCompanionNS);
+        ui.sliderPulsarMass->setValue(sliderPulsarMass);
+        ui.sliderPulsarSpinFrequency->setValue(sliderPulsarSpinFrequency);
+        ui.sliderPulsarSpinAxisInclination->setValue(sliderPulsarSpinAxisInclination);
+        ui.sliderPulsarMagneticAxisInclination->setValue(sliderPulsarMagneticAxisInclination);
+        ui.sliderPulsarSemiMajorAxis->setValue(sliderPulsarSemiMajorAxis);
+        ui.pulsarGlWidget->resetCameraPosition(cameraAngleH, cameraAngleV, cameraZoom);
+    }
+    else {
+        // save initial settings
+        radioCompanionWD = ui.radioCompanionWD->isChecked();
+        radioCompanionSun = ui.radioCompanionSun->isChecked();
+        radioCompanionNS = ui.radioCompanionNS->isChecked();
+        sliderPulsarMass = ui.sliderPulsarMass->value();
+        sliderPulsarSpinFrequency = ui.sliderPulsarSpinFrequency->value();
+        sliderPulsarSpinAxisInclination = ui.sliderPulsarSpinAxisInclination->value();
+        sliderPulsarMagneticAxisInclination = ui.sliderPulsarMagneticAxisInclination->value();
+        sliderPulsarSemiMajorAxis = ui.sliderPulsarSemiMajorAxis->value();
+        ui.pulsarGlWidget->getCameraPosition(cameraAngleH, cameraAngleV, cameraZoom);
+        initialized = true;
+    }
+}
diff --git a/src/pulsatingscience.h b/src/pulsatingscience.h
index 13eb6a3d392b333f223c9f6bff2b53a9f9d79940..c7a8fbf940071498500f4566781269591e4fe099 100644
--- a/src/pulsatingscience.h
+++ b/src/pulsatingscience.h
@@ -77,7 +77,15 @@ public slots:
     void updatePulsarSemiMajorAxisValue(double value);
     void toggleHiddenDemoMode();
 
+    void userInactivityCallback();
+
+protected:
+    bool eventFilter(QObject *obj, QEvent *event);
+
 private:
+    void userActivity();
+    void saveOrRestoreInitialAnimationSettings();
+
     Ui::PulsatingScienceClass ui;
 
     QShortcut *m_runShortcut;
@@ -99,6 +107,8 @@ private:
     bool m_animControlVisible;
     bool m_animControlFloating;
     bool m_hiddenDemoModeActivated;
+
+    QTimer *m_inactivityTimer;
 };
 
 #endif // PULSATINGSCIENCE_H