diff --git a/encoding.py b/encoding.py
index 3de335b96462cdb272f9872785a73f8658958390..26f93332b760331d0711685e3d9ce2bf6306c721 100644
--- a/encoding.py
+++ b/encoding.py
@@ -10,7 +10,17 @@ def set_metadata(dest, course, lecture):
 	dest['metadata'] = metadata
 	dest['chapters'] = chapters
 
-def schedule_remux(lectureid):
+@app.route('/internal/jobs/add/remux', methods=['GET', 'POST'])
+@mod_required
+@csrf_protect
+def schedule_remux(lectureid=None, videoid=None):
+	ret = None
+	if not lectureid:
+		lectureid = request.values.get('lectureid')
+		videoid = request.values.get('videoid')
+		if not lectureid:
+			lectureid = query('SELECT lecture_id FROM videos WHERE id = ?', videoid)[0]['lecture_id']
+		ret = redirect(request.values.get('ref', url_for('jobs_overview')))
 	lecture = query('SELECT * FROM lectures WHERE id = ?', lectureid)[0]
 	course = query('SELECT * FROM courses WHERE id = ?', lecture['course_id'])[0]
 	videos = query('''SELECT videos.*, sources.path AS srcpath, sources.hash AS srchash, formats.options AS fmtopts
@@ -21,6 +31,8 @@ def schedule_remux(lectureid):
 	for video in videos:
 		if not video['source']:
 			continue
+		if videoid and video['id'] != videoid:
+			continue
 		data = {'path': video['path'], 'srcpath': video['srcpath'], 'srchash': video['srchash']}
 		fmt = json.loads(video['fmtopts'])
 		if 'format' in fmt:
@@ -28,6 +40,7 @@ def schedule_remux(lectureid):
 		data['options'] = fmt.get('options', {})
 		set_metadata(data, course, lecture)
 		schedule_job('remux', data)
+	return ret
 
 def schedule_transcode(source, fmt_id=None, video=None):
 	if video:
@@ -49,7 +62,7 @@ def schedule_transcode(source, fmt_id=None, video=None):
 	basename = os.path.basename(source['path']).rsplit('.', 1)[0]
 	data['output']['path'] = 'pub/'+course['handle']+'/'+basename+fmt['suffix']
 	if video:
-		old_source = query('SELECT * FROM sources WHERE id = ?', video['source'])
+		old_source = query('SELECT * FROM sources WHERE id = ?', video['source'])[0]
 		data['output']['path'] = video['path']
 		data['video_id'] = video['id']
 		data['srcpath'] = old_source['path']
@@ -60,6 +73,19 @@ def schedule_transcode(source, fmt_id=None, video=None):
 	data['source_id'] = source['id']
 	schedule_job('transcode', data, queue="background")
 
+@app.route('/internal/jobs/add/reencode', methods=['GET', 'POST'])
+@mod_required
+@csrf_protect
+@handle_errors('jobs_overview', 'Video nicht gefunden!', 404, IndexError)
+def schedule_reencode():
+	video = query('SELECT * FROM videos WHERE id = ?', request.values['videoid'])[0]
+	if not video['source']:
+		flash('Manuell erstellte Videos können nicht neukodiert werden!')
+	else:
+		source = query('''SELECT sources.* FROM sources WHERE sources.id = ? ORDER BY time_created''', video['source'])[-1]
+		schedule_transcode(source, video=video)
+	return redirect(request.values.get('ref', url_for('jobs_overview')))
+
 @job_handler('probe-raw')
 def update_lecture_videos(jobid, jobtype, data, state, status):
 	if 'lecture_id' not in data:
diff --git a/sorter.py b/sorter.py
index df0be85482dce83e60c7ae0d695ac5609498665c..a4d90117f19928c9fcc65d5637f1ac722f299daa 100644
--- a/sorter.py
+++ b/sorter.py
@@ -51,6 +51,7 @@ def insert_video(lectureid, dbfilepath, fileformatid, hash="", filesize=-1):
 
 @app.route('/internal/jobs/add/thumbnail', methods=['GET', 'POST'])
 @mod_required
+@csrf_protect
 @handle_errors('jobs_overview', 'Zu dieser Veranstaltung existieren keine Videos!', 404, IndexError)
 def schedule_thumbnail(lectureid=None):
 	ret = None
diff --git a/templates/jobs_overview.html b/templates/jobs_overview.html
index 469cf56f118deeae5788ff125f681199fb02a394..233238cf476662385521e78e58f772c42982491f 100644
--- a/templates/jobs_overview.html
+++ b/templates/jobs_overview.html
@@ -12,15 +12,38 @@
 				</div>
 				<div class="modal-body">
 					<ul class="nav nav-tabs" role="tablist">
-						<li role="presentation" class="active"><a href="#add_thtumbnail" aria-controls="thumbnail" role="tab" data-toggle="tab">Thumbnail</a></li>
+						<li role="presentation" class="active"><a href="#add_thumbnail" aria-controls="thumbnail" role="tab" data-toggle="tab">Thumbnail</a></li>
+						<li role="presentation"><a href="#add_remux" aria-controls="remux" role="tab" data-toggle="tab">Remux</a></li>
+						<li role="presentation"><a href="#add_reencode" aria-controls="remux" role="tab" data-toggle="tab">Reencode</a></li>
 					</ul>
-
 					<div class="tab-content" style="margin-top: 10px;">
 						<div role="tabpanel" class="tab-pane active" id="add_thumbnail">
 							<form class="form-inline" action="{{url_for('schedule_thumbnail', ref=request.url)}}" method="post">
 								<div class="form-group">
 									<input type="text" class="form-control" placeholder="Lecture ID" name="lectureid">
-									<button type="submit" class="btn btn-primary">Hinzufügen</button>
+									<button type="submit" class="btn btn-primary">Thumbnail erzeugen</button>
+								</div>
+							</form>
+						</div>
+						<div role="tabpanel" class="tab-pane" id="add_remux">
+							<form class="form-inline" action="{{url_for('schedule_remux', ref=request.url)}}" method="post">
+								<div class="form-group">
+									<input type="text" class="form-control" placeholder="Lecture ID" name="lectureid">
+									<button type="submit" class="btn btn-primary">Videos remuxen</button>
+								</div>
+							</form><br>
+							<form class="form-inline" action="{{url_for('schedule_remux', ref=request.url)}}" method="post">
+								<div class="form-group">
+									<input type="text" class="form-control" placeholder="Video ID" name="videoid">
+									<button type="submit" class="btn btn-primary">Einzelnes Video remuxen</button>
+								</div>
+							</form>
+						</div>
+						<div role="tabpanel" class="tab-pane" id="add_reencode">
+							<form class="form-inline" action="{{url_for('schedule_reencode', ref=request.url)}}" method="post">
+								<div class="form-group">
+									<input type="text" class="form-control" placeholder="Video ID" name="videoid">
+									<button type="submit" class="btn btn-primary">Video neukodieren</button>
 								</div>
 							</form>
 						</div>