diff --git a/xos/synchronizers/onboarding/steps/sync_servicecontroller.py b/xos/synchronizers/onboarding/steps/sync_servicecontroller.py
index 77d8e12..9354987 100644
--- a/xos/synchronizers/onboarding/steps/sync_servicecontroller.py
+++ b/xos/synchronizers/onboarding/steps/sync_servicecontroller.py
@@ -36,7 +36,12 @@
         if unready:
             raise Exception("Controller %s has unready resources: %s" % (str(sc), ",".join([str(x) for x in unready])))
 
-        dockerfiles = [self.create_synchronizer_dockerfile(sc)]
+        dockerfile = self.create_synchronizer_dockerfile(sc)
+        if dockerfile:
+            dockerfiles=[dockerfile]
+        else:
+            dockerfiles=[]
+
         tenant_fields = {"dockerfiles": dockerfiles,
                          "build_dir": self.build_dir,
                          "ansible_tag": sc.__class__.__name__ + "_" + str(sc.id)}
diff --git a/xos/synchronizers/onboarding/xosbuilder.py b/xos/synchronizers/onboarding/xosbuilder.py
index 8e3ad4e..b27e829 100644
--- a/xos/synchronizers/onboarding/xosbuilder.py
+++ b/xos/synchronizers/onboarding/xosbuilder.py
@@ -11,6 +11,8 @@
 from core.models import Service, ServiceController, ServiceControllerResource, XOS
 from xos.logger import Logger, logging
 
+from django.utils import timezone
+
 logger = Logger(level=logging.INFO)
 
 class XOSBuilder(object):
@@ -21,6 +23,7 @@
     def __init__(self):
         self.source_sync_image = "xosproject/xos-synchronizer-openstack"
         self.build_dir = "/opt/xos/BUILD/"
+        self.build_tainted = False
 
     # stuff that has to do with downloading
 
@@ -143,10 +146,29 @@
     def get_controller_script_lines(self, controller, kinds):
         need_service_init_py = False
         script=[]
-        for scr in controller.service_controller_resources.all():
-            if scr.kind in kinds:
-                lines = self.get_script_lines(scr)
-                script = script + lines
+        for scr in list(controller.service_controller_resources.all()):
+            if not (scr.kind in kinds):
+                continue
+
+            # Check and see if the resource we're trying to install has
+            # disappeared. This may happen if the onboarding synchronizer
+            # container has been destroyed and restarted. In this case, flag
+            # the resource for re-download, and set the build_tainted bit
+            # so we can throw an exception after we've evaluated all
+            # resources.
+
+            download_fn = self.get_download_fn(scr)
+            if not os.path.exists(download_fn):
+                logger.info("File %s is missing; dirtying the resource" % download_fn)
+                scr.backend_status = "2 - download_fn is missing"
+                scr.updated = timezone.now()
+                scr.save(update_fields=['backend_status', 'updated'])
+                self.build_tainted = True
+                continue
+
+            lines = self.get_script_lines(scr)
+            script = script + lines
+
             if scr.kind in ["admin", "models"]:
                 need_service_init_py = True
 
@@ -182,6 +204,7 @@
             file(os.path.join(self.build_dir, "opt/xos/xos/%s_xosbuilder_migration_list") % name, "w").write("\n".join(migration_list)+"\n")
 
     def create_ui_dockerfile(self):
+        self.build_tainted = False
         xos = XOS.objects.all()[0]
         dockerfile_fn = "Dockerfile.UI"
 
@@ -209,14 +232,25 @@
 
         file(os.path.join(self.build_dir, dockerfile_fn), "w").write("\n".join(dockerfile)+"\n")
 
+        if self.build_tainted:
+            raise Exception("Build was tainted due to errors")
+
         return {"dockerfile_fn": dockerfile_fn,
                 "docker_image_name": "xosproject/xos-ui"}
 
     def create_synchronizer_dockerfile(self, controller):
+        self.build_tainted = False
+
         # bake in the synchronizer from this controller
         sync_lines = self.get_controller_script_lines(controller, self.SYNC_CONTROLLER_KINDS)
+
+        if self.build_tainted:
+            raise Exception("Build was tainted due to errors")
+
+        # If there's no sync_lines for this ServiceController, then it must not
+        # have a synchronizer.
         if not sync_lines:
-            return []
+            return None
 
         dockerfile_fn = "Dockerfile.%s" % controller.name
         dockerfile = ["FROM %s" % self.source_sync_image]
@@ -242,6 +276,9 @@
 
         file(os.path.join(self.build_dir, dockerfile_fn), "w").write("\n".join(dockerfile)+"\n")
 
+        if self.build_tainted:
+            raise Exception("Build was tainted due to errors")
+
         return {"dockerfile_fn": dockerfile_fn,
                 "docker_image_name": "xosproject/xos-synchronizer-%s" % controller.name}
 
