diff --git a/designate_tempest_plugin/services/dns/json/base.py b/designate_tempest_plugin/services/dns/json/base.py
index f9b1de7..ea8fb8f 100644
--- a/designate_tempest_plugin/services/dns/json/base.py
+++ b/designate_tempest_plugin/services/dns/json/base.py
@@ -18,6 +18,7 @@
 from tempest.lib.common import rest_client
 from tempest.lib import exceptions as lib_exc
 from six.moves.urllib import parse as urllib
+import six
 
 from designate_tempest_plugin.common.models import ZoneFile
 
@@ -56,8 +57,10 @@
     UPDATE_STATUS_CODES = []
     DELETE_STATUS_CODES = []
 
-    def serialize(self, object_dict):
-        return json.dumps(object_dict)
+    def serialize(self, data):
+        if isinstance(data, six.string_types):
+            return data
+        return json.dumps(data)
 
     def deserialize(self, resp, object_str):
         if 'application/json' in resp['content-type']:
@@ -99,12 +102,13 @@
                                   uuid=uuid,
                                   params=params)
 
-    def _create_request(self, resource, object_dict=None, params=None,
+    def _create_request(self, resource, data=None, params=None,
                         headers=None, extra_headers=False):
         """Create an object of the specified type.
         :param resource: The name of the REST resource, e.g., 'zones'.
-        :param object_dict: A Python dict that represents an object of the
-                            specified type.
+        :param data: A Python dict that represents an object of the
+                     specified type (to be serialized) or a plain string which
+                     is sent as-is.
         :param params: A Python dict that represents the query paramaters to
                        include in the request URI.
         :param headers (dict): The headers to use for the request.
@@ -116,7 +120,7 @@
         :returns: A tuple with the server response and the deserialized created
                  object.
         """
-        body = self.serialize(object_dict)
+        body = self.serialize(data)
         uri = self.get_uri(resource, params=params)
 
         resp, body = self.post(uri, body=body, headers=headers,
@@ -156,17 +160,18 @@
 
         return resp, self.deserialize(resp, body)
 
-    def _put_request(self, resource, uuid, object_dict, params=None):
+    def _put_request(self, resource, uuid, data, params=None):
         """Updates the specified object using PUT request.
         :param resource: The name of the REST resource, e.g., 'zones'.
         :param uuid: Unique identifier of the object in UUID format.
-        :param object_dict: A Python dict that represents an object of the
-                            specified type
+        :param data: A Python dict that represents an object of the
+                     specified type (to be serialized) or a plain string which
+                     is sent as-is.
         :param params: A Python dict that represents the query paramaters to
                        include in the request URI.
         :returns: Serialized object as a dictionary.
         """
-        body = self.serialize(object_dict)
+        body = self.serialize(data)
         uri = self.get_uri(resource, uuid=uuid, params=params)
         resp, body = self.put(uri, body=body)
 
@@ -174,17 +179,18 @@
 
         return resp, self.deserialize(resp, body)
 
-    def _update_request(self, resource, uuid, object_dict, params=None):
+    def _update_request(self, resource, uuid, data, params=None):
         """Updates the specified object using PATCH request.
         :param resource: The name of the REST resource, e.g., 'zones'
         :param uuid: Unique identifier of the object in UUID format.
-        :param object_dict: A Python dict that represents an object of the
-                             specified type.
+        :param data: A Python dict that represents an object of the
+                     specified type (to be serialized) or a plain string which
+                     is sent as-is.
         :param params: A Python dict that represents the query paramaters to
                        include in the request URI.
         :returns: Serialized object as a dictionary.
         """
-        body = self.serialize(object_dict)
+        body = self.serialize(data)
         uri = self.get_uri(resource, uuid=uuid, params=params)
 
         resp, body = self.patch(uri, body=body)
diff --git a/designate_tempest_plugin/services/dns/v2/json/pool_client.py b/designate_tempest_plugin/services/dns/v2/json/pool_client.py
index cd7c540..67e8de8 100644
--- a/designate_tempest_plugin/services/dns/v2/json/pool_client.py
+++ b/designate_tempest_plugin/services/dns/v2/json/pool_client.py
@@ -37,8 +37,7 @@
                  "ns_records": ns_records or dns_data_utils.rand_ns_records()
         }
 
-        resp, body = self._create_request('pools', object_dict=pool,
-                                          params=params)
+        resp, body = self._create_request('pools', data=pool, params=params)
 
         # Create Pool should Return a HTTP 201
         self.expected_success(201, resp.status)
diff --git a/designate_tempest_plugin/services/dns/v2/json/recordset_client.py b/designate_tempest_plugin/services/dns/v2/json/recordset_client.py
index 00b49de..3363e0c 100644
--- a/designate_tempest_plugin/services/dns/v2/json/recordset_client.py
+++ b/designate_tempest_plugin/services/dns/v2/json/recordset_client.py
@@ -33,7 +33,7 @@
         """
         resp, body = self._create_request(
             "/zones/{0}/recordsets".format(zone_uuid), params=params,
-            object_dict=recordset_data)
+            data=recordset_data)
 
         # Create Recordset should Return a HTTP 202
         self.expected_success(202, resp.status)
@@ -109,7 +109,7 @@
         """
         resp, body = self._put_request(
             'zones/{0}/recordsets'.format(zone_uuid), recordset_uuid,
-            object_dict=recordset_model, params=params)
+            data=recordset_model, params=params)
 
         # Update Recordset should Return a HTTP 202
         self.expected_success(202, resp.status)
diff --git a/designate_tempest_plugin/services/dns/v2/json/tld_client.py b/designate_tempest_plugin/services/dns/v2/json/tld_client.py
index d6b3c66..86a31de 100644
--- a/designate_tempest_plugin/services/dns/v2/json/tld_client.py
+++ b/designate_tempest_plugin/services/dns/v2/json/tld_client.py
@@ -35,8 +35,7 @@
                                name="description")
         }
 
-        resp, body = self._create_request('tlds', object_dict=tld,
-                                          params=params)
+        resp, body = self._create_request('tlds', data=tld, params=params)
 
         # Create Tld should Return a HTTP 201
         self.expected_success(201, resp.status)
diff --git a/designate_tempest_plugin/services/dns/v2/json/tsigkey_client.py b/designate_tempest_plugin/services/dns/v2/json/tsigkey_client.py
index 0c5f9c2..683c1bb 100644
--- a/designate_tempest_plugin/services/dns/v2/json/tsigkey_client.py
+++ b/designate_tempest_plugin/services/dns/v2/json/tsigkey_client.py
@@ -41,7 +41,7 @@
                  "scope": scope or utils.rand_tsig_scope(),
                  "resource_id": resource_id}
 
-        resp, body = self._create_request('tsigkeys', object_dict=tsig,
+        resp, body = self._create_request('tsigkeys', data=tsig,
                                           params=params)
 
         self.expected_success(201, resp.status)
diff --git a/designate_tempest_plugin/tests/scenario/v2/test_zones_import.py b/designate_tempest_plugin/tests/scenario/v2/test_zones_import.py
new file mode 100644
index 0000000..86af3d2
--- /dev/null
+++ b/designate_tempest_plugin/tests/scenario/v2/test_zones_import.py
@@ -0,0 +1,61 @@
+# Copyright 2016 Rackspace
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+from oslo_log import log as logging
+from tempest import test
+
+from designate_tempest_plugin.common import waiters
+from designate_tempest_plugin import data_utils as dns_data_utils
+from designate_tempest_plugin.tests.api.v2.test_zones_imports import \
+    BaseZonesImportTest
+
+LOG = logging.getLogger(__name__)
+
+
+class ZonesImportTest(BaseZonesImportTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ZonesImportTest, cls).setup_clients()
+        cls.client = cls.os.zone_imports_client
+        cls.zones_client = cls.os.zones_client
+
+    @test.attr(type='slow')
+    @test.idempotent_id('679f38d0-2f2f-49c5-934e-8fe0c452f56e')
+    def test_create_zone_import_and_wait_for_zone(self):
+        name = dns_data_utils.rand_zone_name('testimport')
+        zonefile = dns_data_utils.rand_zonefile_data(name=name)
+
+        LOG.info('Import zone %r', name)
+        _, zone_import = self.client.create_zone_import(zonefile)
+        self.addCleanup(self.client.delete_zone_import, zone_import['id'])
+
+        LOG.info('Wait for the zone import to COMPLETE')
+        waiters.wait_for_zone_import_status(self.client, zone_import['id'],
+                                            "COMPLETE")
+
+        LOG.info('Check the zone import looks good')
+        _, zone_import = self.client.show_zone_import(zone_import['id'])
+        self.assertEqual('COMPLETE', zone_import['status'])
+        self.assertIsNotNone(zone_import['zone_id'])
+        self.assertIsNotNone(zone_import['links'].get('zone'))
+
+        LOG.info('Wait for the imported zone to go to ACTIVE')
+        waiters.wait_for_zone_status(self.zones_client, zone_import['zone_id'],
+                                     "ACTIVE")
+
+        LOG.info('Check the imported zone looks good')
+        _, zone = self.zones_client.show_zone(zone_import['zone_id'])
+        self.assertEqual('NONE', zone['action'])
+        self.assertEqual('ACTIVE', zone['status'])
+        self.assertEqual(name, zone['name'])
