diff --git a/mo/web/org_users.py b/mo/web/org_users.py
index f0abd8eb2dbfb7a5c738fad2b941cfcf182bf824..6687a5bce2431ec0fceb407109b67ef6f6a3250e 100644
--- a/mo/web/org_users.py
+++ b/mo/web/org_users.py
@@ -5,7 +5,7 @@ from flask_wtf import FlaskForm
 from sqlalchemy import or_, select, Column
 from sqlalchemy.orm import joinedload, subqueryload
 from sqlalchemy.orm.query import Query
-from typing import Optional, Set, Union, List, Tuple
+from typing import Optional, Set, Union, List, Tuple, Sequence
 import urllib.parse
 import werkzeug.exceptions
 import wtforms
@@ -29,6 +29,12 @@ from mo.web.imports import ImportForm, generic_import_page
 from mo.web.util import PagerForm
 
 
+def sorted_user_roles(roles: Sequence[db.UserRole]) -> List[db.UserRole]:
+    # Používá se ve výpisech rolí jednoho uživatele.
+    # Doporučujeme preloadnout UserRole.place.
+    return sorted(roles, key=lambda ur: (ur.year or 0, ur.seq or 0, mo.rights.role_order_by_type[ur.role], ur.place.level, ur.category or "", ur.user_role_id))
+
+
 class UsersFilterForm(PagerForm):
     # user
     search_name = mo_fields.String("Jméno/příjmení", render_kw={'autofocus': True})
@@ -280,6 +286,7 @@ def org_orgs() -> str:
             can_edit=rr.have_right(Right.edit_orgs),
             can_add=rr.have_right(Right.add_orgs),
             can_send_email=rr.can_send_email(count),
+            sorted_user_roles=sorted_user_roles,
         )
 
 
@@ -411,6 +418,7 @@ def org_org(id: int):
         roles_by_type=mo.rights.roles_by_type, role_errors=role_errors,
         form_add_role=form_add_role, form_remove_role=form_remove_role,
         resend_invite_form=resend_invite_form,
+        sorted_user_roles=sorted_user_roles,
     )
 
 
diff --git a/mo/web/templates/org_org.html b/mo/web/templates/org_org.html
index adce580dd53989efcc517e7ca2b8d938deeeed7d..6d99a70051b154c6421d5554264f1b0df26c89ab 100644
--- a/mo/web/templates/org_org.html
+++ b/mo/web/templates/org_org.html
@@ -54,7 +54,7 @@
 			<th>Role<th>Oblast<th>Ročník<th>Kategorie<th class='has-tip' title='Pořadí kola v kategorii'>Kolo<th>Přidělil<th>Akce
 		</tr>
 	</thead>
-{% for role in user.roles %}
+{% for role in sorted_user_roles(user.roles) %}
 	<tr>
 		<td>{{ roles_by_type[role.role].name }}
 		<td><a href="{{ url_for('org_place', id=role.place_id) }}">{{ role.place.type_name() + ": " + role.place.name or '*' }}</a>
diff --git a/mo/web/templates/org_orgs.html b/mo/web/templates/org_orgs.html
index 5ee560b45412322f5fea132943a6ccf777209a5c..a069834a58acd24d8a526845d82ab935548a7b4d 100644
--- a/mo/web/templates/org_orgs.html
+++ b/mo/web/templates/org_orgs.html
@@ -85,7 +85,7 @@
 		<td>{% if user.is_system %}systémový uživatel{% elif user.is_admin %}správce{% elif user.roles|count == 0 %}<i>žádná role</i>{% endif %}
 			{% if user.roles|count > 0 %}
 			<ul>
-			{% for role in user.roles %}
+			{% for role in sorted_user_roles(user.roles) %}
 				{% if role.user_role_id in marked_roles_id %}
 					<li><b>{{ role }}</b></li>
 				{% else %}