diff --git a/planetstack/observer/steps/sync_nodes.py b/planetstack/observer/steps/sync_nodes.py
new file mode 100644
index 0000000..a1f0803
--- /dev/null
+++ b/planetstack/observer/steps/sync_nodes.py
@@ -0,0 +1,42 @@
+import os
+import base64
+import random
+from datetime import datetime 
+from django.db.models import F, Q
+from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
+from core.models.node import Node
+from core.models.deployment import Deployment
+from core.models.site import Site
+
+class SyncNodes(OpenStackSyncStep):
+    provides=[Node]
+    requested_interval=0
+
+    def fetch_pending(self):
+        config = Config()
+        deployment = Deployment.objects.filter(name=config.plc_deployment)[0]
+        login_bases = ['princeton', 'stanford', 'gt', 'uw', 'mpisws']
+        sites = Site.objects.filter(login_base__in=login_bases)
+        
+        # collect local nodes
+        nodes = Node.objects.all()
+        node_hostnames  = [node.name for node in nodes]
+
+        # collect nova nodes
+        # generate list of new nodes
+        new_nodes = []
+        compute_nodes = self.driver.shell.nova.hypervisors.list()
+        for compute_node in compute_nodes:
+            if compute_node.hypervisor_hostname not in node_hostnames:
+                # pick a random site to add the node to for now
+                site_index = random.randint(0, len(sites))
+                node = Node(name=compute_node.hypervisor_hostname, 
+                            site=sites[site_index], deployment=deployment)
+                new_nodes.append(node) 
+        
+        return new_nodes
+
+    def sync_record(self, node):
+        node.save()
+          
