diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py
index bd786672373cc1852ce82c61d64ae0774616605f..758416680e30e01a3886d68702d90c79a2e17ba2 100644
--- a/mo/web/org_contest.py
+++ b/mo/web/org_contest.py
@@ -240,35 +240,57 @@ class ParticipantAddForm(FlaskForm):
     email = wtforms.StringField("E-mail", validators=[validators.Required()])
     first_name = wtforms.StringField("Křestní jméno", validators=[validators.Required()])
     last_name = wtforms.StringField("Příjmení", validators=[validators.Required()])
-    school_code = wtforms.StringField(
-            "Kód školy",
-            description="Viz katalog škol na tomto webu",
+    school_code = wtforms.StringField("Kód školy",
+                                      validators=[validators.Required()],
+                                      description="Viz katalog škol na tomto webu")
+    rocnik = wtforms.StringField(
+            "Ročník",
+            description="Pro základní školy je to číslo od 1 do 9, pro <var>k</var>-tý ročník <var>r</var>-leté střední školy má formát <var>k</var>/<var>r</var>.",
             validators=[validators.Required()])
+    rok_naroz = wtforms.StringField("Rok narození")
+    participation_place = wtforms.HiddenField('Soutěžní místo')
+    save = wtforms.SubmitField("Přidat")
+
+    def get_school_code(self) -> str:
+        return self.school_code.data
+
+    def get_participation_place(self) -> str:
+        return '#'+str(self.participation_place.data)
+
+    def set_site(self, site: db.Place):
+        self.participation_place.data = site.place_id
+
+    def validate_email(form, field):
+        try:
+            field.data = mo.users.normalize_email(field.data)
+        except mo.CheckError as e:
+            raise wtforms.ValidationError(str(e))
+
+
+
+class ParticipantAddFormWithSite(FlaskForm):
+    email = wtforms.StringField("E-mail", validators=[validators.Required()])
+    first_name = wtforms.StringField("Křestní jméno", validators=[validators.Required()])
+    last_name = wtforms.StringField("Příjmení", validators=[validators.Required()])
+    school_code = wtforms.StringField("Kód školy",
+                                      validators=[validators.Required()],
+                                      description="Viz katalog škol na tomto webu")
     rocnik = wtforms.StringField(
             "Ročník",
             description="Pro základní školy je to číslo od 1 do 9, pro <var>k</var>-tý ročník <var>r</var>-leté střední školy má formát <var>k</var>/<var>r</var>.",
             validators=[validators.Required()])
     rok_naroz = wtforms.StringField("Rok narození")
-    participation_place = wtforms.SelectField('Soutěžní místo', coerce=int)
+    participation_place = wtforms.StringField('Soutěžní místo')
     save = wtforms.SubmitField("Přidat")
 
-    def set_contest(self, contest_id: int, site_id: int):
-        sess = db.get_session()
-        places = (
-            sess.query(db.Place)
-            .select_from(db.Participation).join(db.Place)
-            .filter(db.Participation.contest_id == contest_id).all()
-        )
-        if len(places) == 0:
-            places = (
-                sess.query(db.Place)
-                .select_from(db.Contest).join(db.Place)
-                .filter(db.Contest.contest_id == contest_id).all()
-            )
+    def get_school_code(self) -> str:
+        return self.school_code.data
 
-        self.participation_place.choices = [(p.place_id, p.name) for p in places]
-        if site_id:
-            self.participation_place.data = site_id
+    def get_participation_place(self) -> str:
+        return self.participation_place.data
+
+    def set_contest(self, contest: db.Contest):
+        self.participation_place.description = "Pokud účastník soutěží někde jinde než: "+contest.place.name+". Dozor na soutěžním místě má pak právo odevzdávat za účastníka řešení."
 
     def validate_email(form, field):
         try:
@@ -277,6 +299,56 @@ class ParticipantAddForm(FlaskForm):
             raise wtforms.ValidationError(str(e))
 
 
+class ParticipantAddFormWithSchoolSelect(FlaskForm):
+    email = wtforms.StringField("E-mail", validators=[validators.Required()])
+    first_name = wtforms.StringField("Křestní jméno", validators=[validators.Required()])
+    last_name = wtforms.StringField("Příjmení", validators=[validators.Required()])
+    school_code = wtforms.SelectField("Škola",
+                                      validators=[validators.Required()],
+                                      coerce=int)
+    rocnik = wtforms.StringField(
+            "Ročník",
+            description="Pro základní školy je to číslo od 1 do 9, pro <var>k</var>-tý ročník <var>r</var>-leté střední školy má formát <var>k</var>/<var>r</var>.",
+            validators=[validators.Required()])
+    rok_naroz = wtforms.StringField("Rok narození")
+    participation_place = wtforms.SelectField('Soutěžní místo', coerce=int)
+    save = wtforms.SubmitField("Přidat")
+
+    def get_school_code(self) -> str:
+        return '#'+str(self.school_code.data)
+
+    def get_participation_place(self) -> str:
+        return '#'+str(self.participation_place.data)
+
+    def set_contest(self, contest: db.Contest, site: db.Place):
+        sess = db.get_session()
+
+        schools = []
+        if contest.place.level == 2:
+            school = aliased(db.Place)
+            schools = (
+                sess.query(school)
+                .select_from(db.Place).join(school, school.parent == db.Place.place_id)
+                .filter(db.Place.parent == contest.place.place_id).order_by('name').all()
+            )
+        elif contest.place.level == 3:
+            schools = (
+                sess.query(db.Place)
+                .select_from(db.Place)
+                .filter(db.Place.parent == contest.place.place_id).order_by('name').all()
+            )
+        elif contest.place.level == 4:
+            schools = [contest.place]
+
+        self.school_code.choices = [(s.place_id, s.name) for s in schools]
+
+        places = [contest.place] + schools
+        self.participation_place.choices = [(p.place_id, p.name) for p in places]
+        if site:
+            self.participation_place.data = site.place_id
+            self.participation_place.render_kw={'disabled': True}
+
+
 def get_contest(id: int) -> Tuple[db.Contest, db.Contest]:
     """Vrací contest a master_contest pro zadané contest_id.
     Pro nedělená kola platí contest == master_contest.
@@ -484,25 +556,34 @@ def org_contest_import(id: int):
 @app.route('/org/contest/c/<int:id>/ucastnici/pridat', methods=('GET', 'POST'))
 @app.route('/org/contest/c/<int:id>/site/<int:site_id>/ucastnici/pridat', methods=('GET', 'POST'))
 def org_contest_add_user(id: int, site_id: Optional[int] = None):
-    contest, site, rr = get_contest_site_rr(id, site_id, right_needed=Right.manage_contest)
+    contest, master_contest, site, rr = get_contest_site_rr(id, site_id, right_needed=Right.manage_contest)
 
     errs = None
-    form = ParticipantAddForm()
-    form.set_contest(id, site_id)
+    form = None
+    if master_contest.place.level >= 2:
+        form = ParticipantAddFormWithSchoolSelect()
+        form.set_contest(master_contest, site)
+    elif site:
+        form = ParticipantAddForm()
+        form.set_site(site)
+    else:
+        form = ParticipantAddFormWithSite()
+        form.set_contest(master_contest)
+
     if form.validate_on_submit():
         row = ContestImportRow()
         row.email = form.email.data
         row.krestni = form.first_name.data
         row.prijmeni = form.last_name.data
-        row.kod_skoly = form.school_code.data
+        row.kod_skoly = form.get_school_code()
         row.rocnik = form.rocnik.data
         row.rok_naroz = form.rok_naroz.data
-        row.kod_mista = '#'+str(form.participation_place.data)
+        row.kod_mista = form.get_participation_place()
 
         imp = ContestImport()
         imp.user = g.user
         imp.round = contest.round
-        imp.contest = contest
+        imp.contest = master_contest
         imp.gatekeeper = mo.rights.Gatekeeper(g.user)
         imp.setup()
         imp.import_row(row)
@@ -516,7 +597,7 @@ def org_contest_add_user(id: int, site_id: Optional[int] = None):
 
     return render_template(
         'org_contest_add_user.html',
-        contest=contest, site=site,
+        contest=master_contest, site=site,
         form=form, errs=errs
     )