diff --git a/kong/config.py b/kong/config.py
new file mode 100644
index 0000000..5c3771f
--- /dev/null
+++ b/kong/config.py
@@ -0,0 +1,112 @@
+import ConfigParser
+
+
+class NovaConfig(object):
+    """Provides configuration information for connecting to Nova."""
+
+    def __init__(self, conf):
+        """Initialize a Nova-specific configuration object."""
+        self.conf = conf
+
+    def get(self, item_name, default_value):
+        try:
+            return self.conf.get("nova", item_name)
+        except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
+            return default_value
+
+    @property
+    def host(self):
+        """Host for the Nova HTTP API. Defaults to 127.0.0.1."""
+        return self.get("host", "127.0.0.1")
+
+    @property
+    def port(self):
+        """Port for the Nova HTTP API. Defaults to 8774."""
+        return int(self.get("port", 8774))
+
+    @property
+    def username(self):
+        """Username to use for Nova API requests. Defaults to 'admin'."""
+        return self.get("user", "admin")
+
+    @property
+    def base_url(self):
+        """Base of the HTTP API URL. Defaults to '/v1.1'."""
+        return self.get("base_url", "/v1.1")
+
+    @property
+    def project_id(self):
+        """Base of the HTTP API URL. Defaults to '/v1.1'."""
+        return self.get("project_id", "admin")
+
+    @property
+    def api_key(self):
+        """API key to use when authenticating. Defaults to 'admin_key'."""
+        return self.get("api_key", "admin_key")
+
+    @property
+    def ssh_timeout(self):
+        """Timeout in seconds to use when connecting via ssh."""
+        return float(self.get("ssh_timeout", 300))
+
+    @property
+    def build_timeout(self):
+        """Timeout in seconds to use when connecting via ssh."""
+        return float(self.get("build_timeout", 300))
+
+
+
+class EnvironmentConfig(object):
+    def __init__(self, conf):
+        """Initialize a Environment-specific configuration object."""
+        self.conf = conf
+
+    def get(self, item_name, default_value):
+        try:
+            return self.conf.get("environment", item_name)
+        except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
+            return default_value
+
+    @property
+    def image_ref(self):
+        """Valid imageRef to use """
+        return self.get("image_ref", 3);
+
+    @property
+    def image_ref_alt(self):
+        """Valid imageRef to rebuild images with"""
+        return self.get("image_ref_alt", 3);
+
+    @property
+    def flavor_ref(self):
+        """Valid flavorRef to use"""
+        return self.get("flavor_ref", 1);
+
+    @property
+    def flavor_ref_alt(self):
+        """Valid flavorRef to resize images with"""
+        return self.get("flavor_ref_alt", 2);
+
+    @property
+    def multi_node(self):
+        """ Does the test environment have more than one compute node """
+        return self.get("multi_node", 'false') != 'false'
+
+
+class StackConfig(object):
+    """Provides `kong` configuration information."""
+
+    _path = None
+
+    def __init__(self, path=None):
+        """Initialize a configuration from a path."""
+        self._path = path or self._path
+        self._conf = self.load_config(self._path)
+        self.nova = NovaConfig(self._conf)
+        self.env = EnvironmentConfig(self._conf)
+
+    def load_config(self, path=None):
+        """Read configuration from given path and return a config object."""
+        config = ConfigParser.SafeConfigParser()
+        config.read(path)
+        return config
