diff --git a/contracts/migrations/0033_alter_contractfile_file.py b/contracts/migrations/0033_alter_contractfile_file.py
new file mode 100644
index 0000000000000000000000000000000000000000..bf56c070772fb50c7862cba7479d131701f828ab
--- /dev/null
+++ b/contracts/migrations/0033_alter_contractfile_file.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.1.4 on 2023-04-10 21:45
+
+import contracts.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('contracts', '0032_alter_signee_address_country'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='contractfile',
+            name='file',
+            field=models.FileField(upload_to=contracts.models.get_contract_file_loaction, verbose_name='Soubor'),
+        ),
+    ]
diff --git a/contracts/models.py b/contracts/models.py
index 6df13582b4bececd35459f36f07ee9a90a945dda..51fa00576f41bcf193fcdc85b8d58a87db4932cb 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -1,4 +1,6 @@
 import datetime
+import os
+import mimetypes
 import typing
 
 from django.conf import settings
@@ -740,6 +742,29 @@ class Contract(NameStrMixin, models.Model):
         ] + OwnPermissionsMixin.Meta.permissions
 
 
+def get_contract_file_loaction(instance, filename):
+    mimetypes_instance = mimetypes.MimeTypes()
+
+    current_time = datetime.datetime.today()
+    guessed_type = mimetypes_instance.guess_type(filename, strict=False)[0]
+
+    extension = ""
+
+    if guessed_type is not None:
+        for mapper in mimetypes_instance.types_map_inv:
+            if guessed_type not in mapper:
+                continue
+
+            extension = mapper[guessed_type]
+            break
+
+    return (
+        "_private/"
+        f"{current_time.year}/{current_time.month}/{current_time.day}/"
+        f"{str(instance.id)}{extension}"
+    )
+
+
 class ContractFile(NameStrMixin, models.Model):
     name = models.CharField(
         max_length=128,
@@ -754,7 +779,7 @@ class ContractFile(NameStrMixin, models.Model):
 
     file = models.FileField(
         verbose_name="Soubor",
-        upload_to="_private/",
+        upload_to=get_contract_file_loaction,
     )
 
     contract = models.ForeignKey(