diff --git a/xos/synchronizer/Dockerfile.synchronizer b/xos/synchronizer/Dockerfile.synchronizer
new file mode 100644
index 0000000..8a99685
--- /dev/null
+++ b/xos/synchronizer/Dockerfile.synchronizer
@@ -0,0 +1,39 @@
+# xosproject/epc-service-synchronizer
+FROM xosproject/xos-synchronizer-base:candidate
+
+COPY . /opt/xos/synchronizers/epc-service
+
+ENTRYPOINT []
+
+WORKDIR "/opt/xos/synchronizers/epc-service"
+
+# Label image
+ARG org_label_schema_schema_version=1.0
+ARG org_label_schema_name=epc-service-synchronizer
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+ARG org_opencord_component_chameleon_version=unknown
+ARG org_opencord_component_chameleon_vcs_url=unknown
+ARG org_opencord_component_chameleon_vcs_ref=unknown
+ARG org_opencord_component_xos_version=unknown
+ARG org_opencord_component_xos_vcs_url=unknown
+ARG org_opencord_component_xos_vcs_ref=unknown
+
+LABEL org.label-schema.schema-version=$org_label_schema_schema_version \
+      org.label-schema.name=$org_label_schema_name \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date \
+      org.opencord.component.chameleon.version=$org_opencord_component_chameleon_version \
+      org.opencord.component.chameleon.vcs-url=$org_opencord_component_chameleon_vcs_url \
+      org.opencord.component.chameleon.vcs-ref=$org_opencord_component_chameleon_vcs_ref \
+      org.opencord.component.xos.version=$org_opencord_component_xos_version \
+      org.opencord.component.xos.vcs-url=$org_opencord_component_xos_vcs_url \
+      org.opencord.component.xos.vcs-ref=$org_opencord_component_xos_vcs_ref
+
+CMD bash -c "cd /opt/xos/synchronizers/epc-service; ./run-from-api.sh"
diff --git a/xos/synchronizer/model-deps b/xos/synchronizer/model-deps
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/xos/synchronizer/model-deps
@@ -0,0 +1 @@
+{}
diff --git a/xos/synchronizer/model_policies/model_policy_vepcserviceinstance.py b/xos/synchronizer/model_policies/model_policy_vepcserviceinstance.py
new file mode 100644
index 0000000..566a4b8
--- /dev/null
+++ b/xos/synchronizer/model_policies/model_policy_vepcserviceinstance.py
@@ -0,0 +1,271 @@
+# 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 *
+
+from xosconfig import Config
+from multistructlog import create_logger
+
+log = create_logger(Config().get('logging'))
+blueprints = Config().get('blueprints')
+
+def service_of_service_instance(si):
+    if si.endswith('Tenant'): 
+        return si[:-len('Tenant')] + 'Service'
+    elif si.endswith('ServiceInstance'): 
+        return si[:-len('ServiceInstance')] + 'Service'
+    else:
+        raise Exception('Could not translate service instance into service: %s'%si)
+
+class VEPCServiceInstancePolicy(TenantWithContainerPolicy):
+    model_name = "VEPCServiceInstance"
+
+    """TODO: Update the following to not be service-specific
+       This code assumes there is only one vendor installed 
+    """
+    def configure_service_instance(self, service_instance):
+        if service_instance.leaf_model_name == 'VSPGWUTenant':
+            vendor = VSPGWUVendor.objects.first()
+            if not vendor:
+                raise Exception('No VSPGWU vendors')
+            service_instance.vspgwu_vendor = vendor
+        elif service_instance.leaf_model_name == 'VSPGWCTenant':
+            vendor = VSPGWCVendor.objects.first()
+            if not vendor:
+                raise Exception('No VSPGWC vendors')
+            service_instance.vspgwc_vendor = vendor
+
+    def child_service_instance_from_name(self, name):
+        service_instances = self.obj.child_serviceinstances.all() 
+
+        try:
+            service_instance = next(s for s in service_instances if s.leaf_model_name == name)
+        except StopIteration:
+            service_instance = None
+
+        return service_instance 
+
+    def get_service_for_service_instance(self, si):
+        service = service_of_service_instance(si)
+        service_class = getattr(Slice().stub, service)
+        service_obj = service_class.objects.first() # There's only one service object
+        return service_obj
+
+    def create_service_instance(si):
+        service = self.get_service_for_service_instance(si)
+	if not service:
+	    raise Exception('No service object for %s'%service)
+
+	si_class = getattr(Slice().stub, si)
+	s = si_class(owner = service, name = 'epc-' + si.lower())
+	s.master_serviceinstance = self.obj
+
+	self.configure_service_instance(s)
+	s.save()
+        return s
+
+    def create_link(self, src, dst):
+        src_instance = self.child_service_instance_from_name(src)
+        if not src_instance:
+            src_instance = self.create_service_instance(src)
+
+        dst_instance = self.child_service_instance_from_name(dst)
+        if not dst_instance:
+            dst_instance = self.create_service_instance(dst)
+      
+        src_service = self.get_service_for_service_instance(src)
+        dst_service = self.get_service_for_service_instance(dst)
+
+        service_dependency = ServiceDependency.objects.filter(provider_service_id = dst_service.id, subscriber_service_id = src_service.id)
+        if not service_dependency:
+            service_dependency = ServiceDependency(provider_service = dst_service, subscriber_service = src_service)
+            service_dependency.save()
+
+        service_instance_link = ServiceInstanceLink.objects.filter(provider_service_instance_id = dst_instance.id, subscriber_service_instance_id = src_instance.id)
+        if not service_instance_link:
+            service_instance_link = ServiceInstanceLink(provider_service_instance = dst_instance, subscriber_service_instance = src_instance)
+            service_instance_link.save()
+
+    def recursive_create_links(self, blueprint, src):
+        for k, v in blueprint.iteritems():
+            if src:
+                self.create_link(src, k)
+
+            if isinstance(v, dict):
+                self.recursive_create_links(v, k)
+            else:
+                self.create_link(src, k)
+
+    def create_child_services(self, service_instance):
+        self.obj = service_instance
+        # Create service graph based on blueprint
+        chosen_blueprint = service_instance.blueprint
+        try:
+            blueprint = next(b for b in blueprints if b['name'] == chosen_blueprint)
+        except StopIteration:
+            log.error('Chosen blueprint (%s) not found' % chosen_blueprint)
+
+        self.recursive_create_links(blueprint['graph'], None)
+
+    def handle_update(self, service_instance):
+        self.create_child_services(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 VEPCServiceInstance.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 = VEPCServiceInstance.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(
+                    "VEPCServiceInstance Instance %s is now unused -- deleting" % service_instance.instance)
+                self.delete_instance(
+                    service_instance, service_instance.instance)
+            else:
+                self.logger.info("VEPCServiceInstance 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=flavors[0],
+                            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()
+
+        tags = Tag.objects.filter(content_type=instance.self_content_type_id, object_id=instance.id,
+                                  name="vm_vrouter_tenant")
+        for tag in tags:
+            address_manager_instances = list(
+                ServiceInstance.objects.filter(id=tag.value))
+            tag.delete()
+
+            # TODO: Potential partial failure
+
+            for address_manager_instance in address_manager_instances:
+                self.logger.info(
+                    "Deleting address_manager_instance %s" % address_manager_instance)
+                address_manager_instance.delete()
+
+        instance.delete()
+
+    def save_instance(self, service_instance, instance):
+        instance.volumes = "/etc/dnsmasq.d,/etc/ufw"
+        instance.no_sync = True   # prevent instance from being synced until we're done with it
+        super(VEPCServiceInstancePolicy, 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(VEPCServiceInstancePolicy, 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 None
+
+    def get_flavor(self, service_instance):
+        raise None
+
diff --git a/xos/synchronizer/run-from-api.sh b/xos/synchronizer/run-from-api.sh
new file mode 100755
index 0000000..dc05460
--- /dev/null
+++ b/xos/synchronizer/run-from-api.sh
@@ -0,0 +1,15 @@
+# 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.
+
+python vepc-synchronizer.py
diff --git a/xos/synchronizer/vepc-synchronizer.py b/xos/synchronizer/vepc-synchronizer.py
new file mode 100644
index 0000000..84a324d
--- /dev/null
+++ b/xos/synchronizer/vepc-synchronizer.py
@@ -0,0 +1,32 @@
+# 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.
+
+
+#!/usr/bin/env python
+
+# This imports and runs ../../xos-observer.py
+
+import importlib
+import os
+import sys
+from xosconfig import Config
+
+config_file = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + '/vepc_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()
\ No newline at end of file
diff --git a/xos/synchronizer/vepc_config.yaml b/xos/synchronizer/vepc_config.yaml
new file mode 100644
index 0000000..cf7694a
--- /dev/null
+++ b/xos/synchronizer/vepc_config.yaml
@@ -0,0 +1,14 @@
+name: vepc-synchronizer
+accessor:
+  username: xosadmin@opencord.org
+  password: "@/opt/xos/services/vepc/credentials/xosadmin@opencord.org"
+blueprints:
+  - name: build
+    graph:
+      VSPGWCTenant:
+        VSPGWUTenant:
+          VENBServiceInstance
+dependency_graph: "/opt/xos/synchronizers/epc-service/model-deps"
+#steps_dir: "/opt/xos/synchronizers/epc-service/steps"
+sys_dir: "/opt/xos/synchronizers/epc-service/sys"
+model_policies_dir: "/opt/xos/synchronizers/epc-service/model_policies"
diff --git a/xos/vepc-onboard.yaml b/xos/vepc-onboard.yaml
new file mode 100644
index 0000000..2f377c6
--- /dev/null
+++ b/xos/vepc-onboard.yaml
@@ -0,0 +1,35 @@
+# 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.
+
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+description: Onboard the EPC service
+
+imports:
+   - custom_types/xos.yaml
+
+topology_template:
+  node_templates:
+    servicecontroller#vepc:
+      type: tosca.nodes.ServiceController
+      properties:
+          base_url: file:///opt/xos_services/epc-service/xos/
+          # The following will concatenate with base_url automatically, if
+          # base_url is non-null.
+          xproto: ./
+          synchronizer: synchronizer/manifest
+          synchronizer_run: vepc-synchronizer.py
+          private_key: file:///opt/xos/key_import/mcord_rsa
+          public_key: file:///opt/xos/key_import/mcord_rsa.pub
+
diff --git a/xos/vepc-synchronizer.py b/xos/vepc-synchronizer.py
new file mode 100644
index 0000000..84a324d
--- /dev/null
+++ b/xos/vepc-synchronizer.py
@@ -0,0 +1,32 @@
+# 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.
+
+
+#!/usr/bin/env python
+
+# This imports and runs ../../xos-observer.py
+
+import importlib
+import os
+import sys
+from xosconfig import Config
+
+config_file = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + '/vepc_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()
\ No newline at end of file
diff --git a/xos/vepc.xproto b/xos/vepc.xproto
new file mode 100644
index 0000000..3a23d6b
--- /dev/null
+++ b/xos/vepc.xproto
@@ -0,0 +1,15 @@
+option name = "vEPC";
+option verbose_name = "Virtual Evolved Packet Core";
+option app_label = "vepc";
+
+message VEPCService (Service){
+    option name = "VEPCService";
+    option verbose_name = "Virtual Evolved Packet Core Service";
+}
+
+message VEPCServiceInstance (TenantWithContainer){
+    option name = "VEPCServiceInstance";
+    option verbose_name = "Virtual Evolved Packet Core ServiceInstance";
+    optional string description = 1 [help_text = "service chain details", max_length = 128, null = True, db_index = False, blank = True];
+    required string blueprint = 3 [help_text = "Select the service graph blueprint", db_index = False, default = 1, choices = "(('build', 'CORD Build'),)"];
+}
