diff --git a/designate_tempest_plugin/common/models.py b/designate_tempest_plugin/common/models.py
new file mode 100644
index 0000000..e69bd09
--- /dev/null
+++ b/designate_tempest_plugin/common/models.py
@@ -0,0 +1,81 @@
+"""
+Copyright 2015 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.
+"""
+
+
+class ZoneFile(object):
+
+    def __init__(self, origin, ttl, records):
+        self.origin = origin
+        self.ttl = ttl
+        self.records = records
+
+    def __str__(self):
+        return str(self.__dict__)
+
+    def __repr__(self):
+        return str(self)
+
+    def __eq__(self, other):
+        return self.__dict__ == other.__dict__
+
+    @classmethod
+    def from_text(cls, text):
+        """Return a ZoneFile from a string containing the zone file contents"""
+        # filter out empty lines and strip all leading/trailing whitespace.
+        # this assumes no multiline records
+        lines = [x.strip() for x in text.split('\n') if x.strip()]
+
+        assert lines[0].startswith('$ORIGIN')
+        assert lines[1].startswith('$TTL')
+
+        return ZoneFile(
+            origin=lines[0].split(' ')[1],
+            ttl=int(lines[1].split(' ')[1]),
+            records=[ZoneFileRecord.from_text(x) for x in lines[2:]],
+        )
+
+
+class ZoneFileRecord(object):
+
+    def __init__(self, name, type, data):
+        self.name = str(name)
+        self.type = str(type)
+        self.data = str(data)
+
+    def __str__(self):
+        return str(self.__dict__)
+
+    def __repr__(self):
+        return str(self)
+
+    def __eq__(self, other):
+        return self.__dict__ == other.__dict__
+
+    def __hash__(self):
+        return hash(tuple(sorted(self.__dict__.items())))
+
+    @classmethod
+    def from_text(cls, text):
+        """Create a ZoneFileRecord from a line of text of a zone file, like:
+
+            mydomain.com. IN NS ns1.example.com.
+        """
+        # assumes records don't have a TTL between the name and the class.
+        # assumes no parentheses in the record, all on a single line.
+        parts = [x for x in text.split(' ', 4) if x.strip()]
+        name, rclass, rtype, data = parts
+        assert rclass == 'IN'
+        return cls(name=name, type=rtype, data=data)
