diff --git a/debian/changelog b/debian/changelog
index 7c6a99d28..374b70963 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+openbabel (3.2.0+dfsg-1.1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Build python extensions for all supported python3 versions.
+
+ -- Maximiliano Curia <maxy@debian.org>  Fri, 18 Sep 2026 10:20:00 +0200
+
 openbabel (3.2.0+dfsg-1) unstable; urgency=medium
 
   * Upload to unstable
diff --git a/debian/control b/debian/control
index 9be254797..3b4ae39d1 100644
--- a/debian/control
+++ b/debian/control
@@ -22,7 +22,7 @@ Build-Depends: cmake,
                libxml2-dev,
                pkgconf,
                python3-all,
-               python3-dev,
+               python3-all-dev,
                python3-setuptools,
                rapidjson-dev,
                swig,
diff --git a/debian/rules b/debian/rules
index 664aae696..902d39ba4 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,6 +1,7 @@
 #!/usr/bin/make -f
 
--include /usr/share/python3/python.mk
+include /usr/share/dpkg/architecture.mk
+include /usr/share/dpkg/buildtools.mk
 
 DEB_BUILD_PARALLEL ?= $(shell guess_concurrency --require-mem 16G)
 export PYBUILD_TEST_ARGS=-n $(DEB_BUILD_PARALLEL)
@@ -16,6 +17,7 @@ export LDFLAGS      := $(shell dpkg-buildflags --get LDFLAGS)
 DH_AUTO_CONFIGURE_OPTS := -DCMAKE_BUILD_TYPE=None \
                           -DLIB_SUFFIX=/$(DEB_HOST_MULTIARCH) \
                           -DPYTHON_BINDINGS=ON -DPYTHON_EXECUTABLE=/usr/bin/python3 \
+                          -DPYTHON_INSTDIR=/usr/lib/python3/dist-packages \
                           -DPERL_BINDINGS=ON \
                           -DOBPERL_INSTALLDIRS=vendor \
                           -DRUN_SWIG=ON \
@@ -36,9 +38,26 @@ override_dh_auto_configure:
 override_dh_auto_build:
 	dh_auto_build
 	make -C $(CURDIR)/builddir docs
+	mkdir -p $(CURDIR)/builddir/scripts
+	for pyversion in $(PYVERS); do \
+		pyinclude=$$(python$$pyversion -c "import sysconfig; print(sysconfig.get_path('include'))"); \
+		extsuffix=$$(python$$pyversion -c "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))"); \
+		$(CXX) $(CXXFLAGS) $(CPPFLAGS) -fPIC -shared \
+			-I$(CURDIR)/include -I$(CURDIR)/builddir/include -I/usr/include/eigen3 -I$$pyinclude \
+			-Wno-deprecated-declarations \
+			$(CURDIR)/scripts/python/openbabel/openbabel-python.cpp \
+			-o $(CURDIR)/builddir/scripts/_openbabel$$extsuffix \
+			$(LDFLAGS) -L$(CURDIR)/builddir/lib/$(DEB_HOST_MULTIARCH) -L$(CURDIR)/builddir/lib -lopenbabel; \
+	done
 
 override_dh_auto_install:
 	dh_auto_install
+	rm -f $(CURDIR)/debian/tmp/usr/lib/python3/dist-packages/openbabel/_openbabel.so
+	for pyversion in $(PYVERS); do \
+		extsuffix=$$(python$$pyversion -c "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))"); \
+		install -m 0644 $(CURDIR)/builddir/scripts/_openbabel$$extsuffix \
+			$(CURDIR)/debian/tmp/usr/lib/python3/dist-packages/openbabel/; \
+	done
 	mkdir --parents $(CURDIR)/debian/tmp/$(PERL_ARCHLIB)
 	mv debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/auto debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/Chemistry \
 		$(CURDIR)/debian/tmp/$(PERL_ARCHLIB)
diff --git a/debian/tests/control b/debian/tests/control
index 9fd0b8bc5..316f90bc0 100644
--- a/debian/tests/control
+++ b/debian/tests/control
@@ -1,6 +1,7 @@
 Tests: python3
 Depends:
  @,
+ python3-all
 Restrictions:
  allow-stderr,
  rw-build-tree,
diff --git a/debian/tests/python3 b/debian/tests/python3
index 823e85705..b9f2faf53 100644
--- a/debian/tests/python3
+++ b/debian/tests/python3
@@ -6,46 +6,48 @@ sed -i 's/"\.\."/"\/usr"/' test/testbabel.py
 
 arch=$(dpkg --print-architecture)
 fails=
-for TEST in test/test*.py
-do
-    fail_on_failure=true
-    case $TEST in
-      test/testroundtrip.py)
-        # timesout?
-        echo "Skipping ${TEST} ..."
-        continue;;
-      test/testdistgeom.py)
-	# timesout and exhausts memory
-	echo "Skipping ${TEST} ..."
-	continue;;
-      test/testbindings.py)
-        case "$arch" in
-          amd64)
-            true;;
-          *)
-            fail_on_failure=false;;
-        esac;;
-      test/testsym.py)
-          # on most/all non-amd64 architecture it fails
-          # if it finishes at all, it takes a very long time
-          # on worker13, the test takes 1000 times longer than on other amd64 hosts
-          echo "Skipping ${TEST} ..."
-          continue;;
-      test/testobconv_writers.py)
-        case "$arch" in arm64|i386|ppc64el|s390x)
-          fail_on_failure=false;;
-        esac;;
-    esac
-    echo "Running ${TEST} ..."
-    if python3 ${TEST}; then
-	:
-    else
-       if [ $fail_on_failure = "false" ] ; then
-         echo "Ignoring ${TEST} on $arch ..."
-       else
-         fails="$fails $TEST"
-       fi
-    fi
+for pyversion in $(py3versions -s); do
+    for TEST in test/test*.py
+    do
+        fail_on_failure=true
+        case $TEST in
+          test/testroundtrip.py)
+            # timesout?
+            echo "Skipping ${TEST} ..."
+            continue;;
+          test/testdistgeom.py)
+	    # timesout and exhausts memory
+	    echo "Skipping ${TEST} ..."
+	    continue;;
+          test/testbindings.py)
+            case "$arch" in
+              amd64)
+                true;;
+              *)
+                fail_on_failure=false;;
+            esac;;
+          test/testsym.py)
+              # on most/all non-amd64 architecture it fails
+              # if it finishes at all, it takes a very long time
+              # on worker13, the test takes 1000 times longer than on other amd64 hosts
+              echo "Skipping ${TEST} ..."
+              continue;;
+          test/testobconv_writers.py)
+            case "$arch" in arm64|i386|ppc64el|s390x)
+              fail_on_failure=false;;
+            esac;;
+        esac
+        echo "Running ${TEST} with ${pyversion} ..."
+        if ${pyversion} ${TEST}; then
+	    :
+        else
+           if [ $fail_on_failure = "false" ] ; then
+             echo "Ignoring ${TEST} on $arch with ${pyversion} ..."
+           else
+             fails="$fails ${TEST}(${pyversion})"
+           fi
+        fi
+    done
 done
 
 if [ -n "$fails" ]; then
