diff --git a/mo/imports.py b/mo/imports.py
index 6bccc47d8a2d6e8f56f424acced6a3a0f48047a1..b8c34f96702b3073f11eeb6be0180515da11d701 100644
--- a/mo/imports.py
+++ b/mo/imports.py
@@ -104,9 +104,12 @@ class Import:
         except ValueError:
             return self.error('ID uživatele není číslo')
 
-    def parse_email(self, email: str) -> Optional[str]:
+    def parse_email(self, email: str, optional: bool) -> Optional[str]:
         if email == "":
-            return self.error('Chybí e-mailová adresa')
+            if optional:
+                return ""
+            else:
+                return self.error('Chybí e-mailová adresa')
 
         try:
             # XXX: Zde si nemůžeme dovolit kontrolovat existenci domén,
@@ -213,12 +216,11 @@ class Import:
 
     def find_or_create_user(self, email: str, krestni: Optional[str], prijmeni: Optional[str], is_org: bool) -> Optional[db.User]:
         try:
-            try:
-                user, is_new, is_user_to_org = mo.users.find_or_create_user(email, krestni, prijmeni, is_org, allow_change_user_to_org=self.allow_change_user_to_org, reason='import')
-                self.cnt_change_user_to_org += is_user_to_org
-            except mo.users.CheckErrorOrgIsUser as e:
-                self.cnt_change_user_to_org += 1
-                raise mo.CheckError(str(e) + " Změnu můžete povolit ve formuláři.")
+            user, is_new, is_user_to_org = mo.users.find_or_create_user(email, krestni, prijmeni, is_org, allow_change_user_to_org=self.allow_change_user_to_org, reason='import')
+            self.cnt_change_user_to_org += is_user_to_org
+        except mo.users.CheckErrorOrgIsUser as e:
+            self.cnt_change_user_to_org += 1
+            raise mo.CheckError(str(e) + " Změnu můžete povolit ve formuláři.")
         except mo.CheckError as e:
             return self.error(str(e))
         if is_new:
@@ -387,9 +389,11 @@ class Import:
             return False
 
     def get_row_name(self, row: mo.csv.Row) -> Optional[str]:
-        if hasattr(row, 'email'):
-            # čtení prvku potomka
+        # čteme prvky potomka třídy Row
+        if hasattr(row, 'email') and row.email:
             return row.email  # type: ignore
+        if hasattr(row, 'krestni') and hasattr(row, 'prijmeni') and row.krestni and row.prijmeni:
+            return row.krestni + ' ' + row.prijmeni  # type: ignore
         return None
 
     def generic_import(self, path: str, despite_warnings: bool) -> bool:
@@ -514,7 +518,7 @@ class ContestImport(Import):
         assert self.round
         assert isinstance(r, ContestImportRow)
         num_prev_errs = len(self.errors)
-        email = self.parse_email(r.email)
+        email = self.parse_email(r.email, optional=True)
         krestni = self.parse_name(r.krestni) if r.krestni else None
         prijmeni = self.parse_name(r.prijmeni) if r.prijmeni else None
         school_place = self.parse_school(r.kod_skoly) if r.kod_skoly else None
@@ -522,6 +526,7 @@ class ContestImport(Import):
             school_place = self.default_place
         rocnik = self.parse_grade(r.rocnik, (school_place.school if school_place else None)) if r.rocnik else None
         rok_naroz = self.parse_born(r.rok_naroz) if r.rok_naroz else None
+
         misto = self.parse_opt_place(r.kod_mista, 'místo')
         if misto and not self.check_rights(self.round, misto):
             return self.error(f'Nemáte práva na správu soutěže {misto.name_locative()}')
@@ -530,10 +535,13 @@ class ContestImport(Import):
         if oblast and not self.check_rights(self.round, oblast):
             return self.error(f'Nemáte práva na správu soutěže {oblast.name_locative()}')
 
-        if (len(self.errors) > num_prev_errs
-                or email is None):
+        if len(self.errors) > num_prev_errs:
             return
 
+        try:
+            email = mo.users.email_or_synthesize(email, krestni, prijmeni, rocnik, school_place)
+        except mo.CheckError as e:
+            return self.error(str(e))
         user = self.find_or_create_user(email, krestni, prijmeni, is_org=False)
         if user is None:
             return
@@ -604,7 +612,7 @@ class OrgsImport(Import):
     def import_row(self, r: mo.csv.Row) -> None:
         assert isinstance(r, OrgsImportRow) or isinstance(r, GlobalOrgsImportRow)
         num_prev_errs = len(self.errors)
-        email = self.parse_email(r.email)
+        email = self.parse_email(r.email, optional=False)
         krestni = self.parse_name(r.krestni)
         prijmeni = self.parse_name(r.prijmeni)
         role = self.parse_role(r.role)