diff -pruN 3.2.0-1/.github/dependabot.yml 3.4.0-1/.github/dependabot.yml
--- 3.2.0-1/.github/dependabot.yml	1970-01-01 00:00:00.000000000 +0000
+++ 3.4.0-1/.github/dependabot.yml	2025-07-01 14:22:11.000000000 +0000
@@ -0,0 +1,12 @@
+# Set update schedule for GitHub Actions
+---
+version: 2
+updates:
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "weekly"
+  - package-ecosystem: "pip"
+    directory: "/"
+    schedule:
+      interval: "weekly"
diff -pruN 3.2.0-1/.github/workflows/acceptance.yml 3.4.0-1/.github/workflows/acceptance.yml
--- 3.2.0-1/.github/workflows/acceptance.yml	1970-01-01 00:00:00.000000000 +0000
+++ 3.4.0-1/.github/workflows/acceptance.yml	2025-07-01 14:22:11.000000000 +0000
@@ -0,0 +1,91 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# See https://github.com/apache/cloudstack-terraform-provider/blob/main/.github/workflows/acceptance.yml
+name: Acceptance Test
+
+on:
+  pull_request:
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-acceptance
+  cancel-in-progress: true
+
+permissions:
+  contents: read
+
+env:
+  CLOUDSTACK_API_URL: http://localhost:8080/client/api
+  CLOUDSTACK_VERSIONS: "['1.7.0']"
+jobs:
+  prepare-matrix:
+    runs-on: ubuntu-latest
+    outputs:
+      cloudstack-versions: ${{ steps.set-versions.outputs.cloudstack-versions }}
+    steps:
+      - name: Set versions
+        id: set-versions
+        run: |
+          echo "cloudstack-versions=${{ env.CLOUDSTACK_VERSIONS }}" >> $GITHUB_OUTPUT
+
+  acceptance-cs:
+    name: Python ${{ matrix.python-version }} with CloudStack test container ${{ matrix.cloudstack-version }}
+    needs: [prepare-matrix]
+    runs-on: ubuntu-latest
+    services:
+      cloudstack-simulator:
+        image: quay.io/ansible/cloudstack-test-container:${{ matrix.cloudstack-version }}
+        ports:
+          - 8080:8080
+    strategy:
+      fail-fast: false
+      max-parallel: 1
+      matrix:
+        cloudstack-version: ${{ fromJson(needs.prepare-matrix.outputs.cloudstack-versions) }}
+        python-version:
+          - '3.12'
+    steps:
+      - uses: actions/checkout@v4
+      - name: Configure Cloudstack v${{ matrix.cloudstack-version }}
+        uses: ./.github/workflows/setup-cloudstack
+        id: setup-cloudstack
+        with:
+          cloudstack-version: ${{ matrix.cloudstack-version }}
+      - uses: actions/setup-python@v5
+        with:
+          python-version: ${{ matrix.python-version }}
+      - name: Run acceptance test
+        env:
+          CLOUDSTACK_USER_ID: ${{ steps.setup-cloudstack.outputs.CLOUDSTACK_USER_ID }}
+          CLOUDSTACK_KEY: ${{ steps.setup-cloudstack.outputs.CLOUDSTACK_API_KEY }}
+          CLOUDSTACK_SECRET: ${{ steps.setup-cloudstack.outputs.CLOUDSTACK_SECRET_KEY }}
+          CLOUDSTACK_ENDPOINT: ${{ steps.setup-cloudstack.outputs.CLOUDSTACK_API_URL }}
+        run: |
+          python -m venv .venv
+          source .venv/bin/activate
+          which python
+          pip install .
+          cs listZones
+
+  all-jobs-passed: # Will succeed if it is skipped
+    runs-on: ubuntu-latest
+    needs: [acceptance-cs]
+    # Only run if any of the previous jobs failed
+    if: ${{ failure() }}
+    steps:
+      - name: Previous jobs failed
+        run: exit 1
diff -pruN 3.2.0-1/.github/workflows/main.yml 3.4.0-1/.github/workflows/main.yml
--- 3.2.0-1/.github/workflows/main.yml	2023-06-22 07:16:06.000000000 +0000
+++ 3.4.0-1/.github/workflows/main.yml	2025-07-01 14:22:11.000000000 +0000
@@ -1,7 +1,8 @@
 ---
 name: CI
 
-"on":
+on:
+  pull_request:
   push:
     branches:
       - '**'
@@ -19,10 +20,15 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        python-version: ['3.8', '3.9', '3.10', '3.11']
+        python-version:
+          - '3.9'
+          - '3.10'
+          - '3.11'
+          - '3.12'
+          - '3.13'
     steps:
-      - uses: actions/checkout@v3
-      - uses: actions/setup-python@v4
+      - uses: actions/checkout@v4
+      - uses: actions/setup-python@v5
         with:
           python-version: ${{ matrix.python-version }}
       - name: "Install dependencies"
@@ -37,8 +43,8 @@ jobs:
     name: Linting
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v3
-      - uses: actions/setup-python@v4
+      - uses: actions/checkout@v4
+      - uses: actions/setup-python@v5
         with:
           python-version: '3.x'
       - name: "Install dependencies"
diff -pruN 3.2.0-1/.github/workflows/publish.yml 3.4.0-1/.github/workflows/publish.yml
--- 3.2.0-1/.github/workflows/publish.yml	1970-01-01 00:00:00.000000000 +0000
+++ 3.4.0-1/.github/workflows/publish.yml	2025-07-01 14:22:11.000000000 +0000
@@ -0,0 +1,27 @@
+name: Upload Python Package
+
+on:
+  release:
+    types: [created]
+
+jobs:
+  deploy:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Set up Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: "3.x"
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          pip install -U setuptools wheel twine
+      - name: Build and publish
+        env:
+          TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
+          TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
+        run: |
+          rm -rf dist/*
+          python setup.py sdist bdist_wheel
+          twine upload dist/*
diff -pruN 3.2.0-1/.github/workflows/setup-cloudstack/action.yml 3.4.0-1/.github/workflows/setup-cloudstack/action.yml
--- 3.2.0-1/.github/workflows/setup-cloudstack/action.yml	1970-01-01 00:00:00.000000000 +0000
+++ 3.4.0-1/.github/workflows/setup-cloudstack/action.yml	2025-07-01 14:22:11.000000000 +0000
@@ -0,0 +1,75 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# See https://raw.githubusercontent.com/apache/cloudstack-terraform-provider/refs/heads/main/.github/workflows/setup-cloudstack/action.yml
+
+name: Setup Cloudstack
+
+inputs:
+  cloudstack-version:
+    description: 'Cloudstack version'
+    required: true
+outputs:
+  CLOUDSTACK_USER_ID:
+    description: 'Cloudstack user id'
+    value: ${{ steps.setup-cloudstack.outputs.user_id }}
+  CLOUDSTACK_API_KEY:
+    description: 'Cloudstack api key'
+    value: ${{ steps.setup-cloudstack.outputs.api_key }}
+  CLOUDSTACK_SECRET_KEY:
+    description: 'Cloudstack secret key'
+    value: ${{ steps.setup-cloudstack.outputs.secret_key }}
+  CLOUDSTACK_API_URL:
+    description: 'Cloudstack API URL'
+    value: http://localhost:8080/client/api
+
+runs:
+  using: composite
+  steps:
+    - name: Wait Cloudstack to be ready
+      shell: bash
+      run: |
+        echo "Starting Cloudstack health check"
+        T=0
+        until [ $T -gt 20 ]  || curl -sfL http://localhost:8080 --output /dev/null
+        do
+            echo "Waiting for Cloudstack to be ready..."
+            ((T+=1))
+            sleep 30
+        done
+    - name: Setting up Cloudstack
+      id: setup-cloudstack
+      shell: bash
+      run: |
+        curl -sf --location "${CLOUDSTACK_API_URL}" \
+            --header 'Content-Type: application/x-www-form-urlencoded' \
+            --data-urlencode 'command=login' \
+            --data-urlencode 'username=admin' \
+            --data-urlencode 'password=password' \
+            --data-urlencode 'response=json' \
+            --data-urlencode 'domain=/' -j -c cookies.txt --output /dev/null
+
+        CLOUDSTACK_USER_ID=$(curl -fs "${CLOUDSTACK_API_URL}?command=listUsers&response=json" -b cookies.txt | jq -r '.listusersresponse.user[0].id')
+        CLOUDSTACK_API_KEY=$(curl -s "${CLOUDSTACK_API_URL}?command=getUserKeys&id=${CLOUDSTACK_USER_ID}&response=json" -b cookies.txt | jq -r '.getuserkeysresponse.userkeys.apikey')
+        CLOUDSTACK_SECRET_KEY=$(curl -fs "${CLOUDSTACK_API_URL}?command=getUserKeys&id=${CLOUDSTACK_USER_ID}&response=json" -b cookies.txt | jq -r '.getuserkeysresponse.userkeys.secretkey')
+
+        echo "::add-mask::$CLOUDSTACK_API_KEY"
+        echo "::add-mask::$CLOUDSTACK_SECRET_KEY"
+
+        echo "user_id=$CLOUDSTACK_USER_ID" >> $GITHUB_OUTPUT
+        echo "api_key=$CLOUDSTACK_API_KEY" >> $GITHUB_OUTPUT
+        echo "secret_key=$CLOUDSTACK_SECRET_KEY" >> $GITHUB_OUTPUT
diff -pruN 3.2.0-1/.github/workflows/stale.yml 3.4.0-1/.github/workflows/stale.yml
--- 3.2.0-1/.github/workflows/stale.yml	1970-01-01 00:00:00.000000000 +0000
+++ 3.4.0-1/.github/workflows/stale.yml	2025-07-01 14:22:11.000000000 +0000
@@ -0,0 +1,12 @@
+name: Close stale issues and PRs
+on:
+  schedule:
+    - cron: '23 5 * * *'
+
+jobs:
+  stale:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/stale@v9
+        with:
+          any-of-labels: 'needs-more-info,needs-demo'
diff -pruN 3.2.0-1/.travis.yml 3.4.0-1/.travis.yml
--- 3.2.0-1/.travis.yml	2023-06-22 07:16:06.000000000 +0000
+++ 3.4.0-1/.travis.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,17 +0,0 @@
-dist: xenial
-sudo: required
-
-language: python
-arch:
-  - amd64
-  - ppc64le
-python:
-  - 3.6
-  - 3.7
-  - 3.8
-
-install:
-  - pip install tox-travis
-
-script:
-  - tox
diff -pruN 3.2.0-1/README.rst 3.4.0-1/README.rst
--- 3.2.0-1/README.rst	2023-06-22 07:16:06.000000000 +0000
+++ 3.4.0-1/README.rst	2025-07-01 14:22:11.000000000 +0000
@@ -1,13 +1,20 @@
-CS
-==
+.. image:: https://github.com/ngine-io/cs/actions/workflows/main.yml/badge.svg
+   :alt: CI
+   :target: https://github.com/ngine-io/cs/actions/workflows/main.yml
+.. image:: https://img.shields.io/pypi/pyversions/cs.svg
+   :alt: Python versions
+   :target: https://pypi.org/project/cs/
+
+.. image:: https://img.shields.io/pypi/dw/cs.svg
+   :alt: Downloads / Week
+   :target: https://pypi.org/project/cs/
 
 .. image:: https://img.shields.io/pypi/l/cs.svg
    :alt: License
    :target: https://pypi.org/project/cs/
 
-.. image:: https://img.shields.io/pypi/pyversions/cs.svg
-   :alt: Python versions
-   :target: https://pypi.org/project/cs/
+CS - Python CloudStack API client 
+=================================
 
 A simple, yet powerful CloudStack API client for python and the command-line.
 
@@ -41,7 +48,7 @@ In Python:
 
     from cs import CloudStack
 
-    cs = CloudStack(endpoint='https://api.exoscale.ch/v1',
+    cs = CloudStack(endpoint='https://cloudstack.example.com/client/api',
                     key='cloudstack api key',
                     secret='cloudstack api secret')
 
@@ -58,13 +65,13 @@ From the command-line, this requires som
 .. code-block:: ini
 
     [cloudstack]
-    endpoint = https://api.exoscale.ch/v1
+    endpoint = https://cloudstack.example.com/client/api
     key = cloudstack api key
     secret = cloudstack api secret
     # Optional ca authority certificate
-    verify = /path/to/certs/exoscale_ca.crt
+    verify = /path/to/certs/ca.crt
     # Optional client PEM certificate
-    cert = /path/to/client_exoscale.pem
+    cert = /path/to/client.pem
     # If you need to pass the certificate and key as separate files
     cert_key = /path/to/client_key.pem
 
@@ -159,14 +166,14 @@ the credentials or endpoint to use with
     key = api key
     secret = api secret
 
-    [exoscale]
-    endpoint = https://api.exoscale.ch/v1
+    [region-example]
+    endpoint = https://cloudstack.example.com/client/api
     key = api key
     secret = api secret
 
 Usage::
 
-    $ cs listVirtualMachines --region=exoscale
+    $ cs listVirtualMachines --region=region-example
 
 Optionally ``CLOUDSTACK_REGION`` can be used to overwrite the default region ``cloudstack``.
 
@@ -250,7 +257,7 @@ Release Procedure
 
     mktmpenv -p /usr/bin/python3
     pip install -U twine wheel build
-    cd exoscale/cs
+    cd ./cs
     rm -rf build dist
     python -m build
     twine upload dist/*
@@ -259,4 +266,3 @@ Links
 -----
 
 * CloudStack API: http://cloudstack.apache.org/api.html
-* Example of use: `Get Started with the exoscale API client <https://www.exoscale.com/syslog/2016/02/23/get-started-with-the-exoscale-api-client/>`_
diff -pruN 3.2.0-1/cs/__init__.py 3.4.0-1/cs/__init__.py
--- 3.2.0-1/cs/__init__.py	2023-06-22 07:16:06.000000000 +0000
+++ 3.4.0-1/cs/__init__.py	2025-07-01 14:22:11.000000000 +0000
@@ -3,11 +3,7 @@ import json
 import os
 import sys
 from collections import defaultdict
-
-try:
-    from configparser import NoSectionError
-except ImportError:  # python 2
-    from ConfigParser import NoSectionError
+from configparser import NoSectionError
 
 try:
     import pygments
@@ -23,6 +19,7 @@ from .client import (
     CloudStackException,
     read_config,
 )
+from .version import __version__
 
 
 __all__ = [
@@ -32,15 +29,14 @@ __all__ = [
     "CloudStackApiException",
 ]
 
-if sys.version_info >= (3, 5):
-    try:
-        import aiohttp  # noqa
-    except ImportError:
-        pass
-    else:
-        from ._async import AIOCloudStack  # noqa
+try:
+    import aiohttp  # noqa
+except ImportError:
+    pass
+else:
+    from ._async import AIOCloudStack  # noqa
 
-        __all__.append("AIOCloudStack")
+    __all__.append("AIOCloudStack")
 
 
 def _format_json(data, theme):
@@ -56,7 +52,7 @@ def _format_json(data, theme):
 
 
 def main(args=None):
-    parser = argparse.ArgumentParser(description="Cloustack client.")
+    parser = argparse.ArgumentParser(description="Cloudstack client.")
     parser.add_argument(
         "--region",
         "-r",
@@ -97,7 +93,15 @@ def main(args=None):
         help="trace the HTTP requests done on stderr",
     )
     parser.add_argument(
-        "command", metavar="COMMAND", help="Cloudstack API command to execute"
+        "command",
+        metavar="COMMAND",
+        help="Cloudstack API command to execute",
+    )
+
+    parser.add_argument(
+        "--version",
+        action="version",
+        version=__version__,
     )
 
     def parse_option(x):
@@ -116,6 +120,7 @@ def main(args=None):
     )
 
     options = parser.parse_args(args=args)
+
     command = options.command
     kwargs = defaultdict(set)
     for arg in options.arguments:
@@ -133,8 +138,10 @@ def main(args=None):
 
     if options.post:
         config["method"] = "post"
+
     if options.trace:
         config["trace"] = True
+
     cs = CloudStack(**config)
     ok = True
     response = None
diff -pruN 3.2.0-1/cs/client.py 3.4.0-1/cs/client.py
--- 3.2.0-1/cs/client.py	2023-06-22 07:16:06.000000000 +0000
+++ 3.4.0-1/cs/client.py	2025-07-01 14:22:11.000000000 +0000
@@ -1,6 +1,3 @@
-#! /usr/bin/env python
-from __future__ import print_function
-
 import base64
 import hashlib
 import hmac
@@ -8,42 +5,21 @@ import os
 import re
 import sys
 import time
+from configparser import ConfigParser
 from datetime import datetime, timedelta
 from fnmatch import fnmatch
-
-try:
-    from configparser import ConfigParser
-except ImportError:  # python 2
-    from ConfigParser import ConfigParser
-
-try:
-    from urllib.parse import quote
-except ImportError:  # python 2
-    from urllib import quote
+from urllib.parse import quote
 
 import pytz
 
 import requests
 from requests.structures import CaseInsensitiveDict
 
-PY2 = sys.version_info < (3, 0)
 
-if PY2:
-    text_type = unicode  # noqa
-    string_type = basestring  # noqa
-    integer_types = int, long  # noqa
-    binary_type = str
-else:
-    text_type = str
-    string_type = str
-    integer_types = int
-    binary_type = bytes
-
-if sys.version_info >= (3, 5):
-    try:
-        from . import AIOCloudStack  # noqa
-    except ImportError:
-        pass
+try:
+    from . import AIOCloudStack  # noqa
+except ImportError:
+    pass
 
 
 TIMEOUT = 10
@@ -124,8 +100,6 @@ def cs_encode(s):
 
     java.net.URLEncoder.encode(s).replace('+', '%20')
     """
-    if PY2 and isinstance(s, text_type):
-        s = s.encode("utf-8")
     return quote(s, safe="*")
 
 
@@ -146,11 +120,11 @@ def transform(params):
             params.pop(key)
             continue
 
-        if isinstance(value, (string_type, binary_type)):
+        if isinstance(value, (str, bytes)):
             continue
 
-        if isinstance(value, integer_types):
-            params[key] = text_type(value)
+        if isinstance(value, int):
+            params[key] = str(value)
         elif isinstance(value, (list, tuple, set, dict)):
             if not value:
                 params.pop(key)
@@ -166,7 +140,7 @@ def transform(params):
                     for index, val in enumerate(value):
                         for name, v in val.items():
                             k = "%s[%d].%s" % (key, index, name)
-                            params[k] = text_type(v)
+                            params[k] = str(v)
         else:
             raise ValueError(type(value))
 
@@ -606,7 +580,7 @@ def read_config(ini_group=None):
     # convert booleans values.
     bool_keys = ("dangerous_no_tls_verify",)
     for bool_key in bool_keys:
-        if isinstance(config[bool_key], string_type):
+        if isinstance(config[bool_key], str):
             try:
                 config[bool_key] = strtobool(config[bool_key])
             except ValueError:
diff -pruN 3.2.0-1/cs/version.py 3.4.0-1/cs/version.py
--- 3.2.0-1/cs/version.py	1970-01-01 00:00:00.000000000 +0000
+++ 3.4.0-1/cs/version.py	2025-07-01 14:22:11.000000000 +0000
@@ -0,0 +1 @@
+__version__ = "3.4.0"
diff -pruN 3.2.0-1/debian/changelog 3.4.0-1/debian/changelog
--- 3.2.0-1/debian/changelog	2024-02-28 20:03:22.000000000 +0000
+++ 3.4.0-1/debian/changelog	2025-11-16 12:08:07.000000000 +0000
@@ -1,3 +1,16 @@
+python-cs (3.4.0-1) unstable; urgency=medium
+
+  * Team upload
+  * New upstream version 3.4.0
+  * Replace dependency on transitional python3-tz with new python3-pytz
+  * Rewrite d/rules with shorter syntax
+  * Add debian/salsa-ci.yml
+  * Drop "Rules-Requires-Root: no": it is the default now
+  * Bump Standards-Version to 4.7.2
+  * Rewrite d/watch if v5 format
+
+ -- Alexandre Detiste <tchet@debian.org>  Sun, 16 Nov 2025 13:08:07 +0100
+
 python-cs (3.2.0-1) unstable; urgency=medium
 
   * Team upload
diff -pruN 3.2.0-1/debian/control 3.4.0-1/debian/control
--- 3.2.0-1/debian/control	2024-02-28 20:03:22.000000000 +0000
+++ 3.4.0-1/debian/control	2025-11-16 12:07:00.000000000 +0000
@@ -3,28 +3,33 @@ Section: python
 Testsuite: autopkgtest-pkg-python
 Priority: optional
 Maintainer: Debian Python Team <team+python@tracker.debian.org>
-Uploaders: Vincent Bernat <bernat@debian.org>
-Build-Depends: debhelper-compat (= 13), dh-sequence-python3,
-               python3-all,
-               python3-setuptools,
-               python3-requests,
-               python3-tz,
-               python3-pytest,
-               python3-pytest-runner,
-               python3-pytest-cov,
-               python3-aiohttp
-Standards-Version: 4.6.2
+Uploaders:
+ Vincent Bernat <bernat@debian.org>,
+Build-Depends:
+ debhelper-compat (= 13),
+ dh-sequence-python3,
+ python3-aiohttp,
+ python3-all,
+ python3-pytest,
+ python3-pytest-cov,
+ python3-pytest-runner,
+ python3-pytz,
+ python3-requests,
+ python3-setuptools,
+Standards-Version: 4.7.2
 Homepage: https://github.com/exoscale/cs
-Rules-Requires-Root: no
 Vcs-Git: https://salsa.debian.org/python-team/packages/python-cs.git
 Vcs-Browser: https://salsa.debian.org/python-team/packages/python-cs
 
 Package: cs
 Architecture: all
 Section: utils
-Depends: ${python3:Depends}, ${misc:Depends},
-         python3-cs (= ${binary:Version})
-Suggests: python3-pygments
+Depends:
+ python3-cs (= ${binary:Version}),
+ ${misc:Depends},
+ ${python3:Depends},
+Suggests:
+ python3-pygments,
 Description: simple, yet powerful CloudStack API client
  cs a simple, yet powerful Apache CloudStack API client written in
  Python and available as a command-line tool. It is a thin wrapper on
@@ -36,7 +41,9 @@ Description: simple, yet powerful CloudS
 
 Package: python3-cs
 Architecture: all
-Depends: ${python3:Depends}, ${misc:Depends}
+Depends:
+ ${misc:Depends},
+ ${python3:Depends},
 Description: simple, yet powerful CloudStack API client (Python 3 module)
  This module is a simple, yet powerful Apache CloudStack API client
  for Python. It is a thin wrapper on top of the CloudStack API and
diff -pruN 3.2.0-1/debian/patches/drop_tox.ini.patch 3.4.0-1/debian/patches/drop_tox.ini.patch
--- 3.2.0-1/debian/patches/drop_tox.ini.patch	1970-01-01 00:00:00.000000000 +0000
+++ 3.4.0-1/debian/patches/drop_tox.ini.patch	2025-11-16 12:08:07.000000000 +0000
@@ -0,0 +1,30 @@
+--- a/tox.ini
++++ /dev/null
+@@ -1,27 +0,0 @@
+-[tox]
+-envlist =
+-	py{39,310,311,312,313}
+-	lint
+-skip_missing_interpreters = True
+-
+-[gh-actions]
+-	3.9: py39
+-	3.10: py310
+-	3.11: py311
+-	3.12: py312
+-	3.13: py313
+-
+-[testenv]
+-deps=
+-	aiohttp
+-	check-manifest
+-	flake8
+-	flake8-import-order
+-	pytest
+-	pytest-cache
+-	pytest-cov
+-commands =
+-	pip wheel --no-deps -w dist .
+-	test: pytest -v
+-	check-manifest
+-	lint: flake8 cs tests.py
diff -pruN 3.2.0-1/debian/patches/series 3.4.0-1/debian/patches/series
--- 3.2.0-1/debian/patches/series	1970-01-01 00:00:00.000000000 +0000
+++ 3.4.0-1/debian/patches/series	2025-11-16 12:08:07.000000000 +0000
@@ -0,0 +1 @@
+drop_tox.ini.patch
diff -pruN 3.2.0-1/debian/rules 3.4.0-1/debian/rules
--- 3.2.0-1/debian/rules	2024-02-28 20:03:22.000000000 +0000
+++ 3.4.0-1/debian/rules	2025-11-16 12:07:00.000000000 +0000
@@ -1,13 +1,12 @@
 #!/usr/bin/make -f
 # -*- mode: makefile; coding: utf-8 -*-
 
-export PYBUILD_DESTDIR_python3=debian/python3-cs/
+export PYBUILD_DESTDIR=debian/python3-cs/
 
 %:
 	dh $@ --buildsystem=pybuild
 
-override_dh_install:
-	dh_install
+execute_after_dh_install:
 	# Move cs executable in its dedicated package
 	mkdir -p debian/cs/usr/bin
 	mv debian/python3-cs/usr/bin/cs debian/cs/usr/bin/cloudstack
diff -pruN 3.2.0-1/debian/salsa-ci.yml 3.4.0-1/debian/salsa-ci.yml
--- 3.2.0-1/debian/salsa-ci.yml	1970-01-01 00:00:00.000000000 +0000
+++ 3.4.0-1/debian/salsa-ci.yml	2025-11-16 12:07:00.000000000 +0000
@@ -0,0 +1,2 @@
+include:
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
diff -pruN 3.2.0-1/debian/watch 3.4.0-1/debian/watch
--- 3.2.0-1/debian/watch	2024-02-28 20:03:22.000000000 +0000
+++ 3.4.0-1/debian/watch	2025-11-16 12:08:07.000000000 +0000
@@ -1,3 +1,5 @@
-version=4
-opts=filenamemangle=s/.+\/v?(\d\S*)\.tar\.gz/cs-$1.tar.gz/ \
-  https://github.com/exoscale/cs/tags .*/v?(\d\S*)\.tar\.gz
+Version: 5
+
+Template: GitHub
+Owner: exoscale
+Project: cs
diff -pruN 3.2.0-1/setup.cfg 3.4.0-1/setup.cfg
--- 3.2.0-1/setup.cfg	2023-06-22 07:16:06.000000000 +0000
+++ 3.4.0-1/setup.cfg	2025-07-01 14:22:11.000000000 +0000
@@ -1,22 +1,23 @@
 [metadata]
 name = cs
-version = 3.2.0
-url = https://github.com/exoscale/cs
+version = 3.4.0
+url = https://github.com/ngine-io/cs
 author = Bruno Renié
 description = A simple yet powerful CloudStack API client for Python and the command-line.
 long_description = file: README.rst
 license = BSD
-license_file = LICENSE
+license_files = LICENSE
 classifiers =
     Intended Audience :: Developers
     Intended Audience :: System Administrators
     License :: OSI Approved :: BSD License
     Programming Language :: Python
     Programming Language :: Python :: 3
-    Programming Language :: Python :: 3.8
     Programming Language :: Python :: 3.9
     Programming Language :: Python :: 3.10
     Programming Language :: Python :: 3.11
+    Programming Language :: Python :: 3.12
+    Programming Language :: Python :: 3.13
 
 [options]
 packages = find:
@@ -25,13 +26,6 @@ zip_safe = false
 install_requires =
     pytz
     requests
-setup_requires =
-    pytest-runner
-tests_require =
-    aiohttp
-    pytest-cache
-    pytest-cov
-    pytest
 
 [options.packages.find]
 exclude = tests
diff -pruN 3.2.0-1/tests.py 3.4.0-1/tests.py
--- 3.2.0-1/tests.py	2023-06-22 07:16:06.000000000 +0000
+++ 3.4.0-1/tests.py	2025-07-01 14:22:11.000000000 +0000
@@ -4,16 +4,8 @@ import os
 from contextlib import contextmanager
 from functools import partial
 from unittest import TestCase
-
-try:
-    from unittest.mock import patch
-except ImportError:
-    from mock import patch
-
-try:
-    from urllib.parse import urlparse, parse_qs
-except ImportError:
-    from urlparse import urlparse, parse_qs
+from unittest.mock import patch
+from urllib.parse import parse_qs, urlparse
 
 from cs import (
     CloudStack,
@@ -154,7 +146,6 @@ class ConfigTest(TestCase):
                     "trace": None,
                     "poll_interval": 2.0,
                     "name": "hanibal",
-                    "poll_interval": 2.0,
                     "verify": None,
                     "dangerous_no_tls_verify": True,
                     "retry": 0,
@@ -194,7 +185,6 @@ class ConfigTest(TestCase):
                     "trace": None,
                     "poll_interval": 2.0,
                     "name": "cloudstack",
-                    "poll_interval": 2.0,
                     "verify": None,
                     "dangerous_no_tls_verify": True,
                     "retry": 0,
diff -pruN 3.2.0-1/tox.ini 3.4.0-1/tox.ini
--- 3.2.0-1/tox.ini	2023-06-22 07:16:06.000000000 +0000
+++ 3.4.0-1/tox.ini	2025-07-01 14:22:11.000000000 +0000
@@ -1,23 +1,27 @@
 [tox]
 envlist =
-	py{38,39,310,311}
+	py{39,310,311,312,313}
 	lint
 skip_missing_interpreters = True
 
 [gh-actions]
-python =
-    3.8: py38
-    3.9: py39
-    3.10: py310
-    3.11: py311
+	3.9: py39
+	3.10: py310
+	3.11: py311
+	3.12: py312
+	3.13: py313
 
 [testenv]
 deps=
+	aiohttp
 	check-manifest
 	flake8
 	flake8-import-order
+	pytest
+	pytest-cache
+	pytest-cov
 commands =
-	pip install pytest pytest-cache pytest-cov
-	python setup.py test
+	pip wheel --no-deps -w dist .
+	test: pytest -v
 	check-manifest
 	lint: flake8 cs tests.py
