diff --git a/.ansible-core.metadata b/.ansible-core.metadata
index c7452bb..851cd09 100644
--- a/.ansible-core.metadata
+++ b/.ansible-core.metadata
@@ -1,4 +1,7 @@
-a264a9beef663bd0743eb59a8cb5e5f8ce32c527 SOURCES/ansible-fbaea4c269b0a3c8112101754cee808d82bebbee.tar.gz
+f8c73e16f07ba1d1206a9c766362e9bab801f5d9 SOURCES/ansible-e9f633ec720fbd4367d2f694574dec101e22d3b9.tar.gz
+6a9e1e0eec23c0f3091fa53f91eb8701ad7caaeb SOURCES/jinja2-b08cd4bc64bb980df86ed2876978ae5735572280.tar.gz
+72c5fe7f8145d4cff66426c444c33104a9ae3d53 SOURCES/markupsafe-b5a517506d6cb8091e215a4a89e47db5eee6a68f.tar.gz
 d5b06047a8a5937c9433c8e0e88bcf2ccb6a4f84 SOURCES/packaging-ded06cedf6e20680eea0363fac894cb4a09e7831.tar.gz
 f20e820c8fa08ff162ace90735a2a89c599f7166 SOURCES/pyparsing-6a844ee35ca5125490a28dbd6dd2d15b6498e605.tar.gz
+2203e09b2add3d1edceb28e20b2a091e5e6c0344 SOURCES/resolvelib-d935f9fd07246d9641436c7a8e6ae39423374e28.tar.gz
 c17fd6000af4ccf32930c41e928fea1e38cb5d0a SOURCES/straightplugin-6634ea8e1e89d5bb23804f50e676f196c52c46ed.tar.gz
diff --git a/.gitignore b/.gitignore
index 2f10aa6..94110d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,7 @@
-SOURCES/ansible-fbaea4c269b0a3c8112101754cee808d82bebbee.tar.gz
+SOURCES/ansible-e9f633ec720fbd4367d2f694574dec101e22d3b9.tar.gz
+SOURCES/jinja2-b08cd4bc64bb980df86ed2876978ae5735572280.tar.gz
+SOURCES/markupsafe-b5a517506d6cb8091e215a4a89e47db5eee6a68f.tar.gz
 SOURCES/packaging-ded06cedf6e20680eea0363fac894cb4a09e7831.tar.gz
 SOURCES/pyparsing-6a844ee35ca5125490a28dbd6dd2d15b6498e605.tar.gz
+SOURCES/resolvelib-d935f9fd07246d9641436c7a8e6ae39423374e28.tar.gz
 SOURCES/straightplugin-6634ea8e1e89d5bb23804f50e676f196c52c46ed.tar.gz
diff --git a/SPECS/ansible-core.spec b/SPECS/ansible-core.spec
index 9666671..a96162b 100644
--- a/SPECS/ansible-core.spec
+++ b/SPECS/ansible-core.spec
@@ -7,8 +7,8 @@
 # ansible-test munges the shebangs itself.
 %global __brp_mangle_shebangs_exclude_from_file %{SOURCE1}
 
-%global commitId fbaea4c269b0a3c8112101754cee808d82bebbee
-%global python38_sitelib /usr/lib/python3.8/site-packages/
+%global commitId e9f633ec720fbd4367d2f694574dec101e22d3b9
+%global python39_sitelib /usr/lib/python3.9/site-packages/
 
 # NOTE(pabelanger): Don't auto add pwsh as Requires for ansible-test. We do
 # not wish to package it.
@@ -23,18 +23,21 @@
 %define py2_shbang_opts %{nil}
 %define py3_shbang_opts %{nil}
 
-%define vendor_path %{buildroot}%{python38_sitelib}/ansible/_vendor/
-%define vendor_pip /usr/bin/python3.8 -m pip install --no-deps -v --no-use-pep517 --no-binary :all: -t %{vendor_path}
+%define vendor_path %{buildroot}%{python39_sitelib}/ansible/_vendor/
+%define vendor_pip /usr/bin/python3.9 -m pip install --no-deps -v --no-use-pep517 --no-binary :all: -t %{vendor_path}
 
 # These control which bundled dep versions we pin against
+%global jinja2_version 3.1.2
+%global markupsafe_version 2.1.0
 %global packaging_version 20.4
 %global pyparsing_version 2.4.7
+%global resolvelib_version 0.5.4
 %global straightplugin_version 1.4.1
 
 
 Name: ansible-core
 Summary: SSH-based configuration management, deployment, and task execution system
-Version: 2.12.7
+Version: 2.13.1
 Release: 1%{?dist}
 ExcludeArch: i686
 
@@ -44,11 +47,14 @@ Source0: ansible-%{commitId}.tar.gz
 Source1: ansible-test-data-files.txt
 
 # And bundled deps
-Source2: packaging-ded06cedf6e20680eea0363fac894cb4a09e7831.tar.gz
-Source3: pyparsing-6a844ee35ca5125490a28dbd6dd2d15b6498e605.tar.gz
+Source2: jinja2-b08cd4bc64bb980df86ed2876978ae5735572280.tar.gz
+Source3: markupsafe-b5a517506d6cb8091e215a4a89e47db5eee6a68f.tar.gz
+Source4: packaging-ded06cedf6e20680eea0363fac894cb4a09e7831.tar.gz
+Source5: pyparsing-6a844ee35ca5125490a28dbd6dd2d15b6498e605.tar.gz
+Source6: resolvelib-d935f9fd07246d9641436c7a8e6ae39423374e28.tar.gz
 
 # Deps to build man pages
-Source5: straightplugin-6634ea8e1e89d5bb23804f50e676f196c52c46ed.tar.gz
+Source7: straightplugin-6634ea8e1e89d5bb23804f50e676f196c52c46ed.tar.gz
 
 URL: http://ansible.com
 
@@ -62,33 +68,32 @@ Conflicts: ansible-base
 
 # Bundled provides that are sprinkled throughout the codebase.
 Provides: bundled(python-backports-ssl_match_hostname) = 3.7.0.1
-Provides: bundled(python-distro) = 1.5.0
+Provides: bundled(python-distro) = 1.6.0
 Provides: bundled(python-selectors2) = 1.1.1
-Provides: bundled(python-six) = 1.13.0
+Provides: bundled(python-six) = 1.16.0
 
 # Things we explicitly bundle via src rpm, and put in ansible._vendor
+Provides: bundled(python-jinja2) = %{jinja2_version}
+Provides: bundled(python-markupsafe) = %{markupsafe_version}
 Provides: bundled(python-packaging) = %{packaging_version}
 Provides: bundled(python-pyparsing) = %{pyparsing_version}
+Provides: bundled(python-resolvelib) = %{resolvelib_version}
 Provides: bundled(python-straightplugin) = %{straightplugin_version}
 
 BuildRequires: python3-docutils
-BuildRequires: python38-devel
-BuildRequires: python38-jinja2
-BuildRequires: python38-pip
-BuildRequires: python38-pyyaml
-BuildRequires: python38-resolvelib
-BuildRequires: python38-rpm-macros
-BuildRequires: python38-setuptools
-BuildRequires: python38-wheel
-BuildRequires: make git-core
+BuildRequires: python39-devel
+BuildRequires: python39-pip
+BuildRequires: python39-pyyaml
+BuildRequires: python39-rpm-macros
+BuildRequires: python39-setuptools
+BuildRequires: python39-wheel
+BuildRequires: make git-core gcc
 
 Requires: git-core
-Requires: python38
-Requires: python38-jinja2
-Requires: python38-PyYAML
-Requires: python38-cryptography
-Requires: python38-resolvelib
-Requires: python38-six
+Requires: python39
+Requires: python39-PyYAML >= 5.1
+Requires: python39-cryptography
+Requires: python39-six
 Requires: sshpass
 
 %description
@@ -113,27 +118,33 @@ This package installs the ansible-test command for testing modules and plugins
 developed for ansible.
 
 %prep
-%setup -q -T -b 2 -n packaging-ded06cedf6e20680eea0363fac894cb4a09e7831
-%setup -q -T -b 3 -n pyparsing-6a844ee35ca5125490a28dbd6dd2d15b6498e605
-%setup -q -T -b 5 -n straightplugin-6634ea8e1e89d5bb23804f50e676f196c52c46ed
+%setup -q -T -b 2 -n jinja2-b08cd4bc64bb980df86ed2876978ae5735572280
+%setup -q -T -b 3 -n markupsafe-b5a517506d6cb8091e215a4a89e47db5eee6a68f
+%setup -q -T -b 4 -n packaging-ded06cedf6e20680eea0363fac894cb4a09e7831
+%setup -q -T -b 5 -n pyparsing-6a844ee35ca5125490a28dbd6dd2d15b6498e605
+%setup -q -T -b 6 -n resolvelib-d935f9fd07246d9641436c7a8e6ae39423374e28
+%setup -q -T -b 7 -n straightplugin-6634ea8e1e89d5bb23804f50e676f196c52c46ed
 %setup -q -n ansible-%{commitId}
 
 # Fix all Python shebangs recursively in ansible-test
 # -p preserves timestamps
 # -n prevents creating ~backup files
 # -i specifies the interpreter for the shebang
-pathfix3.8.py -pni "%{__python3} %{py3_shbang_opts}" test/lib/ansible_test
+pathfix3.9.py -pni "%{__python3} %{py3_shbang_opts}" test/lib/ansible_test
 
 %build
-/usr/bin/python3.8 setup.py build
+/usr/bin/python3.9 setup.py build
 
 %install
-/usr/bin/python3.8 setup.py install --root %{buildroot}
+/usr/bin/python3.9 setup.py install --root %{buildroot}
 
 # Handle bundled deps:
 %{vendor_pip} \
+  ../jinja2-b08cd4bc64bb980df86ed2876978ae5735572280/ \
+  ../markupsafe-b5a517506d6cb8091e215a4a89e47db5eee6a68f/ \
+  ../packaging-ded06cedf6e20680eea0363fac894cb4a09e7831/ \
   ../pyparsing-6a844ee35ca5125490a28dbd6dd2d15b6498e605/ \
-  ../packaging-ded06cedf6e20680eea0363fac894cb4a09e7831/
+  ../resolvelib-d935f9fd07246d9641436c7a8e6ae39423374e28
 
 # Create system directories that Ansible defines as default locations in
 # ansible/config/base.yml
@@ -178,12 +189,12 @@ mkdir -p %{buildroot}/%{_mandir}/man1/
 ## Build man pages
 
 mkdir /tmp/_vendor
-/usr/bin/python3.8 -m pip install ../straightplugin-6634ea8e1e89d5bb23804f50e676f196c52c46ed -t /tmp/_vendor --no-build-isolation
+/usr/bin/python3.9 -m pip install ../straightplugin-6634ea8e1e89d5bb23804f50e676f196c52c46ed -t /tmp/_vendor --no-build-isolation
 
 # Remove plugins not needed, they bring in more dependencies
 find hacking/build_library/build_ansible/command_plugins ! -name 'generate_man.py' -type f -exec rm -f {} +
 
-PYTHON=python3.8 PYTHONPATH=%{vendor_path}:/tmp/_vendor make docs
+PYTHON=python3.9 PYTHONPATH=%{vendor_path}:/tmp/_vendor make docs
 cp -v docs/man/man1/*.1 %{buildroot}/%{_mandir}/man1/
 
 cp -pr docs/docsite/rst .
@@ -198,14 +209,20 @@ cp -p lib/ansible_core.egg-info/PKG-INFO .
 %doc changelogs/CHANGELOG-v2.*.rst
 %doc %{_mandir}/man1/ansible*
 %{_datadir}/ansible/
-%{python38_sitelib}/ansible*
-%exclude %{python38_sitelib}/ansible_test
+%{python39_sitelib}/ansible*
+%exclude %{python39_sitelib}/ansible_test
+%exclude %{python39_sitelib}/ansible/_vendor/markupsafe/_speedups.c
 
 %files -n ansible-test
 %{_bindir}/ansible-test
-%{python38_sitelib}/ansible_test
+%{python39_sitelib}/ansible_test
 
 %changelog
+* Mon Jul 04 2022 Dimitri Savineau <dsavinea@redhat.com> - 2.13.1-1
+- ansible-core 2.13.1 release (rhbz#2103699)
+- add bundled version of jinja2, markupsafe and resolvelib
+- rebuild with python 3.9
+
 * Mon Jun 20 2022 Dimitri Savineau <dsavinea@redhat.com> - 2.12.7-1
 - ansible-core 2.12.7 release (rhbz#2099323)