diff --git a/test/test_s3storage.py b/test/test_s3storage.py
index 9087316504dad4250aadcf66b5e957efd68507ed_dGVzdC90ZXN0X3Mzc3RvcmFnZS5weQ==..58929acc327e578d7a9f4d8bc30c62b893a3b8ea_dGVzdC90ZXN0X3Mzc3RvcmFnZS5weQ== 100644
--- a/test/test_s3storage.py
+++ b/test/test_s3storage.py
@@ -15,6 +15,134 @@
     return cnx.create_entity('Image', data=Binary(data), **kwargs)
 
 
+class S3StorageVersionedTC(testing.S3StorageTestMixin, CubicWebTC):
+
+    def test_s3key_gen(self):
+        self.s3_bucket.Versioning().enable()
+        self.repo.vreg.config['s3-activate-object-versioning'] = True
+        s3storage = self.repo.system_source.storage('Image', 'data')
+        with self.admin_access.client_cnx() as cnx:
+            fobj = create_image(cnx, b'some content')
+            cnx.commit()
+            eid = fobj.eid
+            k1 = s3storage.get_s3_key(fobj, 'data')
+        with self.admin_access.client_cnx() as cnx:
+            fobj = cnx.find('Image', eid=eid).one()
+            k2 = s3storage.get_s3_key(fobj, 'data')
+        self.assertEqual(k1, k2)
+
+    def test_entity_create_versioning(self):
+        self.s3_bucket.Versioning().enable()
+        self.repo.vreg.config['s3-activate-object-versioning'] = True
+        with self.admin_access.client_cnx() as cnx:
+            eid = create_image(cnx, b'some content').eid
+            cnx.commit()
+
+            key = cnx.execute('Any STKEY(D) WHERE X is Image, X data D, '
+                              'X eid %(eid)s', {'eid': eid}).rows[0][0]
+
+            key = key.getvalue().decode()
+
+            s3storage = self.repo.system_source.storage('Image', 'data')
+            key, _ = s3storage.parse_key(key)
+        data = self.s3_bucket.Object(key).get()['Body'].read()
+        self.assertEqual(data, b'some content')
+
+    def test_entity_create_with_same_key(self):
+        self.s3_bucket.Versioning().enable()
+        self.repo.vreg.config['s3-activate-object-versioning'] = True
+        s3storage = self.repo.system_source.storage('Image', 'data')
+        with self.admin_access.client_cnx() as cnx, \
+                patch('cubicweb_s3storage.storages.S3Storage.new_s3_key',
+                      return_value='shared-key'):
+            eid = create_image(cnx, b'some content').eid
+            _ = create_image(cnx, b'some content').eid
+            cnx.commit()
+            key = cnx.execute('Any STKEY(D) WHERE X is Image, X data D, '
+                              'X eid %(eid)s', {'eid': eid}).rows[0][0]
+            key = key.getvalue().decode()
+            key, _ = s3storage.parse_key(key)
+        data = self.s3_bucket.Object(key).get()['Body'].read()
+        self.assertEqual(data, b'some content')
+
+    def test_entity_modify(self):
+        self.s3_bucket.Versioning().enable()
+        self.repo.vreg.config['s3-activate-object-versioning'] = True
+        s3storage = self.repo.system_source.storage('Image', 'data')
+        with self.admin_access.client_cnx() as cnx:
+            eid = create_image(cnx, b'some content').eid
+            cnx.commit()
+        with self.admin_access.client_cnx() as cnx:
+            fobj = cnx.find('Image', eid=eid).one()
+            fobj.cw_set(data=Binary(b'something else'))
+            cnx.commit()
+            # retrieve key now as it will have changed by the modification
+            key = cnx.execute('Any STKEY(D) WHERE X is Image, X data D, '
+                              'X eid %(eid)s', {'eid': eid}).rows[0][0]
+            key = key.getvalue().decode()
+            key, _ = s3storage.parse_key(key)
+
+        data = self.s3_bucket.Object(key).get()['Body'].read()
+        self.assertEqual(data, b'something else')
+
+    def test_entity_retrieve(self):
+        self.s3_bucket.Versioning().enable()
+        self.repo.vreg.config['s3-activate-object-versioning'] = True
+        binstuff = ''.join(chr(x) for x in range(256))
+        if PY3:
+            binstuff = binstuff.encode()
+        with self.admin_access.client_cnx() as cnx:
+            eid = create_image(cnx, binstuff).eid
+            cnx.commit()
+
+        with self.admin_access.client_cnx() as cnx:
+            rset = cnx.execute('Any D WHERE F eid %(eid)s, F data D',
+                               {'eid': eid})
+            self.assertTrue(rset)
+            data = rset.rows[0][0]
+        self.assertEqual(data.read(), binstuff)
+
+    def test_entity_delete(self):
+        self.s3_bucket.Versioning().enable()
+        self.repo.vreg.config['s3-activate-object-versioning'] = True
+        s3storage = self.repo.system_source.storage('Image', 'data')
+        self.repo.vreg.config['s3-auto-delete'] = True
+        with self.admin_access.client_cnx() as cnx:
+            eid = create_image(cnx, b'some content').eid
+            cnx.commit()
+
+            key = cnx.execute('Any STKEY(D) WHERE X is Image, X data D, '
+                              'X eid %(eid)s', {'eid': eid}).rows[0][0]
+            key = key.getvalue().decode()
+            key, _ = s3storage.parse_key(key)
+        keys = [x.key for x in self.s3_bucket.objects.all()]
+        self.assertIn(key, keys)
+        with self.admin_access.client_cnx() as cnx:
+            cnx.execute('DELETE Image X WHERE X eid %(eid)s', {'eid': eid})
+            cnx.commit()
+        keys = [x.key for x in self.s3_bucket.objects.all()]
+        self.assertNotIn(key, keys)
+
+    def test_upload_content_type(self):
+        self.s3_bucket.Versioning().enable()
+        self.repo.vreg.config['s3-activate-object-versioning'] = True
+        s3storage = self.repo.system_source.storage('Image', 'data')
+        mime_type = 'x-custom/mime-type'
+        with self.admin_access.client_cnx() as cnx, \
+                patch('cubicweb_s3storage.storages.S3Storage'
+                      '.get_upload_extra_args',
+                      return_value={'ContentType': mime_type}):
+            image = create_image(cnx, b'some content')
+            cnx.commit()
+            s3storage = self.repo.system_source.storage('Image', 'data')
+            s3_key = s3storage.get_s3_key(image, 'data')
+            s3_key, _ = s3storage.parse_key(s3_key)
+            head = s3storage.s3cnx.head_object(
+                Bucket=self.s3_bucket.name,
+                Key=s3_key)
+            self.assertEqual(head['ContentType'], mime_type)
+
+
 class S3StorageTC(testing.S3StorageTestMixin, CubicWebTC):
 
     def test_s3key_gen(self):