diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py
index 7c1df9cfc9ab4968d22bff182878e9b4715c1433..a2e2f6dd3c4be9122624b4f4785cb4db99f65d9a 100644
--- a/mo/web/org_contest.py
+++ b/mo/web/org_contest.py
@@ -1696,29 +1696,51 @@ def org_contest_scans(ct_id: int, site_id: Optional[int] = None):
     round, contest, site = ctx.round, ctx.contest, ctx.site
     assert contest
 
+    sess = db.get_session()
+
     class PSF(ProcessScansForm):
         pass
 
-    tasks = db.get_session().query(db.Task).filter_by(round=round).order_by(db.Task.code).all()
+    tasks = sess.query(db.Task).filter_by(round=round).order_by(db.Task.code).all()
+    tasks_map: Dict[int,db.Task] = {}
     for t in tasks:
         setattr(PSF, f'task_{t.task_id}', wtforms.BooleanField(t.code, default=True))
+        tasks_map[t.task_id] = t
 
     proc_form = PSF()
     proc_task_fields = [f for f in proc_form if f.name.startswith('task_')]
 
     if proc_form.validate_on_submit() and proc_form.process_scans.data:
         files = request.files.getlist(proc_form.files.name)
-        mo.jobs.protocols.schedule_process_scans(
+        job_id = mo.jobs.protocols.schedule_process_scans(
             contest, site, g.user,
             tasks=[t for t in tasks if getattr(proc_form, f'task_{t.task_id}').data],
             in_file_names=[f.stream.name for f in files],
         )
-        flash('Zpracování scanů zahájeno. Vyčkejte chvíli, než budou připraveny k roztřídění, poté je roztřiďte (tlačítko v seznamu dávek).', 'success')
-        return redirect(url_for('org_jobs'))
+        flash('Zpracování skenů zahájeno. Vyčkejte chvíli, než budou připraveny k roztřídění, poté je roztřiďte', 'success')
+        return redirect(url_for('org_contest_scans_process', id=id, site_id=site_id, job_id=job_id))
+
+    jobs_query = sess.query(db.Job).filter_by(type=db.JobType.process_scans)
+    if not g.user.is_admin:
+        jobs_query = jobs_query.filter_by(user=g.user)
+    jobs = []
+    for job in jobs_query.all():
+        if 'contest_id' not in job.in_json or job.in_json['contest_id'] != id:
+            continue
+        if site_id is not None and ('site_id' not in job.in_json or job.in_json['site_id'] != site_id):
+            continue
+
+        job.tasks = []
+        for task_id in job.in_json['task_ids']:
+            if task_id in tasks_map:
+                job.tasks.append(tasks_map[task_id])
+
+        jobs.append(job)
 
     return render_template(
         'org_contest_scans.html',
         ctx=ctx,
         proc_form=proc_form,
         proc_task_fields=proc_task_fields,
+        jobs=jobs,
     )
diff --git a/mo/web/templates/org_contest_scans.html b/mo/web/templates/org_contest_scans.html
index 59e628d102e7449da163b1a1c4958c8669ff72f5..d8fc942f34f3c9a71cdd335f4ecacbf4ab757d22 100644
--- a/mo/web/templates/org_contest_scans.html
+++ b/mo/web/templates/org_contest_scans.html
@@ -36,4 +36,40 @@ jejich přiřazení jednotlivým soutěžícím.
 	{{ field(proc_form.process_scans) }}
 </form>
 
+<h3>Nahráno k roztřídění</h3>
+{% if jobs %}
+<p>Smazat dávky lze v <a href="{{ url_for('org_jobs') }}">přehledu všech dávek</a>.</p>
+<table class=data>
+	<thead>
+		<tr>
+			<th>Datum
+			<th>Úlohy
+			<th>Stav
+			{% if g.user.is_admin %}<th>Vlastník{% endif %}
+			<th>Akce
+		</tr>
+	</thead>
+	{% for job in jobs %}
+	<tr class="job-{{ job.state.name }}">
+		<td>{{ job.created_at|timeformat }}
+		<td>{% for task in job.tasks %}{{ task.code }} {% endfor %}
+		<td>
+		{% if job.state == JobState.done %}
+			Připraveno k roztřídění
+		{% else %}
+			{{ job.state.friendly_name() }}
+		{% endif %}
+		{% if g.user.is_admin %}<td>{{ job.user|user_link }}{% endif %}
+		<td><div class="btn-group">
+			{% if job.state == JobState.done %}
+				<a class="btn btn-xs btn-primary" href="{{ url_for('org_contest_scans_process', id=contest.contest_id, site_id=site_id, job_id=job.job_id) }}">Zpracovat skeny</a>
+			{% endif %}
+		</div>
+	</tr>
+	{% endfor %}
+</table>
+{% else %}
+<p>Žádné nahrané skeny k roztřídění.</p>
+{% endif %}
+
 {% endblock %}