diff -rau ofxPiMapper_clean/example/src/main.cpp ofxPiMapper/example/src/main.cpp
--- ofxPiMapper_clean/example/src/main.cpp	2015-06-07 12:43:32.456293516 +0200
+++ ofxPiMapper/example/src/main.cpp	2015-06-07 15:08:39.248843240 +0200
@@ -6,7 +6,7 @@
 // Accept arguments in the Pi version
 int main(int argc, char* argv[]) {
   
-  bool fullscreen = false;
+  bool fullscreen = true;
   
   if (argc > 0) {
     std::string fullscreenFlag = "-f";
@@ -19,9 +19,9 @@
   }
   
   if (fullscreen) {
-    ofSetupOpenGL(600, 500, OF_FULLSCREEN);
+    ofSetupOpenGL(640, 480, OF_FULLSCREEN);
   } else {
-    ofSetupOpenGL(800, 450, OF_WINDOW);
+    ofSetupOpenGL(640, 480, OF_WINDOW);
   }
   
   ofRunApp(new ofApp());
diff -rau ofxPiMapper_clean/src/ofxPiMapper.cpp ofxPiMapper/src/ofxPiMapper.cpp
--- ofxPiMapper_clean/src/ofxPiMapper.cpp	2015-06-07 12:43:32.476293252 +0200
+++ ofxPiMapper/src/ofxPiMapper.cpp	2015-06-07 15:07:52.321629774 +0200
@@ -8,6 +8,71 @@
     ofRemoveListener(ofEvents().keyPressed, this, &ofxPiMapper::keyPressed);
 }
 
+// reset Timer
+void ofxPiMapper::resetTimer() {
+    startTime = ofGetElapsedTimeMillis();
+    
+    // set timer to 10 seconds
+    endTime = 10000;
+    
+    // uncomment this to enable random timer
+    //endTime = (int)ofRandom(1000, endTime);
+}
+
+// cycle Photos (=slideshow)
+void ofxPiMapper::cyclePhotos() {
+    // Get image count
+    int numImages = mediaServer.getNumImages();
+    
+    // Get image names from media server
+    vector<string> imageNames = mediaServer.getImageNames();
+    
+    // Get image paths from media server
+    vector<string> imagePaths = mediaServer.getImagePaths();
+    
+    // Chose random image
+    int randomImage = (int)ofRandom(0,numImages);
+    
+    // Assign all image surfaces the new image
+    for (int i = 0; i < surfaceManager.size(); i++) {
+        ofx::piMapper::BaseSurface* surface = surfaceManager.getSurface(i);
+        string sourceTypeName = ofx::piMapper::SourceType::GetSourceTypeName(surface->getSource()->getType());
+        
+        // Select surface if type is image
+        if (sourceTypeName == "image") {
+          // Load new image
+          surface->setSource(mediaServer.loadImage(imagePaths[randomImage]));
+        }
+    }
+}
+
+// cycle Videos (=loopplay)
+void ofxPiMapper::cycleVideos() {
+    // Get video count
+    int numVideos = mediaServer.getNumVideos();
+    
+    // Get video names from media server
+    vector<string> videoNames = mediaServer.getVideoNames();
+    
+    // Get video paths from media server
+    vector<string> videoPaths = mediaServer.getVideoPaths();
+    
+    // Chose random video
+    int randomVideo = (int)ofRandom(0,numVideos);
+    
+    // Assign all video surfaces the new video
+    for (int i = 0; i < surfaceManager.size(); i++) {
+        ofx::piMapper::BaseSurface* surface = surfaceManager.getSurface(i);
+        string sourceTypeName = ofx::piMapper::SourceType::GetSourceTypeName(surface->getSource()->getType());
+        
+        // Select surface if type is video
+        if (sourceTypeName == "video") {
+            // Load new video
+            surface->setSource(mediaServer.loadVideo(videoPaths[randomVideo]));
+        }
+    }
+}
+
 void ofxPiMapper::setup(){
     ofLogNotice("ofxPiMapper") << "Setting up...";
     
@@ -28,6 +93,14 @@
     // The GUI needs something to interface with
     gui.setSurfaceManager(&surfaceManager);
     
+    // Reset timer
+    bTimerEnabled = false;
+    resetTimer();
+  
+    // Reset cycling
+    bCyclePhotoEnabled = false;
+    bCycleVideoEnabled = false;
+
     isSetUp = true;
     
     ofLogNotice("ofxPiMapper") << "Done setting up";
@@ -55,12 +128,35 @@
         ss << "Press <q> to add new quad surface\n";
         ss << "Press <s> to save the composition\n";
         ss << "Press <f> to toggle fullscreen\n";
+        ss << "Press <p> to toggle random photo slideshow\n";
+        ss << "Press <v> to toggle random video switching\n";
         ss << "Press <i> to hide this message";
         
         ofDrawBitmapStringHighlight(ss.str(), 10, 20, ofColor(0, 0, 0, 100),
                                                                 ofColor(255, 255, 255, 200));
     }
     
+    // Update timer
+    float timer = ofGetElapsedTimeMillis() - startTime;
+    
+    // Timer reached
+    if(timer >= endTime && bTimerEnabled) {
+        ofLogNotice("ofxPiMapper") << "Timer reached.";
+        resetTimer();
+        
+        // Cycle photos
+        if (bCyclePhotoEnabled) {
+            ofLogNotice("ofxPiMapper") << "Showing next photo.";
+            cyclePhotos();
+        }
+        
+        // Cycle videos
+        if (bCycleVideoEnabled) {
+            ofLogNotice("ofxPiMapper") << "Loopplaying next video.";
+            cycleVideos();
+        }
+    }
+
     // TODO: remove undo test completely
     //ofDrawBitmapStringHighlight(ofToString(undoTestValue), 200, 200);
     
@@ -107,6 +203,36 @@
         case 'f':
             ofToggleFullscreen();
             break;
+        case 'p':
+            bCyclePhotoEnabled = !bCyclePhotoEnabled;
+            if (bCyclePhotoEnabled) {
+                bTimerEnabled = true;
+                ofLogNotice("ofxPiMapper") << "Timer enabled and set to "+ofToString(endTime/1000.0, 1)+" seconds.";
+                ofLogNotice("ofxPiMapper") << "Photo cycling enabled.";
+            } else {
+                if (!bCycleVideoEnabled) {
+                    bTimerEnabled = false;
+                    ofLogNotice("ofxPiMapper") << "Timer disabled.";
+                }
+                ofLogNotice("ofxPiMapper") << "Photo cycling disabled.";
+            }
+            resetTimer();
+            break;
+        case 'v':
+            bCycleVideoEnabled = !bCycleVideoEnabled;
+            if (bCycleVideoEnabled) {
+                bTimerEnabled = true;
+                ofLogNotice("ofxPiMapper") << "Timer enabled and set to "+ofToString(endTime/1000.0, 1)+" seconds.";
+                ofLogNotice("ofxPiMapper") << "Video cycling enabled.";
+            } else {
+                if (!bCyclePhotoEnabled) {
+                    bTimerEnabled = false;
+                    ofLogNotice("ofxPiMapper") << "Timer disabled.";
+                }
+                ofLogNotice("ofxPiMapper") << "Video cycling disabled.";
+            }
+            resetTimer();
+            break;
         case 's':
             surfaceManager.saveXmlSettings(PIMAPPER_USER_SURFACES_XML_FILE);
             break;
diff -rau ofxPiMapper_clean/src/ofxPiMapper.h ofxPiMapper/src/ofxPiMapper.h
--- ofxPiMapper_clean/src/ofxPiMapper.h	2015-06-07 12:43:32.486293120 +0200
+++ ofxPiMapper/src/ofxPiMapper.h	2015-06-07 15:07:52.321629774 +0200
@@ -49,6 +49,20 @@
         // from anywhere within ofxPiMapper.
         ofx::piMapper::MediaServer& getMediaServer();
         ofx::piMapper::SurfaceManager& getSurfaceManager();
+        
+        // Timer
+        float startTime;
+        float endTime;
+        bool bTimerEnabled;
+        
+        // Timer
+        void resetTimer();
+        
+        // Cycle photos (slideshow) or videos (loopplay)
+        bool bCyclePhotoEnabled;
+        bool bCycleVideoEnabled;
+        void cyclePhotos();
+        void cycleVideos();
     
         ofx::piMapper::CmdManager cmdManager;
         ofx::piMapper::SurfaceManager surfaceManager;
