diff --git a/stress/state.py b/stress/state.py
index 60b1acc..3a9f12e 100644
--- a/stress/state.py
+++ b/stress/state.py
@@ -11,19 +11,21 @@
 #    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.
-"""A class to store the state of various persistent objects in the Nova
-cluster, e.g. instances, volumes.  Use methods to query to state which than
-can be compared to the current state of the objects in Nova"""
 
 
-class State(object):
+class ClusterState(object):
+    """A class to store the state of various persistent objects in the Nova
+    cluster, e.g. instances, volumes.  Use methods to query to state which than
+    can be compared to the current state of the objects in Nova"""
 
     def __init__(self, **kwargs):
         self._max_vms = kwargs.get('max_vms', 32)
         self._instances = {}
-        self._volumes = {}
+        self._floating_ips = []
+        self._keypairs = []
+        self._volumes = []
 
-    # machine state methods
+    # instance state methods
     def get_instances(self):
         """return the instances dictionary that we believe are in cluster."""
         return self._instances
@@ -39,3 +41,75 @@
     def delete_instance_state(self, key):
         """Delete state indexed at `key`."""
         del self._instances[key]
+
+    #floating_ip state methods
+    def get_floating_ips(self):
+        """return the floating ips list for the cluster."""
+        return self._floating_ips
+
+    def add_floating_ip(self, floating_ip_state):
+        """Add floating ip."""
+        self._floating_ips.append(floating_ip_state)
+
+    def remove_floating_ip(self, floating_ip_state):
+        """Remove floating ip."""
+        self._floating_ips.remove(floating_ip_state)
+
+    # keypair methods
+    def get_keypairs(self):
+        """return the keypairs list for the cluster."""
+        return self._keypairs
+
+    def add_keypair(self, keypair_state):
+        """Add keypair."""
+        self._keypairs.append(keypair_state)
+
+    def remove_keypair(self, keypair_state):
+        """Remove keypair."""
+        self._keypairs.remove(keypair_state)
+
+    # volume methods
+    def get_volumes(self):
+        """return the volumes list for the cluster."""
+        return self._volumes
+
+    def add_volume(self, volume_state):
+        """Add volume."""
+        self._volumes.append(volume_state)
+
+    def remove_volume(self, volume_state):
+        """Remove volume."""
+        self._volumes.remove(volume_state)
+
+
+class ServerAssociatedState(object):
+    """Class that tracks resources that are associated with a particular server
+    such as a volume or floating ip"""
+
+    def __init__(self, resource_id):
+        # The id of the server.
+        self.server_id = None
+        # The id of the resource that is attached to the server.
+        self.resource_id = resource_id
+        # True if in the process of attaching/detaching the resource.
+        self.change_pending = False
+
+
+class FloatingIpState(ServerAssociatedState):
+
+    def __init__(self, ip_desc):
+        super(FloatingIpState, self).__init__(ip_desc['id'])
+        self.address = ip_desc['ip']
+
+
+class VolumeState(ServerAssociatedState):
+
+    def __init__(self, volume_desc):
+        super(VolumeState, self).__init__(volume_desc['id'])
+
+
+class KeyPairState(object):
+
+    def __init__(self, keypair_spec):
+        self.name = keypair_spec['name']
+        self.private_key = keypair_spec['private_key']
