diff --git a/www/trac-devel/Makefile b/www/trac-devel/Makefile
index aaff16b2df4c..f1df0e79e00d 100644
--- a/www/trac-devel/Makefile
+++ b/www/trac-devel/Makefile
@@ -1,61 +1,61 @@
 PORTNAME=	trac
-DISTVERSION=	1.5.2
+DISTVERSION=	1.5.3
 PORTREVISION=	2
 CATEGORIES=	www devel python
 MASTER_SITES=	http://ftp.edgewall.com/pub/trac/ \
 		ftp://ftp.edgewall.com/pub/trac/
 PKGNAMESUFFIX=	-devel
 DISTNAME=	Trac-${DISTVERSION}
 
 MAINTAINER=	samm@FreeBSD.org
 COMMENT=	Enhanced wiki and issue tracking system for software projects
 
 LICENSE=	BSD3CLAUSE
 LICENSE_FILE=	${WRKSRC}/COPYING
 
 BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}Babel>=2.3.4:devel/py-babel@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}Jinja2>=2.10:devel/py-Jinja2@${PY_FLAVOR}
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}Babel>=2.3.4:devel/py-babel@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}Jinja2>=2.10:devel/py-Jinja2@${PY_FLAVOR}
 
 # some tests are failing with 3.8
 USES=		python:3.7+
 
 CONFLICTS_INSTALL=	trac
 
 USE_PYTHON=	distutils autoplist
 USE_RC_SUBR=	tracd
 SUB_LIST=	PYTHON_CMD=${PYTHON_CMD}
 
 PORTEXAMPLES=	*
 PORTDATA=	*
 
 NO_ARCH=	yes
 
 OPTIONS_DEFINE=		DOCUTILS EXAMPLES FCGI GIT PYGMENTS SUBVERSION TEXTILE TZ
 OPTIONS_DEFAULT=	DOCUTILS FCGI PYGMENTS SQLITE SUBVERSION TEXTILE TZ
 OPTIONS_MULTI=		DATABASE
 OPTIONS_MULTI_DATABASE=	MYSQL PGSQL SQLITE
 DOCUTILS_DESC=		Allow additional text markup
 PYGMENTS_DESC=		Use generic syntax highlighter
 TEXTILE_DESC=		Support for the Textile markup
 TZ_DESC=		Process Time Zones
 FCGI_DESC=		Enable FastCGI support
 
 DOCUTILS_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}docutils>=0.14:textproc/py-docutils@${PY_FLAVOR}
 PYGMENTS_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}pygments>=1.0:textproc/py-pygments@${PY_FLAVOR}
 TZ_RUN_DEPENDS=		${PYTHON_PKGNAMEPREFIX}pytz>0:devel/py-pytz@${PY_FLAVOR}
 PGSQL_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}psycopg2>0:databases/py-psycopg2@${PY_FLAVOR}
 SQLITE_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3@${PY_FLAVOR}
 MYSQL_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}mysqlclient>=0:databases/py-mysqlclient@${PY_FLAVOR}
 SUBVERSION_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}subversion>0:devel/py-subversion@${PY_FLAVOR}
 GIT_RUN_DEPENDS=	git:devel/git
 TEXTILE_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}textile>0:www/py-textile@${PY_FLAVOR}
 FCGI_RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}flup6>0:www/py-flup6@${PY_FLAVOR}
 
 post-install-EXAMPLES-on:
 	@${MKDIR} ${STAGEDIR}${EXAMPLESDIR}/sample-plugins
 	${FIND} ${WRKSRC}/contrib -type f -maxdepth 1 -exec ${INSTALL_DATA} {} ${STAGEDIR}${EXAMPLESDIR}/ \;
 	(cd ${WRKSRC}/sample-plugins && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR}/sample-plugins)
 
 .include <bsd.port.mk>
diff --git a/www/trac-devel/distinfo b/www/trac-devel/distinfo
index a5cb0f6307e4..bc1e278bd51b 100644
--- a/www/trac-devel/distinfo
+++ b/www/trac-devel/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1609593024
-SHA256 (Trac-1.5.2.tar.gz) = dac241e8018e11374cfabe68f902d815948611481f4ecb565e4f076768547e39
-SIZE (Trac-1.5.2.tar.gz) = 5416364
+TIMESTAMP = 1637782544
+SHA256 (Trac-1.5.3.tar.gz) = 699f5dd3ce82fb7138c726ef55a653f09531823e26170a1fb4d71d31b4adeaa5
+SIZE (Trac-1.5.3.tar.gz) = 5423354
diff --git a/www/trac-devel/files/patch-trac_ticket_templates_report__view.html b/www/trac-devel/files/patch-trac_ticket_templates_report__view.html
new file mode 100644
index 000000000000..de20599c2244
--- /dev/null
+++ b/www/trac-devel/files/patch-trac_ticket_templates_report__view.html
@@ -0,0 +1,10 @@
+--- trac/ticket/templates/report_view.html.orig	2021-05-09 23:08:49 UTC
++++ trac/ticket/templates/report_view.html
+@@ -162,6 +162,7 @@ history and logs, available at https://trac.edgewall.o
+         # for value_for_group, row_group in row_groups:
+         #   if loop.first:
+         <thead>
++          #   set header_group, header = None, None
+           #   set column_headers
+           #     for header_group in header_groups:
+           <tr class="trac-columns">
diff --git a/www/trac-devel/files/patch-trac_util_html.py b/www/trac-devel/files/patch-trac_util_html.py
new file mode 100644
index 000000000000..e99992efd7d1
--- /dev/null
+++ b/www/trac-devel/files/patch-trac_util_html.py
@@ -0,0 +1,11 @@
+--- trac/util/html.py.orig	2021-05-09 23:08:49 UTC
++++ trac/util/html.py
+@@ -24,7 +24,7 @@ import sys
+ from html import entities
+ from html.parser import HTMLParser
+ 
+-from markupsafe import Markup, escape as escape_quotes
++from markupsafe import Markup, escape as escape_quotes, soft_unicode
+ 
+ try:
+     from babel.support import LazyProxy
diff --git a/www/trac-devel/files/patch-trac_util_presentation.py b/www/trac-devel/files/patch-trac_util_presentation.py
new file mode 100644
index 000000000000..f04f3a8bab1d
--- /dev/null
+++ b/www/trac-devel/files/patch-trac_util_presentation.py
@@ -0,0 +1,19 @@
+--- trac/util/presentation.py.orig	2021-05-09 23:08:49 UTC
++++ trac/util/presentation.py
+@@ -21,13 +21,13 @@ from datetime import datetime
+ from math import ceil
+ import re
+ 
+-from jinja2 import Markup, Undefined, contextfilter, evalcontextfilter
++from jinja2 import Undefined, contextfilter, evalcontextfilter
+ from jinja2.filters import make_attrgetter
+-from jinja2.utils import soft_unicode
+ 
+ from trac.core import TracError
+ from .datefmt import to_utimestamp, utc
+-from .html import Fragment, classes, html_attribute, styles, tag
++from .html import (Fragment, Markup, classes, html_attribute, soft_unicode,
++                   styles, tag)
+ from .text import javascript_quote
+ 
+ __all__ = ['captioned_button', 'classes', 'first_last', 'group', 'istext',
diff --git a/www/trac-devel/files/patch-trac_util_text.py b/www/trac-devel/files/patch-trac_util_text.py
new file mode 100644
index 000000000000..64e40a62758c
--- /dev/null
+++ b/www/trac-devel/files/patch-trac_util_text.py
@@ -0,0 +1,31 @@
+--- trac/util/text.py.orig	2021-05-09 23:08:49 UTC
++++ trac/util/text.py
+@@ -22,6 +22,7 @@ import base64
+ import configparser
+ import locale
+ import os
++import pkg_resources
+ import re
+ import sys
+ import textwrap
+@@ -43,6 +44,11 @@ del Empty # shouldn't be used outside of Trac core
+ 
+ # -- Jinja2
+ 
++_jinja2_ver = pkg_resources.parse_version(jinja2.__version__)
++_jinja2_exts = ['jinja2.ext.do', 'jinja2.ext.i18n']
++if _jinja2_ver < pkg_resources.parse_version('3'):
++    _jinja2_exts.append('jinja2.ext.with_')
++
+ def jinja2env(**kwargs):
+     """Creates a Jinja2 ``Environment`` configured with Trac conventions.
+ 
+@@ -65,7 +71,7 @@ def jinja2env(**kwargs):
+         line_comment_prefix='##',
+         trim_blocks=True,
+         lstrip_blocks=True,
+-        extensions=['jinja2.ext.do', 'jinja2.ext.i18n', 'jinja2.ext.with_'],
++        extensions=list(_jinja2_exts),
+         finalize=filterout_none,
+         autoescape=autoescape_extensions,
+     )