diff --git a/tests.py b/tests.py
index ebc12aee678e4f10eebe42f8a508057aeae92ea2..4dcf85ef16ffb4d5ca0898dd8043ccb9cb86b5f3 100755
--- a/tests.py
+++ b/tests.py
@@ -16,22 +16,91 @@ class VideoTestCase(unittest.TestCase):
 		server.app.testing = True
 		self.app = server.app.test_client()
 
+	def login(self, c):
+		with c.session_transaction() as sess:
+			sess['user'] = {'name': 'videoag', '_csrf_token': 'asd', 'dbid': 72}
+			sess['_csrf_token'] = 'asd'
+
 	def test_index(self):
-		r = self.app.get('/')
-		assert r.status_code == 200
+		with self.app as c:
+			r = c.get('/')
+			assert r.status_code == 200
+
+			self.login(c)
+			r = c.get('/')
+			assert r.status_code == 200
 	
 	def test_courses(self):
-		r = self.app.get('/courses')
-		assert r.status_code == 200
+		with self.app as c:
+			r = c.get('/courses')
+			assert r.status_code == 200
+
+			self.login(c)
+			r = c.get('/courses')
+			assert r.status_code == 200
+
+	def test_timetable(self):
+		with self.app as c:
+			r = c.get('/internal/timetable')
+			assert r.status_code == 302
+
+			self.login(c)
+			r = c.get('internal/timetable')
+			assert r.status_code == 200
+			r = c.get('internal/timetable?date=2016-W05')
+			assert r.status_code == 200
+			assert 'AfI' in r.data.decode()
+			assert 'Progra' in r.data.decode()
+			assert 'Bio' in r.data.decode()
 	
 	def test_faq(self):
 		r = self.app.get('/faq')
 		assert r.status_code == 200
+
+	def test_ical(self):
+		with self.app as c:
+			r = c.get('/internal/ical/all')
+			assert r.status_code == 401
+
+			self.login(c)
+			r = c.get('/internal/ical/all')
+			assert r.status_code == 200
+			assert 'Progra' in r.data.decode()
+			assert 'Vorlesung' in r.data.decode()
 	
 	def test_sitemap(self):
 		r = self.app.get('/sitemap.xml')
 		assert r.status_code == 200
 	
+	def test_chapters(self):
+		with self.app as c:
+			# wrong time format
+			r = c.post('/internal/newchapter/7011', data={'text':'testchapter A', 'time': 1234})
+			assert r.status_code == 400
+			# should be inserted as id 15
+			r = c.post('/internal/newchapter/7011', data={'text':'testchapter B', 'time': '00:10:00'})
+			assert r.status_code == 200
+			# not yet set visible
+			r = c.get('/internal/chapters/7011')
+			assert r.status_code == 404
+			# other lecture
+			r = c.get('/internal/chapters/7012')
+			assert r.status_code == 404
+
+			self.login(c)
+			r = c.post('/internal/edit', data={"chapters.15.visible":1,"_csrf_token":"asd"})
+			assert r.status_code == 200
+			r = c.get('/internal/chapters/7011')
+			assert 'testchapter B' in r.data.decode() and not 'testchapter A' in r.data.decode()
+
+	def test_search(self):
+		r = self.app.get('/search?q=Malo')
+		assert r.status_code == 200
+		assert 'Mathematische Logik II' in r.data.decode() and '4.1 Der Sequenzenkalkül'  in r.data.decode()
+		r = self.app.get('/search?q=Afi+Stens')
+		assert r.status_code == 200
+		assert 'Analysis für Informatiker' in r.data.decode() and 'Höhere Mathematik I'  in r.data.decode()
+
 	def test_login(self):
 		# test login page
 		r = self.app.get('/internal/login')
@@ -64,10 +133,11 @@ class VideoTestCase(unittest.TestCase):
 			r = c.get('/internal/new/courses', data={'title': 'Neue Vera14352345nstaltung totalyrandomcrap', 'responsible': 'foo', 'handle': '2r5sQ46z4w3DFCRT3<F4>DG', '_csrf_token': 'asd'})
 			assert r.status_code != 200
 
+			r = c.get('/internal/changelog')
+			assert r.status_code == 302
+
 			# all other tests are done logged in
-			with c.session_transaction() as sess:
-				sess['user'] = {'name': 'videoag', '_csrf_token': 'asd', 'dbid': 72}
-				sess['_csrf_token'] = 'asd'
+			self.login(c)
 
 			# add course
 			r = c.get('/internal/new/courses', data={'title': 'Neue Veranstaltung totalyrandomcrap', 'responsible': 'foo', 'handle': '2r5sQDFCRT3DG', '_csrf_token': 'asd'})
@@ -76,6 +146,16 @@ class VideoTestCase(unittest.TestCase):
 			assert r.status_code == 200
 			assert 'Neue Veranstaltung totalyrandomcrap' in r.data.decode() and '2r5sQDFCRT3DG' in r.data.decode()
 
+			# rename lecture
+			r = c.get('internal/edit', data={"lectures.7353.title":"Testtitle","_csrf_token":"asd"})
+			assert r.status_code == 200
+
+			# test if the changelog is written
+			r = c.get('/internal/changelog')
+			assert r.status_code == 200
+			assert 'Testtitle' in r.data.decode() and 'lectures.7353.title' in r.data.decode()
+
+
 	def test_legacyurl(self):
 		with self.app as c:
 			r = self.app.get('/site/feed.php?newcourses')