diff --git a/planetstack/ec2_observer/steps/sync_nodes.py b/planetstack/ec2_observer/steps/sync_nodes.py
deleted file mode 100644
index 0fa8b61..0000000
--- a/planetstack/ec2_observer/steps/sync_nodes.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import os
-import base64
-import random
-import time
-from datetime import datetime 
-from django.db.models import F, Q
-from planetstack.config import Config
-from ec2_observer.syncstep import SyncStep
-from core.models.node import Node
-from core.models.site import *
-from ec2_observer.awslib import *
-import pdb
-
-class SyncNodes(SyncStep):
-    provides=[Node]
-    requested_interval=0
-
-    def fetch_pending(self, deletion):
-        if (deletion):
-            return []
-
-        deployment = Deployment.objects.filter(Q(name="Amazon EC2"))[0]
-        current_site_deployments = SiteDeployment.objects.filter(Q(deployment=deployment))
-
-        zone_ret = aws_run('ec2 describe-availability-zones')
-        zones = zone_ret['AvailabilityZones']
-
-        # collect local nodes
-        instance_types = 'm1.small | m1.medium | m1.large | m1.xlarge | m3.medium | m3.large | m3.xlarge | m3.2xlarge'.split(' | ')
-
-        all_new_nodes = []
-        for sd in current_site_deployments:
-            s = sd.site
-            current_fqns = [n.name for n in s.nodes.all()]
-            all_fqns = ['.'.join([n,s.name]) for n in instance_types]
-            new_node_names = list(set(all_fqns) - set(current_fqns))
-
-            new_nodes = []
-            for node_name in new_node_names:
-                node = Node(name=node_name,
-                            site=s,deployment=deployment)
-                new_nodes.append(node)
-
-            all_new_nodes.extend(new_nodes)
-
-        return all_new_nodes
-                 
-
-    def sync_record(self, node):
-        node.save()
-          
diff --git a/planetstack/openstack_observer/steps/sync_nodes.py b/planetstack/openstack_observer/steps/sync_nodes.py
deleted file mode 100644
index e2c63bc..0000000
--- a/planetstack/openstack_observer/steps/sync_nodes.py
+++ /dev/null
@@ -1,61 +0,0 @@
-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.site import SiteDeployment, Controller
-from util.logger import Logger, logging
-
-logger = Logger(level=logging.INFO)
-
-class SyncNodes(OpenStackSyncStep):
-    provides=[Node]
-    requested_interval=0
-
-    def fetch_pending(self, deleted):
-        # Nodes come from the back end
-        # You can't delete them
-        if (deleted):
-            return []
-
-        # collect local nodes
-        controllers = Controller.objects.all()
-        nodes = Node.objects.all()
-        node_hostnames = [node.name for node in nodes]
-
-        # fetch all nodes from each controller
-        new_nodes = []
-        for controller in controllers:
-            try:
-            	controller_site_deployments = SiteDeployment.objects.filter(controller=controller)[0]
-	    except IndexError:
-                raise Exception("Controller %s not bound to any site deployments"%controller.name)
-
-            site_deployment = controller_site_deployments.site_deployment
-            if (not site_deployment):
-                raise Exception('Controller without Site Deployment: %s'%controller.name)
-
-            try:
-                driver = self.driver.admin_driver(controller=controller,tenant='admin')
-                compute_nodes = driver.shell.nova.hypervisors.list()
-            except:
-                logger.log_exc("Failed to get nodes from controller %s" % str(controller))
-                continue
-
-            for compute_node in compute_nodes:
-                if compute_node.hypervisor_hostname not in node_hostnames:
-                    # XX TODO:figure out how to correctly identify a node's site.
-                    # XX pick the first one
-                    node = Node(name=compute_node.hypervisor_hostname,
-                                site_deployment=site_deployment)
-                    new_nodes.append(node)
-
-        return new_nodes    
-                 
-
-    def sync_record(self, node):
-        node.save()
-          
