diff --git a/qr_reader/qrreader.py b/qr_reader/qrreader.py
new file mode 100755
index 0000000000000000000000000000000000000000..6656adee716e86220011485904c43d033e4f8856
--- /dev/null
+++ b/qr_reader/qrreader.py
@@ -0,0 +1,139 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+
+import sys, os, re, subprocess, httplib
+from threading import Timer
+import pygtk, gtk, gobject
+import pygst
+pygst.require("0.10")
+import gst
+import zbar, Image, string, urllib
+
+class GTK_Main:
+
+	def __init__(self):
+		self.clean()
+		window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+		window.set_title("Webcam-Viewer")
+		window.set_default_size(500, 400)
+		window.connect("destroy", gtk.main_quit, "WM destroy")
+		vbox = gtk.VBox()
+		window.add(vbox)
+		self.movie_window = gtk.DrawingArea()
+		vbox.add(self.movie_window)
+		hbox = gtk.HBox()
+		vbox.pack_start(hbox, False)
+
+		hbox.set_border_width(10)
+		hbox.pack_start(gtk.Label())
+		self.button = gtk.Button("Quit")
+		self.button.connect("clicked", self.exit)
+		hbox.pack_start(self.button, False)
+		self.button_restart = gtk.Button('Restart')
+		self.button_restart.connect('clicked',self.restart)
+		hbox.pack_start(self.button_restart,True)
+		hbox.add(gtk.Label())
+
+		window.show_all()
+
+		# Set up the gstreamer pipepile
+		self.player = gst.parse_launch ("""v4l2src ! 
+tee name=t ! queue ! autovideosink t.
+! queue ! videorate ! video/x-raw-yuv, width=800, height=600, framerate=1/1
+! jpegenc ! multifilesink location=snapshot-%03d.jpg""")
+
+		bus = self.player.get_bus()
+		bus.add_signal_watch()
+		bus.enable_sync_message_emission()
+		bus.connect('message', self.on_message)
+		bus.connect('sync-message::element', self.on_sync_message)
+		
+		self.player.set_state(gst.STATE_PLAYING)
+		self.scan()
+
+	def exit(self, widget, data=None):
+		self.t.cancel()
+		self.clean()
+		gtk.main_quit()
+	
+	def restart(self, widget, data=None):
+		self.clean()
+		self.scan()
+
+	def on_message(self, bus, message):
+		t = message.type
+		if t == gst.MESSAGE_EOS:
+			self.player.set_state(gst.STATE_NULL)
+			self.button.set_label("Start")
+		elif t == gst.MESSAGE_ERROR:
+			err, debug = message.parse_error()
+			print "Error: %s" % err, debug
+			self.player.set_state(gst.STATE_NULL)
+			self.button.set_label("Start")
+
+	def on_sync_message(self, bus, message):
+		if message.structure is None:
+			return
+		message_name = message.structure.get_name()
+		if message_name == 'prepare-xwindow-id':
+			# Assign the viewport
+			imagesink = message.src
+			imagesink.set_property('force-aspect-ratio', True)
+			imagesink.set_xwindow_id(self.movie_window.window.xid)
+			
+	def scan(self):
+		files = os.listdir(".")
+		files = filter(lambda x: re.search('^snapshot-[0-9]*.jpg$', x) != None, files)
+	
+		for f in files:
+			print("processing image: "+str(f))
+			self.process_qr(str(f))
+
+			os.remove(f)
+		self.t = Timer(3.0, self.scan)
+		self.t.start()
+
+	def process_qr(self, picture):
+		scanner = zbar.ImageScanner()
+		scanner.parse_config('enable')
+		pil = Image.open(picture).convert('L')
+		width,height = pil.size
+		raw = pil.tostring()
+		image = zbar.Image(width,height,'Y800',raw)
+		scanner.scan(image)
+		no_qr = True
+		result = ''
+		for symbol in image:
+			url = symbol.data
+			print(url)
+			if url.find('http://fsmpi.rwth-aachen.de/lip/view/') >= 0:
+				os.system('firefox -new-tab '+url)
+			else:
+				self.invalid_code()
+			no_qr = False
+		del(image)
+		if no_qr:
+			print('\033[1;31mno QR code found\033[1;m')
+		else:
+			exit()
+
+	def stop(self):
+		exit()
+	
+	def clean(self):
+		files = os.listdir(".")
+		files = filter(lambda x: re.search('^snapshot-[0-9]*.jpg$', x) != None, files)
+		for f in files:
+			os.remove(f)
+
+	def invalid_code(self):
+		print('\033[1;41m  _  _  _  _ _  ___  _    _  ___    ___  ___     ___  ___  ___  ___  \033[1;m')
+		print('\033[1;41m | || \| || | |/ - \| |  | ||   \  /   \| - |   /  _|/   \|   \| __| \033[1;m')
+		print('\033[1;41m | ||  \ || | || | || |_ | || | |  | | ||   \  |  (_ | | || | || __| \033[1;m')
+		print('\033[1;41m |_||_\__| \_/ |_|_||___||_||___/  \__\_|_|\_\  \___|\___/|___/|___| \033[1;m')
+		print('\033[1;41m                                                                     \033[1;m')
+
+g = GTK_Main()
+gtk.gdk.threads_init()
+gtk.main()
+