diff --git a/README.md b/README.md
index ff9744f..c6bea64 100644
--- a/README.md
+++ b/README.md
@@ -1,44 +1,46 @@
-# Virtual Home Subscriber Server Service
+# Virtual Home Subscriber Server Service (vHSS)
 
 ## Onboarding
 
-To onboard this service in your system, you can add the service to the `mcord.yml` profile manifest:
+To onboard this service in your system, you can add the service to the `mcord.yml` profile manifest (location: $CORD/build/platform-install/profile_manifests/mcord.yml):
 
 ```
 xos_services:
   - name: vhss
     path: orchestration/xos_services/vhss
     keypair: mcord_rsa
-    synchronizer: true
 ```
 
-Once you have added the service, you will need to rebuild and redeploy the XOS containers from source. Login to the `corddev` vm and `cd /cord/build`
+In addition, you should add the synchronizer for this service to the `docker_images.yml` (location: $CORD/build/docker_images.yml):
 
 ```
-$ ./gradlew -PdeployConfig=config/mcord_in_a_box.yml PIprepPlatform
-$ ./gradlew -PdeployConfig=config/mcord_in_a_box.yml :platform-install:buildImages
-$ ./gradlew -PdeployConfig=config/mcord_in_a_box.yml :platform-install:publish
-$ ./gradlew -PdeployConfig=config/mcord_in_a_box.yml :orchestration:xos:publish
+  - name: xosproject/vhss-synchronizer
+    repo: vHSS
+    path: "xos/synchronizer"
+    dockerfile: "Dockerfile.synchronizer"
 ```
 
-Now the new XOS images should be published to the registry on `prod`. To bring them up, login to the `prod` VM and define these aliases:
+To build the synchronizer as a container, following codes should be written in scenario files, e.g., cord, local, mock, and so on:
 
 ```
-$ CORD_PROFILE=$( cat /opt/cord_profile/profile_name )
-$ alias xos-pull="docker-compose -p $CORD_PROFILE -f /opt/cord_profile/docker-compose.yml pull"
-$ alias xos-up="docker-compose -p $CORD_PROFILE -f /opt/cord_profile/docker-compose.yml up -d --remove-orphans"
-$ alias xos-teardown="pushd /opt/cord/build/platform-install; ansible-playbook -i inventory/head-localhost --extra-vars @/opt/cord/build/genconfig/config.yml teardown-playbook.yml; popd"
-$ alias compute-node-refresh="pushd /opt/cord/build/platform-install; ansible-playbook -i /etc/maas/ansible/pod-inventory --extra-vars=@/opt/cord/build/genconfig/config.yml compute-node-refresh-playbook.yml; popd"
+docker_image_whitelist:
+  - "xosproject/vhss-synchronizer"
 ```
 
-To pull new images from the database and launch the containers, while retaining the existing XOS database, run:
+For this, the exact location for each scenario is as follows:
+ - for CORD scenario: $CROD/build/scenarios/cord/config.yml
+ - for Local scenario: $CROD/build/scenarios/local/config.yml
+ - for Mock scenario: $CROD/build/scenarios/mock/config.yml
+ - for Opencloud scenario: $CROD/build/scenarios/opencloud/config.yml
+ - for Single scenario: $CROD/build/scenarios/single/config.yml
+
+Once you have added the service, you will need to rebuild and redeploy the XOS containers from source.
 
 ```
-$ xos-pull; xos-up
-```
-
-Alternatively, to remove the XOS database and reinitialize XOS from scratch, run:
-
-```
-$ xos-teardown; xos-pull; xos-launch; compute-node-refresh
+$ cd $CORD/build
+$ make xos-teardown
+$ make clean-openstack
+$ make clean-profile
+$ make -j4 build
+$ make compute-node-refresh
 ```
diff --git a/xos/models.py b/xos/models.py
deleted file mode 100644
index 3f2b522..0000000
--- a/xos/models.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-from core.models.plcorebase import *
-from models_decl import VHSSService_decl
-from models_decl import VHSSVendor_decl
-from models_decl import VHSSTenant_decl
-
-from django.db import models
-from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool
-from core.models.plcorebase import StrippedCharField
-import os
-from django.db import models, transaction
-from django.forms.models import model_to_dict
-from django.db.models import *
-from operator import itemgetter, attrgetter, methodcaller
-from core.models import Tag
-from core.models.service import LeastLoadedNodeScheduler
-import traceback
-from xos.exceptions import *
-from xos.config import Config
-
-class VHSSService(VHSSService_decl):
-   class Meta:
-        proxy = True 
-
-   def create_tenant(self, **kwargs):
-       t = VHSSTenant(kind="vEPC", provider_service=self, connect_method="na", **kwargs)
-       t.save()
-       return t
-
-class VHSSVendor(VHSSVendor_decl):
-   class Meta:
-       proxy = True
-
-class VHSSTenant(VHSSTenant_decl):
-   class Meta:
-        proxy = True 
-
-   def __init__(self, *args, **kwargs):
-       vhssservice = VHSSService.get_service_objects().all()
-       if vhssservice:
-           self._meta.get_field(
-                   "provider_service").default = vhssservice[0].id
-       super(VHSSTenant, self).__init__(*args, **kwargs)
-
-   @property
-   def image(self):
-       if not self.vhss_vendor:
-           return super(VHSSTenant, self).image
-       return self.vhss_vendor.image
-   
-   def save_instance(self, instance):
-       if self.vhss_vendor:
-           instance.flavor = self.vhss_vendor.flavor
-       super(VHSSTenant, self).save_instance(instance)
-
-   def save(self, *args, **kwargs):
-       if not self.creator:
-           if not getattr(self, "caller", None):
-               raise XOSProgrammingError("VHSSTenant's self.caller was not set")
-           self.creator = self.caller
-           if not self.creator:
-               raise XOSProgrammingError("VHSSTenant's self.creator was not set")
-
-       super(VHSSTenant, self).save(*args, **kwargs)
-       # This call needs to happen so that an instance is created for this
-       # tenant is created in the slice. One instance is created per tenant.
-       model_policy_vhsstenant(self.pk)
-
-   def delete(self, *args, **kwargs):
-       # Delete the instance that was created for this tenant
-       self.cleanup_container()
-       super(VHSSTenant, self).delete(*args, **kwargs)
-
-def model_policy_vhsstenant(pk):
-    # This section of code is atomic to prevent race conditions
-    with transaction.atomic():
-        # We find all of the tenants that are waiting to update
-        tenant = VHSSTenant.objects.select_for_update().filter(pk=pk)
-        if not tenant:
-            return
-        # Since this code is atomic it is safe to always use the first tenant
-        tenant = tenant[0]
-        tenant.manage_container()
diff --git a/xos/synchronizer/model_policies/model_policy_vhsstenant.py b/xos/synchronizer/model_policies/model_policy_vhsstenant.py
new file mode 100644
index 0000000..5520f58
--- /dev/null
+++ b/xos/synchronizer/model_policies/model_policy_vhsstenant.py
@@ -0,0 +1,148 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from synchronizers.new_base.modelaccessor import *
+from synchronizers.new_base.model_policies.model_policy_tenantwithcontainer import TenantWithContainerPolicy, LeastLoadedNodeScheduler
+from synchronizers.new_base.exceptions import *
+
+class VHSSTenantPolicy(TenantWithContainerPolicy):
+    model_name = "VHSSTenant"
+
+    # Already defined in Super class
+    #def handle_create(self, service_instance):
+    #    return self.handle_update(service_instance)
+
+    def handle_update(self, service_instance):
+        if (service_instance. link_deleted_count >0) and (not service_instance.provided_links.exists()):
+            self.logger.info("The last provided link has been deleted -- self-destructing.")
+            self.handle_delete(service_instance)
+            if VHSSTenant.objects.filter(id=service_instance.id).exists():
+                service_instance.delete()
+            else:
+                self.logger.info("Tenant %s is already deleted" % service_instance)
+            return
+
+        self.manage_container(service_instance)
+
+    def handle_delete(self, service_instance):
+        if service_instance.instance and (not service_instance.instance.deleted):
+            all_service_instances_this_instance = VHSSTenant.objects.filter(instance_id=service_instance.instance.id)
+            other_service_instances_this_instance = [x for x in all_service_instances_this_instance if x.id != service_instance.id]
+            if (not other_service_instances_this_instance):
+                self.logger.info("VHSSTenant Instance %s is now unused -- deleting" % service_instance.instance)
+                self.delete_instance(service_instance, service_instance.instance)
+            else:
+                self.logger.info("VHSSTenant Instance %s has %d other service instances attached" %
+                (service_instance.instance, len(other_service_instances_this_instance)))
+
+    def get_service(self, service_instance):
+        service_name = service_instance.owner.leaf_model_name
+        service_class = globals()[service_name]
+        return service_class.objects.get(id=service_instance.owner.id)
+
+    def find_instance_for_instance_tag(self, instance_tag):
+        tags = Tag.objects.filter(name="instance_tag", value=instance_tag)
+        if tags:
+            return tags[0].content_object
+        return None
+
+    def find_or_make_instance_for_instance_tag(self, service_instance):
+        instance_tag = self.get_instance_tag(service_instance)
+        instance = self.find_instance_for_instance_tag(instance_tag)
+        if instance:
+            if instance.no_sync:
+                # if no_sync is still set, then perhaps we failed while saving it and need to retry.
+                self.save_instance(service_instance, instance)
+            return instance
+
+        desired_image = self.get_image(service_instance)
+        desired_flavor = self.get_flavor(service_instance)
+
+        slice = service_instance.owner.slices.first()
+
+        (node, parent) = LeastLoadedNodeScheduler(slice, label=None).pick()
+
+        assert (slice is not None)
+        assert (node is not None)
+        assert (desired_image is not None)
+        assert (service_instance.creator is not None)
+        assert (node.site_deployment.deployment is not None)
+        assert (desired_image is not None)
+
+        instance = Instance(slice=slice,
+                            node=node,
+                            image=desired_image,
+                            creator=service_instance.creator,
+                            deployment=node.site_deployment.deployment,
+                            flavor=desired_flavor,
+                            isolation=slice.default_isolation,
+                            parent=parent)
+
+        self.save_instance(service_instance, instance)
+
+        return instance
+
+    def manage_container(self, service_instance):
+        if service_instance.deleted:
+            return
+
+        if service_instance.instance:
+            # We're good.
+            return
+
+        instance = self.find_or_make_instance_for_instance_tag(service_instance)
+        service_instance.instance = instance
+        # TODO: possible for partial failure here?
+        service_instance.save()
+
+    def delete_instance(self, service_instance, instance):
+        # delete the `instance_tag` tags
+        tags = Tag.objects.filter(service_id=service_instance.owner.id, content_type=instance.self_content_type_id,
+                                  object_id=instance.id, name="instance_tag")
+        for tag in tags:
+            tag.delete()
+
+        instance.delete()
+
+    def save_instance(self, service_instance, instance):
+        instance.no_sync = True  # prevent instance from being synced until we're done with it
+        super(VHSSTenantPolicy, self).save_instance(instance)
+
+        try:
+            if instance.isolation in ["container", "container_vm"]:
+                raise Exception("Not supported")
+
+            instance_tag = self.get_instance_tag(service_instance)
+            if instance_tag:
+                tags = Tag.objects.filter(name="instance_tag", value=instance_tag)
+                if not tags:
+                    tag = Tag(service=service_instance.owner, content_type=instance.self_content_type_id,
+                              object_id=instance.id, name="instance_tag", value=str(instance_tag))
+                    tag.save()
+
+            instance.no_sync = False  # allow the synchronizer to run now
+            super(VHSSTenantPolicy, self).save_instance(instance)
+        except:
+            # need to clean up any failures here
+            raise
+
+    def get_instance_tag(self, service_instance):
+        return '%d' % service_instance.id
+
+    def get_image(self, service_instance):
+        return service_instance.vhss_vendor.image
+
+    def get_flavor(self, service_vendor):
+        return service_vendor.vhss_vendor.flavor
diff --git a/xos/synchronizer/run-from-api.sh b/xos/synchronizer/run-from-api.sh
index de2c7fa..ed1147f 100755
--- a/xos/synchronizer/run-from-api.sh
+++ b/xos/synchronizer/run-from-api.sh
@@ -12,5 +12,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-export XOS_DIR=/opt/xos
-python vhss-synchronizer.py  -C $XOS_DIR/synchronizers/vhss/vhss_from_api_config
+
+python vhss-synchronizer.py
\ No newline at end of file
diff --git a/xos/synchronizer/steps/sync_vhsstenant.py b/xos/synchronizer/steps/sync_vhsstenant.py
index d6bdd49..01433de 100644
--- a/xos/synchronizer/steps/sync_vhsstenant.py
+++ b/xos/synchronizer/steps/sync_vhsstenant.py
@@ -15,13 +15,14 @@
 import os
 import sys
 from django.db.models import Q, F
-from synchronizers.new_base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
 from synchronizers.new_base.modelaccessor import *
+from synchronizers.new_base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
 
 parentdir = os.path.join(os.path.dirname(__file__), "..")
 sys.path.insert(0, parentdir)
 
 class SyncVHSSTenant(SyncInstanceUsingAnsible):
+
     provides = [VHSSTenant]
 
     observes = VHSSTenant
@@ -32,18 +33,7 @@
 
     service_key_name = "/opt/xos/configurations/mcord/mcord_private_key"
 
-    #Gets the attributes that are used by the Ansible template but are not
-    #part of the set of default attributes.
-
     def __init__(self, *args, **kwargs):
         super(SyncVHSSTenant, self).__init__(*args, **kwargs)
 
-    def fetch_pending(self, deleted):
-        if (not deleted):
-            objs = VHSSTenant.get_tenant_objects().filter(
-                Q(enacted__lt=F('updated')) | Q(enacted=None), Q(lazy_blocked=False))
-        else:
-            objs = VHSSTenant.get_deleted_tenant_objects()
-
-        return objs
 
diff --git a/xos/synchronizer/steps/vhsstenant_playbook.yaml b/xos/synchronizer/steps/vhsstenant_playbook.yaml
index 83c8bbd..e0a34b2 100644
--- a/xos/synchronizer/steps/vhsstenant_playbook.yaml
+++ b/xos/synchronizer/steps/vhsstenant_playbook.yaml
@@ -15,7 +15,7 @@
 ---
 # vhsstenant_playbook
 
-- hosts: "{{ instance_name }}"
+- hosts: {{ instance_name }}
   gather_facts: False
   connection: ssh
   user: ubuntu
diff --git a/xos/synchronizer/vhss-synchronizer.py b/xos/synchronizer/vhss-synchronizer.py
index bae8953..2d1bb00 100755
--- a/xos/synchronizer/vhss-synchronizer.py
+++ b/xos/synchronizer/vhss-synchronizer.py
@@ -14,15 +14,18 @@
 
 #!/usr/bin/env python
 
-# Runs the standard XOS synchronizer
+# This imports and runs ../../xos-observer.py
 
 import importlib
 import os
 import sys
 
-synchronizer_path = os.path.join(os.path.dirname(
-    os.path.realpath(__file__)), "../../synchronizers/new_base")
-sys.path.append(synchronizer_path)
+from xosconfig import Config
+config_file = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + '/vhss_config.yaml')
+
+Config.init(config_file, 'synchronizer-config-schema.yaml')
+observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../../synchronizers/new_base")
+
+sys.path.append(observer_path)
 mod = importlib.import_module("xos-synchronizer")
 mod.main()
-
diff --git a/xos/synchronizer/vhss_config.yaml b/xos/synchronizer/vhss_config.yaml
new file mode 100644
index 0000000..0123b0d
--- /dev/null
+++ b/xos/synchronizer/vhss_config.yaml
@@ -0,0 +1,23 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+name: vhss-synchronizer
+accessor:
+  username: xosadmin@opencord.org
+  password: "@/opt/xos/services/vhss/credentials/xosadmin@opencord.org"
+dependency_graph: "/opt/xos/synchronizers/vhss/model-deps"
+steps_dir: "/opt/xos/synchronizers/vhss/steps"
+sys_dir: "/opt/xos/synchronizers/vhss/sys"
+model_policies_dir: "/opt/xos/synchronizers/vhss/model_policies"
diff --git a/xos/tosca/resources/vhsstenant.py b/xos/tosca/resources/vhsstenant.py
index 074c423..2d572c0 100644
--- a/xos/tosca/resources/vhsstenant.py
+++ b/xos/tosca/resources/vhsstenant.py
@@ -13,29 +13,34 @@
 # limitations under the License.
 
 from xosresource import XOSResource
-from core.models import Tenant, Service
+from core.models import ServiceInstance, Service
 from services.vhss.models import VHSSTenant
 
 class XOSVHSSTenant(XOSResource):
     provides = "tosca.nodes.VHSSTenant"
     xos_model = VHSSTenant
-    name_field = "service_specific_id"
+    name_field = None
     copyin_props = ()
 
     def get_xos_args(self, throw_exception=True):
         args = super(XOSVHSSTenant, self).get_xos_args()
 
-        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
+        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=throw_exception)
         if provider_name:
-            args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
+            args["owner"] = self.get_xos_object(Service, throw_exception=throw_exception, name=provider_name)
 
         return args
 
     def get_existing_objs(self):
         args = self.get_xos_args(throw_exception=False)
-        return VHSSTenant.get_tenant_objects().filter(provider_service=args["provider_service"], service_specific_id=args["service_specific_id"])
+        owner = args.get("provider", None)
+        if owner:
+            return [ self.get_xos_object(owner=owner) ]
         return []
 
+    def postprocess(self, obj):
+        pass
+
     def can_delete(self, obj):
         return super(XOSVHSSTenant, self).can_delete(obj)
 
diff --git a/xos/tosca/resources/vhssvendor.py b/xos/tosca/resources/vhssvendor.py
index cc01d06..7ba8024 100644
--- a/xos/tosca/resources/vhssvendor.py
+++ b/xos/tosca/resources/vhssvendor.py
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 from xosresource import XOSResource
-from core.models import Tenant
+from core.models import ServiceInstance
 from services.vhss.models import VHSSVendor
 
 class XOSVHSSVendor(XOSResource):
@@ -27,7 +27,7 @@
 
         tenant_name = self.get_requirement("tosca.relationships.VendorOfTenant", throw_exception=throw_exception)
         if tenant_name:
-            args["provider_tenant"] = self.get_xos_object(Tenant, throw_exception=throw_exception, name=tenant_name)
+            args["provider_tenant"] = self.get_xos_object(ServiceInstance, throw_exception=throw_exception, name=tenant_name)
 
         return args
 
diff --git a/xos/vhss-onboard.yaml b/xos/vhss-onboard.yaml
index e2ecde4..c43f59c 100644
--- a/xos/vhss-onboard.yaml
+++ b/xos/vhss-onboard.yaml
@@ -17,7 +17,7 @@
 description: Onboard the vHSS service
 
 imports:
-   - custom_types/xos.yaml
+  - custom_types/xos.yaml
 
 topology_template:
   node_templates:
@@ -28,10 +28,10 @@
           # The following will concatenate with base_url automatically, if
           # base_url is non-null.
           xproto: ./
+          tosca_custom_types: tosca/custom_types/vhss.yaml
           synchronizer: synchronizer/manifest
           synchronizer_run: vhss-synchronizer.py
-          tosca_custom_types: tosca/custom_types/vhss.yaml
-          tosca_resource: tosca/resources/vhssservice.py, tosca/resources/vhsstenant.py, tosca/resources/vhssvendor.py
+          tosca_resource: tosca/resources/vhsstenant.py, tosca/resources/vhssservice.py, tosca/resources/vhssvendor.py
           private_key: file:///opt/xos/key_import/mcord_rsa
           public_key: file:///opt/xos/key_import/mcord_rsa.pub
 
diff --git a/xos/vhss.xproto b/xos/vhss.xproto
index c68dbf1..49afe59 100644
--- a/xos/vhss.xproto
+++ b/xos/vhss.xproto
@@ -1,16 +1,12 @@
 option name = "vHSS";
-option verbose_name = "Virtual Home Subscriber Server";
 option app_label = "vhss";
 option kind = "vEPC";
-option legacy = "True";
 
 message VHSSService (Service){
-    option name = "VHSSService";
     option verbose_name = "Virtual Home Subscriber Server Service";
 }
 
-message VHSSVendor (PlCoreBase){
-    option name = "VHSSVendor";
+message VHSSVendor (XOSBase){
     option verbose_name = "Virtual Home Subscriber Server Vendor";
     required string name = 1 [help_text = "vendor name", max_length = 32, null = False, db_index = False, blank = False]; 
     required manytoone image->Image:+ = 2 [help_text = "select image for this vendor", db_index = True, null = False, blank = False];
@@ -18,7 +14,6 @@
 }
 
 message VHSSTenant (TenantWithContainer){
-    option name = "VHSSTenant";
     option verbose_name = "Virtual Home Subscriber Server Tenant";
     optional manytoone vhss_vendor->VHSSVendor:vendor_tenants = 1 [help_text = "select vendor of choice, leave blank for slice default", db_index = True, null = True, blank = True];
 }
