diff --git a/bin/import-points b/bin/import-points
index 17055911b7a7e5f2d95f4ca0c481a67b98b3d62e..14227e981031282456cd5d01b6de61c81b574ac9 100755
--- a/bin/import-points
+++ b/bin/import-points
@@ -5,7 +5,7 @@ import sys
 
 from mo.csv import FileFormat
 import mo.db as db
-from mo.imports import create_import, ImportType
+from mo.imports import PointsImport
 import mo.users
 import mo.util
 from mo.util import die
@@ -37,14 +37,13 @@ user = mo.users.user_by_email(args.user)
 if user is None:
     die(f"Uživatel {args.user} neexistuje")
 
-imp = create_import(
+imp = PointsImport(
     user,
-    type=ImportType.points,
-    fmt=FileFormat.tsv,
     round=round,
     task=task,
     allow_add_del=args.add_del,
 )
+imp.fmt = FileFormat.tsv
 
 if args.import_file:
     if not imp.run(args.import_file):
diff --git a/mo/imports.py b/mo/imports.py
index a831f25783218cc7cc6d1f516aa69412627694ee..6c4156d073a043e5f9ec04417436331b01744bfa 100644
--- a/mo/imports.py
+++ b/mo/imports.py
@@ -54,12 +54,10 @@ class Import:
 
     # Interní: Co a jak zrovna importujeme
     user: db.User
-    round: Optional[db.Round]
-    contest: Optional[db.Contest]
-    only_region: Optional[db.Place]
-    task: Optional[db.Task]         # pro Import bodů
-    allow_add_del: bool             # pro Import bodů: je povoleno zakládat/mazat řešení
-    allow_change_user_to_org: bool = False # pro Import orgů: je povoleno vyrobit orga z účastníka
+    round: Optional[db.Round] = None
+    contest: Optional[db.Contest] = None
+    only_region: Optional[db.Place] = None
+    task: Optional[db.Task] = None        # pro Import bodů
     fmt: FileFormat
     row_class: Type[mo.csv.Row]
     row_example: mo.csv.Row
@@ -74,12 +72,14 @@ class Import:
     line_number: int = 0
     row_name: Optional[str] = None
 
-    def __init__(self):
+    def __init__(self, user: db.User):
         self.errors = []
         self.warnings = []
         self.place_cache = {}
         self.school_place_cache = {}
         self.new_user_ids = []
+        self.gatekeeper = mo.rights.Gatekeeper(user)
+        self.user = user
 
     def setup(self):
         # Definováno odvozenými třídami
@@ -461,6 +461,25 @@ class ContestImport(Import):
     log_details = {'action': 'import'}
     template_basename = 'sablona-ucast'
 
+    def __init__(
+         self,
+         user: db.User,
+         type: ImportType,
+         round: Optional[db.Round] = None,
+         contest: Optional[db.Contest] = None,
+         only_region: Optional[db.Place] = None,
+         task: Optional[db.Task] = None,
+         default_place: Optional[db.Place] = None
+    ):
+        super().__init__(user)
+        self.user = user
+        self.round = round
+        self.contest = contest
+        self.only_region = only_region
+        self.task = task
+        self.default_place = default_place
+        self.setup()
+
     def setup(self):
         assert self.round is not None
         assert not self.round.is_subround()
@@ -521,6 +540,25 @@ class OrgsImport(Import):
     log_details = {'action': 'import-orgs'}
     template_basename = 'sablona-organizatori'
 
+    allow_change_user_to_org: bool = False # je povoleno vyrobit orga z účastníka
+
+    def __init__(
+        self,
+        user: db.User,
+        round: Optional[db.Round] = None,
+        contest: Optional[db.Contest] = None,
+        only_region: Optional[db.Place] = None,
+        allow_change_user_to_org: bool = False,
+        default_place: Optional[db.Place] = None
+    ):
+        super().__init__(user)
+        self.round = round
+        self.contest = contest
+        self.only_region = only_region
+        self.default_place = default_place
+        self.setup()
+        self.allow_change_user_to_org = allow_change_user_to_org
+
     def setup(self):
         assert self.round is not None
         self.root_place = db.get_root_place()
@@ -571,6 +609,25 @@ class PointsImport(Import):
     row_class = PointsImportRow
     log_msg_prefix = 'Body'
 
+    allow_add_del: bool             # je povoleno zakládat/mazat řešení
+
+    def __init__(
+        self,
+        user: db.User,
+        round: Optional[db.Round] = None,
+        contest: Optional[db.Contest] = None,
+        task: Optional[db.Task] = None,
+        only_region: Optional[db.Place] = None,
+        allow_add_del: bool = False,
+    ):
+        super().__init__(user)
+        self.round = round
+        self.contest = contest
+        self.task = task
+        self.only_region = only_region
+        self.allow_add_del = allow_add_del
+        self.setup()
+
     def setup(self):
         assert self.round is not None
         assert self.task is not None
@@ -710,38 +767,3 @@ class PointsImport(Import):
 
     def get_after_import_message(self) -> str:
         return f'Importováno ({self.cnt_rows} řádků, {self.cnt_set_points} řešení přebodováno, {self.cnt_add_sols} založeno a {self.cnt_del_sols} smazáno)'
-
-
-def create_import(user: db.User,
-                  type: ImportType,
-                  fmt: FileFormat,
-                  round: Optional[db.Round] = None,
-                  contest: Optional[db.Contest] = None,
-                  only_region: Optional[db.Place] = None,
-                  task: Optional[db.Task] = None,
-                  allow_add_del: bool = False,
-                  allow_change_user_to_org: bool = False,
-                  default_place: Optional[db.Place] = None):
-    imp: Import
-    if type == ImportType.participants:
-        imp = ContestImport()
-    elif type == ImportType.orgs:
-        imp = OrgsImport()
-        imp.allow_change_user_to_org = allow_change_user_to_org
-    elif type == ImportType.points:
-        imp = PointsImport()
-    else:
-        assert False, "Neznámý typ importu"
-
-    imp.user = user
-    imp.round = round
-    imp.contest = contest
-    imp.only_region = only_region
-    imp.task = task
-    imp.allow_add_del = allow_add_del
-    imp.fmt = fmt
-    imp.gatekeeper = mo.rights.Gatekeeper(user)
-    imp.default_place = default_place
-    imp.setup()
-
-    return imp
diff --git a/mo/web/imports.py b/mo/web/imports.py
index 928793d3413ae976a58166c40cee248bd48da134..c9a84cb76cf63223e235ddf0fda24840fccdb5e3 100644
--- a/mo/web/imports.py
+++ b/mo/web/imports.py
@@ -27,6 +27,7 @@ def generic_import_page(form: ImportForm, imp: Optional[Import], redirect_url: s
     warnings = []
     if imp:
         fmt = form.fmt.data
+        imp.fmt = fmt
         if form.submit.data:
             if form.file.data is not None:
                 file = form.file.data.stream
diff --git a/mo/web/org_contest.py b/mo/web/org_contest.py
index 39444f908331fa99ec3b42fe37e938ab67fa6fe9..fc22d418671abf19f329884fa1127c64fa291e2a 100644
--- a/mo/web/org_contest.py
+++ b/mo/web/org_contest.py
@@ -19,7 +19,7 @@ import mo
 from mo.csv import FileFormat
 import mo.config as config
 import mo.db as db
-from mo.imports import ImportType, create_import
+from mo.imports import ImportType, create_import, PointsImport, ContestImport, OrgsImport
 import mo.jobs.submit
 from mo.rights import Right, RoundRights
 import mo.util
@@ -430,11 +430,8 @@ def org_import_user(round_id: Optional[int] = None, hier_id: Optional[int] = Non
     form = UserImportForm()
     imp = None
     if form.validate_on_submit():
-        fmt = form.fmt.data
-        imp = create_import(
+        imp = ContestImport(
             user=g.user,
-            type=ImportType.participants,
-            fmt=fmt,
             round=round,
             contest=contest,
             only_region=ctx.hier_place,
@@ -465,11 +462,8 @@ def org_import_org(round_id: Optional[int] = None, hier_id: Optional[int] = None
     form = OrgImportForm()
     imp = None
     if form.validate_on_submit():
-        fmt = form.fmt.data
-        imp = create_import(
+        imp = OrgsImport(
             user=g.user,
-            type=ImportType.orgs,
-            fmt=fmt,
             round=round,
             contest=contest,
             only_region=ctx.hier_place,
@@ -1326,8 +1320,7 @@ def org_generic_batch_points(task_id: int, round_id: Optional[int] = None, hier_
     form = BatchPointsForm()
     imp = None
     if form.validate_on_submit():
-        fmt = form.fmt.data
-        imp = create_import(user=g.user, type=ImportType.points, fmt=fmt, round=round, only_region=hier_place, contest=contest, task=task, allow_add_del=form.add_del_sols.data)
+        imp = PointsImport(user=g.user, round=round, only_region=hier_place, contest=contest, task=task, allow_add_del=form.add_del_sols.data)
     return generic_import_page(
         form, imp, ctx.url_home(),
         template='org_generic_batch_points.html',