diff --git a/LiveViewer.py b/LiveViewer.py
new file mode 100644
index 0000000000000000000000000000000000000000..006ec82309102c1a6099ee0e50555778ccb2748b
--- /dev/null
+++ b/LiveViewer.py
@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*-
+import os
+import time
+from dectris import albula
+from PyQt4 import QtCore
+from PyQt4.QtCore import SIGNAL, QThread, QMutex
+
+class LiveView(QThread):
+    FILETYPE_CBF = 0
+    FILETYPE_TIF = 1
+    FILETYPE_HDF5 = 2
+
+    alive = False
+    path = ""
+    filetype = 0
+    interval = 0.5 #s
+    stoptimer = -1.0
+
+    viewer = None
+    subframe = None
+    mutex = None
+
+    def __init__(self, path=None, filetype=None, interval=None, parent=None):
+        QThread.__init__(self, parent)
+        if path is not None:
+            self.path = path
+        if filetype is not None:
+            self.filetype = filetype
+        if interval is not None:
+            self.interval = interval
+        self.mutex = QMutex()
+
+
+    def start(self, path=None, filetype=None, interval=None):
+        if path is not None:
+            self.path = path
+        if filetype is not None:
+            self.filetype = filetype
+        if interval is not None:
+            self.interval = interval
+        QThread.start(self)
+
+    def stop(self, interval=0.0):
+        if self.stoptimer < 0.0 and interval > 0.0:
+            print "Live view thread: Stopping in %d seconds"%interval
+            self.stoptimer = interval
+            return
+        print "Live view thread: Stopping thread"
+        self.alive = False
+        self.wait() # waits until run stops on his own
+
+    def run(self):
+        self.alive = True
+        print "Live view thread: started"
+        suffix = [".cbf", ".tif", ".hdf5"]
+
+        if self.filetype in [LiveView.FILETYPE_CBF, LiveView.FILETYPE_TIF]:
+            # open viewer
+            while self.alive:
+                # find latest image
+                self.mutex.lock()
+                files = [(os.path.getmtime(self.path + "/" + fn), fn)
+                    for fn in os.listdir(self.path) if fn.lower().endswith(suffix[self.filetype])]
+                files.sort()
+                files.reverse()
+                if len(files) > 0:
+                    # display image
+                    # wait to make sure the image is copied completely before displaying it
+                    time.sleep(0.1)
+                    try:
+                        self.subframe.loadFile(self.path + "/" + files[0][1])
+                    # viewer or subframe has been closed by the user
+                    except:
+                        self.mutex.unlock()
+                        time.sleep(0.1)
+                        try:
+                            self.subframe =  self.viewer.openSubFrame()
+                        except:
+                            self.viewer = albula.openMainFrame()
+                            self.subframe = self.viewer.openSubFrame()
+                        continue
+                self.mutex.unlock()
+                # wait interval
+                interval = 0.0
+                while interval < self.interval and self.alive:
+                    if self.stoptimer > 0.0:
+                        self.stoptimer -= 0.05
+                        if self.stoptimer < 0.0:
+                            self.stoptimer = -1.0
+                            self.alive = False
+                    time.sleep(0.05)
+                    interval += 0.05
+        elif self.filetype == LiveView.FILETYPE_HDF5:
+            print "Live view thread: HDF5 not supported yet"
+
+        print "Live view thread: Thread for Live view died"
+        self.alive = False
+
+    def setPath(self, path=None):
+        self.mutex.lock()
+        if path is not None:
+            self.path = path
+        self.mutex.unlock()
+
+    def setFiletype(self, filetype=None):
+        restart = False
+        if self.alive:
+            restart = True
+            self.stop()
+        if filetype is not None:
+            self.filetype = filetype
+        if restart:
+            self.start()
+
+    def setInterval(self, interval=None):
+        if interval is not None:
+            self.interval = interval
+