diff --git a/db/db.ddl b/db/db.ddl
index 2cdf48a4574b789a3b77434b169997bceca1b6e9..d0841c548c8b534824b73005bd236c83e07e50e9 100644
--- a/db/db.ddl
+++ b/db/db.ddl
@@ -115,6 +115,7 @@ CREATE TABLE rounds (
 	seq		int		NOT NULL,			-- 1=domácí kolo atd.
 	part		int		NOT NULL DEFAULT 0,		-- část kola (nenulová u dělených kol)
 	level		int		NOT NULL,			-- úroveň hierarchie míst
+	code		varchar(255)	NOT NULL DEFAULT '',		-- kód kola ("1", "S" apod.), prázdný=podle seq
 	name		varchar(255)	NOT NULL,			-- zobrazované jméno ("Krajské kolo" apod.)
 	state		round_state	NOT NULL DEFAULT 'preparing',	-- stav kola
 	tasks_file	varchar(255)	DEFAULT NULL,			-- jméno souboru se zadáním úloh
diff --git a/db/upgrade-20210929.sql b/db/upgrade-20210929.sql
new file mode 100644
index 0000000000000000000000000000000000000000..d48a034938f215ef5a7d2fd167d64c61695ebc58
--- /dev/null
+++ b/db/upgrade-20210929.sql
@@ -0,0 +1,4 @@
+SET ROLE 'mo_osmo';
+
+ALTER TABLE ROUNDS ADD COLUMN
+	code		varchar(255)	NOT NULL DEFAULT '';
diff --git a/mo/db.py b/mo/db.py
index d7df8327b7688bccd70f8381c822684ff56884d0..649ab47e6cb2e2a2dd75873cf34434fc84ee9430 100644
--- a/mo/db.py
+++ b/mo/db.py
@@ -249,6 +249,7 @@ class Round(Base):
     seq = Column(Integer, nullable=False)
     part = Column(Integer, nullable=False)
     level = Column(Integer, nullable=False)
+    code = Column(String(255), nullable=False)
     name = Column(String(255), nullable=False)
     state = Column(Enum(RoundState, name='round_state'), nullable=False, server_default=text("'preparing'::round_state"))
     tasks_file = Column(String(255))
@@ -268,7 +269,7 @@ class Round(Base):
 
     def round_code_short(self):
         """ Pro samostatné kolo ekvivalentní s `round_code()`, pro skupinu kol společná část kódu. """
-        return f"{self.year}-{self.category}-{self.seq}"
+        return f"{self.year}-{self.category}-{self.code or self.seq}"
 
     def part_code(self):
         return chr(ord('a') + self.part - 1) if self.part > 0 else ""