diff --git a/Dockerfile.synchronizer b/Dockerfile.synchronizer
index a07d3e6..f9411d2 100644
--- a/Dockerfile.synchronizer
+++ b/Dockerfile.synchronizer
@@ -16,7 +16,7 @@
 
 # xosproject/progran-synchronizer
 
-FROM xosproject/xos-synchronizer-base:2.1.38
+FROM xosproject/xos-synchronizer-base:2.2.5
 
 COPY xos/synchronizer /opt/xos/synchronizers/progran
 COPY VERSION /opt/xos/synchronizers/progran/
diff --git a/VERSION b/VERSION
index f1547e6..815e68d 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.0.7
+2.0.8
diff --git a/xos/synchronizer/config.yaml b/xos/synchronizer/config.yaml
index a3f2048..22d5115 100644
--- a/xos/synchronizer/config.yaml
+++ b/xos/synchronizer/config.yaml
@@ -15,6 +15,7 @@
 
 
 name: progran
+core_version: ">=2.2.1"
 required_models:
   - ProgranService
   - ProgranServiceInstance
diff --git a/xos/synchronizer/models/progran.xproto b/xos/synchronizer/models/progran.xproto
index 37ab7ae..8a4025d 100644
--- a/xos/synchronizer/models/progran.xproto
+++ b/xos/synchronizer/models/progran.xproto
@@ -12,7 +12,7 @@
 
 message ENodeB (XOSBase){
     option verbose_name = "eNodeB";
-    required string description = 1 [db_index = False, max_length = 256, null = False, blank = False];
+    required string description = 1 [tosca_key = True];
     required string enbId = 2 [help_text = "ID of this enodeb", db_index = False, max_length = 256, null = False, blank = False];
     required string ipAddr = 3 [help_text = "IP address of this enodeb", db_index = False, max_length = 256, null = False, blank = False];
     optional string created_by = 4 [null = True, blank = True, gui_hidden = True];
@@ -32,6 +32,7 @@
     required int32 HysteresisA5 = 9 [default = 1, db_index = False, null = False, blank = False];
     required int32 A5TriggerQuantity = 10 [default = 0, db_index = False, null = False, blank = False];
     optional string created_by = 11 [null = True, blank = True, gui_hidden = True];
+    optional string name = 12 [tosca_key = True];
 }
 
 message ProgranServiceInstance (ServiceInstance){
diff --git a/xos/synchronizer/steps/sync_progranserviceinstance_back.py b/xos/synchronizer/steps/sync_progranserviceinstance_back.py
deleted file mode 100644
index 25a92e9..0000000
--- a/xos/synchronizer/steps/sync_progranserviceinstance_back.py
+++ /dev/null
@@ -1,191 +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.
-
-
-import os
-import sys
-
-import datetime
-import time
-
-from xossynchronizer.steps.syncstep import SyncStep
-from xossynchronizer.modelaccessor import ProgranServiceInstance, ENodeB, Handover, ServiceInstanceLink, MCordSubscriberInstance
-
-from xosconfig import Config
-from multistructlog import create_logger
-import requests
-from requests.auth import HTTPBasicAuth
-
-
-
-log = create_logger(Config().get('logging'))
-
-parentdir = os.path.join(os.path.dirname(__file__), "..")
-sys.path.insert(0, parentdir)
-sys.path.insert(0, os.path.dirname(__file__))
-from helpers import ProgranHelpers
-
-class SyncProgranServiceInstanceBack(SyncStep):
-    provides = [ProgranServiceInstance]
-
-    observes = ProgranServiceInstance
-
-
-    def call(self, failed=[], deletion=False):
-        """
-        Read profile from progran and save them in xos
-        """
-
-        if deletion == False:
-            # NOTE we won't it to run only after the delete has completed
-            return
-
-        log.debug("Reading profiles from progran")
-        onos = ProgranHelpers.get_progran_onos_info(self.model_accessor)
-        profile_url = "http://%s:%s/onos/progran/profile/" % (onos['url'], onos['port'])
-        r = requests.get(profile_url, auth=HTTPBasicAuth(onos['username'], onos['password']))
-        res = r.json()['ProfileArray']
-
-
-        # remove default profiles
-        res = [p for p in res if "Default" not in p['Name']]
-        pnames = [p['Name'] for p in res]
-        log.debug("Received Profiles: ", profiles=pnames)
-
-        field_mapping = {
-            'Name': 'name',
-            'Start': 'start',
-            'End': 'end',
-        }
-
-        field_transformations = {
-            'Start': ProgranHelpers.date_to_time,
-            'End': ProgranHelpers.date_to_time
-        }
-
-        handover_mapping = {
-            'A5Hysteresis': 'HysteresisA5',
-            'A3Hysteresis': 'HysteresisA3'
-        }
-
-        updated_profiles = []
-
-        for p in res:
-
-
-            # checking for profiles
-            try:
-                si = ProgranServiceInstance.objects.get(name=p['Name'])
-                log.debug("Profile %s already exists, updating it" % p['Name'])
-
-            except IndexError:
-                si = ProgranServiceInstance()
-
-                si.created_by = "Progran"
-
-                log.debug("Profile %s is new, creating it" % p['Name'])
-
-            if not si.is_new:
-                # update IMSI association
-                xos_imsis_for_profile = [i.subscriber_service_instance.leaf_model for i in si.provided_links.all()]
-                progran_imsis_for_profile = p['IMSIRuleArray']
-
-                log.debug("List of imsis for profile %s in XOS" % p["Name"], imsis=xos_imsis_for_profile)
-                log.debug("List of imsis for profile %s in ONOS" % p["Name"], imsis=progran_imsis_for_profile)
-
-                for i in xos_imsis_for_profile:
-                    if not i.imsi_number in progran_imsis_for_profile:
-                        log.debug("Removing Imsi %s from profile %s" % (i.imsi_number, p['Name']))
-
-                        imsi_link = ServiceInstanceLink.objects.get(subscriber_service_instance_id=i.id)
-
-                        # NOTE: this model has already been removed from the backend, no need to synchronize
-                        imsi_link.backend_need_delete = False
-                        imsi_link.no_sync = True
-                        imsi_link.save() # we need to save it to avoid a synchronization loop
-
-                        imsi_link.delete()
-                    else:
-                        # remove from imsi list coming from progran everything we already know about
-                        progran_imsis_for_profile.remove(i.imsi_number)
-
-                for i in progran_imsis_for_profile:
-                    log.debug("Adding Imsi %s to profile %s" % (i, p['Name']))
-                    imsi = MCordSubscriberInstance.objects.get(imsi_number=i)
-                    imsi_to_profile = ServiceInstanceLink(provider_service_instance=si,
-                                                          subscriber_service_instance=imsi)
-                    imsi_to_profile.save()
-
-            # if the model has not been synchronized yet, skip it
-            if not si.is_new and si.no_sync is False:
-                log.debug("Skipping profile %s as not synchronized" % p['Name'])
-                # NOTE add it to the removed profiles to avoid deletion (this is ugly, I know)
-                updated_profiles.append(si.name)
-                continue
-
-            # ugly fix
-            if p['AdmControl']:
-                p['AdmControl'] = str(p['AdmControl'])
-
-            si = ProgranHelpers.update_fields(si, p, field_mapping, field_transformations)
-
-            # checking for handovers
-            handover_dict = p['Handover']
-            handover_dict = ProgranHelpers.convert_keys(handover_dict, handover_mapping)
-            del p['Handover']
-
-            if si.handover_id:
-                handover = si.handover
-                log.debug("handover already exists, updating it", handover=handover_dict)
-            else:
-                handover = Handover()
-                handover = ProgranHelpers.update_fields(handover, handover_dict)
-                log.debug("handover is new, creating it", handover=handover_dict)
-                handover.created_by = "Progran"
-
-            handover = ProgranHelpers.update_fields(handover, handover_dict)
-            handover.save()
-
-            # Assigning handover to profile
-            si.handover = handover
-
-            # si.backend_status = "OK"
-            # si.backend_code = 1
-
-            si.no_sync = True
-            si.previously_sync = True
-
-            if p["MMECfg"]:
-                si.mmeip = str(p["MMECfg"]["IPAddr"])
-                si.mmeport = str(p["MMECfg"]["Port"])
-
-            si.enacted = time.mktime(datetime.datetime.now().timetuple())
-
-            si.save()
-
-            updated_profiles.append(si.name)
-
-        existing_profiles = [p.name for p in ProgranServiceInstance.objects.all() if not p.is_new]
-        deleted_profiles = ProgranHelpers.list_diff(existing_profiles, updated_profiles)
-
-        if len(deleted_profiles) > 0:
-            for p in deleted_profiles:
-                si = ProgranServiceInstance.objects.get(name=p)
-                if si.created_by == 'XOS' and si.previously_sync == False:
-                    # don't delete if the profile has been created by XOS and it hasn't been sync'ed yet
-                    continue
-                # TODO delete also the associated Handover
-                log.debug("Profiles %s have been removed in progran, removing it from XOS" % str(p))
-                si.delete()
