diff --git a/l2pauth.py b/l2pauth.py
new file mode 100644
index 0000000000000000000000000000000000000000..e0ef7e09700449609cb11cce8591ade9cfe4e792
--- /dev/null
+++ b/l2pauth.py
@@ -0,0 +1,42 @@
+from server import *
+import requests
+import json
+from time import sleep
+
+L2P_BASE = 'https://www3.elearning.rwth-aachen.de/_vti_bin/l2pservices/api.svc/v1/'
+OAUTH_BASE = 'https://oauth.campus.rwth-aachen.de/oauth2waitress/oauth2.svc/'
+
+def l2pget(endpoint, token, **args):
+	args['accessToken'] = token
+	r = requests.request('GET', L2P_BASE+endpoint, params=args)
+	return r.json()
+
+def oauthget(endpoint, **args):
+	args['client_id'] = config['L2P_APIKEY']
+	r = requests.request('POST', OAUTH_BASE+endpoint, data=args)
+	return r.json()
+
+@app.route('/l2pauth')
+def start_l2pauth():
+	code = oauthget('code', scope='l2p2013.rwth')
+	session['l2p_oauthcode'] = code['device_code']
+	return redirect(code['verification_url']+'?q=verify&d='+code['user_code'])
+
+@app.route('/l2p')
+def test_l2pauth():
+	return str(session.get('l2p_courses', {}))
+
+@app.before_request
+def finish_oauth():
+	if 'l2p_oauthcode' not in session:
+		return
+	token = oauthget('token', code=session['l2p_oauthcode'], grant_type='device')
+	if token.get('status') != 'ok':
+		return
+	del session['l2p_oauthcode']
+	session['rwthintern'] = True
+	session['l2p_courses'] = []
+	for course in l2pget('viewAllCourseInfo', token['access_token'])['dataSet']:
+		session['l2p_courses'].append(course['uniqueid'])
+	oauthget('token', refresh_token=token['refresh_token'], grant_type='invalidate')
+	flash('Folgende Kurse wurden freigegeben: '+', '.join(session['l2p_courses']))
diff --git a/server.py b/server.py
index 13aea0a8e8c418b2c34e2ee992f9a41a09b867a3..39af4c4f33a0c1086bc3368b73f8272536df3699 100644
--- a/server.py
+++ b/server.py
@@ -468,3 +468,5 @@ import timetable
 import sorter
 if 'ICAL_URL' in config:
 	import meetings
+if 'L2P_APIKEY' in config:
+	import l2pauth