diff -pruN 0.2.5-1/debian/changelog 0.2.5-1ubuntu2/debian/changelog
--- 0.2.5-1/debian/changelog	2021-01-13 08:49:04.000000000 +0000
+++ 0.2.5-1ubuntu2/debian/changelog	2022-05-03 15:23:03.000000000 +0000
@@ -1,3 +1,17 @@
+python-etcd3gw (0.2.5-1ubuntu2) kinetic; urgency=medium
+
+  * d/p/lp1965325-watch-avoid-double-decoding-in-python3.patch
+  - avoid double decoding in python3 (LP: #1965325) 
+
+ -- Heather Lemon <heather.lemon@canonical.com>  Tue, 03 May 2022 15:23:03 +0000
+
+python-etcd3gw (0.2.5-1ubuntu1) hirsute; urgency=medium
+
+  * d/p/lp1900617-Include-resp.text-as-detail-in-all-etcd-exceptions.patch:
+    include resp.text as exception detail (LP: #1900617)
+
+ -- Dan Streetman <ddstreet@canonical.com>  Tue, 09 Mar 2021 09:46:53 -0500
+
 python-etcd3gw (0.2.5-1) unstable; urgency=medium
 
   [ Ondřej Nový ]
diff -pruN 0.2.5-1/debian/patches/lp1900617-Include-resp.text-as-detail-in-all-etcd-exceptions.patch 0.2.5-1ubuntu2/debian/patches/lp1900617-Include-resp.text-as-detail-in-all-etcd-exceptions.patch
--- 0.2.5-1/debian/patches/lp1900617-Include-resp.text-as-detail-in-all-etcd-exceptions.patch	1970-01-01 00:00:00.000000000 +0000
+++ 0.2.5-1ubuntu2/debian/patches/lp1900617-Include-resp.text-as-detail-in-all-etcd-exceptions.patch	2021-03-09 14:45:58.000000000 +0000
@@ -0,0 +1,60 @@
+From 5a3157a122368c2314c7a961f61722e47355f981 Mon Sep 17 00:00:00 2001
+From: Spike Curtis <spike@tigera.io>
+Date: Wed, 12 Feb 2020 17:00:40 -0800
+Subject: [PATCH] Include resp.text as detail in all etcd exceptions
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-etcd3gw/+bug/1900617
+Origin: upstream, https://github.com/dims/etcd3-gateway/commit/5a3157a122368c2314c7a961f61722e47355f981
+
+Signed-off-by: Spike Curtis <spike@tigera.io>
+---
+ etcd3gw/client.py            |  5 ++++-
+ etcd3gw/tests/test_client.py | 20 ++++++++++++++++++++
+ 2 files changed, 24 insertions(+), 1 deletion(-)
+
+--- a/etcd3gw/client.py
++++ b/etcd3gw/client.py
+@@ -81,7 +81,10 @@ class Etcd3Client(object):
+         try:
+             resp = self.session.post(*args, **kwargs)
+             if resp.status_code in _EXCEPTIONS_BY_CODE:
+-                raise _EXCEPTIONS_BY_CODE[resp.status_code](resp.reason)
++                raise _EXCEPTIONS_BY_CODE[resp.status_code](
++                    resp.text,
++                    resp.reason
++                )
+             if resp.status_code != requests.codes['ok']:
+                 raise exceptions.Etcd3Exception(resp.text, resp.reason)
+         except requests.exceptions.Timeout as ex:
+--- a/etcd3gw/tests/test_client.py
++++ b/etcd3gw/tests/test_client.py
+@@ -14,6 +14,7 @@ import mock
+ 
+ from etcd3gw.client import Etcd3Client
+ from etcd3gw.exceptions import Etcd3Exception
++from etcd3gw.exceptions import InternalServerError
+ from etcd3gw.tests import base
+ 
+ 
+@@ -54,3 +55,22 @@ class TestEtcd3Gateway(base.TestCase):
+ "error": "etcdserver: mvcc: required revision has been compacted",
+ "code": 11
+ }''')
++
++    def test_client_exceptions_by_code(self):
++        client = Etcd3Client(host="127.0.0.1")
++        with mock.patch.object(client, "session") as mock_session:
++            mock_response = mock.Mock()
++            mock_response.status_code = 500
++            mock_response.reason = "Internal Server Error"
++            mock_response.text = '''{
++"error": "etcdserver: unable to reach quorum"
++}'''
++            mock_session.post.return_value = mock_response
++            try:
++                client.status()
++                self.assertFalse(True)
++            except InternalServerError as e:
++                self.assertEqual(str(e), "Internal Server Error")
++                self.assertEqual(e.detail_text, '''{
++"error": "etcdserver: unable to reach quorum"
++}''')
diff -pruN 0.2.5-1/debian/patches/lp19653250-watch-Avoid-double-decoding-in-python3.patch 0.2.5-1ubuntu2/debian/patches/lp19653250-watch-Avoid-double-decoding-in-python3.patch
--- 0.2.5-1/debian/patches/lp19653250-watch-Avoid-double-decoding-in-python3.patch	1970-01-01 00:00:00.000000000 +0000
+++ 0.2.5-1ubuntu2/debian/patches/lp19653250-watch-Avoid-double-decoding-in-python3.patch	2022-05-03 15:23:03.000000000 +0000
@@ -0,0 +1,86 @@
+From ed899b34e464862525f76fff2377a2cceeb65af7 Mon Sep 17 00:00:00 2001
+From: "Tyler J. Stachecki" <tstachecki@bloomberg.net>
+Date: Wed, 10 Nov 2021 17:32:03 -0500
+Subject: Avoid double-decoding in python3
+Origin: upstream, https://opendev.org/openstack/etcd3gw/commit/ed899b34e464
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/bugs/1965325
+Last-Update: 2022-05-03
+
+Both iter_content and the first line of the loop in the
+etcd3gw watch code were decoding the chunk received.
+Thus, etcd3gw's watch is broken in python3.  This commit
+fixes it by only decoding the line once.
+
+Change-Id: I203574a1ef4996a43860350be59fbe208457562d
+Closes-Bug: 1950517
+---
+ etcd3gw/tests/test_etcd3gw.py | 31 +++++++++++++++++++++++++++++++
+ etcd3gw/watch.py              |  2 +-
+ 2 files changed, 32 insertions(+), 1 deletion(-)
+
+Index: python-etcd3gw-0.2.5/etcd3gw/tests/test_etcd3gw.py
+===================================================================
+--- python-etcd3gw-0.2.5.orig/etcd3gw/tests/test_etcd3gw.py
++++ python-etcd3gw-0.2.5/etcd3gw/tests/test_etcd3gw.py
+@@ -17,12 +17,16 @@ test_etcd3-gateway
+ Tests for `etcd3gw` module.
+ """
+ 
++import base64
++import json
++import requests
+ import six
+ import threading
+ import time
+ import uuid
+ 
+ from testtools.testcase import unittest
++from unittest import mock
+ import urllib3
+ 
+ from etcd3gw.client import Etcd3Client
+@@ -382,3 +386,31 @@ class TestEtcd3Gateway(base.TestCase):
+         # Verify that key is still 'bar'
+         self.assertEqual([six.b('bar')], self.client.get(key))
+         self.assertFalse(status)
++
++    
++    def my_iter_content(self, *args, **kwargs):
++        payload = json.dumps({
++            'result': {
++                'events': [{
++                    'kv': {'key': base64.b64encode(b'value').decode('utf-8')},
++                }]
++            }
++        })
++
++        if not kwargs.get('decode_unicode', False):
++            payload = payload.encode()
++        return [payload]
++
++    @mock.patch.object(requests.Response, 'iter_content', new=my_iter_content)
++    @mock.patch.object(requests.sessions.Session, 'post')
++    def test_watch_unicode(self, mock_post):
++        mocked_response = requests.Response()
++        mocked_response.connection = mock.Mock()
++        mock_post.return_value = mocked_response
++
++        try:
++            res = self.client.watch_once('/some/key', timeout=1)
++        except exceptions.WatchTimedOut:
++            self.fail("watch timed out when server responded with unicode")
++
++        self.assertEqual(res, {'kv': {'key': b'value'}})
+Index: python-etcd3gw-0.2.5/etcd3gw/watch.py
+===================================================================
+--- python-etcd3gw-0.2.5.orig/etcd3gw/watch.py
++++ python-etcd3gw-0.2.5/etcd3gw/watch.py
+@@ -19,7 +19,7 @@ from etcd3gw.utils import _get_threadpoo
+ 
+ 
+ def _watch(resp, callback):
+-    for line in resp.iter_content(chunk_size=None, decode_unicode=True):
++    for line in resp.iter_content(chunk_size=None, decode_unicode=False):
+         decoded_line = line.decode('utf-8')
+         payload = json.loads(decoded_line)
+         if 'created' in payload['result']:
diff -pruN 0.2.5-1/debian/patches/series 0.2.5-1ubuntu2/debian/patches/series
--- 0.2.5-1/debian/patches/series	1970-01-01 00:00:00.000000000 +0000
+++ 0.2.5-1ubuntu2/debian/patches/series	2022-05-03 15:23:03.000000000 +0000
@@ -0,0 +1,2 @@
+lp1900617-Include-resp.text-as-detail-in-all-etcd-exceptions.patch
+lp19653250-watch-Avoid-double-decoding-in-python3.patch
