diff --git a/libcloud/drivers/dummy.py b/libcloud/drivers/dummy.py
index 04e006c..2e19747 100644
--- a/libcloud/drivers/dummy.py
+++ b/libcloud/drivers/dummy.py
@@ -36,6 +36,29 @@ class DummyConnection(ConnectionKey):
 class DummyNodeDriver(NodeDriver):
     """
     Dummy node driver
+
+    This is a fake driver which appears to create or destroy
+    nodes always successfully.
+
+    >>> from libcloud.drivers.dummy import DummyNodeDriver
+    >>> driver = DummyNodeDriver(0)
+    >>> node=driver.create_node()
+    >>> node.public_ip[0]
+    '127.0.0.3'
+    >>> node.name
+    'dummy-3'
+
+    If the credentials you give convert to an integer then the next
+    node to be created will be one higher.
+
+    each time you create a node you will get the a different IP
+    address
+
+    >>> driver = DummyNodeDriver(22)
+    >>> node=driver.create_node()
+    >>> node.name
+    'dummy-23'
+
     """
 
     name = "Dummy Node Provider"
@@ -84,18 +107,91 @@ class DummyNodeDriver(NodeDriver):
         return str(uuid.uuid4())
 
     def list_nodes(self):
+        """
+        list the nodes known to a particular driver;  There are two default nodes created at the beginning
+
+
+        >>> from libcloud.drivers.dummy import DummyNodeDriver
+        >>> driver = DummyNodeDriver(0)
+        >>> node_list=driver.list_nodes()
+        >>> sorted([node.name for node in node_list ])
+        ['dummy-1', 'dummy-2']
+
+        each item in the list returned is a node object from which you
+        can carry out any node actions you wish
+
+        >>> node_list[0].reboot()
+        True
+
+        as more nodes are added list nodes will return them
+
+        >>> node=driver.create_node()
+        >>> sorted([node.name for node in driver.list_nodes()])
+        ['dummy-1', 'dummy-2', 'dummy-3']
+
+        """
+
         return self.nl
 
     def reboot_node(self, node):
+        """
+        sets the node state to rebooting; In this dummy driver always
+        returns True as if the reboot had been successful.
+
+        >>> from libcloud.drivers.dummy import DummyNodeDriver
+        >>> driver = DummyNodeDriver(0)
+        >>> node=driver.create_node()
+        >>> from libcloud.types import NodeState
+        >>> node.state == NodeState.RUNNING
+        True
+        >>> node.state == NodeState.REBOOTING
+        False
+        >>> driver.reboot_node(node)
+        True
+        >>> node.state == NodeState.REBOOTING
+        True
+
+        please note; dummy nodes never recover from the reboot.
+
+        """
+
+
         node.state = NodeState.REBOOTING
         return True
 
     def destroy_node(self, node):
+        """
+        sets the node state to terminated and removes it from the node list
+
+        >>> from libcloud.drivers.dummy import DummyNodeDriver
+        >>> driver = DummyNodeDriver(0)
+        >>> from libcloud.types import NodeState
+        >>> node = [node for node in driver.list_nodes() if node.name == 'dummy-1'][0]
+        >>> node.state == NodeState.RUNNING
+        True
+        >>> driver.destroy_node(node)
+        True
+        >>> node.state == NodeState.RUNNING
+        False
+        >>> [node for node in driver.list_nodes() if node.name == 'dummy-1']
+        []
+
+        """
+
         node.state = NodeState.TERMINATED
         self.nl.remove(node)
         return True
 
     def list_images(self, location=None):
+        """
+        returns a list of images as a cloud provider might have
+
+        >>> from libcloud.drivers.dummy import DummyNodeDriver
+        >>> driver = DummyNodeDriver(0)
+        >>> sorted([image.name for image in driver.list_images()])
+        ['Slackware 4', 'Ubuntu 9.04', 'Ubuntu 9.10']
+
+        """
         return [
             NodeImage(id=1, name="Ubuntu 9.10", driver=self),
             NodeImage(id=2, name="Ubuntu 9.04", driver=self),
@@ -103,7 +199,17 @@ class DummyNodeDriver(NodeDriver):
         ]
 
     def list_sizes(self, location=None):
-        return [
+      """
+      returns a list of node sizes as a cloud provider might have
+
+      >>> from libcloud.drivers.dummy import DummyNodeDriver
+      >>> driver = DummyNodeDriver(0)
+      >>> sorted([size.ram for size in driver.list_sizes()])
+      [128, 512, 4096, 8192]
+
+      """
+
+      return [
           NodeSize(id=1,
                    name="Small",
                    ram=128,
@@ -135,6 +241,15 @@ class DummyNodeDriver(NodeDriver):
         ]
 
     def list_locations(self):
+        """
+        returns a list of locations of nodes
+
+        >>> from libcloud.drivers.dummy import DummyNodeDriver
+        >>> driver = DummyNodeDriver(0)
+        >>> sorted([loc.name + " in " + loc.country for loc in driver.list_locations()])
+        ['Island Datacenter in FJ', 'London Loft in GB', "Paul's Room in US"]
+
+        """
         return [
           NodeLocation(id=1,
                        name="Paul's Room",
@@ -151,6 +266,37 @@ class DummyNodeDriver(NodeDriver):
         ]
 
     def create_node(self, **kwargs):
+        """
+        creates a dummy node; the node id is equal to the number of
+        nodes in the node list
+
+        >>> from libcloud.drivers.dummy import DummyNodeDriver
+        >>> driver = DummyNodeDriver(0)
+        >>> sorted([node.name for node in driver.list_nodes()])
+        ['dummy-1', 'dummy-2']
+        >>> nodeA = driver.create_node()
+        >>> sorted([node.name for node in driver.list_nodes()])
+        ['dummy-1', 'dummy-2', 'dummy-3']
+        >>> driver.create_node().name
+        'dummy-4'
+        >>> driver.destroy_node(nodeA)
+        True
+        >>> sorted([node.name for node in driver.list_nodes()])
+        ['dummy-1', 'dummy-2', 'dummy-4']
+
+
+        if we create a node after a delete, wierd things happen!!
+
+        >>> # FIXME - this shouldn't happen
+        >>> driver.create_node().name
+        'dummy-4'
+        >>> # FIXME - nor should this
+        >>> sorted([node.name for node in driver.list_nodes()])
+        ['dummy-1', 'dummy-2', 'dummy-4', 'dummy-4']
+
+        """
+        #FIXME - this is too clever by half, we should just use a
+        #counter in the class.  As it is this is a bug.
         l = len(self.nl) + 1
         n = Node(id=l,
                  name='dummy-%d' % l,
@@ -167,3 +313,7 @@ def _ip_to_int(ip):
 
 def _int_to_ip(ip):
     return socket.inet_ntoa(struct.pack('I', socket.ntohl(ip)))
+
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod()
