commit f5f2dc533598070b760bd9c4045ec5a29d8d14e3
Author: Stavros Sachtouris <saxtouri@admin.grnet.gr>
Date:   Thu Feb 21 12:50:13 2013 +0200

    Rename tests to livetest in kamaki.clients
    
    Update documentation to reflect these changes

diff --git a/docs/installation.rst b/docs/installation.rst
index 87e777c..81fb712 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -105,7 +105,7 @@ A more detailed example of using virtual env can be found at the `snf-image-crea
 Install objpool (was: snf-common)
 """""""""""""""""""""""""""""""""
 
-Since 0.6.2, kamaki is based on python-objpool. The objpool package is easy to install from source (even on windows platforms):
+Kamaki is based on python-objpool. The objpool package is easy to install from source, even on windows platforms:
 
 .. code-block:: console
 
@@ -121,7 +121,7 @@ Kamaki can be downloaded from `this location <https://code.grnet.gr/projects/kam
 
 .. code-block:: console
 
-    $ tar xvfz kamaki-0.6.2.tar.gz
+    $ tar xvfz kamaki-0.7.tar.gz
 
 or it can be downloaded directly from the git repository:
 
@@ -156,7 +156,7 @@ Kamaki can be installed on Mac OS X systems from source, by following the steps
 Windows
 -------
 
-Since version 0.6.2 kamaki can run on Windows, either on standard Windows console, or inside an improved command line shell. The present guide presents a tested method for using kamaki in windows
+Kamaki can run on Windows, either on standard Windows console, or inside an improved command line shell. The present guide presents a tested method for setting up kamaki in windows
 
 Requirements
 ^^^^^^^^^^^^
@@ -242,8 +242,6 @@ Install kamaki
         $ python setup.py install
         running install
         ...
-        Finished processing dependencies for kamaki==0.6.2
-
-.. warning:: kamaki version should be 0.6.2 or better, otherwise it will not function. Users can test that by running::
+        Finished processing dependencies for kamaki==0.7
 
     $ kamaki --version
diff --git a/docs/setup.rst b/docs/setup.rst
index f98f78d..b21860c 100644
--- a/docs/setup.rst
+++ b/docs/setup.rst
@@ -29,7 +29,7 @@ For installing any all of the following, consult the `kamaki installation guide
 
 * progress 
     * Attach progress bars to various kamaki commands (e.g. kamaki store upload)
-    * Since version 0.6.1 kamaki "requires" progress version 1.0.2 or better
+    * If desired, progress version should be 1.0.2 or better
 
 Any of the above features can be installed at any time before or after kamaki installation.
 
@@ -157,15 +157,103 @@ The [global] group is treated by kamaki as a generic group for arbitrary options
 Hidden features
 ^^^^^^^^^^^^^^^
 
-Since version 0.6.1 kamaki contains a test suite for the kamaki.clients API. The test suite can be activated with the following option on the configuration file::
+The livetest suite
+""""""""""""""""""
 
-    [test]
-    cli=test_cli
+Kamaki contains a live test suite for the kamaki.clients API, where "live" means that the tests are performed against active services that up and running. The live test package is named "livetest", it is accessible as kamaki.clients.livetest and it is designed to check the actual relation between kamaki and synnefo services.
 
-After that, users can run "kamaki test" commands to unit-test the prepackaged client APIs. Unit-tests are still experimental and there is a high probability of false alarms due to some of the expected values being hard-coded in the testing code.
+The livetest suite can be activated with the following option on the configuration file::
 
-Since version 0.6.3, a quotaholder client is introduced as an advanced feature. Quotaholder client is mostly used as a client library for accessing a synnefo quota service, but it can also be allowed as a kamaki command set, but setting the quotaholder.cli and quotaholder.url methods:
+    [livetest]
+    cli=livetest_cli
+
+In most tests, livetest will run as long as an Astakos identity manager service is accessible and kamaki is set up to authenticate a valid token on this server.
+
+In specific, a setup file needs at least the following mandatory settings in the configuration file:
+
+* If authentication information is used for default kamaki clients::
+
+    [astakos]
+    url=<Astakos Identity Manager URL>
+    token=<A valid user token>
+
+* else if this authentication information is only for testing add this under [livetest]::
+
+    astakos_url=<Astakos Identity Manager URL>
+    astakos_token=<A valid user token>
+
+Each service tested in livetest might need some more options under the [livetest] label, as shown bellow:
+
+* kamaki livetest astakos::
+
+    astakos_email = <The valid email of testing user>
+    astakos_name = <The exact "real" name of testing user>
+    astakos_username = <The username of the testing user>
+    astakos_uuid = <The valid unique user id of the testing user>
+
+* kamaki livetest pithos::
+
+    astakos_uuid = <The valid unique user id of the testing user>
+
+* kamaki livetest cyclades / image::
+
+    image_id = <A valid image id used for testing>
+    image_local_path = <The local path of the testing image>
+    image_details = <A text file containing testing image details in a python dict>
+
+    - example image.details content:
+    {
+        u'id': u'b3e68235-3abd-4d60-adfe-1379a4f8d3fe',
+        u'metadata': {
+            u'values': {
+                u'description': u'Debian 6.0.6 (Squeeze) Base System',
+                u'gui': u'No GUI',
+                u'kernel': u'2.6.32',
+                u'os': u'debian',
+                u'osfamily': u'linux',
+                u'root_partition': u'1',
+                u'sortorder': u'1',
+                u'users': u'root'
+            }
+        },
+        u'name': u'Debian Base',
+        u'progress': u'100',
+        u'status': u'ACTIVE',
+        u'created': u'2012-11-19T14:54:57+00:00',
+        u'updated': u'2012-11-19T15:29:51+00:00'
+    }
+
+    flavor_details = <A text file containing the testing images' flavor details in a python dict>
+
+    - example flavor.details content:
+    {
+        u'name': u'C1R1drbd',
+        u'ram': 1024,
+        u'id': 1,
+        u'SNF:disk_template': u'drbd',
+        u'disk': 20,
+        u'cpu': 1
+    }
+
+After setup, kamaki can run all tests::
+
+    $ kamaki livetest all
+
+a specific test (e.g. astakos)::
+
+    $ kamaki livetest astakos
+
+or a specific method from a service (e.g. astakos authenticate)::
+
+    $ kamaki livetest astakos authenticate
+
+The quotaholder client
+""""""""""""""""""""""
+
+A quotaholder client is introduced as an advanced feature. Quotaholder client is mostly used as a client library for accessing a synnefo quota service, but it can also be allowed as a kamaki command set, but setting the quotaholder.cli and quotaholder.url methods::
 
     [quotaholder]
     cli=quotaholder_cli
     url=<URL of quotaholder service>
+
+Quotaholder is not tested in livetest
diff --git a/kamaki/cli/commands/livetest_cli.py b/kamaki/cli/commands/livetest_cli.py
new file mode 100644
index 0000000..2085a87
--- /dev/null
+++ b/kamaki/cli/commands/livetest_cli.py
@@ -0,0 +1,218 @@
+# Copyright 2012-2013 GRNET S.A. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or
+# without modification, are permitted provided that the following
+# conditions are met:
+#
+#   1. Redistributions of source code must retain the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer.
+#
+#   2. Redistributions in binary form must reproduce the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer in the documentation and/or other materials
+#      provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and
+# documentation are those of the authors and should not be
+# interpreted as representing official policies, either expressed
+# or implied, of GRNET S.A.command
+
+from kamaki.cli.commands import errors
+from kamaki.cli import command
+from kamaki.cli.commands import _command_init
+from kamaki.cli.command_tree import CommandTree
+from kamaki.clients import livetest
+from kamaki.cli.errors import raiseCLIError
+
+livetest_cmds = CommandTree('livetest', 'Test clients on live servers')
+_commands = [livetest_cmds]
+
+
+class _livetest_init(_command_init):
+
+    def _run(self, client, method=None):
+        if method:
+            livetest._main([client, method], config=self.config)
+        else:
+            livetest._main([client], config=self.config)
+
+    def main(self, client, method=None):
+        return self._run(client, method)
+
+
+@command(livetest_cmds)
+class livetest_error(_livetest_init):
+    """Create an error message with optional message"""
+
+    @errors.generic.all
+    def _run(self, errmsg='', importance=0, index=0):
+        l = [1, 2]
+        try:
+            l[int(index)]
+        except Exception as err:
+            raiseCLIError(err, errmsg, importance)
+        raiseCLIError(None, errmsg, importance)
+
+    def main(self, errmsg='', importance=0, index=0):
+        self._run(errmsg, importance, index)
+
+
+@command(livetest_cmds)
+class livetest_args(_livetest_init):
+    """Test how arguments are treated by kamaki"""
+
+    @errors.generic.all
+    def _run(self, *args):
+        print(args)
+
+    def main(self, *args):
+        self._run(args)
+
+
+@command(livetest_cmds)
+class livetest_all(_livetest_init):
+    """test all clients"""
+
+    @errors.generic.all
+    def _run(self):
+        for client in ('pithos', 'cyclades', 'image', 'astakos'):
+            super(self.__class__, self)._run(client)
+
+    def main(self):
+        self._run()
+
+
+@command(livetest_cmds)
+class livetest_pithos(_livetest_init):
+    """ test Pithos client"""
+
+    @errors.generic.all
+    def _run(self, method=None):
+        super(self.__class__, self)._run('pithos', method)
+
+    def main(self, method=None):
+        self._run(method)
+
+
+@command(livetest_cmds)
+class livetest_cyclades(_livetest_init):
+    """ test Cyclades client"""
+
+    @errors.generic.all
+    def _run(self, method=None):
+        super(self.__class__, self)._run('cyclades', method)
+
+    def main(self, method=None):
+        self._run(method)
+
+
+@command(livetest_cmds)
+class livetest_image(_livetest_init):
+    """ test Image client"""
+
+    @errors.generic.all
+    def _run(self, method=None):
+        super(self.__class__, self)._run('image', method)
+
+    def main(self, method=None):
+        self._run(method)
+
+
+@command(livetest_cmds)
+class livetest_astakos(_livetest_init):
+    """ test Astakos client"""
+
+    @errors.generic.all
+    def _run(self, method=None):
+        super(self.__class__, self)._run('astakos', method)
+
+    def main(self, method=None):
+        self._run(method)
+
+
+@command(livetest_cmds)
+class livetest_prints(_livetest_init):
+    """ user-test print methods for lists and dicts"""
+
+    d1 = {'key0a': 'val0a', 'key0b': 'val0b', 'key0c': 'val0c'}
+
+    l1 = [1, 'string', '3', 'many (2 or 3) numbers and strings combined', 5]
+
+    d2 = {'id': 'val0a', 'key0b': d1, 'title': l1}
+
+    l2 = [d2, l1, d1]
+
+    spr_msg = 'long key of size 75 characters is used to check the effects on'
+    spr_msg += ' total result for long messages that drive pep8 completely mad'
+    d3 = {'dict 1': d1, 'dict 2': d2, 'list2': l2, spr_msg: l1}
+
+    @errors.generic.all
+    def _run(self):
+        from kamaki.cli.utils import print_dict, print_list, print_items
+        print('Test simple dict:\n- - -')
+        print_dict(self.d1)
+        print('- - -\n')
+        print('\nTest simple list:\n- - -')
+        print_list(self.l1)
+        print('- - -\n')
+        print('\nTest 2-level dict:\n- - -')
+        print_dict(self.d2)
+        print('- - -\n')
+        print('\nTest non-trivial list:\n- - -')
+        print_list(self.l2)
+        print('- - -')
+        print('\nTest extreme dict:\n- - -')
+        print_dict(self.d3)
+        print('- - -\n')
+        print('Test simple enumerated dict:\n- - -')
+        print_dict(self.d1, with_enumeration=True)
+        print('- - -\n')
+        print('\nTest simple enumerated list:\n- - -')
+        print_list(self.l1, with_enumeration=True)
+        print('- - -\n')
+        print('Test non-trivial deep-enumerated dict:\n- - -')
+        print_dict(self.d2, with_enumeration=True, recursive_enumeration=True)
+        print('- - -\n')
+        print('\nTest non-trivial enumerated list:\n- - -')
+        print_list(self.l2, with_enumeration=True)
+        print('- - -\n')
+        print('\nTest print_items with id:\n- - -')
+        print_items([
+            {'id': '42', 'title': 'lalakis 1', 'content': self.d1},
+            {'id': '142', 'title': 'lalakis 2', 'content': self.d2}])
+        print('- - -')
+        print('\nTest print_items with id and enumeration:\n- - -')
+        print_items(
+            [
+                {'id': '42', 'title': 'lalakis 1', 'content': self.d1},
+                {'id': '142', 'title': 'lalakis 2', 'content': self.d2}],
+            with_enumeration=True)
+        print('- - -')
+        print('\nTest print_items with id, title and redundancy:\n- - -')
+        print_items(
+            [
+                {'id': '42', 'title': 'lalakis 1', 'content': self.d1},
+                {'id': '142', 'title': 'lalakis 2', 'content': self.d2}],
+            title=('id', 'title'),
+            with_redundancy=True)
+        print('- - -')
+        print('\nTest print_items with lists- - -')
+        print_items([['i00', 'i01', 'i02'], [self.l2, 'i11', self.d1], 3])
+        print('- - -')
+
+    def main(self):
+        self._run()
diff --git a/kamaki/cli/commands/test_cli.py b/kamaki/cli/commands/test_cli.py
deleted file mode 100644
index 03ea13e..0000000
--- a/kamaki/cli/commands/test_cli.py
+++ /dev/null
@@ -1,218 +0,0 @@
-# Copyright 2012-2013 GRNET S.A. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or
-# without modification, are permitted provided that the following
-# conditions are met:
-#
-#   1. Redistributions of source code must retain the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer in the documentation and/or other materials
-#      provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
-# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and
-# documentation are those of the authors and should not be
-# interpreted as representing official policies, either expressed
-# or implied, of GRNET S.A.command
-
-from kamaki.cli.commands import errors
-from kamaki.cli import command
-from kamaki.cli.commands import _command_init
-from kamaki.cli.command_tree import CommandTree
-from kamaki.clients import tests
-from kamaki.cli.errors import raiseCLIError
-
-test_cmds = CommandTree('test', 'Unitest clients')
-_commands = [test_cmds]
-
-
-class _test_init(_command_init):
-
-    def _run(self, client, method=None):
-        if method:
-            tests._main([client, method], config=self.config)
-        else:
-            tests._main([client], config=self.config)
-
-    def main(self, client, method=None):
-        return self._run(client, method)
-
-
-@command(test_cmds)
-class test_error(_test_init):
-    """Create an error message with optional message"""
-
-    @errors.generic.all
-    def _run(self, errmsg='', importance=0, index=0):
-        l = [1, 2]
-        try:
-            l[int(index)]
-        except Exception as err:
-            raiseCLIError(err, errmsg, importance)
-        raiseCLIError(None, errmsg, importance)
-
-    def main(self, errmsg='', importance=0, index=0):
-        self._run(errmsg, importance, index)
-
-
-@command(test_cmds)
-class test_args(_test_init):
-    """Test how arguments are treated by kamaki"""
-
-    @errors.generic.all
-    def _run(self, *args):
-        print(args)
-
-    def main(self, *args):
-        self._run(args)
-
-
-@command(test_cmds)
-class test_all(_test_init):
-    """test all clients"""
-
-    @errors.generic.all
-    def _run(self):
-        for client in ('pithos', 'cyclades', 'image', 'astakos'):
-            super(self.__class__, self)._run(client)
-
-    def main(self):
-        self._run()
-
-
-@command(test_cmds)
-class test_pithos(_test_init):
-    """ test Pithos client"""
-
-    @errors.generic.all
-    def _run(self, method=None):
-        super(self.__class__, self)._run('pithos', method)
-
-    def main(self, method=None):
-        self._run(method)
-
-
-@command(test_cmds)
-class test_cyclades(_test_init):
-    """ test Cyclades client"""
-
-    @errors.generic.all
-    def _run(self, method=None):
-        super(self.__class__, self)._run('cyclades', method)
-
-    def main(self, method=None):
-        self._run(method)
-
-
-@command(test_cmds)
-class test_image(_test_init):
-    """ test Image client"""
-
-    @errors.generic.all
-    def _run(self, method=None):
-        super(self.__class__, self)._run('image', method)
-
-    def main(self, method=None):
-        self._run(method)
-
-
-@command(test_cmds)
-class test_astakos(_test_init):
-    """ test Astakos client"""
-
-    @errors.generic.all
-    def _run(self, method=None):
-        super(self.__class__, self)._run('astakos', method)
-
-    def main(self, method=None):
-        self._run(method)
-
-
-@command(test_cmds)
-class test_prints(_test_init):
-    """ user-test print methods for lists and dicts"""
-
-    d1 = {'key0a': 'val0a', 'key0b': 'val0b', 'key0c': 'val0c'}
-
-    l1 = [1, 'string', '3', 'many (2 or 3) numbers and strings combined', 5]
-
-    d2 = {'id': 'val0a', 'key0b': d1, 'title': l1}
-
-    l2 = [d2, l1, d1]
-
-    spr_msg = 'long key of size 75 characters is used to check the effects on'
-    spr_msg += ' total result for long messages that drive pep8 completely mad'
-    d3 = {'dict 1': d1, 'dict 2': d2, 'list2': l2, spr_msg: l1}
-
-    @errors.generic.all
-    def _run(self):
-        from kamaki.cli.utils import print_dict, print_list, print_items
-        print('Test simple dict:\n- - -')
-        print_dict(self.d1)
-        print('- - -\n')
-        print('\nTest simple list:\n- - -')
-        print_list(self.l1)
-        print('- - -\n')
-        print('\nTest 2-level dict:\n- - -')
-        print_dict(self.d2)
-        print('- - -\n')
-        print('\nTest non-trivial list:\n- - -')
-        print_list(self.l2)
-        print('- - -')
-        print('\nTest extreme dict:\n- - -')
-        print_dict(self.d3)
-        print('- - -\n')
-        print('Test simple enumerated dict:\n- - -')
-        print_dict(self.d1, with_enumeration=True)
-        print('- - -\n')
-        print('\nTest simple enumerated list:\n- - -')
-        print_list(self.l1, with_enumeration=True)
-        print('- - -\n')
-        print('Test non-trivial deep-enumerated dict:\n- - -')
-        print_dict(self.d2, with_enumeration=True, recursive_enumeration=True)
-        print('- - -\n')
-        print('\nTest non-trivial enumerated list:\n- - -')
-        print_list(self.l2, with_enumeration=True)
-        print('- - -\n')
-        print('\nTest print_items with id:\n- - -')
-        print_items([
-            {'id': '42', 'title': 'lalakis 1', 'content': self.d1},
-            {'id': '142', 'title': 'lalakis 2', 'content': self.d2}])
-        print('- - -')
-        print('\nTest print_items with id and enumeration:\n- - -')
-        print_items(
-            [
-                {'id': '42', 'title': 'lalakis 1', 'content': self.d1},
-                {'id': '142', 'title': 'lalakis 2', 'content': self.d2}],
-            with_enumeration=True)
-        print('- - -')
-        print('\nTest print_items with id, title and redundancy:\n- - -')
-        print_items(
-            [
-                {'id': '42', 'title': 'lalakis 1', 'content': self.d1},
-                {'id': '142', 'title': 'lalakis 2', 'content': self.d2}],
-            title=('id', 'title'),
-            with_redundancy=True)
-        print('- - -')
-        print('\nTest print_items with lists- - -')
-        print_items([['i00', 'i01', 'i02'], [self.l2, 'i11', self.d1], 3])
-        print('- - -')
-
-    def main(self):
-        self._run()
diff --git a/kamaki/clients/livetest/__init__.py b/kamaki/clients/livetest/__init__.py
new file mode 100644
index 0000000..652e0cd
--- /dev/null
+++ b/kamaki/clients/livetest/__init__.py
@@ -0,0 +1,202 @@
+# Copyright 2012-2013 GRNET S.A. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or
+# without modification, are permitted provided that the following
+# conditions are met:
+#
+#   1. Redistributions of source code must retain the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer.
+#
+#   2. Redistributions in binary form must reproduce the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer in the documentation and/or other materials
+#      provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and
+# documentation are those of the authors and should not be
+# interpreted as representing official policies, either expressed
+# or implied, of GRNET S.A.
+
+import inspect
+from unittest import TestCase, TestSuite, TextTestRunner
+from argparse import ArgumentParser
+from sys import stdout
+
+from kamaki.cli.config import Config
+from kamaki.cli.utils import spiner
+
+
+def _add_value(foo, value):
+    def wrap(self):
+        return foo(self, value)
+    return wrap
+
+
+class Generic(TestCase):
+
+    _waits = []
+    _cnf = None
+    _grp = None
+    _fetched = {}
+
+    def __init__(self, specific=None, config=None, group=None):
+        super(Generic, self).__init__(specific)
+        self._cnf = config or Config()
+        self._grp = group
+        self._waits.append(0.71828)
+        for i in range(10):
+            self._waits.append(self._waits[-1] * 2.71828)
+
+    def __getitem__(self, key):
+        key = self._key(key)
+        try:
+            r = self._fetched[key]
+            return r
+            return self._fetched[key]
+        except KeyError:
+            r = self._get_from_cnf(key)
+            return r
+            return self._get_from_cnf(key)
+
+    def _key(self, key):
+        return ('', key) if isinstance(key, str)\
+            else ('', key[0]) if len(key) == 1\
+            else key
+
+    def _get_from_cnf(self, key):
+        val = 0
+        if key[0]:
+            keystr = '%s_%s' % key
+            val = self._cnf.get('livetest', keystr) or self._cnf.get(*key)
+        if not val:
+            val = self._cnf.get('livetest', key[1]) or self._cnf.get(
+                'global',
+                key[1])
+        self._fetched[key] = val
+        return val
+
+    def _safe_progress_bar(self, msg):
+        """Try to get a progress bar, but do not raise errors"""
+        try:
+            from progress.bar import ShadyBar
+            wait_bar = ShadyBar(msg)
+
+            def wait_gen(n):
+                for i in wait_bar.iter(range(int(n))):
+                    yield
+                yield
+            wait_cb = wait_gen
+        except Exception:
+            stdout.write('%s:' % msg)
+            (wait_bar, wait_cb) = (None, spiner)
+        return (wait_bar, wait_cb)
+
+    def _safe_progress_bar_finish(self, progress_bar):
+        try:
+            progress_bar.finish()
+        except Exception:
+            print('\b DONE')
+
+    def do_with_progress_bar(self, action, msg, items):
+        if not items:
+            print('%s: DONE' % msg)
+            return
+        (action_bar, action_cb) = self._safe_progress_bar(msg)
+        action_gen = action_cb(len(items))
+        try:
+            action_gen.next()
+        except Exception:
+            pass
+        for item in items:
+            action(item)
+            action_gen.next()
+        self._safe_progress_bar_finish(action_bar)
+
+    def assert_dicts_are_deeply_equal(self, d1, d2):
+        (st1, st2) = (set(d1.keys()), set(d2.keys()))
+        diff1 = st1.difference(st2)
+        diff2 = st2.difference(st1)
+        self.assertTrue(
+            not (diff1 or diff2),
+            'Key differences:\n\td1-d2=%s\n\td2-d1=%s' % (diff1, diff2))
+        for k, v in d1.items():
+            if isinstance(v, dict):
+                self.assert_dicts_are_deeply_equal(v, d2[k])
+            else:
+                self.assertEqual(unicode(v), unicode(d2[k]))
+
+    def test_000(self):
+        print('')
+        methods = [method for method in inspect.getmembers(
+            self,
+            predicate=inspect.ismethod) if method[0].startswith('_test_')]
+        failures = 0
+        for method in methods:
+            stdout.write('Test %s ' % method[0][6:])
+            stdout.flush()
+            try:
+                method[1]()
+                print(' ...ok')
+            except AssertionError:
+                print('  FAIL: %s (%s)' % (method[0], method[1]))
+                failures += 1
+        if failures:
+            raise AssertionError('%s failures' % failures)
+
+
+def init_parser():
+    parser = ArgumentParser(add_help=False)
+    parser.add_argument(
+        '-h', '--help',
+        dest='help',
+        action='store_true',
+        default=False,
+        help="Show this help message and exit")
+    return parser
+
+
+def main(argv):
+    _main(argv, config=None)
+
+
+def _main(argv, config=None):
+    suiteFew = TestSuite()
+    if len(argv) == 0 or argv[0] == 'pithos':
+        from kamaki.clients.livetest.pithos import Pithos
+        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
+        suiteFew.addTest(Pithos(test_method, config))
+    if len(argv) == 0 or argv[0] == 'cyclades':
+        from kamaki.clients.livetest.cyclades import Cyclades
+        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
+        suiteFew.addTest(Cyclades(test_method, config))
+    if len(argv) == 0 or argv[0] == 'image':
+        from kamaki.clients.livetest.image import Image
+        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
+        suiteFew.addTest(Image(test_method, config))
+    if len(argv) == 0 or argv[0] == 'astakos':
+        from kamaki.clients.livetest.astakos import Astakos
+        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
+        suiteFew.addTest(Astakos(test_method, config))
+
+    TextTestRunner(verbosity=2).run(suiteFew)
+
+if __name__ == '__main__':
+    parser = init_parser()
+    args, argv = parser.parse_known_args()
+    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
+        raise Exception('\tusage: livetest <group> [command]')
+    main(argv)
diff --git a/kamaki/clients/livetest/astakos.py b/kamaki/clients/livetest/astakos.py
new file mode 100644
index 0000000..22bdb27
--- /dev/null
+++ b/kamaki/clients/livetest/astakos.py
@@ -0,0 +1,88 @@
+# Copyright 2012-2013 GRNET S.A. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or
+# without modification, are permitted provided that the following
+# conditions are met:
+#
+#   1. Redistributions of source code must retain the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer.
+#
+#   2. Redistributions in binary form must reproduce the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer in the documentation and/or other materials
+#      provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and
+# documentation are those of the authors and should not be
+# interpreted as representing official policies, either expressed
+# or implied, of GRNET S.A.
+
+from kamaki.clients import livetest
+from kamaki.clients.astakos import AstakosClient
+
+
+class Astakos(livetest.Generic):
+    def setUp(self):
+        self.client = AstakosClient(
+            self['astakos', 'url'],
+            self['astakos', 'token'])
+
+    def test_authenticate(self):
+        self._test_0010_authenticate()
+
+    def _test_0010_authenticate(self):
+        r = self.client.authenticate()
+        for term in (
+                'name',
+                'username',
+                'auth_token_expires',
+                'auth_token_created',
+                'uuid',
+                'id',
+                'email'):
+            self.assertTrue(term in r)
+
+    def test_info(self):
+        self._test_0020_info()
+
+    def _test_0020_info(self):
+        self.assertTrue(set([
+            'name',
+            'username',
+            'uuid']).issubset(self.client.info().keys()))
+
+    def test_get(self):
+        self._test_0020_get()
+
+    def _test_0020_get(self):
+        for term in ('uuid', 'name', 'username'):
+            self.assertEqual(
+                self.client.term(term, self['astakos', 'token']),
+                self['astakos', term])
+        self.assertTrue(self['astakos', 'email'] in self.client.term('email'))
+
+    def test_list(self):
+        self.client.authenticate()
+        self._test_0020_list()
+
+    def _test_0020_list(self):
+        terms = set(['name', 'username', 'uuid', 'email', 'auth_token'])
+        uuid = 0
+        for r in self.client.list():
+            self.assertTrue(terms.issubset(r.keys()))
+            self.assertTrue(uuid != r['uuid'] if uuid else True)
+            uuid = r['uuid']
diff --git a/kamaki/clients/livetest/cyclades.py b/kamaki/clients/livetest/cyclades.py
new file mode 100644
index 0000000..199e849
--- /dev/null
+++ b/kamaki/clients/livetest/cyclades.py
@@ -0,0 +1,765 @@
+# Copyright 2012-2013 GRNET S.A. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or
+# without modification, are permitted provided that the following
+# conditions are met:
+#
+#   1. Redistributions of source code must retain the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer.
+#
+#   2. Redistributions in binary form must reproduce the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer in the documentation and/or other materials
+#      provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and
+# documentation are those of the authors and should not be
+# interpreted as representing official policies, either expressed
+# or implied, of GRNET S.A.
+
+import time
+
+from kamaki.clients import livetest, ClientError
+from kamaki.clients.cyclades import CycladesClient
+
+
+class Cyclades(livetest.Generic):
+    """Set up a Cyclades thorough test"""
+    def setUp(self):
+        print
+        with open(self['image', 'details']) as f:
+            self.img_details = eval(f.read())
+        self.img = self.img_details['id']
+        with open(self['flavor', 'details']) as f:
+            self._flavor_details = eval(f.read())
+        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
+
+        self.servers = {}
+        self.now = time.mktime(time.gmtime())
+        self.servname1 = 'serv' + unicode(self.now)
+        self.servname2 = self.servname1 + '_v2'
+        self.servname1 += '_v1'
+        self.flavorid = 1
+        #servers have to be created at the begining...
+        self.networks = {}
+        self.netname1 = 'net' + unicode(self.now)
+        self.netname2 = 'net' + unicode(self.now) + '_v2'
+
+        self.client = CycladesClient(self['compute', 'url'], self['token'])
+
+    def tearDown(self):
+        """Destoy servers used in testing"""
+        for net in self.networks.keys():
+            self._delete_network(net)
+        for server in self.servers.values():
+            self._delete_server(server['id'])
+            print('DEL VM %s (%s)' % (server['id'], server['name']))
+
+    def test_000(self):
+        "Prepare a full Cyclades test scenario"
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self.server2 = self._create_server(
+            self.servname2,
+            self.flavorid + 2,
+            self.img)
+        super(self.__class__, self).test_000()
+
+    def _create_server(self, servername, flavorid, imageid, personality=None):
+        server = self.client.create_server(
+            servername,
+            flavorid,
+            imageid,
+            personality)
+        print('CREATE VM %s (%s)' % (server['id'], server['name']))
+        self.servers[servername] = server
+        return server
+
+    def _delete_server(self, servid):
+        try:
+            current_state = self.client.get_server_details(servid)
+            current_state = current_state['status']
+            if current_state == 'DELETED':
+                return
+            self.client.delete_server(servid)
+            self._wait_for_status(servid, current_state)
+            self.client.delete_server(servid)
+        except:
+            return
+
+    def _create_network(self, netname, **kwargs):
+        net = self.client.create_network(netname, **kwargs)
+        self.networks[net['id']] = net
+        return net
+
+    def _delete_network(self, netid):
+        if not netid in self.networks:
+            return None
+        print('Disconnect nics of network %s' % netid)
+        self.client.disconnect_network_nics(netid)
+
+        def netwait(wait):
+            try:
+                self.client.delete_network(netid)
+            except ClientError:
+                time.sleep(wait)
+        self.do_with_progress_bar(
+            netwait,
+            'Delete network %s' % netid,
+            self._waits[:7])
+        return self.networks.pop(netid)
+
+    def _wait_for_network(self, netid, status):
+
+        def netwait(wait):
+            r = self.client.get_network_details(netid)
+            if r['status'] == status:
+                return
+            time.sleep(wait)
+        self.do_with_progress_bar(
+            netwait,
+            'Wait network %s to reach status %s' % (netid, status),
+            self._waits[:5])
+
+    def _wait_for_nic(self, netid, servid, in_creation=True):
+        self._wait_for_network(netid, 'ACTIVE')
+
+        def nicwait(wait):
+            nics = self.client.list_server_nics(servid)
+            for net in nics:
+                found_nic = net['network_id'] == netid
+                if (in_creation and found_nic) or not (
+                        in_creation or found_nic):
+                    return
+            time.sleep(wait)
+        self.do_with_progress_bar(
+            nicwait,
+            'Wait nic-%s-%s to %sconnect' % (
+                netid,
+                servid,
+                '' if in_creation else 'dis'),
+            self._waits[:5])
+        for net in self.client.list_server_nics(servid):
+            if netid == net['network_id']:
+                return True
+        return False
+
+    def _has_status(self, servid, status):
+        r = self.client.get_server_details(servid)
+        return r['status'] == status
+
+    def _wait_for_status(self, servid, status):
+        (wait_bar, wait_cb) = self._safe_progress_bar(
+            'Server %s in %s' % (servid, status))
+        self.client.wait_server(servid, status, wait_cb=wait_cb)
+        self._safe_progress_bar_finish(wait_bar)
+
+    def test_parallel_creation(self):
+        """test create with multiple threads
+        Do not use this in regular livetest
+        """
+        from kamaki.clients import SilentEvent
+        c1 = SilentEvent(
+            self._create_server,
+            self.servname1,
+            self.flavorid,
+            self.img)
+        c2 = SilentEvent(
+            self._create_server,
+            self.servname2,
+            self.flavorid + 2,
+            self.img)
+        c3 = SilentEvent(
+            self._create_server,
+            self.servname1,
+            self.flavorid,
+            self.img)
+        c4 = SilentEvent(
+            self._create_server,
+            self.servname2,
+            self.flavorid + 2,
+            self.img)
+        c5 = SilentEvent(
+            self._create_server,
+            self.servname1,
+            self.flavorid,
+            self.img)
+        c6 = SilentEvent(
+            self._create_server,
+            self.servname2,
+            self.flavorid + 2,
+            self.img)
+        c7 = SilentEvent(
+            self._create_server,
+            self.servname1,
+            self.flavorid,
+            self.img)
+        c8 = SilentEvent(
+            self._create_server,
+            self.servname2,
+            self.flavorid + 2,
+            self.img)
+        c1.start()
+        c2.start()
+        c3.start()
+        c4.start()
+        c5.start()
+        c6.start()
+        c7.start()
+        c8.start()
+
+    def test_create_server(self):
+        """Test create_server"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        self._test_0010_create_server()
+
+    def _test_0010_create_server(self):
+        self.assertEqual(self.server1["name"], self.servname1)
+        self.assertEqual(self.server1["flavorRef"], self.flavorid)
+        self.assertEqual(self.server1["imageRef"], self.img)
+        self.assertEqual(self.server1["status"], "BUILD")
+
+    def test_list_servers(self):
+        """Test list servers"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self.server2 = self._create_server(
+            self.servname2,
+            self.flavorid + 2,
+            self.img)
+        self._test_0020_list_servers()
+
+    def _test_0020_list_servers(self):
+        servers = self.client.list_servers()
+        dservers = self.client.list_servers(detail=True)
+
+        """detailed and simple are same size"""
+        self.assertEqual(len(dservers), len(servers))
+        for i in range(len(servers)):
+            for field in (
+                    'created',
+                    'flavorRef',
+                    'hostId',
+                    'imageRef',
+                    'progress',
+                    'status',
+                    'updated'):
+                self.assertFalse(field in servers[i])
+                self.assertTrue(field in dservers[i])
+
+        """detailed and simple contain same names"""
+        names = sorted(map(lambda x: x["name"], servers))
+        dnames = sorted(map(lambda x: x["name"], dservers))
+        self.assertEqual(names, dnames)
+
+    def _test_0030_wait_test_servers_to_build(self):
+        """Pseudo-test to wait for VMs to load"""
+        print('')
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        self._wait_for_status(self.server2['id'], 'BUILD')
+
+    def test_get_server_details(self):
+        """Test get_server_details"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        self._test_0040_get_server_details()
+
+    def _test_0040_get_server_details(self):
+        r = self.client.get_server_details(self.server1['id'])
+        self.assertEqual(r["name"], self.servname1)
+        self.assertEqual(r["flavorRef"], self.flavorid)
+        self.assertEqual(r["imageRef"], self.img)
+        self.assertEqual(r["status"], "ACTIVE")
+
+    def test_update_server_name(self):
+        """Test update_server_name"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._test_0050_update_server_name()
+
+    def _test_0050_update_server_name(self):
+        new_name = self.servname1 + '_new_name'
+        self.client.update_server_name(self.server1['id'], new_name)
+        r = self.client.get_server_details(
+            self.server1['id'],
+            success=(200, 400))
+        self.assertEqual(r['name'], new_name)
+        changed = self.servers.pop(self.servname1)
+        changed['name'] = new_name
+        self.servers[new_name] = changed
+
+    def test_reboot_server(self):
+        """Test reboot server"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        self.server2 = self._create_server(
+            self.servname2,
+            self.flavorid + 1,
+            self.img)
+        self._wait_for_status(self.server2['id'], 'BUILD')
+        self._test_0060_reboot_server()
+        self._wait_for_status(self.server1['id'], 'REBOOT')
+        self._wait_for_status(self.server2['id'], 'REBOOT')
+
+    def _test_0060_reboot_server(self):
+        self.client.reboot_server(self.server1['id'])
+        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
+        self.client.reboot_server(self.server2['id'], hard=True)
+        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
+
+    def _test_0070_wait_test_servers_to_reboot(self):
+        """Pseudo-test to wait for VMs to load"""
+        print('')
+        self._wait_for_status(self.server1['id'], 'REBOOT')
+        self._wait_for_status(self.server2['id'], 'REBOOT')
+
+    def test_create_server_metadata(self):
+        """Test create_server_metadata"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._test_0080_create_server_metadata()
+
+    def _test_0080_create_server_metadata(self):
+        r1 = self.client.create_server_metadata(
+            self.server1['id'],
+            'mymeta',
+            'mymeta val')
+        self.assertTrue('mymeta' in r1)
+        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
+        self.assert_dicts_are_deeply_equal(r1, r2)
+
+    def test_get_server_metadata(self):
+        """Test get server_metadata"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._test_0090_get_server_metadata()
+
+    def _test_0090_get_server_metadata(self):
+        self.client.create_server_metadata(
+            self.server1['id'],
+            'mymeta_0',
+            'val_0')
+        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
+        self.assertEqual(r['mymeta_0'], 'val_0')
+
+    def test_update_server_metadata(self):
+        """Test update_server_metadata"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._test_0100_update_server_metadata()
+
+    def _test_0100_update_server_metadata(self):
+        r1 = self.client.create_server_metadata(
+            self.server1['id'],
+            'mymeta3',
+            'val2')
+        self.assertTrue('mymeta3'in r1)
+        r2 = self.client.update_server_metadata(
+            self.server1['id'],
+            mymeta3='val3')
+        self.assertTrue(r2['mymeta3'], 'val3')
+
+    def test_delete_server_metadata(self):
+        """Test delete_server_metadata"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._test_0110_delete_server_metadata()
+
+    def _test_0110_delete_server_metadata(self):
+        r1 = self.client.create_server_metadata(
+            self.server1['id'],
+            'mymeta',
+            'val')
+        self.assertTrue('mymeta' in r1)
+        self.client.delete_server_metadata(self.server1['id'], 'mymeta')
+        try:
+            self.client.get_server_metadata(self.server1['id'], 'mymeta')
+            raise ClientError('Wrong Error', status=100)
+        except ClientError as err:
+            self.assertEqual(err.status, 404)
+
+    def test_list_flavors(self):
+        """Test flavors_get"""
+        self._test_0120_list_flavors()
+
+    def _test_0120_list_flavors(self):
+        r = self.client.list_flavors()
+        self.assertTrue(len(r) > 1)
+        r = self.client.list_flavors(detail=True)
+        self.assertTrue('SNF:disk_template' in r[0])
+
+    def test_get_flavor_details(self):
+        """Test test_get_flavor_details"""
+        self._test_0130_get_flavor_details()
+
+    def _test_0130_get_flavor_details(self):
+        r = self.client.get_flavor_details(self.flavorid)
+        self.assert_dicts_are_deeply_equal(self._flavor_details, r)
+
+    def test_list_images(self):
+        """Test list_images"""
+        self._test_0140_list_images()
+
+    def _test_0140_list_images(self):
+        r = self.client.list_images()
+        self.assertTrue(len(r) > 1)
+        r = self.client.list_images(detail=True)
+        for detailed_img in r:
+            if detailed_img['id'] == self.img:
+                break
+        self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
+
+    def test_get_image_details(self):
+        """Test image_details"""
+        self._test_0150_get_image_details()
+
+    def _test_0150_get_image_details(self):
+        r = self.client.get_image_details(self.img)
+        self.assert_dicts_are_deeply_equal(r, self.img_details)
+
+    def test_get_image_metadata(self):
+        """Test get_image_metadata"""
+        self._test_0160_get_image_metadata()
+
+    def _test_0160_get_image_metadata(self):
+        r = self.client.get_image_metadata(self.img)
+        self.assert_dicts_are_deeply_equal(
+            self.img_details['metadata']['values'], r)
+        for key, val in self.img_details['metadata']['values'].items():
+            r = self.client.get_image_metadata(self.img, key)
+            self.assertEqual(r[key], val)
+
+    def test_shutdown_server(self):
+        """Test shutdown_server"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        self._test_0170_shutdown_server()
+
+    def _test_0170_shutdown_server(self):
+        self.client.shutdown_server(self.server1['id'])
+        self._wait_for_status(self.server1['id'], 'ACTIVE')
+        r = self.client.get_server_details(self.server1['id'])
+        self.assertEqual(r['status'], 'STOPPED')
+
+    def test_start_server(self):
+        """Test start_server"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        self.client.shutdown_server(self.server1['id'])
+        self._wait_for_status(self.server1['id'], 'ACTIVE')
+        self._test_0180_start_server()
+
+    def _test_0180_start_server(self):
+        self.client.start_server(self.server1['id'])
+        self._wait_for_status(self.server1['id'], 'STOPPED')
+        r = self.client.get_server_details(self.server1['id'])
+        self.assertEqual(r['status'], 'ACTIVE')
+
+    def test_get_server_console(self):
+        """Test get_server_console"""
+        self.server2 = self._create_server(
+            self.servname2,
+            self.flavorid + 2,
+            self.img)
+        self._wait_for_status(self.server2['id'], 'BUILD')
+        self._test_0190_get_server_console()
+
+    def _test_0190_get_server_console(self):
+        r = self.client.get_server_console(self.server2['id'])
+        self.assertTrue('host' in r)
+        self.assertTrue('password' in r)
+        self.assertTrue('port' in r)
+        self.assertTrue('type' in r)
+
+    def test_get_firewall_profile(self):
+        """Test get_firewall_profile"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._test_0200_get_firewall_profile()
+
+    def _test_0200_get_firewall_profile(self):
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        fprofile = self.client.get_firewall_profile(self.server1['id'])
+        self.assertTrue(fprofile in self.PROFILES)
+
+    def test_set_firewall_profile(self):
+        """Test set_firewall_profile"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._test_0210_set_firewall_profile()
+
+    def _test_0210_set_firewall_profile(self):
+
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
+        fprofile = self.client.get_firewall_profile(self.server1['id'])
+        print('')
+        count_success = 0
+        for counter, fprofile in enumerate(PROFILES):
+            npos = counter + 1
+            try:
+                nprofile = PROFILES[npos]
+            except IndexError:
+                nprofile = PROFILES[0]
+            print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
+            self.client.set_firewall_profile(self.server1['id'], nprofile)
+            time.sleep(0.5)
+            self.client.reboot_server(self.server1['id'], hard=True)
+            time.sleep(1)
+            self._wait_for_status(self.server1['id'], 'REBOOT')
+            time.sleep(0.5)
+            changed = self.client.get_firewall_profile(self.server1['id'])
+            try:
+                self.assertEqual(changed, nprofile)
+            except AssertionError as err:
+                if count_success:
+                    print('\tFAIL in swap #%s' % npos)
+                    break
+                else:
+                    raise err
+            count_success += 1
+
+    def test_get_server_stats(self):
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self._test_0220_get_server_stats()
+
+    def _test_0220_get_server_stats(self):
+        r = self.client.get_server_stats(self.server1['id'])
+        it = ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh')
+        for term in it:
+            self.assertTrue(term in r)
+
+    def test_create_network(self):
+        """Test create_network"""
+        self._test_0230_create_network()
+
+    def _test_0230_create_network(self):
+        print('\twith no params')
+        self.network1 = self._create_network(self.netname1)
+        self._wait_for_network(self.network1['id'], 'ACTIVE')
+        n1id = self.network1['id']
+        self.network1 = self.client.get_network_details(n1id)
+        nets = self.client.list_networks(self.network1['id'])
+        chosen = [net for net in nets if net['id'] == n1id][0]
+        chosen.pop('updated')
+        net1 = dict(self.network1)
+        net1.pop('updated')
+        self.assert_dicts_are_deeply_equal(chosen, net1)
+        for param, val in dict(
+                cidr='192.168.0.0/24',
+                gateway='192.168.0.1',
+                type='MAC_FILTERED',
+                dhcp=True).items():
+            print('\tdelete %s to avoid max net limit' % n1id)
+            self._delete_network(n1id)
+            kwargs = {param: val}
+            print('\twith %s=%s' % (param, val))
+            self.network1 = self._create_network(self.netname1, **kwargs)
+            n1id = self.network1['id']
+            self._wait_for_network(n1id, 'ACTIVE')
+            self.network1 = self.client.get_network_details(n1id)
+            self.assertEqual(self.network1[param], val)
+
+    def test_connect_server(self):
+        """Test connect_server"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self.network1 = self._create_network(self.netname1)
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        self._wait_for_network(self.network1['id'], 'ACTIVE')
+        self._test_0240_connect_server()
+
+    def _test_0250_connect_server(self):
+        self.client.connect_server(self.server1['id'], self.network1['id'])
+        self.assertTrue(self._wait_for_nic(
+            self.network1['id'],
+            self.server1['id']))
+
+    def test_disconnect_server(self):
+        """Test disconnect_server"""
+        self.test_connect_server()
+        self._test_0250_disconnect_server()
+
+    def _test_0250_disconnect_server(self):
+        self.client.disconnect_server(self.server1['id'], self.network1['id'])
+        self.assertTrue(self._wait_for_nic(
+            self.network1['id'],
+            self.server1['id'],
+            in_creation=False))
+
+    def _test_0260_wait_for_second_network(self):
+        self.network2 = self._create_network(self.netname2)
+        self._wait_for_network(self.network2['id'], 'ACTIVE')
+
+    def test_list_server_nics(self):
+        """Test list_server_nics"""
+        self.server1 = self._create_server(
+            self.servname1,
+            self.flavorid,
+            self.img)
+        self.network2 = self._create_network(self.netname2)
+        self._wait_for_status(self.server1['id'], 'BUILD')
+        self._wait_for_network(self.network2['id'], 'ACTIVE')
+        self._test_0280_list_server_nics()
+
+    def _test_0280_list_server_nics(self):
+        r = self.client.list_server_nics(self.server1['id'])
+        len0 = len(r)
+        self.client.connect_server(self.server1['id'], self.network2['id'])
+        self.assertTrue(self._wait_for_nic(
+            self.network2['id'],
+            self.server1['id']))
+        r = self.client.list_server_nics(self.server1['id'])
+        self.assertTrue(len(r) > len0)
+
+    def test_list_networks(self):
+        """Test list_network"""
+        self.network1 = self._create_network(self.netname1)
+        self._wait_for_network(self.network1['id'], 'ACTIVE')
+        self._test_0290_list_networks()
+
+    def _test_0290_list_networks(self):
+        r = self.client.list_networks()
+        self.assertTrue(len(r) > 1)
+        ids = [net['id'] for net in r]
+        names = [net['name'] for net in r]
+        self.assertTrue('1' in ids)
+        #self.assertTrue('public' in names)
+        self.assertTrue(self.network1['id'] in ids)
+        self.assertTrue(self.network1['name'] in names)
+
+        r = self.client.list_networks(detail=True)
+        ids = [net['id'] for net in r]
+        names = [net['name'] for net in r]
+        for net in r:
+            self.assertTrue(net['id'] in ids)
+            self.assertTrue(net['name'] in names)
+            for term in ('status', 'updated', 'created'):
+                self.assertTrue(term in net.keys())
+
+    def test_get_network_details(self):
+        """Test get_network_details"""
+        self.network1 = self._create_network(self.netname1)
+        self._test_0300_get_network_details()
+
+    def _test_0300_get_network_details(self):
+        r = self.client.get_network_details(self.network1['id'])
+        net1 = dict(self.network1)
+        net1.pop('status')
+        net1.pop('updated', None)
+        net1.pop('attachments')
+        r.pop('status')
+        r.pop('updated', None)
+        r.pop('attachments')
+        self.assert_dicts_are_deeply_equal(net1, r)
+
+    def test_update_network_name(self):
+        self.network2 = self._create_network(self.netname2)
+        self._test_0310_update_network_name()
+
+    def _test_0310_update_network_name(self):
+        updated_name = self.netname2 + '_upd'
+        self.client.update_network_name(self.network2['id'], updated_name)
+
+        def netwait(wait):
+            r = self.client.get_network_details(self.network2['id'])
+            if r['name'] == updated_name:
+                return
+            time.sleep(wait)
+        self.do_with_progress_bar(
+            netwait,
+            'Network %s name is changing:' % self.network2['id'],
+            self._waits[:5])
+
+        r = self.client.get_network_details(self.network2['id'])
+        self.assertEqual(r['name'], updated_name)
+
+    """ Don't have auth to test this
+    def test_delete_image(self):
+        ""Test delete_image""
+        self._test_0330_delete_image()
+    def _test_0330_delete_image(self):
+        images = self.client.list_images()
+        self.client.delete_image(images[2]['id'])
+        try:
+            r = self.client.get_image_details(images[2]['id'], success=(400))
+        except ClientError as err:
+            self.assertEqual(err.status, 404)
+
+    def test_create_image_metadata(self):
+        ""Test create_image_metadata""
+        self._test_0340_create_image_metadata()
+    def _test_0340_create_image_metadata(self):
+        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
+        self.assertEqual(r['mykey'], 'myval')
+
+    def test_update_image_metadata(self):
+        ""Test update_image_metadata""
+        self._test_0350_update_image_metadata()
+    def _test_0350_update_image_metadata(self):
+        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
+        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
+        self.assertEqual(r['mykey0'], 'myval0')
+
+    def test_delete_image_metadata(self):
+        ""Test delete_image_metadata""
+        self._test_0360_delete_image_metadata()
+    def _test_0360_delete_image_metadata(self):
+        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
+        self.client.delete_image_metadata(self.img, 'mykey1')
+        r = self.client.get_image_metadata(self.img)
+        self.assertNotEqual('mykey1' in r)
+    """
diff --git a/kamaki/clients/livetest/image.py b/kamaki/clients/livetest/image.py
new file mode 100644
index 0000000..04ce83b
--- /dev/null
+++ b/kamaki/clients/livetest/image.py
@@ -0,0 +1,256 @@
+# Copyright 2012-2013 GRNET S.A. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or
+# without modification, are permitted provided that the following
+# conditions are met:
+#
+#   1. Redistributions of source code must retain the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer.
+#
+#   2. Redistributions in binary form must reproduce the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer in the documentation and/or other materials
+#      provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and
+# documentation are those of the authors and should not be
+# interpreted as representing official policies, either expressed
+# or implied, of GRNET S.A.
+
+import time
+
+from kamaki.clients import livetest
+from kamaki.clients.cyclades import CycladesClient
+from kamaki.clients.image import ImageClient
+from kamaki.clients import ClientError
+
+
+class Image(livetest.Generic):
+    def setUp(self):
+        self.now = time.mktime(time.gmtime())
+
+        self.imgname = 'img_%s' % self.now
+        url = self['image', 'url']
+        self.client = ImageClient(url, self['token'])
+        cyclades_url = self['compute', 'url']
+        self.cyclades = CycladesClient(cyclades_url, self['token'])
+        self._imglist = {}
+
+    def test_000(self):
+        self._prepare_img()
+        super(self.__class__, self).test_000()
+
+    def _prepare_img(self):
+        f = open(self['image', 'local_path'], 'rb')
+        (token, uuid) = (self['token'], self['store', 'account'])
+        if not uuid:
+            from kamaki.clients.astakos import AstakosClient
+            uuid = AstakosClient(self['astakos', 'url'], token).term('uuid')
+        from kamaki.clients.pithos import PithosClient
+        self.pithcli = PithosClient(self['store', 'url'], token, uuid)
+        cont = 'cont_%s' % self.now
+        self.pithcli.container = cont
+        self.obj = 'obj_%s' % self.now
+        print('\t- Create container %s on Pithos server' % cont)
+        self.pithcli.container_put()
+        self.location = 'pithos://%s/%s/%s' % (uuid, cont, self.obj)
+        print('\t- Upload an image at %s...' % self.location)
+        self.pithcli.upload_object(self.obj, f)
+        print('\t- ok')
+        f.close()
+
+        self.client.register(
+            self.imgname,
+            self.location,
+            params=dict(is_public=True))
+        img = self._get_img_by_name(self.imgname)
+        self._imglist[self.imgname] = img
+
+    def tearDown(self):
+        for img in self._imglist.values():
+            print('\tDeleting image %s' % img['id'])
+            self.cyclades.delete_image(img['id'])
+        if hasattr(self, 'pithcli'):
+            print('\tDeleting container %s' % self.pithcli.container)
+            try:
+                self.pithcli.del_container(delimiter='/')
+                self.pithcli.purge_container()
+            except ClientError:
+                pass
+
+    def _get_img_by_name(self, name):
+        r = self.cyclades.list_images()
+        for img in r:
+            if img['name'] == name:
+                return img
+        return None
+
+    def assert_dicts_are_deeply_equal(self, d1, d2):
+        for k, v in d1.items():
+            self.assertTrue(k in d2)
+            if isinstance(v, dict):
+                self.assert_dicts_are_deeply_equal(v, d2[k])
+            else:
+                self.assertEqual(unicode(v), unicode(d2[k]))
+
+    def test_list_public(self):
+        """Test list_public"""
+        self._test_list_public()
+
+    def _test_list_public(self):
+        r = self.client.list_public()
+        r0 = self.client.list_public(order='-')
+        self.assertTrue(len(r) > 0)
+        for img in r:
+            for term in (
+                    'status',
+                    'name',
+                    'container_format',
+                    'disk_format',
+                    'id',
+                    'size'):
+                self.assertTrue(term in img)
+        self.assertTrue(r, r0)
+        r0.reverse()
+        for i, img in enumerate(r):
+            self.assert_dicts_are_deeply_equal(img, r0[i])
+        r1 = self.client.list_public(detail=True)
+        for img in r1:
+            for term in (
+                    'status',
+                    'name',
+                    'checksum',
+                    'created_at',
+                    'disk_format',
+                    'updated_at',
+                    'id',
+                    'location',
+                    'container_format',
+                    'owner',
+                    'is_public',
+                    'deleted_at',
+                    'properties',
+                    'size'):
+                self.assertTrue(term in img)
+                if img['properties']:
+                    for interm in (
+                            'osfamily',
+                            'users',
+                            'os',
+                            'root_partition',
+                            'description'):
+                        self.assertTrue(interm in img['properties'])
+        size_max = 1000000000
+        r2 = self.client.list_public(filters=dict(size_max=size_max))
+        self.assertTrue(len(r2) <= len(r))
+        for img in r2:
+            self.assertTrue(int(img['size']) <= size_max)
+
+    def test_get_meta(self):
+        """Test get_meta"""
+        self._test_get_meta()
+
+    def _test_get_meta(self):
+        r = self.client.get_meta(self['image', 'id'])
+        self.assertEqual(r['id'], self['image', 'id'])
+        for term in (
+                'status',
+                'name',
+                'checksum',
+                'updated-at',
+                'created-at',
+                'deleted-at',
+                'location',
+                'is-public',
+                'owner',
+                'disk-format',
+                'size',
+                'container-format'):
+            self.assertTrue(term in r)
+            for interm in (
+                    'kernel',
+                    'osfamily',
+                    'users',
+                    'gui', 'sortorder',
+                    'root-partition',
+                    'os',
+                    'description'):
+                self.assertTrue(interm in r['properties'])
+
+    def test_register(self):
+        """Test register"""
+        self._prepare_img()
+        self._test_register()
+
+    def _test_register(self):
+        self.assertTrue(self._imglist)
+        for img in self._imglist.values():
+            self.assertTrue(img is not None)
+
+    def test_reregister(self):
+        """Test reregister"""
+        self._prepare_img()
+        self._test_reregister()
+
+    def _test_reregister(self):
+        self.client.reregister(
+            self.location,
+            properties=dict(my_property='some_value'))
+
+    def test_set_members(self):
+        """Test set_members"""
+        self._prepare_img()
+        self._test_set_members()
+
+    def _test_set_members(self):
+        members = ['%s@fake.net' % self.now]
+        for img in self._imglist.values():
+            self.client.set_members(img['id'], members)
+            r = self.client.list_members(img['id'])
+            self.assertEqual(r[0]['member_id'], members[0])
+
+    def test_list_members(self):
+        """Test list_members"""
+        self._test_list_members()
+
+    def _test_list_members(self):
+        self._test_set_members()
+
+    def test_remove_members(self):
+        """Test remove_members - NO CHECK"""
+        self._prepare_img()
+        self._test_remove_members()
+
+    def _test_remove_members(self):
+        return
+        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
+        for img in self._imglist.values():
+            self.client.set_members(img['id'], members)
+            r = self.client.list_members(img['id'])
+            self.assertTrue(len(r) > 1)
+            self.client.remove_member(img['id'], members[0])
+            r0 = self.client.list_members(img['id'])
+            self.assertEqual(len(r), 1 + len(r0))
+            self.assertEqual(r0[0]['member_id'], members[1])
+
+    def test_list_shared(self):
+        """Test list_shared - NOT CHECKED"""
+        self._test_list_shared()
+
+    def _test_list_shared(self):
+        #No way to test this, if I dont have member images
+        pass
diff --git a/kamaki/clients/livetest/pithos.py b/kamaki/clients/livetest/pithos.py
new file mode 100644
index 0000000..1f1fcd8
--- /dev/null
+++ b/kamaki/clients/livetest/pithos.py
@@ -0,0 +1,1245 @@
+# Copyright 2012-2013 GRNET S.A. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or
+# without modification, are permitted provided that the following
+# conditions are met:
+#
+#   1. Redistributions of source code must retain the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer.
+#
+#   2. Redistributions in binary form must reproduce the above
+#      copyright notice, this list of conditions and the following
+#      disclaimer in the documentation and/or other materials
+#      provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and
+# documentation are those of the authors and should not be
+# interpreted as representing official policies, either expressed
+# or implied, of GRNET S.A.
+
+import time
+import datetime
+from os import urandom
+from tempfile import NamedTemporaryFile
+
+from kamaki.clients import livetest, ClientError
+from kamaki.clients.pithos import PithosClient
+from kamaki.clients.astakos import AstakosClient
+
+
+class Pithos(livetest.Generic):
+
+    files = []
+
+    def setUp(self):
+        self.client = PithosClient(
+            self['store', 'url'],
+            self['store', 'token'],
+            AstakosClient(
+                self['astakos', 'url'],
+                self['store', 'token']
+            ).term('uuid'))
+
+        self.now = time.mktime(time.gmtime())
+        self.now_unformated = datetime.datetime.utcnow()
+        self._init_data()
+
+        """Prepare an object to be shared - also its container"""
+        self.client.container = self.c1
+        self.client.object_post(
+            'test',
+            update=True,
+            permissions={'read': [self.client.account]})
+
+        self.create_remote_object(self.c1, 'another.test')
+
+    def _init_data(self):
+        self.c1 = 'c1_' + unicode(self.now)
+        self.c2 = 'c2_' + unicode(self.now)
+        self.c3 = 'c3_' + unicode(self.now)
+        try:
+            self.client.create_container(self.c2)
+        except ClientError:
+            pass
+        try:
+            self.client.create_container(self.c1)
+        except ClientError:
+            pass
+        try:
+            self.client.create_container(self.c3)
+        except ClientError:
+            pass
+
+        self.create_remote_object(self.c1, 'test')
+        self.create_remote_object(self.c2, 'test')
+        self.create_remote_object(self.c1, 'test1')
+        self.create_remote_object(self.c2, 'test1')
+
+    def create_remote_object(self, container, obj):
+        self.client.container = container
+        self.client.object_put(
+            obj,
+            content_type='application/octet-stream',
+            data='file %s that lives in %s' % (obj, container),
+            metadata={'incontainer': container})
+
+    def forceDeleteContainer(self, container):
+        self.client.container = container
+        try:
+            r = self.client.list_objects()
+        except ClientError:
+            return
+        for obj in r:
+            name = obj['name']
+            self.client.del_object(name)
+        r = self.client.container_delete()
+        self.container = ''
+
+    def tearDown(self):
+        """Destroy test cases"""
+        for f in self.files:
+            f.close()
+        self.forceDeleteContainer(self.c1)
+        self.forceDeleteContainer(self.c2)
+        try:
+            self.forceDeleteContainer(self.c3)
+        except ClientError:
+            pass
+        self.client.container = ''
+
+    def test_000(self):
+        """Prepare a full Pithos+ test"""
+        print('')
+        super(self.__class__, self).test_000()
+
+    def test_account_head(self):
+        """Test account_HEAD"""
+        self._test_0010_account_head()
+
+    def _test_0010_account_head(self):
+        r = self.client.account_head()
+        self.assertEqual(r.status_code, 204)
+
+        r = self.client.account_head(until='1000000000')
+        self.assertEqual(r.status_code, 204)
+
+        r = self.client.get_account_info(until='1000000000')
+        datestring = unicode(r['x-account-until-timestamp'])
+        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
+
+        r = self.client.get_account_quota()
+        self.assertTrue('x-account-policy-quota' in r)
+
+        r = self.client.get_account_versioning()
+        self.assertTrue('x-account-policy-versioning' in r)
+
+        """Check if(un)modified_since"""
+        for format in self.client.DATE_FORMATS:
+            now_formated = self.now_unformated.strftime(format)
+            r1 = self.client.account_head(
+                if_modified_since=now_formated,
+                success=(204, 304, 412))
+            sc1 = r1.status_code
+            r1.release()
+            r2 = self.client.account_head(
+                if_unmodified_since=now_formated,
+                success=(204, 304, 412))
+            sc2 = r2.status_code
+            r2.release()
+            self.assertNotEqual(sc1, sc2)
+
+    def test_account_get(self):
+        """Test account_GET"""
+        self._test_0020_account_get()
+
+    def _test_0020_account_get(self):
+        #r = self.client.account_get()
+        #self.assertEqual(r.status_code, 200)
+        r = self.client.list_containers()
+        fullLen = len(r)
+        self.assertTrue(fullLen > 2)
+
+        r = self.client.account_get(limit=1)
+        self.assertEqual(len(r.json), 1)
+
+        r = self.client.account_get(marker='c2_')
+        temp_c0 = r.json[0]['name']
+        temp_c2 = r.json[2]['name']
+
+        r = self.client.account_get(limit=2, marker='c2_')
+        conames = [container['name'] for container in r.json if (
+            container['name'].lower().startswith('c2_'))]
+        self.assertTrue(temp_c0 in conames)
+        self.assertFalse(temp_c2 in conames)
+
+        r = self.client.account_get(show_only_shared=True)
+        self.assertTrue(self.c1 in [c['name'] for c in r.json])
+
+        r = self.client.account_get(until=1342609206)
+        self.assertTrue(len(r.json) <= fullLen)
+
+        """Check if(un)modified_since"""
+        for format in self.client.DATE_FORMATS:
+            now_formated = self.now_unformated.strftime(format)
+            r1 = self.client.account_get(
+                if_modified_since=now_formated,
+                success=(200, 304, 412))
+            sc1 = r1.status_code
+            r1.release()
+            r2 = self.client.account_get(
+                if_unmodified_since=now_formated,
+                success=(200, 304, 412))
+            sc2 = r2.status_code
+            r2.release()
+            self.assertNotEqual(sc1, sc2)
+
+        """Check sharing_accounts"""
+        r = self.client.get_sharing_accounts()
+        self.assertTrue(len(r) > 0)
+
+    def test_account_post(self):
+        """Test account_POST"""
+        self._test_0030_account_post()
+
+    def _test_0030_account_post(self):
+        r = self.client.account_post()
+        self.assertEqual(r.status_code, 202)
+        grpName = 'grp' + unicode(self.now)
+
+        """Method set/del_account_meta and set_account_groupcall use
+            account_post internally
+        """
+        u1 = self.client.account
+        u2 = self.client.account
+        self.client.set_account_group(grpName, [u1, u2])
+        r = self.client.get_account_group()
+        self.assertEqual(r['x-account-group-' + grpName], '%s,%s' % (u1, u2))
+        self.client.del_account_group(grpName)
+        r = self.client.get_account_group()
+        self.assertTrue('x-account-group-' + grpName not in r)
+
+        mprefix = 'meta' + unicode(self.now)
+        self.client.set_account_meta({
+            mprefix + '1': 'v1',
+            mprefix + '2': 'v2'})
+        r = self.client.get_account_meta()
+        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
+        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
+
+        self.client.del_account_meta(mprefix + '1')
+        r = self.client.get_account_meta()
+        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
+
+        self.client.del_account_meta(mprefix + '2')
+        r = self.client.get_account_meta()
+        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
+
+        """Missing testing for quota, versioning, because normally
+        you don't have permissions to modify those at account level
+        """
+
+        newquota = 1000000
+        self.client.set_account_quota(newquota)
+        #r = self.client.get_account_info()
+        #print(unicode(r))
+        #r = self.client.get_account_quota()
+        #self.assertEqual(r['x-account-policy-quota'], newquota)
+        self.client.set_account_versioning('auto')
+
+    def test_container_head(self):
+        """Test container_HEAD"""
+        self._test_0040_container_head()
+
+    def _test_0040_container_head(self):
+        self.client.container = self.c1
+
+        r = self.client.container_head()
+        self.assertEqual(r.status_code, 204)
+
+        """Check until"""
+        r = self.client.container_head(until=1000000, success=(204, 404))
+        self.assertEqual(r.status_code, 404)
+
+        """Check and if(un)modified_since"""
+        for format in self.client.DATE_FORMATS:
+            now_formated = self.now_unformated.strftime(format)
+            r1 = self.client.container_head(
+                if_modified_since=now_formated,
+                success=(204, 304, 412))
+            sc1 = r1.status_code
+            r1.release()
+            r2 = self.client.container_head(
+                if_unmodified_since=now_formated,
+                success=(204, 304, 412))
+            sc2 = r2.status_code
+            r2.release()
+            self.assertNotEqual(sc1, sc2)
+
+        """Check container object meta"""
+        r = self.client.get_container_object_meta()
+        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
+
+    def test_container_get(self):
+        """Test container_GET"""
+        self._test_0050_container_get()
+
+    def _test_0050_container_get(self):
+        self.client.container = self.c1
+
+        r = self.client.container_get()
+        self.assertEqual(r.status_code, 200)
+        fullLen = len(r.json)
+
+        r = self.client.container_get(prefix='test')
+        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
+        self.assertTrue(len(r.json) > 1)
+        self.assertEqual(len(r.json), len(lalobjects))
+
+        r = self.client.container_get(limit=1)
+        self.assertEqual(len(r.json), 1)
+
+        r = self.client.container_get(marker='another')
+        self.assertTrue(len(r.json) > 1)
+        neobjects = [obj for obj in r.json if obj['name'] > 'another']
+        self.assertEqual(len(r.json), len(neobjects))
+
+        r = self.client.container_get(prefix='another.test', delimiter='.')
+        self.assertTrue(fullLen > len(r.json))
+
+        r = self.client.container_get(path='/')
+        self.assertEqual(fullLen, len(r.json))
+
+        r = self.client.container_get(format='xml')
+        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
+
+        r = self.client.container_get(meta=['incontainer'])
+        self.assertTrue(len(r.json) > 0)
+
+        r = self.client.container_get(show_only_shared=True)
+        self.assertTrue(len(r.json) < fullLen)
+
+        try:
+            r = self.client.container_get(until=1000000000)
+            datestring = unicode(r.headers['x-account-until-timestamp'])
+            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
+
+        except ClientError:
+
+            pass
+
+        """Check and if un/modified_since"""
+        for format in self.client.DATE_FORMATS:
+            now_formated = self.now_unformated.strftime(format)
+            r1 = self.client.container_get(
+                if_modified_since=now_formated,
+                success=(200, 304, 412))
+            sc1 = r1.status_code
+            r1.release()
+            r2 = self.client.container_get(
+                if_unmodified_since=now_formated,
+                success=(200, 304, 412))
+            sc2 = r2.status_code
+            r2.release()
+            self.assertNotEqual(sc1, sc2)
+
+    def test_container_put(self):
+        """Test container_PUT"""
+        self._test_0050_container_put()
+
+    def _test_0050_container_put(self):
+        self.client.container = self.c2
+
+        r = self.client.container_put()
+        self.assertEqual(r.status_code, 202)
+
+        r = self.client.get_container_quota(self.client.container)
+        cquota = r.values()[0]
+        newquota = 2 * int(cquota)
+
+        r = self.client.container_put(quota=newquota)
+        self.assertEqual(r.status_code, 202)
+
+        r = self.client.get_container_quota(self.client.container)
+        xquota = int(r.values()[0])
+        self.assertEqual(newquota, xquota)
+
+        r = self.client.container_put(versioning='auto')
+        self.assertEqual(r.status_code, 202)
+
+        r = self.client.get_container_versioning(self.client.container)
+        nvers = r.values()[0]
+        self.assertEqual('auto', nvers)
+
+        r = self.client.container_put(versioning='none')
+        self.assertEqual(r.status_code, 202)
+
+        r = self.client.get_container_versioning(self.client.container)
+        nvers = r.values()[0]
+        self.assertEqual('none', nvers)
+
+        r = self.client.container_put(metadata={'m1': 'v1', 'm2': 'v2'})
+        self.assertEqual(r.status_code, 202)
+
+        r = self.client.get_container_meta(self.client.container)
+        self.assertTrue('x-container-meta-m1' in r)
+        self.assertEqual(r['x-container-meta-m1'], 'v1')
+        self.assertTrue('x-container-meta-m2' in r)
+        self.assertEqual(r['x-container-meta-m2'], 'v2')
+
+        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
+        self.assertEqual(r.status_code, 202)
+
+        r = self.client.get_container_meta(self.client.container)
+        self.assertTrue('x-container-meta-m1' not in r)
+        self.assertTrue('x-container-meta-m2' in r)
+        self.assertEqual(r['x-container-meta-m2'], 'v2a')
+
+        self.client.del_container_meta(self.client.container)
+
+    def test_container_post(self):
+        """Test container_POST"""
+        self._test_0060_container_post()
+
+    def _test_0060_container_post(self):
+        self.client.container = self.c2
+
+        """Simple post"""
+        r = self.client.container_post()
+        self.assertEqual(r.status_code, 202)
+
+        """post meta"""
+        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
+        r = self.client.get_container_meta(self.client.container)
+        self.assertTrue('x-container-meta-m1' in r)
+        self.assertEqual(r['x-container-meta-m1'], 'v1')
+        self.assertTrue('x-container-meta-m2' in r)
+        self.assertEqual(r['x-container-meta-m2'], 'v2')
+
+        """post/2del meta"""
+        r = self.client.del_container_meta('m1')
+        r = self.client.set_container_meta({'m2': 'v2a'})
+        r = self.client.get_container_meta(self.client.container)
+        self.assertTrue('x-container-meta-m1' not in r)
+        self.assertTrue('x-container-meta-m2' in r)
+        self.assertEqual(r['x-container-meta-m2'], 'v2a')
+
+        """check quota"""
+        r = self.client.get_container_quota(self.client.container)
+        cquota = r.values()[0]
+        newquota = 2 * int(cquota)
+        r = self.client.set_container_quota(newquota)
+        r = self.client.get_container_quota(self.client.container)
+        xquota = int(r.values()[0])
+        self.assertEqual(newquota, xquota)
+        r = self.client.set_container_quota(cquota)
+        r = self.client.get_container_quota(self.client.container)
+        xquota = r.values()[0]
+        self.assertEqual(cquota, xquota)
+
+        """Check versioning"""
+        self.client.set_container_versioning('auto')
+        r = self.client.get_container_versioning(self.client.container)
+        nvers = r.values()[0]
+        self.assertEqual('auto', nvers)
+        self.client.set_container_versioning('none')
+        r = self.client.get_container_versioning(self.client.container)
+        nvers = r.values()[0]
+        self.assertEqual('none', nvers)
+
+        """put_block uses content_type and content_length to
+        post blocks of data 2 container. All that in upload_object"""
+        """Change a file at fs"""
+        f = self.create_large_file(1024 * 1024 * 100)
+        """Upload it at a directory in container"""
+        self.client.create_directory('dir')
+        self.client.upload_object('/dir/sample.file', f)
+        """Check if file has been uploaded"""
+        r = self.client.get_object_info('/dir/sample.file')
+        self.assertTrue(int(r['content-length']) > 100000000)
+
+        """What is tranfer_encoding? What should I check about it? """
+        #TODO
+
+        """Check update=False"""
+        r = self.client.object_post(
+            'test',
+            update=False,
+            metadata={'newmeta': 'newval'})
+
+        r = self.client.get_object_info('test')
+        self.assertTrue('x-object-meta-newmeta' in r)
+        self.assertFalse('x-object-meta-incontainer' in r)
+
+        r = self.client.del_container_meta('m2')
+
+    def test_container_delete(self):
+        """Test container_DELETE"""
+        self._test_0070_container_delete()
+
+    def _test_0070_container_delete(self):
+
+        """Fail to delete a non-empty container"""
+        self.client.container = self.c2
+        r = self.client.container_delete(success=409)
+        self.assertEqual(r.status_code, 409)
+
+        """Fail to delete c3 (empty) container"""
+        self.client.container = self.c3
+        r = self.client.container_delete(until='1000000000')
+        self.assertEqual(r.status_code, 204)
+
+        """Delete c3 (empty) container"""
+        r = self.client.container_delete()
+        self.assertEqual(r.status_code, 204)
+
+        """Purge container(empty a container), check versionlist"""
+        self.client.container = self.c1
+        r = self.client.object_head('test', success=(200, 404))
+        self.assertEqual(r.status_code, 200)
+        self.client.del_container(delimiter='/')
+        r = self.client.object_head('test', success=(200, 404))
+        self.assertEqual(r.status_code, 404)
+        r = self.client.get_object_versionlist('test')
+        self.assertTrue(len(r) > 0)
+        self.assertTrue(len(r[0]) > 1)
+        self.client.purge_container()
+        self.assertRaises(
+            ClientError,
+            self.client.get_object_versionlist,
+            'test')
+
+    def _test_0080_recreate_deleted_data(self):
+        self._init_data()
+
+    def test_object_head(self):
+        """Test object_HEAD"""
+        self._test_0090_object_head()
+
+    def _test_0090_object_head(self):
+        self.client.container = self.c2
+        obj = 'test'
+
+        r = self.client.object_head(obj)
+        self.assertEqual(r.status_code, 200)
+        etag = r.headers['etag']
+
+        r = self.client.object_head(obj, version=40)
+        self.assertEqual(r.headers['x-object-version'], '40')
+
+        r = self.client.object_head(obj, if_etag_match=etag)
+        self.assertEqual(r.status_code, 200)
+
+        r = self.client.object_head(
+            obj,
+            if_etag_not_match=etag,
+            success=(200, 412, 304))
+        self.assertNotEqual(r.status_code, 200)
+
+        r = self.client.object_head(
+            obj,
+            version=40,
+            if_etag_match=etag,
+            success=412)
+        self.assertEqual(r.status_code, 412)
+
+        """Check and if(un)modified_since"""
+        for format in self.client.DATE_FORMATS:
+            now_formated = self.now_unformated.strftime(format)
+            r1 = self.client.object_head(
+                obj,
+                if_modified_since=now_formated,
+                success=(200, 304, 412))
+            sc1 = r1.status_code
+            r1.release()
+            r2 = self.client.object_head(
+                obj,
+                if_unmodified_since=now_formated,
+                success=(200, 304, 412))
+            sc2 = r2.status_code
+            r2.release()
+            self.assertNotEqual(sc1, sc2)
+
+    def test_object_get(self):
+        """Test object_GET"""
+        self._test_0100_object_get()
+
+    def _test_0100_object_get(self):
+        self.client.container = self.c1
+        obj = 'test'
+
+        r = self.client.object_get(obj)
+        self.assertEqual(r.status_code, 200)
+
+        osize = int(r.headers['content-length'])
+        etag = r.headers['etag']
+
+        r = self.client.object_get(obj, hashmap=True)
+        for term in ('hashes', 'block_hash', 'block_hash', 'bytes'):
+            self.assertTrue(term in r.json)
+
+        r = self.client.object_get(obj, format='xml', hashmap=True)
+        self.assertEqual(len(r.text.split('hash>')), 3)
+
+        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
+        r = self.client.object_get(
+            obj,
+            data_range=rangestr,
+            success=(200, 206))
+        partsize = int(r.headers['content-length'])
+        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
+
+        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
+        r = self.client.object_get(
+            obj,
+            data_range=rangestr,
+            if_range=True,
+            success=(200, 206))
+        partsize = int(r.headers['content-length'])
+        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
+
+        r = self.client.object_get(obj, if_etag_match=etag)
+        self.assertEqual(r.status_code, 200)
+
+        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
+        self.assertEqual(r.status_code, 200)
+
+        """Check and if(un)modified_since"""
+        for format in self.client.DATE_FORMATS:
+            now_formated = self.now_unformated.strftime(format)
+            r1 = self.client.object_get(
+                obj,
+                if_modified_since=now_formated,
+                success=(200, 304, 412))
+            sc1 = r1.status_code
+            r1.release()
+            r2 = self.client.object_get(
+                obj,
+                if_unmodified_since=now_formated,
+                success=(200, 304, 412))
+            sc2 = r2.status_code
+            r2.release()
+            self.assertNotEqual(sc1, sc2)
+
+        """Upload an object to download"""
+        trg_fname = 'remotefile_%s' % self.now
+        f_size = 59247824
+        src_f = self.create_large_file(f_size)
+        print('\tUploading...')
+        self.client.upload_object(trg_fname, src_f)
+        print('\tDownloading...')
+        self.files.append(NamedTemporaryFile())
+        dnl_f = self.files[-1]
+        self.client.download_object(trg_fname, dnl_f)
+
+        print('\tCheck if files match...')
+        for pos in (0, f_size / 2, f_size - 20):
+            src_f.seek(pos)
+            dnl_f.seek(pos)
+            self.assertEqual(src_f.read(10), dnl_f.read(10))
+
+    def test_object_put(self):
+        """Test object_PUT"""
+        self._test_object_put()
+
+    def _test_object_put(self):
+        self.client.container = self.c2
+        obj = 'another.test'
+
+        self.client.create_object(obj + '.FAKE')
+        r = self.client.get_object_info(obj + '.FAKE')
+        self.assertEqual(r['content-type'], 'application/octet-stream')
+
+        """create the object"""
+        r = self.client.object_put(
+            obj,
+            data='a',
+            content_type='application/octer-stream',
+            permissions=dict(
+                read=['accX:groupA', 'u1', 'u2'],
+                write=['u2', 'u3']),
+            metadata=dict(key1='val1', key2='val2'),
+            content_encoding='UTF-8',
+            content_disposition='attachment; filename="fname.ext"')
+        self.assertEqual(r.status_code, 201)
+        etag = r.headers['etag']
+
+        """Check content-disposition"""
+        r = self.client.get_object_info(obj)
+        self.assertTrue('content-disposition' in r)
+
+        """Check permissions"""
+        r = self.client.get_object_sharing(obj)
+        self.assertTrue('accx:groupa' in r['read'])
+        self.assertTrue('u1' in r['read'])
+        self.assertTrue('u2' in r['write'])
+        self.assertTrue('u3' in r['write'])
+
+        """Check metadata"""
+        r = self.client.get_object_meta(obj)
+        self.assertEqual(r['x-object-meta-key1'], 'val1')
+        self.assertEqual(r['x-object-meta-key2'], 'val2')
+
+        """Check public and if_etag_match"""
+        r = self.client.object_put(
+            obj,
+            if_etag_match=etag,
+            data='b',
+            content_type='application/octet-stream',
+            public=True)
+
+        r = self.client.object_get(obj)
+        self.assertTrue('x-object-public' in r.headers)
+        vers2 = int(r.headers['x-object-version'])
+        etag = r.headers['etag']
+        self.assertEqual(r.text, 'b')
+
+        """Check if_etag_not_match"""
+        r = self.client.object_put(
+            obj,
+            if_etag_not_match=etag,
+            data='c',
+            content_type='application/octet-stream',
+            success=(201, 412))
+        self.assertEqual(r.status_code, 412)
+
+        """Check content_type and content_length"""
+        tmpdir = 'dir' + unicode(self.now)
+        r = self.client.object_put(
+            tmpdir,
+            content_type='application/directory',
+            content_length=0)
+
+        r = self.client.get_object_info(tmpdir)
+        self.assertEqual(r['content-type'], 'application/directory')
+
+        """Check copy_from, content_encoding"""
+        r = self.client.object_put(
+            '%s/%s' % (tmpdir, obj),
+            format=None,
+            copy_from='/%s/%s' % (self.client.container, obj),
+            content_encoding='application/octet-stream',
+            source_account=self.client.account,
+            content_length=0,
+            success=201)
+        self.assertEqual(r.status_code, 201)
+
+        """Test copy_object for cross-conctainer copy"""
+        self.client.copy_object(
+            src_container=self.c2,
+            src_object='%s/%s' % (tmpdir, obj),
+            dst_container=self.c1,
+            dst_object=obj)
+        self.client.container = self.c1
+        r1 = self.client.get_object_info(obj)
+        self.client.container = self.c2
+        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
+        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
+
+        """Check cross-container copy_from, content_encoding"""
+        self.client.container = self.c1
+        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
+        r = self.client.object_put(
+            obj,
+            format=None,
+            copy_from=fromstr,
+            content_encoding='application/octet-stream',
+            source_account=self.client.account,
+            content_length=0,
+            success=201)
+
+        self.assertEqual(r.status_code, 201)
+        r = self.client.get_object_info(obj)
+        self.assertEqual(r['etag'], etag)
+
+        """Check source_account"""
+        self.client.container = self.c2
+        fromstr = '/%s/%s' % (self.c1, obj)
+        r = self.client.object_put(
+            '%sv2' % obj,
+            format=None,
+            move_from=fromstr,
+            content_encoding='application/octet-stream',
+            source_account='nonExistendAddress@NeverLand.com',
+            content_length=0,
+            success=(201, 403))
+        self.assertEqual(r.status_code, 403)
+
+        """Check cross-container move_from"""
+        self.client.container = self.c1
+        r1 = self.client.get_object_info(obj)
+        self.client.container = self.c2
+        self.client.move_object(
+            src_container=self.c1,
+            src_object=obj,
+            dst_container=self.c2,
+            dst_object=obj + 'v0')
+        r0 = self.client.get_object_info(obj + 'v0')
+        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
+
+        """Check move_from"""
+        r = self.client.object_put(
+            '%sv1' % obj,
+            format=None,
+            move_from='/%s/%s' % (self.c2, obj),
+            source_version=vers2,
+            content_encoding='application/octet-stream',
+            content_length=0, success=201)
+
+        """Check manifest"""
+        mobj = 'manifest.test'
+        txt = ''
+        for i in range(10):
+            txt += '%s' % i
+            r = self.client.object_put(
+                '%s/%s' % (mobj, i),
+                data='%s' % i,
+                content_length=1,
+                success=201,
+                content_type='application/octet-stream',
+                content_encoding='application/octet-stream')
+
+        r = self.client.object_put(
+            mobj,
+            content_length=0,
+            content_type='application/octet-stream',
+            manifest='%s/%s' % (self.client.container, mobj))
+
+        r = self.client.object_get(mobj)
+        self.assertEqual(r.text, txt)
+
+        """Upload a local file with one request"""
+        newf = self.create_large_file(1024 * 10)
+        self.client.upload_object('sample.file', newf)
+        """Check if file has been uploaded"""
+        r = self.client.get_object_info('sample.file')
+        self.assertEqual(int(r['content-length']), 10240)
+
+        """Some problems with transfer-encoding?"""
+
+    def test_object_copy(self):
+        """Test object_COPY"""
+        self._test_0110_object_copy()
+
+    def _test_0110_object_copy(self):
+        self.client.container = self.c2
+        obj = 'test2'
+
+        data = '{"key1":"val1", "key2":"val2"}'
+        r = self.client.object_put(
+            '%sorig' % obj,
+            content_type='application/octet-stream',
+            data=data,
+            metadata=dict(mkey1='mval1', mkey2='mval2'),
+            permissions=dict(
+                read=['accX:groupA', 'u1', 'u2'],
+                write=['u2', 'u3']),
+            content_disposition='attachment; filename="fname.ext"')
+
+        r = self.client.object_copy(
+            '%sorig' % obj,
+            destination='/%s/%s' % (self.client.container, obj),
+            ignore_content_type=False, content_type='application/json',
+            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
+            permissions={'write': ['u5', 'accX:groupB']})
+        self.assertEqual(r.status_code, 201)
+
+        """Check content-disposition"""
+        r = self.client.get_object_info(obj)
+        self.assertTrue('content-disposition' in r)
+
+        """Check Metadata"""
+        r = self.client.get_object_meta(obj)
+        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
+        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
+        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
+
+        """Check permissions"""
+        r = self.client.get_object_sharing(obj)
+        self.assertFalse('read' in r or 'u2' in r['write'])
+        self.assertTrue('accx:groupb' in r['write'])
+
+        """Check destination account"""
+        r = self.client.object_copy(
+            obj,
+            destination='/%s/%s' % (self.c1, obj),
+            content_encoding='utf8',
+            content_type='application/json',
+            destination_account='nonExistendAddress@NeverLand.com',
+            success=(201, 403))
+        self.assertEqual(r.status_code, 403)
+
+        """Check destination being another container
+        and also content_type and content encoding"""
+        r = self.client.object_copy(
+            obj,
+            destination='/%s/%s' % (self.c1, obj),
+            content_encoding='utf8',
+            content_type='application/json')
+        self.assertEqual(r.status_code, 201)
+        self.assertEqual(
+            r.headers['content-type'],
+            'application/json; charset=UTF-8')
+
+        """Check ignore_content_type and content_type"""
+        r = self.client.object_get(obj)
+        etag = r.headers['etag']
+        ctype = r.headers['content-type']
+        self.assertEqual(ctype, 'application/json')
+
+        r = self.client.object_copy(
+            '%sorig' % obj,
+            destination='/%s/%s0' % (self.client.container, obj),
+            ignore_content_type=True,
+            content_type='application/json')
+        self.assertEqual(r.status_code, 201)
+        self.assertNotEqual(r.headers['content-type'], 'application/json')
+
+        """Check if_etag_(not_)match"""
+        r = self.client.object_copy(
+            obj,
+            destination='/%s/%s1' % (self.client.container, obj),
+            if_etag_match=etag)
+        self.assertEqual(r.status_code, 201)
+
+        r = self.client.object_copy(
+            obj,
+            destination='/%s/%s2' % (self.client.container, obj),
+            if_etag_not_match='lalala')
+        self.assertEqual(r.status_code, 201)
+        vers2 = r.headers['x-object-version']
+
+        """Check source_version, public and format """
+        r = self.client.object_copy(
+            '%s2' % obj,
+            destination='/%s/%s3' % (self.client.container, obj),
+            source_version=vers2,
+            format='xml',
+            public=True)
+        self.assertEqual(r.status_code, 201)
+        self.assertTrue(r.headers['content-type'].index('xml') > 0)
+
+        r = self.client.get_object_info(obj + '3')
+        self.assertTrue('x-object-public' in r)
+
+    def test_object_move(self):
+        """Test object_MOVE"""
+        self._test_0120_object_move()
+
+    def _test_0120_object_move(self):
+        self.client.container = self.c2
+        obj = 'test2'
+
+        data = '{"key1": "val1", "key2": "val2"}'
+        r = self.client.object_put(
+            '%sorig' % obj,
+            content_type='application/octet-stream',
+            data=data,
+            metadata=dict(mkey1='mval1', mkey2='mval2'),
+            permissions=dict(
+                read=['accX:groupA', 'u1', 'u2'],
+                write=['u2', 'u3']))
+
+        r = self.client.object_move(
+            '%sorig' % obj,
+            destination='/%s/%s' % (self.client.container, obj),
+            ignore_content_type=False,
+            content_type='application/json',
+            metadata=dict(mkey2='mval2a', mkey3='mval3'),
+            permissions=dict(write=['u5', 'accX:groupB']))
+        self.assertEqual(r.status_code, 201)
+
+        """Check Metadata"""
+        r = self.client.get_object_meta(obj)
+        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
+        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
+        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
+
+        """Check permissions"""
+        r = self.client.get_object_sharing(obj)
+        self.assertFalse('read' in r)
+        self.assertTrue('u5' in r['write'])
+        self.assertTrue('accx:groupb' in r['write'])
+
+        """Check destination account"""
+        r = self.client.object_move(
+            obj,
+            destination='/%s/%s' % (self.c1, obj),
+            content_encoding='utf8',
+            content_type='application/json',
+            destination_account='nonExistendAddress@NeverLand.com',
+            success=(201, 403))
+        self.assertEqual(r.status_code, 403)
+
+        """Check destination being another container and also
+        content_type, content_disposition and content encoding"""
+        r = self.client.object_move(
+            obj,
+            destination='/%s/%s' % (self.c1, obj),
+            content_encoding='utf8',
+            content_type='application/json',
+            content_disposition='attachment; filename="fname.ext"')
+        self.assertEqual(r.status_code, 201)
+        self.assertEqual(
+            r.headers['content-type'],
+            'application/json; charset=UTF-8')
+        self.client.container = self.c1
+        r = self.client.get_object_info(obj)
+        self.assertTrue('content-disposition' in r)
+        self.assertTrue('fname.ext' in r['content-disposition'])
+        etag = r['etag']
+        ctype = r['content-type']
+        self.assertEqual(ctype, 'application/json')
+
+        """Check ignore_content_type and content_type"""
+        r = self.client.object_move(
+            obj,
+            destination='/%s/%s' % (self.c2, obj),
+            ignore_content_type=True,
+            content_type='application/json')
+        self.assertEqual(r.status_code, 201)
+        self.assertNotEqual(r.headers['content-type'], 'application/json')
+
+        """Check if_etag_(not_)match"""
+        self.client.container = self.c2
+        r = self.client.object_move(
+            obj,
+            destination='/%s/%s0' % (self.client.container, obj),
+            if_etag_match=etag)
+        self.assertEqual(r.status_code, 201)
+
+        r = self.client.object_move(
+            '%s0' % obj,
+            destination='/%s/%s1' % (self.client.container, obj),
+            if_etag_not_match='lalala')
+        self.assertEqual(r.status_code, 201)
+
+        """Check public and format """
+        r = self.client.object_move(
+            '%s1' % obj,
+            destination='/%s/%s2' % (self.client.container, obj),
+            format='xml',
+            public=True)
+        self.assertEqual(r.status_code, 201)
+        self.assertTrue(r.headers['content-type'].index('xml') > 0)
+
+        r = self.client.get_object_info(obj + '2')
+        self.assertTrue('x-object-public' in r)
+
+    def test_object_post(self):
+        """Test object_POST"""
+        self._test_0130_object_post()
+
+    def _test_0130_object_post(self):
+        self.client.container = self.c2
+        obj = 'test2'
+        """create a filesystem file"""
+        self.files.append(NamedTemporaryFile())
+        newf = self.files[-1]
+        newf.writelines([
+            'ello!\n',
+            'This is a test line\n',
+            'inside a test file\n'])
+        """create a file on container"""
+        r = self.client.object_put(
+            obj,
+            content_type='application/octet-stream',
+            data='H',
+            metadata=dict(mkey1='mval1', mkey2='mval2'),
+            permissions=dict(
+                read=['accX:groupA', 'u1', 'u2'],
+                write=['u2', 'u3']))
+
+        """Append livetest update, content_range, content_type, content_length"""
+        newf.seek(0)
+        self.client.append_object(obj, newf)
+        r = self.client.object_get(obj)
+        self.assertTrue(r.text.startswith('Hello!'))
+
+        """Overwrite livetest update,
+            content_type, content_length, content_range
+        """
+        newf.seek(0)
+        r = self.client.overwrite_object(obj, 0, 10, newf)
+        r = self.client.object_get(obj)
+        self.assertTrue(r.text.startswith('ello!'))
+
+        """Truncate livetest update,
+            content_range, content_type, object_bytes and source_object"""
+        r = self.client.truncate_object(obj, 5)
+        r = self.client.object_get(obj)
+        self.assertEqual(r.text, 'ello!')
+
+        """Check metadata"""
+        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
+        r = self.client.get_object_meta(obj)
+        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
+        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
+        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
+        self.client.del_object_meta(obj, 'mkey1')
+        r = self.client.get_object_meta(obj)
+        self.assertFalse('x-object-meta-mkey1' in r)
+
+        """Check permissions"""
+        self.client.set_object_sharing(
+            obj,
+            read_permition=['u4', 'u5'],
+            write_permition=['u4'])
+        r = self.client.get_object_sharing(obj)
+        self.assertTrue('read' in r)
+        self.assertTrue('u5' in r['read'])
+        self.assertTrue('write' in r)
+        self.assertTrue('u4' in r['write'])
+        self.client.del_object_sharing(obj)
+        r = self.client.get_object_sharing(obj)
+        self.assertTrue(len(r) == 0)
+
+        """Check publish"""
+        self.client.publish_object(obj)
+        r = self.client.get_object_info(obj)
+        self.assertTrue('x-object-public' in r)
+        self.client.unpublish_object(obj)
+        r = self.client.get_object_info(obj)
+        self.assertFalse('x-object-public' in r)
+
+        """Check if_etag_(not)match"""
+        etag = r['etag']
+        """
+        r = self.client.object_post(
+            obj,
+            update=True,
+            public=True,
+            if_etag_not_match=etag,
+            success=(412, 202, 204))
+        self.assertEqual(r.status_code, 412)
+        """
+
+        r = self.client.object_post(
+            obj,
+            update=True,
+            public=True,
+            if_etag_match=etag,
+            content_encoding='application/json')
+
+        r = self.client.get_object_info(obj)
+        helloVersion = r['x-object-version']
+        self.assertTrue('x-object-public' in r)
+        self.assertEqual(r['content-encoding'], 'application/json')
+
+        """Check source_version and source_account and content_disposition"""
+        r = self.client.object_post(
+            obj,
+            update=True,
+            content_type='application/octet-srteam',
+            content_length=5,
+            content_range='bytes 1-5/*',
+            source_object='/%s/%s' % (self.c2, obj),
+            source_account='thisAccountWillNeverExist@adminland.com',
+            source_version=helloVersion,
+            data='12345',
+            success=(403, 202, 204))
+        self.assertEqual(r.status_code, 403)
+
+        r = self.client.object_post(
+            obj,
+            update=True,
+            content_type='application/octet-srteam',
+            content_length=5,
+            content_range='bytes 1-5/*',
+            source_object='/%s/%s' % (self.c2, obj),
+            source_account=self.client.account,
+            source_version=helloVersion,
+            data='12345',
+            content_disposition='attachment; filename="fname.ext"')
+
+        r = self.client.object_get(obj)
+        self.assertEqual(r.text, 'eello!')
+        self.assertTrue('content-disposition' in r.headers)
+        self.assertTrue('fname.ext' in r.headers['content-disposition'])
+
+        """Check manifest"""
+        mobj = 'manifest.test'
+        txt = ''
+        for i in range(10):
+            txt += '%s' % i
+            r = self.client.object_put(
+                '%s/%s' % (mobj, i),
+                data='%s' % i,
+                content_length=1,
+                success=201,
+                content_encoding='application/octet-stream',
+                content_type='application/octet-stream')
+
+        self.client.create_object_by_manifestation(
+            mobj,
+            content_type='application/octet-stream')
+
+        r = self.client.object_post(
+            mobj,
+            manifest='%s/%s' % (self.client.container, mobj))
+
+        r = self.client.object_get(mobj)
+        self.assertEqual(r.text, txt)
+
+        """We need to check transfer_encoding """
+
+    def test_object_delete(self):
+        """Test object_DELETE"""
+        self._test_0140_object_delete()
+
+    def _test_0140_object_delete(self):
+        self.client.container = self.c2
+        obj = 'test2'
+        """create a file on container"""
+        r = self.client.object_put(
+            obj,
+            content_type='application/octet-stream',
+            data='H',
+            metadata=dict(mkey1='mval1', mkey2='mval2'),
+            permissions=dict(
+                read=['accX:groupA', 'u1', 'u2'],
+                write=['u2', 'u3']))
+
+        """Check with false until"""
+        r = self.client.object_delete(obj, until=1000000)
+
+        r = self.client.object_get(obj, success=(200, 404))
+        self.assertEqual(r.status_code, 200)
+
+        """Check normal case"""
+        r = self.client.object_delete(obj)
+        self.assertEqual(r.status_code, 204)
+
+        r = self.client.object_get(obj, success=(200, 404))
+        self.assertEqual(r.status_code, 404)
+
+    def create_large_file(self, size):
+        """Create a large file at fs"""
+        self.files.append(NamedTemporaryFile())
+        f = self.files[-1]
+        Ki = size / 8
+        bytelist = [b * Ki for b in range(size / Ki)]
+
+        def append2file(step):
+            f.seek(step)
+            f.write(urandom(Ki))
+            f.flush()
+        self.do_with_progress_bar(
+            append2file,
+            ' create rand file %s (%sB): ' % (f.name, size),
+            bytelist)
+        f.seek(0)
+        return f
diff --git a/kamaki/clients/pithos.py b/kamaki/clients/pithos.py
index 2238c5e..e8b4b6d 100644
--- a/kamaki/clients/pithos.py
+++ b/kamaki/clients/pithos.py
@@ -446,9 +446,11 @@ class PithosClient(PithosRestAPI):
 
     def _thread2file(self, flying, local_file, offset=0, **restargs):
         """write the results of a greenleted rest call to a file
-        @offset: the offset of the file up to blocksize
-            - e.g. if the range is 10-100, all
-        blocks will be written to normal_position - 10"""
+
+        :param offset: the offset of the file up to blocksize
+        - e.g. if the range is 10-100, all blocks will be written to
+        normal_position - 10
+        """
         finished = []
         for i, (start, g) in enumerate(flying.items()):
             if not g.isAlive():
@@ -509,8 +511,7 @@ class PithosClient(PithosRestAPI):
             if_none_match=None,
             if_modified_since=None,
             if_unmodified_since=None):
-        """Download an object using multiple connections (threads) and
-            writing to random parts of the file
+        """Download an object (multiple connections, random blocks)
 
         :param obj: (str) remote object path
 
@@ -522,8 +523,7 @@ class PithosClient(PithosRestAPI):
 
         :param resume: (bool) if set, preserve already downloaded file parts
 
-        :param range_str: (str) from-to where from and to are integers
-        denoting file positions in bytes
+        :param range_str: (str) from, to are file positions (int) in bytes
 
         :param if_match: (str)
 
@@ -531,9 +531,7 @@ class PithosClient(PithosRestAPI):
 
         :param if_modified_since: (str) formated date
 
-        :param if_unmodified_since: (str) formated date
-        """
-
+        :param if_unmodified_since: (str) formated date"""
         restargs = dict(
             version=version,
             data_range=None if range_str is None else 'bytes=%s' % range_str,
diff --git a/kamaki/clients/tests/__init__.py b/kamaki/clients/tests/__init__.py
deleted file mode 100644
index cf471c4..0000000
--- a/kamaki/clients/tests/__init__.py
+++ /dev/null
@@ -1,197 +0,0 @@
-# Copyright 2012-2013 GRNET S.A. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or
-# without modification, are permitted provided that the following
-# conditions are met:
-#
-#   1. Redistributions of source code must retain the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer in the documentation and/or other materials
-#      provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
-# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and
-# documentation are those of the authors and should not be
-# interpreted as representing official policies, either expressed
-# or implied, of GRNET S.A.
-
-import inspect
-from unittest import TestCase, TestSuite, TextTestRunner
-from argparse import ArgumentParser
-from sys import stdout
-
-from kamaki.cli.config import Config
-from kamaki.cli.utils import spiner
-
-
-def _add_value(foo, value):
-    def wrap(self):
-        return foo(self, value)
-    return wrap
-
-
-class Generic(TestCase):
-
-    _waits = []
-    _cnf = None
-    _grp = None
-    _fetched = {}
-
-    def __init__(self, specific=None, config=None, group=None):
-        super(Generic, self).__init__(specific)
-        self._cnf = config or Config()
-        self._grp = group
-        self._waits.append(0.71828)
-        for i in range(10):
-            self._waits.append(self._waits[-1] * 2.71828)
-
-    def __getitem__(self, key):
-        key = self._key(key)
-        try:
-            return self._fetched[key]
-        except KeyError:
-            return self._get_from_cnf(key)
-
-    def _key(self, key):
-        return ('', key) if isinstance(key, str)\
-            else ('', key[0]) if len(key) == 1\
-            else key
-
-    def _get_from_cnf(self, key):
-        val = 0
-        if key[0]:
-            val = self._cnf.get('test', '%s_%s' % key) or self._cnf.get(*key)
-        if not val:
-            val = self._cnf.get('test', key[1]) or self._cnf.get(
-                'global',
-                key[1])
-        self._fetched[key] = val
-        return val
-
-    def _safe_progress_bar(self, msg):
-        """Try to get a progress bar, but do not raise errors"""
-        try:
-            from progress.bar import ShadyBar
-            wait_bar = ShadyBar(msg)
-
-            def wait_gen(n):
-                for i in wait_bar.iter(range(int(n))):
-                    yield
-                yield
-            wait_cb = wait_gen
-        except Exception:
-            stdout.write('%s:' % msg)
-            (wait_bar, wait_cb) = (None, spiner)
-        return (wait_bar, wait_cb)
-
-    def _safe_progress_bar_finish(self, progress_bar):
-        try:
-            progress_bar.finish()
-        except Exception:
-            print('\b DONE')
-
-    def do_with_progress_bar(self, action, msg, items):
-        if not items:
-            print('%s: DONE' % msg)
-            return
-        (action_bar, action_cb) = self._safe_progress_bar(msg)
-        action_gen = action_cb(len(items))
-        try:
-            action_gen.next()
-        except Exception:
-            pass
-        for item in items:
-            action(item)
-            action_gen.next()
-        self._safe_progress_bar_finish(action_bar)
-
-    def assert_dicts_are_deeply_equal(self, d1, d2):
-        (st1, st2) = (set(d1.keys()), set(d2.keys()))
-        diff1 = st1.difference(st2)
-        diff2 = st2.difference(st1)
-        self.assertTrue(
-            not (diff1 or diff2),
-            'Key differences:\n\td1-d2=%s\n\td2-d1=%s' % (diff1, diff2))
-        for k, v in d1.items():
-            if isinstance(v, dict):
-                self.assert_dicts_are_deeply_equal(v, d2[k])
-            else:
-                self.assertEqual(unicode(v), unicode(d2[k]))
-
-    def test_000(self):
-        print('')
-        methods = [method for method in inspect.getmembers(
-            self,
-            predicate=inspect.ismethod) if method[0].startswith('_test_')]
-        failures = 0
-        for method in methods:
-            stdout.write('Test %s ' % method[0][6:])
-            stdout.flush()
-            try:
-                method[1]()
-                print(' ...ok')
-            except AssertionError:
-                print('  FAIL: %s (%s)' % (method[0], method[1]))
-                failures += 1
-        if failures:
-            raise AssertionError('%s failures' % failures)
-
-
-def init_parser():
-    parser = ArgumentParser(add_help=False)
-    parser.add_argument(
-        '-h', '--help',
-        dest='help',
-        action='store_true',
-        default=False,
-        help="Show this help message and exit")
-    return parser
-
-
-def main(argv):
-    _main(argv, config=None)
-
-
-def _main(argv, config=None):
-    suiteFew = TestSuite()
-    if len(argv) == 0 or argv[0] == 'pithos':
-        from kamaki.clients.tests.pithos import Pithos
-        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
-        suiteFew.addTest(Pithos(test_method, config))
-    if len(argv) == 0 or argv[0] == 'cyclades':
-        from kamaki.clients.tests.cyclades import Cyclades
-        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
-        suiteFew.addTest(Cyclades(test_method, config))
-    if len(argv) == 0 or argv[0] == 'image':
-        from kamaki.clients.tests.image import Image
-        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
-        suiteFew.addTest(Image(test_method, config))
-    if len(argv) == 0 or argv[0] == 'astakos':
-        from kamaki.clients.tests.astakos import Astakos
-        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
-        suiteFew.addTest(Astakos(test_method, config))
-
-    TextTestRunner(verbosity=2).run(suiteFew)
-
-if __name__ == '__main__':
-    parser = init_parser()
-    args, argv = parser.parse_known_args()
-    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
-        raise Exception('\tusage: tests <group> [command]')
-    main(argv)
diff --git a/kamaki/clients/tests/astakos.py b/kamaki/clients/tests/astakos.py
deleted file mode 100644
index 43abf5a..0000000
--- a/kamaki/clients/tests/astakos.py
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright 2012-2013 GRNET S.A. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or
-# without modification, are permitted provided that the following
-# conditions are met:
-#
-#   1. Redistributions of source code must retain the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer in the documentation and/or other materials
-#      provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
-# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and
-# documentation are those of the authors and should not be
-# interpreted as representing official policies, either expressed
-# or implied, of GRNET S.A.
-
-from kamaki.clients import tests
-from kamaki.clients.astakos import AstakosClient
-
-
-class Astakos(tests.Generic):
-    def setUp(self):
-        self.client = AstakosClient(
-            self['astakos', 'url'],
-            self['astakos', 'token'])
-
-    def test_authenticate(self):
-        self._test_0010_authenticate()
-
-    def _test_0010_authenticate(self):
-        r = self.client.authenticate()
-        for term in (
-                'name',
-                'username',
-                'auth_token_expires',
-                'auth_token_created',
-                'uuid',
-                'id',
-                'email'):
-            self.assertTrue(term in r)
-
-    def test_info(self):
-        self._test_0020_info()
-
-    def _test_0020_info(self):
-        self.assertTrue(set([
-            'name',
-            'username',
-            'uuid']).issubset(self.client.info().keys()))
-
-    def test_get(self):
-        self._test_0020_get()
-
-    def _test_0020_get(self):
-        for term in ('uuid', 'name', 'username'):
-            self.assertEqual(
-                self.client.term(term, self['astakos', 'token']),
-                self['astakos', term])
-        self.assertTrue(self['astakos', 'email'] in self.client.term('email'))
-
-    def test_list(self):
-        self.client.authenticate()
-        self._test_0020_list()
-
-    def _test_0020_list(self):
-        terms = set(['name', 'username', 'uuid', 'email', 'auth_token'])
-        uuid = 0
-        for r in self.client.list():
-            self.assertTrue(terms.issubset(r.keys()))
-            self.assertTrue(uuid != r['uuid'] if uuid else True)
-            uuid = r['uuid']
diff --git a/kamaki/clients/tests/cyclades.py b/kamaki/clients/tests/cyclades.py
deleted file mode 100644
index f5763fc..0000000
--- a/kamaki/clients/tests/cyclades.py
+++ /dev/null
@@ -1,765 +0,0 @@
-# Copyright 2012-2013 GRNET S.A. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or
-# without modification, are permitted provided that the following
-# conditions are met:
-#
-#   1. Redistributions of source code must retain the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer in the documentation and/or other materials
-#      provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
-# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and
-# documentation are those of the authors and should not be
-# interpreted as representing official policies, either expressed
-# or implied, of GRNET S.A.
-
-import time
-
-from kamaki.clients import tests, ClientError
-from kamaki.clients.cyclades import CycladesClient
-
-
-class Cyclades(tests.Generic):
-    """Set up a Cyclades thorough test"""
-    def setUp(self):
-        print
-        with open(self['image', 'details']) as f:
-            self.img_details = eval(f.read())
-        self.img = self.img_details['id']
-        with open(self['flavor', 'details']) as f:
-            self._flavor_details = eval(f.read())
-        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
-
-        self.servers = {}
-        self.now = time.mktime(time.gmtime())
-        self.servname1 = 'serv' + unicode(self.now)
-        self.servname2 = self.servname1 + '_v2'
-        self.servname1 += '_v1'
-        self.flavorid = 1
-        #servers have to be created at the begining...
-        self.networks = {}
-        self.netname1 = 'net' + unicode(self.now)
-        self.netname2 = 'net' + unicode(self.now) + '_v2'
-
-        self.client = CycladesClient(self['compute', 'url'], self['token'])
-
-    def tearDown(self):
-        """Destoy servers used in testing"""
-        for net in self.networks.keys():
-            self._delete_network(net)
-        for server in self.servers.values():
-            self._delete_server(server['id'])
-            print('DEL VM %s (%s)' % (server['id'], server['name']))
-
-    def test_000(self):
-        "Prepare a full Cyclades test scenario"
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self.server2 = self._create_server(
-            self.servname2,
-            self.flavorid + 2,
-            self.img)
-        super(self.__class__, self).test_000()
-
-    def _create_server(self, servername, flavorid, imageid, personality=None):
-        server = self.client.create_server(
-            servername,
-            flavorid,
-            imageid,
-            personality)
-        print('CREATE VM %s (%s)' % (server['id'], server['name']))
-        self.servers[servername] = server
-        return server
-
-    def _delete_server(self, servid):
-        try:
-            current_state = self.client.get_server_details(servid)
-            current_state = current_state['status']
-            if current_state == 'DELETED':
-                return
-            self.client.delete_server(servid)
-            self._wait_for_status(servid, current_state)
-            self.client.delete_server(servid)
-        except:
-            return
-
-    def _create_network(self, netname, **kwargs):
-        net = self.client.create_network(netname, **kwargs)
-        self.networks[net['id']] = net
-        return net
-
-    def _delete_network(self, netid):
-        if not netid in self.networks:
-            return None
-        print('Disconnect nics of network %s' % netid)
-        self.client.disconnect_network_nics(netid)
-
-        def netwait(wait):
-            try:
-                self.client.delete_network(netid)
-            except ClientError:
-                time.sleep(wait)
-        self.do_with_progress_bar(
-            netwait,
-            'Delete network %s' % netid,
-            self._waits[:7])
-        return self.networks.pop(netid)
-
-    def _wait_for_network(self, netid, status):
-
-        def netwait(wait):
-            r = self.client.get_network_details(netid)
-            if r['status'] == status:
-                return
-            time.sleep(wait)
-        self.do_with_progress_bar(
-            netwait,
-            'Wait network %s to reach status %s' % (netid, status),
-            self._waits[:5])
-
-    def _wait_for_nic(self, netid, servid, in_creation=True):
-        self._wait_for_network(netid, 'ACTIVE')
-
-        def nicwait(wait):
-            nics = self.client.list_server_nics(servid)
-            for net in nics:
-                found_nic = net['network_id'] == netid
-                if (in_creation and found_nic) or not (
-                        in_creation or found_nic):
-                    return
-            time.sleep(wait)
-        self.do_with_progress_bar(
-            nicwait,
-            'Wait nic-%s-%s to %sconnect' % (
-                netid,
-                servid,
-                '' if in_creation else 'dis'),
-            self._waits[:5])
-        for net in self.client.list_server_nics(servid):
-            if netid == net['network_id']:
-                return True
-        return False
-
-    def _has_status(self, servid, status):
-        r = self.client.get_server_details(servid)
-        return r['status'] == status
-
-    def _wait_for_status(self, servid, status):
-        (wait_bar, wait_cb) = self._safe_progress_bar(
-            'Server %s in %s' % (servid, status))
-        self.client.wait_server(servid, status, wait_cb=wait_cb)
-        self._safe_progress_bar_finish(wait_bar)
-
-    def test_parallel_creation(self):
-        """test create with multiple threads
-        Do not use this in regular tests
-        """
-        from kamaki.clients import SilentEvent
-        c1 = SilentEvent(
-            self._create_server,
-            self.servname1,
-            self.flavorid,
-            self.img)
-        c2 = SilentEvent(
-            self._create_server,
-            self.servname2,
-            self.flavorid + 2,
-            self.img)
-        c3 = SilentEvent(
-            self._create_server,
-            self.servname1,
-            self.flavorid,
-            self.img)
-        c4 = SilentEvent(
-            self._create_server,
-            self.servname2,
-            self.flavorid + 2,
-            self.img)
-        c5 = SilentEvent(
-            self._create_server,
-            self.servname1,
-            self.flavorid,
-            self.img)
-        c6 = SilentEvent(
-            self._create_server,
-            self.servname2,
-            self.flavorid + 2,
-            self.img)
-        c7 = SilentEvent(
-            self._create_server,
-            self.servname1,
-            self.flavorid,
-            self.img)
-        c8 = SilentEvent(
-            self._create_server,
-            self.servname2,
-            self.flavorid + 2,
-            self.img)
-        c1.start()
-        c2.start()
-        c3.start()
-        c4.start()
-        c5.start()
-        c6.start()
-        c7.start()
-        c8.start()
-
-    def test_create_server(self):
-        """Test create_server"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        self._test_0010_create_server()
-
-    def _test_0010_create_server(self):
-        self.assertEqual(self.server1["name"], self.servname1)
-        self.assertEqual(self.server1["flavorRef"], self.flavorid)
-        self.assertEqual(self.server1["imageRef"], self.img)
-        self.assertEqual(self.server1["status"], "BUILD")
-
-    def test_list_servers(self):
-        """Test list servers"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self.server2 = self._create_server(
-            self.servname2,
-            self.flavorid + 2,
-            self.img)
-        self._test_0020_list_servers()
-
-    def _test_0020_list_servers(self):
-        servers = self.client.list_servers()
-        dservers = self.client.list_servers(detail=True)
-
-        """detailed and simple are same size"""
-        self.assertEqual(len(dservers), len(servers))
-        for i in range(len(servers)):
-            for field in (
-                    'created',
-                    'flavorRef',
-                    'hostId',
-                    'imageRef',
-                    'progress',
-                    'status',
-                    'updated'):
-                self.assertFalse(field in servers[i])
-                self.assertTrue(field in dservers[i])
-
-        """detailed and simple contain same names"""
-        names = sorted(map(lambda x: x["name"], servers))
-        dnames = sorted(map(lambda x: x["name"], dservers))
-        self.assertEqual(names, dnames)
-
-    def _test_0030_wait_test_servers_to_build(self):
-        """Pseudo-test to wait for VMs to load"""
-        print('')
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        self._wait_for_status(self.server2['id'], 'BUILD')
-
-    def test_get_server_details(self):
-        """Test get_server_details"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        self._test_0040_get_server_details()
-
-    def _test_0040_get_server_details(self):
-        r = self.client.get_server_details(self.server1['id'])
-        self.assertEqual(r["name"], self.servname1)
-        self.assertEqual(r["flavorRef"], self.flavorid)
-        self.assertEqual(r["imageRef"], self.img)
-        self.assertEqual(r["status"], "ACTIVE")
-
-    def test_update_server_name(self):
-        """Test update_server_name"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._test_0050_update_server_name()
-
-    def _test_0050_update_server_name(self):
-        new_name = self.servname1 + '_new_name'
-        self.client.update_server_name(self.server1['id'], new_name)
-        r = self.client.get_server_details(
-            self.server1['id'],
-            success=(200, 400))
-        self.assertEqual(r['name'], new_name)
-        changed = self.servers.pop(self.servname1)
-        changed['name'] = new_name
-        self.servers[new_name] = changed
-
-    def test_reboot_server(self):
-        """Test reboot server"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        self.server2 = self._create_server(
-            self.servname2,
-            self.flavorid + 1,
-            self.img)
-        self._wait_for_status(self.server2['id'], 'BUILD')
-        self._test_0060_reboot_server()
-        self._wait_for_status(self.server1['id'], 'REBOOT')
-        self._wait_for_status(self.server2['id'], 'REBOOT')
-
-    def _test_0060_reboot_server(self):
-        self.client.reboot_server(self.server1['id'])
-        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
-        self.client.reboot_server(self.server2['id'], hard=True)
-        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
-
-    def _test_0070_wait_test_servers_to_reboot(self):
-        """Pseudo-test to wait for VMs to load"""
-        print('')
-        self._wait_for_status(self.server1['id'], 'REBOOT')
-        self._wait_for_status(self.server2['id'], 'REBOOT')
-
-    def test_create_server_metadata(self):
-        """Test create_server_metadata"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._test_0080_create_server_metadata()
-
-    def _test_0080_create_server_metadata(self):
-        r1 = self.client.create_server_metadata(
-            self.server1['id'],
-            'mymeta',
-            'mymeta val')
-        self.assertTrue('mymeta' in r1)
-        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
-        self.assert_dicts_are_deeply_equal(r1, r2)
-
-    def test_get_server_metadata(self):
-        """Test get server_metadata"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._test_0090_get_server_metadata()
-
-    def _test_0090_get_server_metadata(self):
-        self.client.create_server_metadata(
-            self.server1['id'],
-            'mymeta_0',
-            'val_0')
-        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
-        self.assertEqual(r['mymeta_0'], 'val_0')
-
-    def test_update_server_metadata(self):
-        """Test update_server_metadata"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._test_0100_update_server_metadata()
-
-    def _test_0100_update_server_metadata(self):
-        r1 = self.client.create_server_metadata(
-            self.server1['id'],
-            'mymeta3',
-            'val2')
-        self.assertTrue('mymeta3'in r1)
-        r2 = self.client.update_server_metadata(
-            self.server1['id'],
-            mymeta3='val3')
-        self.assertTrue(r2['mymeta3'], 'val3')
-
-    def test_delete_server_metadata(self):
-        """Test delete_server_metadata"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._test_0110_delete_server_metadata()
-
-    def _test_0110_delete_server_metadata(self):
-        r1 = self.client.create_server_metadata(
-            self.server1['id'],
-            'mymeta',
-            'val')
-        self.assertTrue('mymeta' in r1)
-        self.client.delete_server_metadata(self.server1['id'], 'mymeta')
-        try:
-            self.client.get_server_metadata(self.server1['id'], 'mymeta')
-            raise ClientError('Wrong Error', status=100)
-        except ClientError as err:
-            self.assertEqual(err.status, 404)
-
-    def test_list_flavors(self):
-        """Test flavors_get"""
-        self._test_0120_list_flavors()
-
-    def _test_0120_list_flavors(self):
-        r = self.client.list_flavors()
-        self.assertTrue(len(r) > 1)
-        r = self.client.list_flavors(detail=True)
-        self.assertTrue('SNF:disk_template' in r[0])
-
-    def test_get_flavor_details(self):
-        """Test test_get_flavor_details"""
-        self._test_0130_get_flavor_details()
-
-    def _test_0130_get_flavor_details(self):
-        r = self.client.get_flavor_details(self.flavorid)
-        self.assert_dicts_are_deeply_equal(self._flavor_details, r)
-
-    def test_list_images(self):
-        """Test list_images"""
-        self._test_0140_list_images()
-
-    def _test_0140_list_images(self):
-        r = self.client.list_images()
-        self.assertTrue(len(r) > 1)
-        r = self.client.list_images(detail=True)
-        for detailed_img in r:
-            if detailed_img['id'] == self.img:
-                break
-        self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
-
-    def test_get_image_details(self):
-        """Test image_details"""
-        self._test_0150_get_image_details()
-
-    def _test_0150_get_image_details(self):
-        r = self.client.get_image_details(self.img)
-        self.assert_dicts_are_deeply_equal(r, self.img_details)
-
-    def test_get_image_metadata(self):
-        """Test get_image_metadata"""
-        self._test_0160_get_image_metadata()
-
-    def _test_0160_get_image_metadata(self):
-        r = self.client.get_image_metadata(self.img)
-        self.assert_dicts_are_deeply_equal(
-            self.img_details['metadata']['values'], r)
-        for key, val in self.img_details['metadata']['values'].items():
-            r = self.client.get_image_metadata(self.img, key)
-            self.assertEqual(r[key], val)
-
-    def test_shutdown_server(self):
-        """Test shutdown_server"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        self._test_0170_shutdown_server()
-
-    def _test_0170_shutdown_server(self):
-        self.client.shutdown_server(self.server1['id'])
-        self._wait_for_status(self.server1['id'], 'ACTIVE')
-        r = self.client.get_server_details(self.server1['id'])
-        self.assertEqual(r['status'], 'STOPPED')
-
-    def test_start_server(self):
-        """Test start_server"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        self.client.shutdown_server(self.server1['id'])
-        self._wait_for_status(self.server1['id'], 'ACTIVE')
-        self._test_0180_start_server()
-
-    def _test_0180_start_server(self):
-        self.client.start_server(self.server1['id'])
-        self._wait_for_status(self.server1['id'], 'STOPPED')
-        r = self.client.get_server_details(self.server1['id'])
-        self.assertEqual(r['status'], 'ACTIVE')
-
-    def test_get_server_console(self):
-        """Test get_server_console"""
-        self.server2 = self._create_server(
-            self.servname2,
-            self.flavorid + 2,
-            self.img)
-        self._wait_for_status(self.server2['id'], 'BUILD')
-        self._test_0190_get_server_console()
-
-    def _test_0190_get_server_console(self):
-        r = self.client.get_server_console(self.server2['id'])
-        self.assertTrue('host' in r)
-        self.assertTrue('password' in r)
-        self.assertTrue('port' in r)
-        self.assertTrue('type' in r)
-
-    def test_get_firewall_profile(self):
-        """Test get_firewall_profile"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._test_0200_get_firewall_profile()
-
-    def _test_0200_get_firewall_profile(self):
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        fprofile = self.client.get_firewall_profile(self.server1['id'])
-        self.assertTrue(fprofile in self.PROFILES)
-
-    def test_set_firewall_profile(self):
-        """Test set_firewall_profile"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._test_0210_set_firewall_profile()
-
-    def _test_0210_set_firewall_profile(self):
-
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
-        fprofile = self.client.get_firewall_profile(self.server1['id'])
-        print('')
-        count_success = 0
-        for counter, fprofile in enumerate(PROFILES):
-            npos = counter + 1
-            try:
-                nprofile = PROFILES[npos]
-            except IndexError:
-                nprofile = PROFILES[0]
-            print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
-            self.client.set_firewall_profile(self.server1['id'], nprofile)
-            time.sleep(0.5)
-            self.client.reboot_server(self.server1['id'], hard=True)
-            time.sleep(1)
-            self._wait_for_status(self.server1['id'], 'REBOOT')
-            time.sleep(0.5)
-            changed = self.client.get_firewall_profile(self.server1['id'])
-            try:
-                self.assertEqual(changed, nprofile)
-            except AssertionError as err:
-                if count_success:
-                    print('\tFAIL in swap #%s' % npos)
-                    break
-                else:
-                    raise err
-            count_success += 1
-
-    def test_get_server_stats(self):
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self._test_0220_get_server_stats()
-
-    def _test_0220_get_server_stats(self):
-        r = self.client.get_server_stats(self.server1['id'])
-        it = ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh')
-        for term in it:
-            self.assertTrue(term in r)
-
-    def test_create_network(self):
-        """Test create_network"""
-        self._test_0230_create_network()
-
-    def _test_0230_create_network(self):
-        print('\twith no params')
-        self.network1 = self._create_network(self.netname1)
-        self._wait_for_network(self.network1['id'], 'ACTIVE')
-        n1id = self.network1['id']
-        self.network1 = self.client.get_network_details(n1id)
-        nets = self.client.list_networks(self.network1['id'])
-        chosen = [net for net in nets if net['id'] == n1id][0]
-        chosen.pop('updated')
-        net1 = dict(self.network1)
-        net1.pop('updated')
-        self.assert_dicts_are_deeply_equal(chosen, net1)
-        for param, val in dict(
-                cidr='192.168.0.0/24',
-                gateway='192.168.0.1',
-                type='MAC_FILTERED',
-                dhcp=True).items():
-            print('\tdelete %s to avoid max net limit' % n1id)
-            self._delete_network(n1id)
-            kwargs = {param: val}
-            print('\twith %s=%s' % (param, val))
-            self.network1 = self._create_network(self.netname1, **kwargs)
-            n1id = self.network1['id']
-            self._wait_for_network(n1id, 'ACTIVE')
-            self.network1 = self.client.get_network_details(n1id)
-            self.assertEqual(self.network1[param], val)
-
-    def test_connect_server(self):
-        """Test connect_server"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self.network1 = self._create_network(self.netname1)
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        self._wait_for_network(self.network1['id'], 'ACTIVE')
-        self._test_0240_connect_server()
-
-    def _test_0250_connect_server(self):
-        self.client.connect_server(self.server1['id'], self.network1['id'])
-        self.assertTrue(self._wait_for_nic(
-            self.network1['id'],
-            self.server1['id']))
-
-    def test_disconnect_server(self):
-        """Test disconnect_server"""
-        self.test_connect_server()
-        self._test_0250_disconnect_server()
-
-    def _test_0250_disconnect_server(self):
-        self.client.disconnect_server(self.server1['id'], self.network1['id'])
-        self.assertTrue(self._wait_for_nic(
-            self.network1['id'],
-            self.server1['id'],
-            in_creation=False))
-
-    def _test_0260_wait_for_second_network(self):
-        self.network2 = self._create_network(self.netname2)
-        self._wait_for_network(self.network2['id'], 'ACTIVE')
-
-    def test_list_server_nics(self):
-        """Test list_server_nics"""
-        self.server1 = self._create_server(
-            self.servname1,
-            self.flavorid,
-            self.img)
-        self.network2 = self._create_network(self.netname2)
-        self._wait_for_status(self.server1['id'], 'BUILD')
-        self._wait_for_network(self.network2['id'], 'ACTIVE')
-        self._test_0280_list_server_nics()
-
-    def _test_0280_list_server_nics(self):
-        r = self.client.list_server_nics(self.server1['id'])
-        len0 = len(r)
-        self.client.connect_server(self.server1['id'], self.network2['id'])
-        self.assertTrue(self._wait_for_nic(
-            self.network2['id'],
-            self.server1['id']))
-        r = self.client.list_server_nics(self.server1['id'])
-        self.assertTrue(len(r) > len0)
-
-    def test_list_networks(self):
-        """Test list_network"""
-        self.network1 = self._create_network(self.netname1)
-        self._wait_for_network(self.network1['id'], 'ACTIVE')
-        self._test_0290_list_networks()
-
-    def _test_0290_list_networks(self):
-        r = self.client.list_networks()
-        self.assertTrue(len(r) > 1)
-        ids = [net['id'] for net in r]
-        names = [net['name'] for net in r]
-        self.assertTrue('1' in ids)
-        #self.assertTrue('public' in names)
-        self.assertTrue(self.network1['id'] in ids)
-        self.assertTrue(self.network1['name'] in names)
-
-        r = self.client.list_networks(detail=True)
-        ids = [net['id'] for net in r]
-        names = [net['name'] for net in r]
-        for net in r:
-            self.assertTrue(net['id'] in ids)
-            self.assertTrue(net['name'] in names)
-            for term in ('status', 'updated', 'created'):
-                self.assertTrue(term in net.keys())
-
-    def test_get_network_details(self):
-        """Test get_network_details"""
-        self.network1 = self._create_network(self.netname1)
-        self._test_0300_get_network_details()
-
-    def _test_0300_get_network_details(self):
-        r = self.client.get_network_details(self.network1['id'])
-        net1 = dict(self.network1)
-        net1.pop('status')
-        net1.pop('updated', None)
-        net1.pop('attachments')
-        r.pop('status')
-        r.pop('updated', None)
-        r.pop('attachments')
-        self.assert_dicts_are_deeply_equal(net1, r)
-
-    def test_update_network_name(self):
-        self.network2 = self._create_network(self.netname2)
-        self._test_0310_update_network_name()
-
-    def _test_0310_update_network_name(self):
-        updated_name = self.netname2 + '_upd'
-        self.client.update_network_name(self.network2['id'], updated_name)
-
-        def netwait(wait):
-            r = self.client.get_network_details(self.network2['id'])
-            if r['name'] == updated_name:
-                return
-            time.sleep(wait)
-        self.do_with_progress_bar(
-            netwait,
-            'Network %s name is changing:' % self.network2['id'],
-            self._waits[:5])
-
-        r = self.client.get_network_details(self.network2['id'])
-        self.assertEqual(r['name'], updated_name)
-
-    """ Don't have auth to test this
-    def test_delete_image(self):
-        ""Test delete_image""
-        self._test_0330_delete_image()
-    def _test_0330_delete_image(self):
-        images = self.client.list_images()
-        self.client.delete_image(images[2]['id'])
-        try:
-            r = self.client.get_image_details(images[2]['id'], success=(400))
-        except ClientError as err:
-            self.assertEqual(err.status, 404)
-
-    def test_create_image_metadata(self):
-        ""Test create_image_metadata""
-        self._test_0340_create_image_metadata()
-    def _test_0340_create_image_metadata(self):
-        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
-        self.assertEqual(r['mykey'], 'myval')
-
-    def test_update_image_metadata(self):
-        ""Test update_image_metadata""
-        self._test_0350_update_image_metadata()
-    def _test_0350_update_image_metadata(self):
-        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
-        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
-        self.assertEqual(r['mykey0'], 'myval0')
-
-    def test_delete_image_metadata(self):
-        ""Test delete_image_metadata""
-        self._test_0360_delete_image_metadata()
-    def _test_0360_delete_image_metadata(self):
-        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
-        self.client.delete_image_metadata(self.img, 'mykey1')
-        r = self.client.get_image_metadata(self.img)
-        self.assertNotEqual('mykey1' in r)
-    """
diff --git a/kamaki/clients/tests/image.py b/kamaki/clients/tests/image.py
deleted file mode 100644
index ba5a951..0000000
--- a/kamaki/clients/tests/image.py
+++ /dev/null
@@ -1,258 +0,0 @@
-# Copyright 2012-2013 GRNET S.A. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or
-# without modification, are permitted provided that the following
-# conditions are met:
-#
-#   1. Redistributions of source code must retain the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer in the documentation and/or other materials
-#      provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
-# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and
-# documentation are those of the authors and should not be
-# interpreted as representing official policies, either expressed
-# or implied, of GRNET S.A.
-
-import time
-
-from kamaki.clients import tests
-from kamaki.clients.cyclades import CycladesClient
-from kamaki.clients.image import ImageClient
-from kamaki.clients import ClientError
-
-
-class Image(tests.Generic):
-    def setUp(self):
-        self.now = time.mktime(time.gmtime())
-
-        self.imgname = 'img_%s' % self.now
-        url = self['image', 'url']
-        self.client = ImageClient(url, self['token'])
-        cyclades_url = self['compute', 'url']
-        self.cyclades = CycladesClient(cyclades_url, self['token'])
-        self._imglist = {}
-
-    def test_000(self):
-        self._prepare_img()
-        super(self.__class__, self).test_000()
-
-    def _prepare_img(self):
-        f = open(self['image', 'local_path'], 'rb')
-        (token, uuid) = (self['token'], self['store', 'account'])
-        print('UUID HERE: %s (%s)' % (uuid, token))
-        if not uuid:
-            from kamaki.clients.astakos import AstakosClient
-            uuid = AstakosClient(self['astakos', 'url'], token).term('uuid')
-        print('UUID HERE: %s' % uuid)
-        from kamaki.clients.pithos import PithosClient
-        self.pithcli = PithosClient(self['store', 'url'], token, uuid)
-        cont = 'cont_%s' % self.now
-        self.pithcli.container = cont
-        self.obj = 'obj_%s' % self.now
-        print('\t- Create container %s on Pithos server' % cont)
-        self.pithcli.container_put()
-        self.location = 'pithos://%s/%s/%s' % (uuid, cont, self.obj)
-        print('\t- Upload an image at %s...' % self.location)
-        self.pithcli.upload_object(self.obj, f)
-        print('\t- ok')
-        f.close()
-
-        self.client.register(
-            self.imgname,
-            self.location,
-            params=dict(is_public=True))
-        img = self._get_img_by_name(self.imgname)
-        self._imglist[self.imgname] = img
-
-    def tearDown(self):
-        for img in self._imglist.values():
-            print('\tDeleting image %s' % img['id'])
-            self.cyclades.delete_image(img['id'])
-        if hasattr(self, 'pithcli'):
-            print('\tDeleting container %s' % self.pithcli.container)
-            try:
-                self.pithcli.del_container(delimiter='/')
-                self.pithcli.purge_container()
-            except ClientError:
-                pass
-
-    def _get_img_by_name(self, name):
-        r = self.cyclades.list_images()
-        for img in r:
-            if img['name'] == name:
-                return img
-        return None
-
-    def assert_dicts_are_deeply_equal(self, d1, d2):
-        for k, v in d1.items():
-            self.assertTrue(k in d2)
-            if isinstance(v, dict):
-                self.assert_dicts_are_deeply_equal(v, d2[k])
-            else:
-                self.assertEqual(unicode(v), unicode(d2[k]))
-
-    def test_list_public(self):
-        """Test list_public"""
-        self._test_list_public()
-
-    def _test_list_public(self):
-        r = self.client.list_public()
-        r0 = self.client.list_public(order='-')
-        self.assertTrue(len(r) > 0)
-        for img in r:
-            for term in (
-                    'status',
-                    'name',
-                    'container_format',
-                    'disk_format',
-                    'id',
-                    'size'):
-                self.assertTrue(term in img)
-        self.assertTrue(r, r0)
-        r0.reverse()
-        for i, img in enumerate(r):
-            self.assert_dicts_are_deeply_equal(img, r0[i])
-        r1 = self.client.list_public(detail=True)
-        for img in r1:
-            for term in (
-                    'status',
-                    'name',
-                    'checksum',
-                    'created_at',
-                    'disk_format',
-                    'updated_at',
-                    'id',
-                    'location',
-                    'container_format',
-                    'owner',
-                    'is_public',
-                    'deleted_at',
-                    'properties',
-                    'size'):
-                self.assertTrue(term in img)
-                if img['properties']:
-                    for interm in (
-                            'osfamily',
-                            'users',
-                            'os',
-                            'root_partition',
-                            'description'):
-                        self.assertTrue(interm in img['properties'])
-        size_max = 1000000000
-        r2 = self.client.list_public(filters=dict(size_max=size_max))
-        self.assertTrue(len(r2) <= len(r))
-        for img in r2:
-            self.assertTrue(int(img['size']) <= size_max)
-
-    def test_get_meta(self):
-        """Test get_meta"""
-        self._test_get_meta()
-
-    def _test_get_meta(self):
-        r = self.client.get_meta(self['image', 'id'])
-        self.assertEqual(r['id'], self['image', 'id'])
-        for term in (
-                'status',
-                'name',
-                'checksum',
-                'updated-at',
-                'created-at',
-                'deleted-at',
-                'location',
-                'is-public',
-                'owner',
-                'disk-format',
-                'size',
-                'container-format'):
-            self.assertTrue(term in r)
-            for interm in (
-                    'kernel',
-                    'osfamily',
-                    'users',
-                    'gui', 'sortorder',
-                    'root-partition',
-                    'os',
-                    'description'):
-                self.assertTrue(interm in r['properties'])
-
-    def test_register(self):
-        """Test register"""
-        self._prepare_img()
-        self._test_register()
-
-    def _test_register(self):
-        self.assertTrue(self._imglist)
-        for img in self._imglist.values():
-            self.assertTrue(img is not None)
-
-    def test_reregister(self):
-        """Test reregister"""
-        self._prepare_img()
-        self._test_reregister()
-
-    def _test_reregister(self):
-        self.client.reregister(
-            self.location,
-            properties=dict(my_property='some_value'))
-
-    def test_set_members(self):
-        """Test set_members"""
-        self._prepare_img()
-        self._test_set_members()
-
-    def _test_set_members(self):
-        members = ['%s@fake.net' % self.now]
-        for img in self._imglist.values():
-            self.client.set_members(img['id'], members)
-            r = self.client.list_members(img['id'])
-            self.assertEqual(r[0]['member_id'], members[0])
-
-    def test_list_members(self):
-        """Test list_members"""
-        self._test_list_members()
-
-    def _test_list_members(self):
-        self._test_set_members()
-
-    def test_remove_members(self):
-        """Test remove_members - NO CHECK"""
-        self._prepare_img()
-        self._test_remove_members()
-
-    def _test_remove_members(self):
-        return
-        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
-        for img in self._imglist.values():
-            self.client.set_members(img['id'], members)
-            r = self.client.list_members(img['id'])
-            self.assertTrue(len(r) > 1)
-            self.client.remove_member(img['id'], members[0])
-            r0 = self.client.list_members(img['id'])
-            self.assertEqual(len(r), 1 + len(r0))
-            self.assertEqual(r0[0]['member_id'], members[1])
-
-    def test_list_shared(self):
-        """Test list_shared - NOT CHECKED"""
-        self._test_list_shared()
-
-    def _test_list_shared(self):
-        #No way to test this, if I dont have member images
-        pass
diff --git a/kamaki/clients/tests/pithos.py b/kamaki/clients/tests/pithos.py
deleted file mode 100644
index 638f742..0000000
--- a/kamaki/clients/tests/pithos.py
+++ /dev/null
@@ -1,1245 +0,0 @@
-# Copyright 2012-2013 GRNET S.A. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or
-# without modification, are permitted provided that the following
-# conditions are met:
-#
-#   1. Redistributions of source code must retain the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above
-#      copyright notice, this list of conditions and the following
-#      disclaimer in the documentation and/or other materials
-#      provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
-# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and
-# documentation are those of the authors and should not be
-# interpreted as representing official policies, either expressed
-# or implied, of GRNET S.A.
-
-import time
-import datetime
-from os import urandom
-from tempfile import NamedTemporaryFile
-
-from kamaki.clients import tests, ClientError
-from kamaki.clients.pithos import PithosClient
-from kamaki.clients.astakos import AstakosClient
-
-
-class Pithos(tests.Generic):
-
-    files = []
-
-    def setUp(self):
-        self.client = PithosClient(
-            self['store', 'url'],
-            self['store', 'token'],
-            AstakosClient(
-                self['astakos', 'url'],
-                self['store', 'token']
-            ).term('uuid'))
-
-        self.now = time.mktime(time.gmtime())
-        self.now_unformated = datetime.datetime.utcnow()
-        self._init_data()
-
-        """Prepare an object to be shared - also its container"""
-        self.client.container = self.c1
-        self.client.object_post(
-            'test',
-            update=True,
-            permissions={'read': [self.client.account]})
-
-        self.create_remote_object(self.c1, 'another.test')
-
-    def _init_data(self):
-        self.c1 = 'c1_' + unicode(self.now)
-        self.c2 = 'c2_' + unicode(self.now)
-        self.c3 = 'c3_' + unicode(self.now)
-        try:
-            self.client.create_container(self.c2)
-        except ClientError:
-            pass
-        try:
-            self.client.create_container(self.c1)
-        except ClientError:
-            pass
-        try:
-            self.client.create_container(self.c3)
-        except ClientError:
-            pass
-
-        self.create_remote_object(self.c1, 'test')
-        self.create_remote_object(self.c2, 'test')
-        self.create_remote_object(self.c1, 'test1')
-        self.create_remote_object(self.c2, 'test1')
-
-    def create_remote_object(self, container, obj):
-        self.client.container = container
-        self.client.object_put(
-            obj,
-            content_type='application/octet-stream',
-            data='file %s that lives in %s' % (obj, container),
-            metadata={'incontainer': container})
-
-    def forceDeleteContainer(self, container):
-        self.client.container = container
-        try:
-            r = self.client.list_objects()
-        except ClientError:
-            return
-        for obj in r:
-            name = obj['name']
-            self.client.del_object(name)
-        r = self.client.container_delete()
-        self.container = ''
-
-    def tearDown(self):
-        """Destroy test cases"""
-        for f in self.files:
-            f.close()
-        self.forceDeleteContainer(self.c1)
-        self.forceDeleteContainer(self.c2)
-        try:
-            self.forceDeleteContainer(self.c3)
-        except ClientError:
-            pass
-        self.client.container = ''
-
-    def test_000(self):
-        """Prepare a full Pithos+ test"""
-        print('')
-        super(self.__class__, self).test_000()
-
-    def test_account_head(self):
-        """Test account_HEAD"""
-        self._test_0010_account_head()
-
-    def _test_0010_account_head(self):
-        r = self.client.account_head()
-        self.assertEqual(r.status_code, 204)
-
-        r = self.client.account_head(until='1000000000')
-        self.assertEqual(r.status_code, 204)
-
-        r = self.client.get_account_info(until='1000000000')
-        datestring = unicode(r['x-account-until-timestamp'])
-        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
-
-        r = self.client.get_account_quota()
-        self.assertTrue('x-account-policy-quota' in r)
-
-        r = self.client.get_account_versioning()
-        self.assertTrue('x-account-policy-versioning' in r)
-
-        """Check if(un)modified_since"""
-        for format in self.client.DATE_FORMATS:
-            now_formated = self.now_unformated.strftime(format)
-            r1 = self.client.account_head(
-                if_modified_since=now_formated,
-                success=(204, 304, 412))
-            sc1 = r1.status_code
-            r1.release()
-            r2 = self.client.account_head(
-                if_unmodified_since=now_formated,
-                success=(204, 304, 412))
-            sc2 = r2.status_code
-            r2.release()
-            self.assertNotEqual(sc1, sc2)
-
-    def test_account_get(self):
-        """Test account_GET"""
-        self._test_0020_account_get()
-
-    def _test_0020_account_get(self):
-        #r = self.client.account_get()
-        #self.assertEqual(r.status_code, 200)
-        r = self.client.list_containers()
-        fullLen = len(r)
-        self.assertTrue(fullLen > 2)
-
-        r = self.client.account_get(limit=1)
-        self.assertEqual(len(r.json), 1)
-
-        r = self.client.account_get(marker='c2_')
-        temp_c0 = r.json[0]['name']
-        temp_c2 = r.json[2]['name']
-
-        r = self.client.account_get(limit=2, marker='c2_')
-        conames = [container['name'] for container in r.json if (
-            container['name'].lower().startswith('c2_'))]
-        self.assertTrue(temp_c0 in conames)
-        self.assertFalse(temp_c2 in conames)
-
-        r = self.client.account_get(show_only_shared=True)
-        self.assertTrue(self.c1 in [c['name'] for c in r.json])
-
-        r = self.client.account_get(until=1342609206)
-        self.assertTrue(len(r.json) <= fullLen)
-
-        """Check if(un)modified_since"""
-        for format in self.client.DATE_FORMATS:
-            now_formated = self.now_unformated.strftime(format)
-            r1 = self.client.account_get(
-                if_modified_since=now_formated,
-                success=(200, 304, 412))
-            sc1 = r1.status_code
-            r1.release()
-            r2 = self.client.account_get(
-                if_unmodified_since=now_formated,
-                success=(200, 304, 412))
-            sc2 = r2.status_code
-            r2.release()
-            self.assertNotEqual(sc1, sc2)
-
-        """Check sharing_accounts"""
-        r = self.client.get_sharing_accounts()
-        self.assertTrue(len(r) > 0)
-
-    def test_account_post(self):
-        """Test account_POST"""
-        self._test_0030_account_post()
-
-    def _test_0030_account_post(self):
-        r = self.client.account_post()
-        self.assertEqual(r.status_code, 202)
-        grpName = 'grp' + unicode(self.now)
-
-        """Method set/del_account_meta and set_account_groupcall use
-            account_post internally
-        """
-        u1 = self.client.account
-        u2 = self.client.account
-        self.client.set_account_group(grpName, [u1, u2])
-        r = self.client.get_account_group()
-        self.assertEqual(r['x-account-group-' + grpName], '%s,%s' % (u1, u2))
-        self.client.del_account_group(grpName)
-        r = self.client.get_account_group()
-        self.assertTrue('x-account-group-' + grpName not in r)
-
-        mprefix = 'meta' + unicode(self.now)
-        self.client.set_account_meta({
-            mprefix + '1': 'v1',
-            mprefix + '2': 'v2'})
-        r = self.client.get_account_meta()
-        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
-        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
-
-        self.client.del_account_meta(mprefix + '1')
-        r = self.client.get_account_meta()
-        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
-
-        self.client.del_account_meta(mprefix + '2')
-        r = self.client.get_account_meta()
-        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
-
-        """Missing testing for quota, versioning, because normally
-        you don't have permissions to modify those at account level
-        """
-
-        newquota = 1000000
-        self.client.set_account_quota(newquota)
-        #r = self.client.get_account_info()
-        #print(unicode(r))
-        #r = self.client.get_account_quota()
-        #self.assertEqual(r['x-account-policy-quota'], newquota)
-        self.client.set_account_versioning('auto')
-
-    def test_container_head(self):
-        """Test container_HEAD"""
-        self._test_0040_container_head()
-
-    def _test_0040_container_head(self):
-        self.client.container = self.c1
-
-        r = self.client.container_head()
-        self.assertEqual(r.status_code, 204)
-
-        """Check until"""
-        r = self.client.container_head(until=1000000, success=(204, 404))
-        self.assertEqual(r.status_code, 404)
-
-        """Check and if(un)modified_since"""
-        for format in self.client.DATE_FORMATS:
-            now_formated = self.now_unformated.strftime(format)
-            r1 = self.client.container_head(
-                if_modified_since=now_formated,
-                success=(204, 304, 412))
-            sc1 = r1.status_code
-            r1.release()
-            r2 = self.client.container_head(
-                if_unmodified_since=now_formated,
-                success=(204, 304, 412))
-            sc2 = r2.status_code
-            r2.release()
-            self.assertNotEqual(sc1, sc2)
-
-        """Check container object meta"""
-        r = self.client.get_container_object_meta()
-        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
-
-    def test_container_get(self):
-        """Test container_GET"""
-        self._test_0050_container_get()
-
-    def _test_0050_container_get(self):
-        self.client.container = self.c1
-
-        r = self.client.container_get()
-        self.assertEqual(r.status_code, 200)
-        fullLen = len(r.json)
-
-        r = self.client.container_get(prefix='test')
-        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
-        self.assertTrue(len(r.json) > 1)
-        self.assertEqual(len(r.json), len(lalobjects))
-
-        r = self.client.container_get(limit=1)
-        self.assertEqual(len(r.json), 1)
-
-        r = self.client.container_get(marker='another')
-        self.assertTrue(len(r.json) > 1)
-        neobjects = [obj for obj in r.json if obj['name'] > 'another']
-        self.assertEqual(len(r.json), len(neobjects))
-
-        r = self.client.container_get(prefix='another.test', delimiter='.')
-        self.assertTrue(fullLen > len(r.json))
-
-        r = self.client.container_get(path='/')
-        self.assertEqual(fullLen, len(r.json))
-
-        r = self.client.container_get(format='xml')
-        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
-
-        r = self.client.container_get(meta=['incontainer'])
-        self.assertTrue(len(r.json) > 0)
-
-        r = self.client.container_get(show_only_shared=True)
-        self.assertTrue(len(r.json) < fullLen)
-
-        try:
-            r = self.client.container_get(until=1000000000)
-            datestring = unicode(r.headers['x-account-until-timestamp'])
-            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
-
-        except ClientError:
-
-            pass
-
-        """Check and if un/modified_since"""
-        for format in self.client.DATE_FORMATS:
-            now_formated = self.now_unformated.strftime(format)
-            r1 = self.client.container_get(
-                if_modified_since=now_formated,
-                success=(200, 304, 412))
-            sc1 = r1.status_code
-            r1.release()
-            r2 = self.client.container_get(
-                if_unmodified_since=now_formated,
-                success=(200, 304, 412))
-            sc2 = r2.status_code
-            r2.release()
-            self.assertNotEqual(sc1, sc2)
-
-    def test_container_put(self):
-        """Test container_PUT"""
-        self._test_0050_container_put()
-
-    def _test_0050_container_put(self):
-        self.client.container = self.c2
-
-        r = self.client.container_put()
-        self.assertEqual(r.status_code, 202)
-
-        r = self.client.get_container_quota(self.client.container)
-        cquota = r.values()[0]
-        newquota = 2 * int(cquota)
-
-        r = self.client.container_put(quota=newquota)
-        self.assertEqual(r.status_code, 202)
-
-        r = self.client.get_container_quota(self.client.container)
-        xquota = int(r.values()[0])
-        self.assertEqual(newquota, xquota)
-
-        r = self.client.container_put(versioning='auto')
-        self.assertEqual(r.status_code, 202)
-
-        r = self.client.get_container_versioning(self.client.container)
-        nvers = r.values()[0]
-        self.assertEqual('auto', nvers)
-
-        r = self.client.container_put(versioning='none')
-        self.assertEqual(r.status_code, 202)
-
-        r = self.client.get_container_versioning(self.client.container)
-        nvers = r.values()[0]
-        self.assertEqual('none', nvers)
-
-        r = self.client.container_put(metadata={'m1': 'v1', 'm2': 'v2'})
-        self.assertEqual(r.status_code, 202)
-
-        r = self.client.get_container_meta(self.client.container)
-        self.assertTrue('x-container-meta-m1' in r)
-        self.assertEqual(r['x-container-meta-m1'], 'v1')
-        self.assertTrue('x-container-meta-m2' in r)
-        self.assertEqual(r['x-container-meta-m2'], 'v2')
-
-        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
-        self.assertEqual(r.status_code, 202)
-
-        r = self.client.get_container_meta(self.client.container)
-        self.assertTrue('x-container-meta-m1' not in r)
-        self.assertTrue('x-container-meta-m2' in r)
-        self.assertEqual(r['x-container-meta-m2'], 'v2a')
-
-        self.client.del_container_meta(self.client.container)
-
-    def test_container_post(self):
-        """Test container_POST"""
-        self._test_0060_container_post()
-
-    def _test_0060_container_post(self):
-        self.client.container = self.c2
-
-        """Simple post"""
-        r = self.client.container_post()
-        self.assertEqual(r.status_code, 202)
-
-        """post meta"""
-        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
-        r = self.client.get_container_meta(self.client.container)
-        self.assertTrue('x-container-meta-m1' in r)
-        self.assertEqual(r['x-container-meta-m1'], 'v1')
-        self.assertTrue('x-container-meta-m2' in r)
-        self.assertEqual(r['x-container-meta-m2'], 'v2')
-
-        """post/2del meta"""
-        r = self.client.del_container_meta('m1')
-        r = self.client.set_container_meta({'m2': 'v2a'})
-        r = self.client.get_container_meta(self.client.container)
-        self.assertTrue('x-container-meta-m1' not in r)
-        self.assertTrue('x-container-meta-m2' in r)
-        self.assertEqual(r['x-container-meta-m2'], 'v2a')
-
-        """check quota"""
-        r = self.client.get_container_quota(self.client.container)
-        cquota = r.values()[0]
-        newquota = 2 * int(cquota)
-        r = self.client.set_container_quota(newquota)
-        r = self.client.get_container_quota(self.client.container)
-        xquota = int(r.values()[0])
-        self.assertEqual(newquota, xquota)
-        r = self.client.set_container_quota(cquota)
-        r = self.client.get_container_quota(self.client.container)
-        xquota = r.values()[0]
-        self.assertEqual(cquota, xquota)
-
-        """Check versioning"""
-        self.client.set_container_versioning('auto')
-        r = self.client.get_container_versioning(self.client.container)
-        nvers = r.values()[0]
-        self.assertEqual('auto', nvers)
-        self.client.set_container_versioning('none')
-        r = self.client.get_container_versioning(self.client.container)
-        nvers = r.values()[0]
-        self.assertEqual('none', nvers)
-
-        """put_block uses content_type and content_length to
-        post blocks of data 2 container. All that in upload_object"""
-        """Change a file at fs"""
-        f = self.create_large_file(1024 * 1024 * 100)
-        """Upload it at a directory in container"""
-        self.client.create_directory('dir')
-        self.client.upload_object('/dir/sample.file', f)
-        """Check if file has been uploaded"""
-        r = self.client.get_object_info('/dir/sample.file')
-        self.assertTrue(int(r['content-length']) > 100000000)
-
-        """What is tranfer_encoding? What should I check about it? """
-        #TODO
-
-        """Check update=False"""
-        r = self.client.object_post(
-            'test',
-            update=False,
-            metadata={'newmeta': 'newval'})
-
-        r = self.client.get_object_info('test')
-        self.assertTrue('x-object-meta-newmeta' in r)
-        self.assertFalse('x-object-meta-incontainer' in r)
-
-        r = self.client.del_container_meta('m2')
-
-    def test_container_delete(self):
-        """Test container_DELETE"""
-        self._test_0070_container_delete()
-
-    def _test_0070_container_delete(self):
-
-        """Fail to delete a non-empty container"""
-        self.client.container = self.c2
-        r = self.client.container_delete(success=409)
-        self.assertEqual(r.status_code, 409)
-
-        """Fail to delete c3 (empty) container"""
-        self.client.container = self.c3
-        r = self.client.container_delete(until='1000000000')
-        self.assertEqual(r.status_code, 204)
-
-        """Delete c3 (empty) container"""
-        r = self.client.container_delete()
-        self.assertEqual(r.status_code, 204)
-
-        """Purge container(empty a container), check versionlist"""
-        self.client.container = self.c1
-        r = self.client.object_head('test', success=(200, 404))
-        self.assertEqual(r.status_code, 200)
-        self.client.del_container(delimiter='/')
-        r = self.client.object_head('test', success=(200, 404))
-        self.assertEqual(r.status_code, 404)
-        r = self.client.get_object_versionlist('test')
-        self.assertTrue(len(r) > 0)
-        self.assertTrue(len(r[0]) > 1)
-        self.client.purge_container()
-        self.assertRaises(
-            ClientError,
-            self.client.get_object_versionlist,
-            'test')
-
-    def _test_0080_recreate_deleted_data(self):
-        self._init_data()
-
-    def test_object_head(self):
-        """Test object_HEAD"""
-        self._test_0090_object_head()
-
-    def _test_0090_object_head(self):
-        self.client.container = self.c2
-        obj = 'test'
-
-        r = self.client.object_head(obj)
-        self.assertEqual(r.status_code, 200)
-        etag = r.headers['etag']
-
-        r = self.client.object_head(obj, version=40)
-        self.assertEqual(r.headers['x-object-version'], '40')
-
-        r = self.client.object_head(obj, if_etag_match=etag)
-        self.assertEqual(r.status_code, 200)
-
-        r = self.client.object_head(
-            obj,
-            if_etag_not_match=etag,
-            success=(200, 412, 304))
-        self.assertNotEqual(r.status_code, 200)
-
-        r = self.client.object_head(
-            obj,
-            version=40,
-            if_etag_match=etag,
-            success=412)
-        self.assertEqual(r.status_code, 412)
-
-        """Check and if(un)modified_since"""
-        for format in self.client.DATE_FORMATS:
-            now_formated = self.now_unformated.strftime(format)
-            r1 = self.client.object_head(
-                obj,
-                if_modified_since=now_formated,
-                success=(200, 304, 412))
-            sc1 = r1.status_code
-            r1.release()
-            r2 = self.client.object_head(
-                obj,
-                if_unmodified_since=now_formated,
-                success=(200, 304, 412))
-            sc2 = r2.status_code
-            r2.release()
-            self.assertNotEqual(sc1, sc2)
-
-    def test_object_get(self):
-        """Test object_GET"""
-        self._test_0100_object_get()
-
-    def _test_0100_object_get(self):
-        self.client.container = self.c1
-        obj = 'test'
-
-        r = self.client.object_get(obj)
-        self.assertEqual(r.status_code, 200)
-
-        osize = int(r.headers['content-length'])
-        etag = r.headers['etag']
-
-        r = self.client.object_get(obj, hashmap=True)
-        for term in ('hashes', 'block_hash', 'block_hash', 'bytes'):
-            self.assertTrue(term in r.json)
-
-        r = self.client.object_get(obj, format='xml', hashmap=True)
-        self.assertEqual(len(r.text.split('hash>')), 3)
-
-        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
-        r = self.client.object_get(
-            obj,
-            data_range=rangestr,
-            success=(200, 206))
-        partsize = int(r.headers['content-length'])
-        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
-
-        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
-        r = self.client.object_get(
-            obj,
-            data_range=rangestr,
-            if_range=True,
-            success=(200, 206))
-        partsize = int(r.headers['content-length'])
-        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
-
-        r = self.client.object_get(obj, if_etag_match=etag)
-        self.assertEqual(r.status_code, 200)
-
-        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
-        self.assertEqual(r.status_code, 200)
-
-        """Check and if(un)modified_since"""
-        for format in self.client.DATE_FORMATS:
-            now_formated = self.now_unformated.strftime(format)
-            r1 = self.client.object_get(
-                obj,
-                if_modified_since=now_formated,
-                success=(200, 304, 412))
-            sc1 = r1.status_code
-            r1.release()
-            r2 = self.client.object_get(
-                obj,
-                if_unmodified_since=now_formated,
-                success=(200, 304, 412))
-            sc2 = r2.status_code
-            r2.release()
-            self.assertNotEqual(sc1, sc2)
-
-        """Upload an object to download"""
-        trg_fname = 'remotefile_%s' % self.now
-        f_size = 59247824
-        src_f = self.create_large_file(f_size)
-        print('\tUploading...')
-        self.client.upload_object(trg_fname, src_f)
-        print('\tDownloading...')
-        self.files.append(NamedTemporaryFile())
-        dnl_f = self.files[-1]
-        self.client.download_object(trg_fname, dnl_f)
-
-        print('\tCheck if files match...')
-        for pos in (0, f_size / 2, f_size - 20):
-            src_f.seek(pos)
-            dnl_f.seek(pos)
-            self.assertEqual(src_f.read(10), dnl_f.read(10))
-
-    def test_object_put(self):
-        """Test object_PUT"""
-        self._test_object_put()
-
-    def _test_object_put(self):
-        self.client.container = self.c2
-        obj = 'another.test'
-
-        self.client.create_object(obj + '.FAKE')
-        r = self.client.get_object_info(obj + '.FAKE')
-        self.assertEqual(r['content-type'], 'application/octet-stream')
-
-        """create the object"""
-        r = self.client.object_put(
-            obj,
-            data='a',
-            content_type='application/octer-stream',
-            permissions=dict(
-                read=['accX:groupA', 'u1', 'u2'],
-                write=['u2', 'u3']),
-            metadata=dict(key1='val1', key2='val2'),
-            content_encoding='UTF-8',
-            content_disposition='attachment; filename="fname.ext"')
-        self.assertEqual(r.status_code, 201)
-        etag = r.headers['etag']
-
-        """Check content-disposition"""
-        r = self.client.get_object_info(obj)
-        self.assertTrue('content-disposition' in r)
-
-        """Check permissions"""
-        r = self.client.get_object_sharing(obj)
-        self.assertTrue('accx:groupa' in r['read'])
-        self.assertTrue('u1' in r['read'])
-        self.assertTrue('u2' in r['write'])
-        self.assertTrue('u3' in r['write'])
-
-        """Check metadata"""
-        r = self.client.get_object_meta(obj)
-        self.assertEqual(r['x-object-meta-key1'], 'val1')
-        self.assertEqual(r['x-object-meta-key2'], 'val2')
-
-        """Check public and if_etag_match"""
-        r = self.client.object_put(
-            obj,
-            if_etag_match=etag,
-            data='b',
-            content_type='application/octet-stream',
-            public=True)
-
-        r = self.client.object_get(obj)
-        self.assertTrue('x-object-public' in r.headers)
-        vers2 = int(r.headers['x-object-version'])
-        etag = r.headers['etag']
-        self.assertEqual(r.text, 'b')
-
-        """Check if_etag_not_match"""
-        r = self.client.object_put(
-            obj,
-            if_etag_not_match=etag,
-            data='c',
-            content_type='application/octet-stream',
-            success=(201, 412))
-        self.assertEqual(r.status_code, 412)
-
-        """Check content_type and content_length"""
-        tmpdir = 'dir' + unicode(self.now)
-        r = self.client.object_put(
-            tmpdir,
-            content_type='application/directory',
-            content_length=0)
-
-        r = self.client.get_object_info(tmpdir)
-        self.assertEqual(r['content-type'], 'application/directory')
-
-        """Check copy_from, content_encoding"""
-        r = self.client.object_put(
-            '%s/%s' % (tmpdir, obj),
-            format=None,
-            copy_from='/%s/%s' % (self.client.container, obj),
-            content_encoding='application/octet-stream',
-            source_account=self.client.account,
-            content_length=0,
-            success=201)
-        self.assertEqual(r.status_code, 201)
-
-        """Test copy_object for cross-conctainer copy"""
-        self.client.copy_object(
-            src_container=self.c2,
-            src_object='%s/%s' % (tmpdir, obj),
-            dst_container=self.c1,
-            dst_object=obj)
-        self.client.container = self.c1
-        r1 = self.client.get_object_info(obj)
-        self.client.container = self.c2
-        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
-        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
-
-        """Check cross-container copy_from, content_encoding"""
-        self.client.container = self.c1
-        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
-        r = self.client.object_put(
-            obj,
-            format=None,
-            copy_from=fromstr,
-            content_encoding='application/octet-stream',
-            source_account=self.client.account,
-            content_length=0,
-            success=201)
-
-        self.assertEqual(r.status_code, 201)
-        r = self.client.get_object_info(obj)
-        self.assertEqual(r['etag'], etag)
-
-        """Check source_account"""
-        self.client.container = self.c2
-        fromstr = '/%s/%s' % (self.c1, obj)
-        r = self.client.object_put(
-            '%sv2' % obj,
-            format=None,
-            move_from=fromstr,
-            content_encoding='application/octet-stream',
-            source_account='nonExistendAddress@NeverLand.com',
-            content_length=0,
-            success=(201, 403))
-        self.assertEqual(r.status_code, 403)
-
-        """Check cross-container move_from"""
-        self.client.container = self.c1
-        r1 = self.client.get_object_info(obj)
-        self.client.container = self.c2
-        self.client.move_object(
-            src_container=self.c1,
-            src_object=obj,
-            dst_container=self.c2,
-            dst_object=obj + 'v0')
-        r0 = self.client.get_object_info(obj + 'v0')
-        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
-
-        """Check move_from"""
-        r = self.client.object_put(
-            '%sv1' % obj,
-            format=None,
-            move_from='/%s/%s' % (self.c2, obj),
-            source_version=vers2,
-            content_encoding='application/octet-stream',
-            content_length=0, success=201)
-
-        """Check manifest"""
-        mobj = 'manifest.test'
-        txt = ''
-        for i in range(10):
-            txt += '%s' % i
-            r = self.client.object_put(
-                '%s/%s' % (mobj, i),
-                data='%s' % i,
-                content_length=1,
-                success=201,
-                content_type='application/octet-stream',
-                content_encoding='application/octet-stream')
-
-        r = self.client.object_put(
-            mobj,
-            content_length=0,
-            content_type='application/octet-stream',
-            manifest='%s/%s' % (self.client.container, mobj))
-
-        r = self.client.object_get(mobj)
-        self.assertEqual(r.text, txt)
-
-        """Upload a local file with one request"""
-        newf = self.create_large_file(1024 * 10)
-        self.client.upload_object('sample.file', newf)
-        """Check if file has been uploaded"""
-        r = self.client.get_object_info('sample.file')
-        self.assertEqual(int(r['content-length']), 10240)
-
-        """Some problems with transfer-encoding?"""
-
-    def test_object_copy(self):
-        """Test object_COPY"""
-        self._test_0110_object_copy()
-
-    def _test_0110_object_copy(self):
-        self.client.container = self.c2
-        obj = 'test2'
-
-        data = '{"key1":"val1", "key2":"val2"}'
-        r = self.client.object_put(
-            '%sorig' % obj,
-            content_type='application/octet-stream',
-            data=data,
-            metadata=dict(mkey1='mval1', mkey2='mval2'),
-            permissions=dict(
-                read=['accX:groupA', 'u1', 'u2'],
-                write=['u2', 'u3']),
-            content_disposition='attachment; filename="fname.ext"')
-
-        r = self.client.object_copy(
-            '%sorig' % obj,
-            destination='/%s/%s' % (self.client.container, obj),
-            ignore_content_type=False, content_type='application/json',
-            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
-            permissions={'write': ['u5', 'accX:groupB']})
-        self.assertEqual(r.status_code, 201)
-
-        """Check content-disposition"""
-        r = self.client.get_object_info(obj)
-        self.assertTrue('content-disposition' in r)
-
-        """Check Metadata"""
-        r = self.client.get_object_meta(obj)
-        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
-        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
-        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
-
-        """Check permissions"""
-        r = self.client.get_object_sharing(obj)
-        self.assertFalse('read' in r or 'u2' in r['write'])
-        self.assertTrue('accx:groupb' in r['write'])
-
-        """Check destination account"""
-        r = self.client.object_copy(
-            obj,
-            destination='/%s/%s' % (self.c1, obj),
-            content_encoding='utf8',
-            content_type='application/json',
-            destination_account='nonExistendAddress@NeverLand.com',
-            success=(201, 403))
-        self.assertEqual(r.status_code, 403)
-
-        """Check destination being another container
-        and also content_type and content encoding"""
-        r = self.client.object_copy(
-            obj,
-            destination='/%s/%s' % (self.c1, obj),
-            content_encoding='utf8',
-            content_type='application/json')
-        self.assertEqual(r.status_code, 201)
-        self.assertEqual(
-            r.headers['content-type'],
-            'application/json; charset=UTF-8')
-
-        """Check ignore_content_type and content_type"""
-        r = self.client.object_get(obj)
-        etag = r.headers['etag']
-        ctype = r.headers['content-type']
-        self.assertEqual(ctype, 'application/json')
-
-        r = self.client.object_copy(
-            '%sorig' % obj,
-            destination='/%s/%s0' % (self.client.container, obj),
-            ignore_content_type=True,
-            content_type='application/json')
-        self.assertEqual(r.status_code, 201)
-        self.assertNotEqual(r.headers['content-type'], 'application/json')
-
-        """Check if_etag_(not_)match"""
-        r = self.client.object_copy(
-            obj,
-            destination='/%s/%s1' % (self.client.container, obj),
-            if_etag_match=etag)
-        self.assertEqual(r.status_code, 201)
-
-        r = self.client.object_copy(
-            obj,
-            destination='/%s/%s2' % (self.client.container, obj),
-            if_etag_not_match='lalala')
-        self.assertEqual(r.status_code, 201)
-        vers2 = r.headers['x-object-version']
-
-        """Check source_version, public and format """
-        r = self.client.object_copy(
-            '%s2' % obj,
-            destination='/%s/%s3' % (self.client.container, obj),
-            source_version=vers2,
-            format='xml',
-            public=True)
-        self.assertEqual(r.status_code, 201)
-        self.assertTrue(r.headers['content-type'].index('xml') > 0)
-
-        r = self.client.get_object_info(obj + '3')
-        self.assertTrue('x-object-public' in r)
-
-    def test_object_move(self):
-        """Test object_MOVE"""
-        self._test_0120_object_move()
-
-    def _test_0120_object_move(self):
-        self.client.container = self.c2
-        obj = 'test2'
-
-        data = '{"key1": "val1", "key2": "val2"}'
-        r = self.client.object_put(
-            '%sorig' % obj,
-            content_type='application/octet-stream',
-            data=data,
-            metadata=dict(mkey1='mval1', mkey2='mval2'),
-            permissions=dict(
-                read=['accX:groupA', 'u1', 'u2'],
-                write=['u2', 'u3']))
-
-        r = self.client.object_move(
-            '%sorig' % obj,
-            destination='/%s/%s' % (self.client.container, obj),
-            ignore_content_type=False,
-            content_type='application/json',
-            metadata=dict(mkey2='mval2a', mkey3='mval3'),
-            permissions=dict(write=['u5', 'accX:groupB']))
-        self.assertEqual(r.status_code, 201)
-
-        """Check Metadata"""
-        r = self.client.get_object_meta(obj)
-        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
-        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
-        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
-
-        """Check permissions"""
-        r = self.client.get_object_sharing(obj)
-        self.assertFalse('read' in r)
-        self.assertTrue('u5' in r['write'])
-        self.assertTrue('accx:groupb' in r['write'])
-
-        """Check destination account"""
-        r = self.client.object_move(
-            obj,
-            destination='/%s/%s' % (self.c1, obj),
-            content_encoding='utf8',
-            content_type='application/json',
-            destination_account='nonExistendAddress@NeverLand.com',
-            success=(201, 403))
-        self.assertEqual(r.status_code, 403)
-
-        """Check destination being another container and also
-        content_type, content_disposition and content encoding"""
-        r = self.client.object_move(
-            obj,
-            destination='/%s/%s' % (self.c1, obj),
-            content_encoding='utf8',
-            content_type='application/json',
-            content_disposition='attachment; filename="fname.ext"')
-        self.assertEqual(r.status_code, 201)
-        self.assertEqual(
-            r.headers['content-type'],
-            'application/json; charset=UTF-8')
-        self.client.container = self.c1
-        r = self.client.get_object_info(obj)
-        self.assertTrue('content-disposition' in r)
-        self.assertTrue('fname.ext' in r['content-disposition'])
-        etag = r['etag']
-        ctype = r['content-type']
-        self.assertEqual(ctype, 'application/json')
-
-        """Check ignore_content_type and content_type"""
-        r = self.client.object_move(
-            obj,
-            destination='/%s/%s' % (self.c2, obj),
-            ignore_content_type=True,
-            content_type='application/json')
-        self.assertEqual(r.status_code, 201)
-        self.assertNotEqual(r.headers['content-type'], 'application/json')
-
-        """Check if_etag_(not_)match"""
-        self.client.container = self.c2
-        r = self.client.object_move(
-            obj,
-            destination='/%s/%s0' % (self.client.container, obj),
-            if_etag_match=etag)
-        self.assertEqual(r.status_code, 201)
-
-        r = self.client.object_move(
-            '%s0' % obj,
-            destination='/%s/%s1' % (self.client.container, obj),
-            if_etag_not_match='lalala')
-        self.assertEqual(r.status_code, 201)
-
-        """Check public and format """
-        r = self.client.object_move(
-            '%s1' % obj,
-            destination='/%s/%s2' % (self.client.container, obj),
-            format='xml',
-            public=True)
-        self.assertEqual(r.status_code, 201)
-        self.assertTrue(r.headers['content-type'].index('xml') > 0)
-
-        r = self.client.get_object_info(obj + '2')
-        self.assertTrue('x-object-public' in r)
-
-    def test_object_post(self):
-        """Test object_POST"""
-        self._test_0130_object_post()
-
-    def _test_0130_object_post(self):
-        self.client.container = self.c2
-        obj = 'test2'
-        """create a filesystem file"""
-        self.files.append(NamedTemporaryFile())
-        newf = self.files[-1]
-        newf.writelines([
-            'ello!\n',
-            'This is a test line\n',
-            'inside a test file\n'])
-        """create a file on container"""
-        r = self.client.object_put(
-            obj,
-            content_type='application/octet-stream',
-            data='H',
-            metadata=dict(mkey1='mval1', mkey2='mval2'),
-            permissions=dict(
-                read=['accX:groupA', 'u1', 'u2'],
-                write=['u2', 'u3']))
-
-        """Append tests update, content_range, content_type, content_length"""
-        newf.seek(0)
-        self.client.append_object(obj, newf)
-        r = self.client.object_get(obj)
-        self.assertTrue(r.text.startswith('Hello!'))
-
-        """Overwrite tests update,
-            content_type, content_length, content_range
-        """
-        newf.seek(0)
-        r = self.client.overwrite_object(obj, 0, 10, newf)
-        r = self.client.object_get(obj)
-        self.assertTrue(r.text.startswith('ello!'))
-
-        """Truncate tests update,
-            content_range, content_type, object_bytes and source_object"""
-        r = self.client.truncate_object(obj, 5)
-        r = self.client.object_get(obj)
-        self.assertEqual(r.text, 'ello!')
-
-        """Check metadata"""
-        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
-        r = self.client.get_object_meta(obj)
-        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
-        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
-        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
-        self.client.del_object_meta(obj, 'mkey1')
-        r = self.client.get_object_meta(obj)
-        self.assertFalse('x-object-meta-mkey1' in r)
-
-        """Check permissions"""
-        self.client.set_object_sharing(
-            obj,
-            read_permition=['u4', 'u5'],
-            write_permition=['u4'])
-        r = self.client.get_object_sharing(obj)
-        self.assertTrue('read' in r)
-        self.assertTrue('u5' in r['read'])
-        self.assertTrue('write' in r)
-        self.assertTrue('u4' in r['write'])
-        self.client.del_object_sharing(obj)
-        r = self.client.get_object_sharing(obj)
-        self.assertTrue(len(r) == 0)
-
-        """Check publish"""
-        self.client.publish_object(obj)
-        r = self.client.get_object_info(obj)
-        self.assertTrue('x-object-public' in r)
-        self.client.unpublish_object(obj)
-        r = self.client.get_object_info(obj)
-        self.assertFalse('x-object-public' in r)
-
-        """Check if_etag_(not)match"""
-        etag = r['etag']
-        """
-        r = self.client.object_post(
-            obj,
-            update=True,
-            public=True,
-            if_etag_not_match=etag,
-            success=(412, 202, 204))
-        self.assertEqual(r.status_code, 412)
-        """
-
-        r = self.client.object_post(
-            obj,
-            update=True,
-            public=True,
-            if_etag_match=etag,
-            content_encoding='application/json')
-
-        r = self.client.get_object_info(obj)
-        helloVersion = r['x-object-version']
-        self.assertTrue('x-object-public' in r)
-        self.assertEqual(r['content-encoding'], 'application/json')
-
-        """Check source_version and source_account and content_disposition"""
-        r = self.client.object_post(
-            obj,
-            update=True,
-            content_type='application/octet-srteam',
-            content_length=5,
-            content_range='bytes 1-5/*',
-            source_object='/%s/%s' % (self.c2, obj),
-            source_account='thisAccountWillNeverExist@adminland.com',
-            source_version=helloVersion,
-            data='12345',
-            success=(403, 202, 204))
-        self.assertEqual(r.status_code, 403)
-
-        r = self.client.object_post(
-            obj,
-            update=True,
-            content_type='application/octet-srteam',
-            content_length=5,
-            content_range='bytes 1-5/*',
-            source_object='/%s/%s' % (self.c2, obj),
-            source_account=self.client.account,
-            source_version=helloVersion,
-            data='12345',
-            content_disposition='attachment; filename="fname.ext"')
-
-        r = self.client.object_get(obj)
-        self.assertEqual(r.text, 'eello!')
-        self.assertTrue('content-disposition' in r.headers)
-        self.assertTrue('fname.ext' in r.headers['content-disposition'])
-
-        """Check manifest"""
-        mobj = 'manifest.test'
-        txt = ''
-        for i in range(10):
-            txt += '%s' % i
-            r = self.client.object_put(
-                '%s/%s' % (mobj, i),
-                data='%s' % i,
-                content_length=1,
-                success=201,
-                content_encoding='application/octet-stream',
-                content_type='application/octet-stream')
-
-        self.client.create_object_by_manifestation(
-            mobj,
-            content_type='application/octet-stream')
-
-        r = self.client.object_post(
-            mobj,
-            manifest='%s/%s' % (self.client.container, mobj))
-
-        r = self.client.object_get(mobj)
-        self.assertEqual(r.text, txt)
-
-        """We need to check transfer_encoding """
-
-    def test_object_delete(self):
-        """Test object_DELETE"""
-        self._test_0140_object_delete()
-
-    def _test_0140_object_delete(self):
-        self.client.container = self.c2
-        obj = 'test2'
-        """create a file on container"""
-        r = self.client.object_put(
-            obj,
-            content_type='application/octet-stream',
-            data='H',
-            metadata=dict(mkey1='mval1', mkey2='mval2'),
-            permissions=dict(
-                read=['accX:groupA', 'u1', 'u2'],
-                write=['u2', 'u3']))
-
-        """Check with false until"""
-        r = self.client.object_delete(obj, until=1000000)
-
-        r = self.client.object_get(obj, success=(200, 404))
-        self.assertEqual(r.status_code, 200)
-
-        """Check normal case"""
-        r = self.client.object_delete(obj)
-        self.assertEqual(r.status_code, 204)
-
-        r = self.client.object_get(obj, success=(200, 404))
-        self.assertEqual(r.status_code, 404)
-
-    def create_large_file(self, size):
-        """Create a large file at fs"""
-        self.files.append(NamedTemporaryFile())
-        f = self.files[-1]
-        Ki = size / 8
-        bytelist = [b * Ki for b in range(size / Ki)]
-
-        def append2file(step):
-            f.seek(step)
-            f.write(urandom(Ki))
-            f.flush()
-        self.do_with_progress_bar(
-            append2file,
-            ' create rand file %s (%sB): ' % (f.name, size),
-            bytelist)
-        f.seek(0)
-        return f
diff --git a/setup.py b/setup.py
index e7a99a3..82be180 100755
--- a/setup.py
+++ b/setup.py
@@ -63,7 +63,7 @@ setup(
         'kamaki.cli',
         'kamaki.cli.commands',
         'kamaki.clients',
-        'kamaki.clients.tests',
+        'kamaki.clients.livetest',
         'kamaki.clients.connection',
         'kamaki.clients.commissioning',
         'kamaki.clients.quotaholder',
