diff --git a/docs/API.md b/docs/API.md
index 993c435..2e77e33 100644
--- a/docs/API.md
+++ b/docs/API.md
@@ -240,7 +240,6 @@ __Return Value__
 |``object.last_modified`` |_datetime.datetime_ | modified time stamp.  |
 
 
-
 __Example__
 
 ```py
@@ -544,14 +543,15 @@ __Parameters__
 |``suffix`` | _string_  | Object key suffix to filter notifications for. |
 |``events`` | _list_ | Enables notifications for specific event types. |
 
-See [here](../examples/listen_notification.py) for a full example.
+See [here](https://raw.githubusercontent.com/minio/minio-py/master/examples/listen_notification.py) for a full example.
 
 ```py
 # Put a file with default content-type.
 events = minioClient.listen_bucket_notification('my-bucket', 'my-prefix/',
                                                 '.my-suffix',
                                                 ['s3:ObjectCreated:*',
-                                                 's3:ObjectRemoved:*'])
+                                                 's3:ObjectRemoved:*',
+                                                 's3:ObjectAccessed:*'])
 for event in events:
     print event
 ```
diff --git a/examples/listen_notification.py b/examples/listen_notification.py
index d4855e3..0eb309f 100644
--- a/examples/listen_notification.py
+++ b/examples/listen_notification.py
@@ -27,6 +27,7 @@ client = Minio('play.minio.io:9000',
 events = client.listen_bucket_notification('my-bucket', 'my-prefix/',
                                            '.my-suffix',
                                            ['s3:ObjectCreated:*',
-                                            's3:ObjectRemoved:*'])
+                                            's3:ObjectRemoved:*',
+                                            's3:ObjectAccessed:*'])
 for event in events:
     print(event)
diff --git a/minio/api.py b/minio/api.py
index 13198af..4646e78 100644
--- a/minio/api.py
+++ b/minio/api.py
@@ -485,7 +485,8 @@ class Minio(object):
 
     def listen_bucket_notification(self, bucket_name, prefix='', suffix='',
                                    events=['s3:ObjectCreated:*',
-                                           's3:ObjectRemoved:*']):
+                                           's3:ObjectRemoved:*',
+                                           's3:ObjectAccessed:*']):
         """
         Yeilds new event notifications on a bucket, caller should iterate
         to read new notifications.
@@ -504,7 +505,7 @@ class Minio(object):
         url_components = urlsplit(self._endpoint_url)
         if url_components.hostname == 's3.amazonaws.com':
             raise InvalidArgumentError(
-                'Listening for event notifications on a  bucket is a Minio '
+                'Listening for event notifications on a bucket is a Minio '
                 'specific extension to bucket notification API. It is not '
                 'supported by Amazon S3')
 
@@ -1082,7 +1083,7 @@ class Minio(object):
             'Content-Md5': get_md5_base64digest(content),
             'Content-Length': len(content)
         }
-        query = {"delete": None}
+        query = {'delete': ''}
         content_sha256_hex = get_sha256_hexdigest(content)
 
         # send multi-object delete request
@@ -1778,7 +1779,7 @@ class Minio(object):
         :return: location of bucket name is returned.
         """
         method = 'GET'
-        url = self._endpoint_url + '/' + bucket_name + '?location'
+        url = self._endpoint_url + '/' + bucket_name + '?location='
         headers = {}
         # default for all requests.
         region = 'us-east-1'
diff --git a/minio/signer.py b/minio/signer.py
index 5cebf5e..b514cb3 100644
--- a/minio/signer.py
+++ b/minio/signer.py
@@ -207,6 +207,7 @@ def sign_v4(method, url, region, headers=None, access_key=None,
                                                headers_to_sign,
                                                signed_headers,
                                                content_sha256)
+
     string_to_sign = generate_string_to_sign(date, region,
                                              canonical_req)
     signing_key = generate_signing_key(date, region, secret_key)
@@ -232,16 +233,7 @@ def generate_canonical_request(method, parsed_url, headers, signed_headers, cont
     :param headers: HTTP header dictionary.
     :param content_sha256: Content sha256 hexdigest string.
     """
-    lines = [method, parsed_url.path]
-
-    # Parsed query.
-    split_query = parsed_url.query.split('&')
-    split_query.sort()
-    for i in range(0, len(split_query)):
-        if len(split_query[i]) > 0 and '=' not in split_query[i]:
-            split_query[i] += '='
-    query = '&'.join(split_query)
-    lines.append(query)
+    lines = [method, parsed_url.path, parsed_url.query]
 
     # Headers added to canonical request.
     header_lines = []

ListenBucketNotification should also support Get and Head
Depends on minio/minio#3916
diff --git a/tests/unit/remove_objects_test.py b/tests/unit/remove_objects_test.py
index bfbf592..1142523 100644
--- a/tests/unit/remove_objects_test.py
+++ b/tests/unit/remove_objects_test.py
@@ -56,7 +56,7 @@ class RemoveObjectsTest(TestCase):
         mock_connection.return_value = mock_server
         mock_server.mock_add_request(
             MockResponse('POST',
-                         'https://localhost:9000/hello/?delete',
+                         'https://localhost:9000/hello/?delete=',
                          {'Content-Length': 95,
                           'User-Agent': _DEFAULT_USER_AGENT,
                           'Content-Md5': u'5Tg5SmU9Or43L4+iIyfPrQ=='}, 200,
@@ -72,7 +72,7 @@ class RemoveObjectsTest(TestCase):
         mock_connection.return_value = mock_server
         mock_server.mock_add_request(
             MockResponse('POST',
-                         'https://localhost:9000/hello/?delete',
+                         'https://localhost:9000/hello/?delete=',
                          {'Content-Length': 95,
                           'User-Agent': _DEFAULT_USER_AGENT,
                           'Content-Md5': u'5Tg5SmU9Or43L4+iIyfPrQ=='}, 200,
@@ -88,7 +88,7 @@ class RemoveObjectsTest(TestCase):
         mock_connection.return_value = mock_server
         mock_server.mock_add_request(
             MockResponse('POST',
-                         'https://localhost:9000/hello/?delete',
+                         'https://localhost:9000/hello/?delete=',
                          {'Content-Length': 95,
                           'User-Agent': _DEFAULT_USER_AGENT,
                           'Content-Md5': u'5Tg5SmU9Or43L4+iIyfPrQ=='}, 200,
diff --git a/tests/unit/sign_test.py b/tests/unit/sign_test.py
index 3ccbb84..1f71238 100644
--- a/tests/unit/sign_test.py
+++ b/tests/unit/sign_test.py
@@ -54,7 +54,7 @@ class CanonicalRequestTest(TestCase):
     def test_request_with_query(self):
         url = urlsplit('http://localhost:9000/hello?c=d&e=f&a=b')
         expected_signed_headers = ['x-amz-content-sha256', 'x-amz-date']
-        expected_request_array = ['PUT', '/hello', 'a=b&c=d&e=f',
+        expected_request_array = ['PUT', '/hello', 'c=d&e=f&a=b',
                                   'x-amz-content-sha256:' + empty_hash,
                                   'x-amz-date:dateString',
                                   '', ';'.join(expected_signed_headers),

pip install -e .[dev]
parse_log_pytest
pytest
nose mock pytest
3.5
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
-e git+https://github.com/minio/minio-py.git@cbe6189d5ee7730931252ac6da2e2fe9af1c9b89#egg=minio
mock==5.2.0
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
nose==1.3.7
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
pytz==2025.2
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3==1.26.20
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: minio-py
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - mock==5.2.0
      - nose==1.3.7
      - pytz==2025.2
      - urllib3==1.26.20
prefix: /opt/conda/envs/minio-py

tests/unit/remove_objects_test.py::RemoveObjectsTest::test_object_is_iterator tests/unit/remove_objects_test.py::RemoveObjectsTest::test_object_is_list tests/unit/remove_objects_test.py::RemoveObjectsTest::test_object_is_tuple tests/unit/sign_test.py::CanonicalRequestTest::test_request_with_query
tests/unit/remove_objects_test.py::RemoveObjectsTest::test_bucket_invalid_name tests/unit/remove_objects_test.py::RemoveObjectsTest::test_object_is_non_string_iterable_1 tests/unit/remove_objects_test.py::RemoveObjectsTest::test_object_is_non_string_iterable_2 tests/unit/remove_objects_test.py::RemoveObjectsTest::test_object_is_non_string_iterable_3 tests/unit/sign_test.py::CanonicalRequestTest::test_simple_request tests/unit/sign_test.py::StringToSignTest::test_signing_key tests/unit/sign_test.py::SigningKeyTest::test_generate_signing_key tests/unit/sign_test.py::AuthorizationHeaderTest::test_generate_authentication_header tests/unit/sign_test.py::PresignURLTest::test_presigned_invalid_expires tests/unit/sign_test.py::PresignURLTest::test_presigned_no_access_key
minio/signer.py docs/API.md minio/api.py examples/listen_notification.py
minio/signer.py docs/API.md minio/api.py examples/listen_notification.py