diff --git a/xos/tools/corebuilder/corebuilder.py b/xos/tools/corebuilder/corebuilder.py
index 01ea525..ac99b01 100644
--- a/xos/tools/corebuilder/corebuilder.py
+++ b/xos/tools/corebuilder/corebuilder.py
@@ -45,13 +45,13 @@
 
 import argparse
 import os
-import pdb
-import shutil
-import sys
-import tempfile
-import traceback
-import urlparse
-
+import pdb
+import shutil
+import sys
+import tempfile
+import traceback
+import urlparse
+
 from toscaparser.tosca_template import ToscaTemplate
 
 BUILD_DIR = "/opt/xos_corebuilder/BUILD"
@@ -81,9 +81,9 @@
 class XOSCoreBuilder(object):
     def __init__(self, recipe_list, parent_dir=None):
         # TOSCA will look for imports using a relative path from where the
-        # template file is located, so we have to put the template file
-        # in a specific place.
-        if not parent_dir:
+        # template file is located, so we have to put the template file
+        # in a specific place.
+        if not parent_dir:
             parent_dir = os.getcwd()
 
         self.parent_dir = parent_dir
@@ -155,68 +155,68 @@
 
     def execute_recipe(self, tosca_yaml):
         tmp_pathname = None
-        try:
-            (tmp_handle, tmp_pathname) = tempfile.mkstemp(dir=self.parent_dir, suffix=".yaml")
-            os.write(tmp_handle, tosca_yaml)
-            os.close(tmp_handle)
-
-            template = ToscaTemplate(tmp_pathname)
-        except:
-            traceback.print_exc()
-            raise
-        finally:
-            if tmp_pathname:
-                os.remove(tmp_pathname)
-
-        # Only one model (ServiceController aka Library), so no need to sort
-        # dependencies...
-
-        for nodetemplate in template.nodetemplates:
-            self.execute_nodetemplate(nodetemplate)
-
-    def execute_nodetemplate(self, nodetemplate):
-        if nodetemplate.type == "tosca.nodes.ServiceController":
-            self.execute_servicecontroller(nodetemplate)
-        elif nodetemplate.type == "tosca.nodes.Library":
-            # Library works just like ServiceController
-            self.execute_servicecontroller(nodetemplate)
-        else:
-            raise CoreBuilderUnknownResourceException("Nodetemplate %s's type %s is not a known resource" % (nodetemplate.name, nodetemplate.type))
-
-    def execute_servicecontroller(self, nodetemplate):
-        service_name = nodetemplate.name
-        if "#" in service_name:
-            service_name = service_name.split("#")[1]
-
-        base = self.get_property_default(nodetemplate, "base_url", None)
-
-        copyin_resources = ("xproto", "models", "admin", "admin_template", "django_library", "tosca_custom_types", "tosca_resource",
-                            "rest_service", "rest_tenant", "private_key", "public_key", "vendor_js")
-
-        for k in copyin_resources:
-            v = self.get_property_default(nodetemplate, k, None)
-            if not v:
-                continue
-
-            # Private keys should not be installed to core, only synchronizers
-            if (k=="private_key"):
-                continue
-
-            # Public keys should be volume mounted in /opt/cord_profile
-            if (k=="public_key"):
-                continue
-
-            # If the ServiceController has models, then add it to the list of
-            # django apps.
-            if (k in ["models","xproto"] and service_name!="core"):
-                self.app_names.append(service_name)
-
-            # filenames can be comma-separated
-            for src_fn in v.split(","):
-                src_fn = src_fn.strip()
-
-                # parse the "subdirectory:name" syntax
-                subdirectory = ""
+        try:
+            (tmp_handle, tmp_pathname) = tempfile.mkstemp(dir=self.parent_dir, suffix=".yaml")
+            os.write(tmp_handle, tosca_yaml)
+            os.close(tmp_handle)
+
+            template = ToscaTemplate(tmp_pathname)
+        except:
+            traceback.print_exc()
+            raise
+        finally:
+            if tmp_pathname:
+                os.remove(tmp_pathname)
+
+        # Only one model (ServiceController aka Library), so no need to sort
+        # dependencies...
+
+        for nodetemplate in template.nodetemplates:
+            self.execute_nodetemplate(nodetemplate)
+
+    def execute_nodetemplate(self, nodetemplate):
+        if nodetemplate.type == "tosca.nodes.ServiceController":
+            self.execute_servicecontroller(nodetemplate)
+        elif nodetemplate.type == "tosca.nodes.Library":
+            # Library works just like ServiceController
+            self.execute_servicecontroller(nodetemplate)
+        else:
+            raise CoreBuilderUnknownResourceException("Nodetemplate %s's type %s is not a known resource" % (nodetemplate.name, nodetemplate.type))
+
+    def execute_servicecontroller(self, nodetemplate):
+        service_name = nodetemplate.name
+        if "#" in service_name:
+            service_name = service_name.split("#")[1]
+
+        base = self.get_property_default(nodetemplate, "base_url", None)
+
+        copyin_resources = ("xproto", "models", "admin", "admin_template", "django_library", "tosca_custom_types", "tosca_resource",
+                            "rest_service", "rest_tenant", "private_key", "public_key", "vendor_js")
+
+        for k in copyin_resources:
+            v = self.get_property_default(nodetemplate, k, None)
+            if not v:
+                continue
+
+            # Private keys should not be installed to core, only synchronizers
+            if (k=="private_key"):
+                continue
+
+            # Public keys should be volume mounted in /opt/cord_profile
+            if (k=="public_key"):
+                continue
+
+            # If the ServiceController has models, then add it to the list of
+            # django apps.
+            if (k in ["models","xproto"] and service_name!="core"):
+                self.app_names.append(service_name)
+
+            # filenames can be comma-separated
+            for src_fn in v.split(","):
+                src_fn = src_fn.strip()
+
+                # parse the "subdirectory:name" syntax
+                subdirectory = ""
                 if (" " in src_fn):
                     parts=src_fn.split()
                     for part in parts[:-1]:
@@ -228,57 +228,59 @@
                                raise CoreBuilderMalformedValueException("Malformed value %s in resource %s of recipe %s" % (v, k, nodetemplate.name))
                        else:
                            raise CoreBuilderMalformedValueException("Malformed value %s in resource %s of recipe %s" % (v, k, nodetemplate.name))
-                    src_fn = parts[-1]
-
-                # apply base_url to src_fn
-                if base:
-                    src_fn = urlparse.urljoin(base, src_fn)
-
-                # ensure that it's a file:// url
-                if not src_fn.startswith("file://"):
-                    raise CoreBuilderMalformedUrlException("Resource `%s: %s` of recipe %s does not start with file://" % (k, src_fn, nodetemplate.name))
-                src_fn = src_fn[7:]
-
-                src_fn = self.fixup_path(src_fn)
-
-                if not os.path.exists(src_fn):
-                    raise CoreBuilderMissingResourceException("Resource '%s: %s' of recipe %s does not exist" % (k, src_fn, nodetemplate.name))
-
-                dest_dir = self.get_dest_dir(k, service_name)
-                dest_fn = os.path.join(dest_dir, subdirectory, os.path.basename(src_fn))
-
-                self.resources.append( (k, src_fn, dest_fn, service_name) )
-
-                # add __init__.py files anywhere that we created a new
-                # directory.
-                if k in ["admin", "models", "rest_service", "rest_tenant"]:
-                    if dest_dir not in self.inits:
-                        self.inits.append(dest_dir)
-
-                    if subdirectory:
-                        dir = dest_dir
-                        for part in subdirectory.split("/"):
-                            dir = os.path.join(dir, part)
-                            if dir not in self.inits:
-                                self.inits.append(dir)
-
-    def build(self):
-        # Destroy anything in the old build directory
-        if os.path.exists(BUILD_DIR):
-            for dir in os.listdir(BUILD_DIR):
-                shutil.rmtree(os.path.join(BUILD_DIR, dir))
-
-        # Copy all of the resources into the build directory
-        for (kind, src_fn, dest_fn, service_name) in self.resources:
-            build_dest_fn = os.path.join(BUILD_DIR, dest_fn)
-            makedirs_if_noexist(os.path.dirname(build_dest_fn))
+                    src_fn = parts[-1]
+
+                # apply base_url to src_fn
+                if base:
+                    src_fn = urlparse.urljoin(base, src_fn)
+
+                # ensure that it's a file:// url
+                if not src_fn.startswith("file://"):
+                    raise CoreBuilderMalformedUrlException("Resource `%s: %s` of recipe %s does not start with file://" % (k, src_fn, nodetemplate.name))
+                src_fn = src_fn[7:]
+
+                src_fn = self.fixup_path(src_fn)
+
+                if not os.path.exists(src_fn):
+                    raise CoreBuilderMissingResourceException("Resource '%s: %s' of recipe %s does not exist" % (k, src_fn, nodetemplate.name))
+
+                dest_dir = self.get_dest_dir(k, service_name)
+                dest_fn = os.path.join(dest_dir, subdirectory, os.path.basename(src_fn))
+
+                self.resources.append( (k, src_fn, dest_fn, service_name) )
+
+                # Add __init__.py files anywhere that we created a new
+                # directory.
+                # NOTE: omitting core, out of concern it could interfere with
+                #       core's __init__.py file.
+                if ((k in ["admin", "models", "rest_service", "rest_tenant", "xproto"]) and (service_name!="core")):
+                    if dest_dir not in self.inits:
+                        self.inits.append(dest_dir)
+
+                    if subdirectory:
+                        dir = dest_dir
+                        for part in subdirectory.split("/"):
+                            dir = os.path.join(dir, part)
+                            if dir not in self.inits:
+                                self.inits.append(dir)
+
+    def build(self):
+        # Destroy anything in the old build directory
+        if os.path.exists(BUILD_DIR):
+            for dir in os.listdir(BUILD_DIR):
+                shutil.rmtree(os.path.join(BUILD_DIR, dir))
+
+        # Copy all of the resources into the build directory
+        for (kind, src_fn, dest_fn, service_name) in self.resources:
+            build_dest_fn = os.path.join(BUILD_DIR, dest_fn)
+            makedirs_if_noexist(os.path.dirname(build_dest_fn))
             if (os.path.isdir(src_fn)):
                 if (not os.path.isdir(build_dest_fn)):
                     shutil.copytree(src_fn, build_dest_fn, symlinks=True)
                 else:
                     os.system('cp -R %s/*.xproto %s/attic %s/*header.py %s'%(src_fn, src_fn, src_fn, build_dest_fn))
             else:
-                shutil.copyfile(src_fn, build_dest_fn)
+                shutil.copyfile(src_fn, build_dest_fn)
 
             if (kind=='xproto'):
                 # Invoke xproto toolchain in the destination directory
@@ -297,24 +299,24 @@
                 if (os.system('make -C %s -f %s PREFIX=%s'%(build_dest_fn, makefile_name, xosgen_path))):
                     raise Exception('xproto build failed!')
 
-
-        # Create the __init__.py files
-        for fn in self.inits:
-            build_dest_fn = os.path.join(BUILD_DIR, fn, "__init__.py")
-            makedirs_if_noexist(os.path.dirname(build_dest_fn))
-            file(build_dest_fn, "w").write("")
-
-        # Generate the migration list
-        mig_list_fn = os.path.join(BUILD_DIR, "opt/xos/xos", "xosbuilder_migration_list")
-        makedirs_if_noexist(os.path.dirname(mig_list_fn))
-        file(mig_list_fn, "w").write("\n".join(self.app_names)+"\n")
-
-        # Generate the app list
-        app_list_fn = os.path.join(BUILD_DIR, "opt/xos/xos", "xosbuilder_app_list")
-        makedirs_if_noexist(os.path.dirname(app_list_fn))
-        file(app_list_fn, "w").write("\n".join(["services.%s" % x for x in self.app_names])+"\n")
-
-def parse_args():
+
+        # Create the __init__.py files
+        for fn in self.inits:
+            build_dest_fn = os.path.join(BUILD_DIR, fn, "__init__.py")
+            makedirs_if_noexist(os.path.dirname(build_dest_fn))
+            file(build_dest_fn, "w").write("")
+
+        # Generate the migration list
+        mig_list_fn = os.path.join(BUILD_DIR, "opt/xos/xos", "xosbuilder_migration_list")
+        makedirs_if_noexist(os.path.dirname(mig_list_fn))
+        file(mig_list_fn, "w").write("\n".join(self.app_names)+"\n")
+
+        # Generate the app list
+        app_list_fn = os.path.join(BUILD_DIR, "opt/xos/xos", "xosbuilder_app_list")
+        makedirs_if_noexist(os.path.dirname(app_list_fn))
+        file(app_list_fn, "w").write("\n".join(["services.%s" % x for x in self.app_names])+"\n")
+
+def parse_args():
     parser = argparse.ArgumentParser()
 
     _help = 'enable verbose logging'
@@ -333,29 +335,29 @@
     args = parser.parse_args()
 
     return args
-
-def main():
-   global options
-
-   options = parse_args()
-
-   try:
-       builder = XOSCoreBuilder(options.recipe_names)
-       builder.build()
-   except CoreBuilderException, e:
-       if options.verbose:
-           traceback.print_exc()
-       else:
-           print >> sys.stderr, "Error:", str(e)
-       sys.exit(-1)
-
-if __name__ == "__main__":
-    main()
-
-
 
-
-
-
-
+def main():
+   global options
+
+   options = parse_args()
+
+   try:
+       builder = XOSCoreBuilder(options.recipe_names)
+       builder.build()
+   except CoreBuilderException, e:
+       if options.verbose:
+           traceback.print_exc()
+       else:
+           print >> sys.stderr, "Error:", str(e)
+       sys.exit(-1)
+
+if __name__ == "__main__":
+    main()
+
+
+
+
+
+
+
 
