diff --git a/contracts/management/commands/import_old_contracts.py b/contracts/management/commands/import_old_contracts.py
index 6af1031af00721ba3000a2e10762afe94ad16ad7..4fcc2485d281e0984e472ded7a133e07b6f49e3f 100644
--- a/contracts/management/commands/import_old_contracts.py
+++ b/contracts/management/commands/import_old_contracts.py
@@ -6,6 +6,7 @@ from datetime import date, datetime
 
 import yaml
 from django.conf import settings
+from django.core.files import File
 from django.core.management.base import BaseCommand
 from django.db import models
 from postal.parser import parse_address
@@ -14,6 +15,7 @@ from git import Repo
 
 from ...models import (
     Contract,
+    ContractFile,
     ContractFilingArea,
     ContractType,
     Contractee,
@@ -408,6 +410,33 @@ class Command(BaseCommand):
 
         return area_name
 
+    def normalize_filename(self, filename: str) -> str:
+        filename = string.capwords(filename)
+
+        patterns = (
+            (
+                r"\s\s+",
+                " "
+            ),
+            (
+                r"^((P|p)odepsaná (V|v)erze|Strojově Čitelná Verze)$",
+                "Anonymizovaná verze",
+            ),
+            (
+                r"^(P|p)odepsaná (V|v)erze 2$",
+                "Anonymizovaná verze 2"
+            ),
+            (
+                r"^(U|u)pravitelná (V|v)erze$",
+                "Upravitelná verze"
+            )
+        )
+
+        for pattern in patterns:
+            filename = re.sub(pattern[0], pattern[1], filename)
+
+        return filename
+
     def parse_index(
         self,
         contract_root: str,
@@ -775,8 +804,37 @@ class Command(BaseCommand):
                     instance.department = self.normalize_department(signing_party_value)
                     self.normalization_count += 1
 
+        if model is Signee:
+            if (
+                "s.r.o" in instance.name
+                or "s. r. o." in instance.name
+                or "a.s." in instance.name
+                or "a. s." in instance.name
+                or "o.s." in instance.name
+                or "o. s." in instance.name
+                or "z.s." in instance.name
+                or "z. s." in instance.name
+                or "1" in instance.name
+                or "2" in instance.name
+                or "3" in instance.name
+                or "4" in instance.name
+                or "5" in instance.name
+                or "6" in instance.name
+                or "7" in instance.name
+                or "8" in instance.name
+                or "9" in instance.name
+                or "0" in instance.name
+                or len(instance.name.split(" ")) not in (2, 3)
+            ):
+                instance.entity_type = instance.EntityTypes.LEGAL_ENTITY
+            else:
+                if instance.ico_number is None:
+                    instance.entity_type = instance.EntityTypes.NATURAL_PERSON
+                else:
+                    instance.entity_type = instance.EntityTypes.BUSINESS_NATURAL_PERSON
+
         # Do our best to merge signing parties together.
-        existing_instance = model.objects.filter(
+        existing_instances = model.objects.filter(
             (
                 models.Q(name=instance.name)
                 & (
@@ -812,32 +870,37 @@ class Command(BaseCommand):
                 if instance.ico_number is not None
                 else models.Value(False)
             )
-        ).first()
-
-        if existing_instance is not None:
-            if existing_instance.ico_number is None and instance.ico_number is not None:
-                existing_instance.ico_number = instance.ico_number
-                existing_instance.save()
-                instance = existing_instance
-            elif existing_instance.ico_number == instance.ico_number or instance.ico_number is None:
-                instance = existing_instance
-            else:
-                instance.save()
+        ).all()
+
+        if len(existing_instances) != 0:
+            for position, existing_instance in enumerate(existing_instances):
+                if existing_instance.ico_number is None and instance.ico_number is not None:
+                    existing_instance.ico_number = instance.ico_number
+                    existing_instance.save()
+                    instance = existing_instance
+                    break
+                elif existing_instance.ico_number == instance.ico_number or instance.ico_number is None:
+                    instance = existing_instance
+                    break
+                elif position == len(existing_instances) - 1:
+                    instance.save()
         else:
             instance.save()
 
         return instance, representatives, is_contractee, issue_count
 
-    def assign_contract_metadata(
+    def assign_contract_data(
         self,
         contract: Contract,
         metadata: dict,
         slug: str,
+        contract_root: str,
     ) -> None:
         filing_area = None
         types = []
         signees = []
         contractees = []
+        files = []
         is_already_imported = False
         observed_issues_count = 0
 
@@ -1109,9 +1172,72 @@ class Command(BaseCommand):
 
                         continue
 
-                    for filename in value:
-                        if not isinstance(filename, str):
-                            
+                    for file_data in value:
+                        if not isinstance(file_data, dict):
+                            observed_issues_count += 1
+                            contract.notes += f"Špatně zadané informace o souboru: {file_data}.\n"
+
+                            if self.verbosity >= 2:
+                                self.stderr.write(
+                                    self.style.NOTICE(
+                                        f"File data in {slug} is not a dict: {file_data}."
+                                    )
+                                )
+
+                            continue
+
+                        for file_key, file_value in file_data.items():
+                            file_key = file_key.strip()
+
+                            if file_key.lower() in ("název", "náhled", "náhlad"):
+                                continue
+
+                            if not isinstance(file_value, str):
+                                observed_issues_count += 1
+                                contract.notes += f"Špatně zadaný název souboru {file_key}: {file_value}.\n"
+
+                                if self.verbosity >= 2:
+                                    self.stderr.write(
+                                        self.style.NOTICE(
+                                            f"Filename in {slug} for file {file_key} invalid: {file_value}."
+                                        )
+                                    )
+
+                                continue
+
+                            file_path = os.path.join(
+                                contract_root,
+                                file_value
+                            )
+
+                            if not os.path.isfile(file_path):
+                                observed_issues_count += 1
+                                contract.notes += f"Neexistující soubor: {file_value}.\n"
+
+                                if self.verbosity >= 2:
+                                    self.stderr.write(
+                                        self.style.NOTICE(
+                                            f"Filename in {slug} does not correspond to a file: {file_value}."
+                                        )
+                                    )
+
+                                continue
+
+                            with open(file_path, "rb") as open_file:
+                                self.normalization_count += 1
+                                file = ContractFile(
+                                    contract=contract,
+                                    name=self.normalize_filename(file_key),
+                                    is_public=True
+                                )
+
+                                file.file.save(
+                                    file_value,
+                                    File(open_file),
+                                    save=False,
+                                )
+
+                                files.append(file)
 
         if not is_already_imported:
             if contract.name in (None, "") or (
@@ -1173,6 +1299,9 @@ class Command(BaseCommand):
                     representative.signature = signature
                     representative.save()
 
+            for file in files:
+                file.save()
+
             contract.filing_area = filing_area
             contract.types.set(types)
             contract.save()
@@ -1209,10 +1338,11 @@ class Command(BaseCommand):
 
                         return
 
-                    self.assign_contract_metadata(
+                    self.assign_contract_data(
                         contract,
                         metadata,
                         os.path.basename(contract_root),
+                        contract_root,
                     )
                 elif file_.endswith(".pdf"):
                     # TODO
@@ -1332,6 +1462,7 @@ class Command(BaseCommand):
                 Contract,
                 ContractType,
                 ContractFilingArea,
+                ContractFile,
                 Contractee,
                 ContracteeSignature,
                 Signee,
diff --git a/static_src/admin/contract_file_form.js b/static_src/admin/contract_file_form.js
index 38f84779a4fa84d832f7e7d297507c70e1c48f06..b5210e1ca542a749ead5f32da4f938ceac647b3b 100644
--- a/static_src/admin/contract_file_form.js
+++ b/static_src/admin/contract_file_form.js
@@ -6,6 +6,7 @@ $(window).ready(
             `<datalist id="file-types">
     <option value="Původní verze">
     <option value="Anonymizovaná verze">
+    <option value="Upravitelná verze">
 </datalist>`
         );
     }