diff --git a/xos/synchronizer/steps/sync_progranserviceinstance.py b/xos/synchronizer/steps/sync_progranserviceinstance.py
index 14925bc..11d679d 100644
--- a/xos/synchronizer/steps/sync_progranserviceinstance.py
+++ b/xos/synchronizer/steps/sync_progranserviceinstance.py
@@ -17,14 +17,15 @@
 import os
 import sys
 from synchronizers.new_base.SyncInstanceUsingAnsible import SyncStep
-from synchronizers.new_base.ansible_helper import run_template
-from synchronizers.new_base.modelaccessor import ProgranServiceInstance, ENodeB
+from synchronizers.new_base.modelaccessor import ProgranServiceInstance, ENodeB, Handover
 
 from xosconfig import Config
 from multistructlog import create_logger
 import json
 import requests
 from requests.auth import HTTPBasicAuth
+import time
+import datetime
 
 
 log = create_logger(Config().get('logging'))
@@ -39,6 +40,9 @@
 
     observes = ProgranServiceInstance
 
+    # Poll every 5 loops of self.call
+    poll = 0
+
     def sync_record(self, o):
         onos = ProgranHelpers.get_progran_onos_info()
 
@@ -48,6 +52,8 @@
         data = self.get_progran_profile_field(o)
 
         r = requests.post(profile_url, data=json.dumps(data), auth=HTTPBasicAuth(onos['username'], onos['password']))
+
+        ProgranHelpers.get_progran_rest_errors(r)
         log.info("Profile synchronized", response=r.json())
 
         log.info("sync'ing enodeb", object=str(o), **o.tologdict())
@@ -60,6 +66,7 @@
                 ]
             }
             r = requests.post(enodeb_url, data=json.dumps(data), auth=HTTPBasicAuth(onos['username'], onos['password']))
+            ProgranHelpers.get_progran_rest_errors(r)
             o.active_enodeb_id = o.enodeb_id # storing the value to know when it will be deleted
             log.info("EnodeB synchronized", response=r.json())
         elif o.active_enodeb_id:
@@ -67,12 +74,12 @@
             log.info("removing profile %s from enodeb %s" % (o.name, o.active_enodeb_id), object=str(o), **o.tologdict())
             enodeb_url = "http://%s:%s/onos/progran/enodeb/%s/profile/%s" % (onos['url'], onos['port'], enb_id, o.name)
             r = requests.delete(enodeb_url, auth=HTTPBasicAuth(onos['username'], onos['password']))
+            ProgranHelpers.get_progran_rest_errors(r)
             o.active_enodeb_id = 0 # removing the value because it has been deleted
             log.info("EnodeB synchronized", response=r.json())
 
         o.save()
 
-
     def get_handover_for_profile(self, o):
         return {
             "A3Hysteresis": o.handover.HysteresisA3,
@@ -114,4 +121,106 @@
         profile_url = "http://%s:%s/onos/progran/profile/%s" % (onos['url'], onos['port'], o.name)
         r = requests.delete(profile_url, auth=HTTPBasicAuth(onos['username'], onos['password']))
         o.active_enodeb_id = 0  # removing the value because it has been deleted
-        log.info("Profile synchronized", response=r.json())
\ No newline at end of file
+        log.info("Profile synchronized", response=r.json())
+
+    def fetch_pending(self, deleted):
+        # self.read_profiles_from_progran()
+        return super(SyncProgranServiceInstance, self).fetch_pending(deleted)
+
+    @staticmethod
+    def date_to_time(d):
+        if len(d) == 0:
+            return 0
+        return time.mktime(datetime.datetime.strptime(d, "%d.%m.%Y %H:%S").timetuple())
+
+    @staticmethod
+    def update_fields(model, dict, mapping={}, transformations={}):
+        dict = SyncProgranServiceInstance.convert_keys(dict, mapping, transformations)
+        for k, v in dict.iteritems():
+            if hasattr(model, k):
+                setattr(model, k, v)
+            else:
+                log.warn("%s does not have a '%s' property, not updating it" % (model.model_name, k))
+        return model
+
+    @staticmethod
+    def convert_keys(dict, mapping={}, transformations={}):
+        for k, v in dict.iteritems():
+            if k in mapping:
+                # apply custom transformations to the data
+                if k in transformations:
+                    dict[k] = transformations[k](v)
+
+                # NOTE we may have different names that the field in the dict
+                dict[mapping[k]] = dict[k]
+                del dict[k]
+        return dict
+
+
+    def my_call(self, failed=[], deletion=False):
+        """
+        Read profile from progran and save them in xos
+        """
+        if self.poll < 5:
+            self.poll = self.poll + 1
+        else:
+            self.poll = 0
+            onos = ProgranHelpers.get_progran_onos_info()
+            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']]
+
+            field_mapping = {
+                'Name': 'name',
+                'Start': 'start',
+                'End': 'end'
+            }
+
+            field_transformations = {
+                'Start': SyncProgranServiceInstance.date_to_time,
+                'End': SyncProgranServiceInstance.date_to_time
+            }
+
+            handover_mapping = {
+                'A5Hysteresis': 'HysteresisA5',
+                'A3Hysteresis': 'HysteresisA3'
+            }
+
+            for p in res:
+
+                # checking for handovers
+                handover_dict = p['Handover']
+                handover_dict = SyncProgranServiceInstance.convert_keys(handover_dict, handover_mapping)
+                del p['Handover']
+
+                try:
+                    handover = Handover.objects.get(**handover_dict)
+                    log.info("handover already exists, updating it", handover=handover_dict)
+                except IndexError:
+                    handover = Handover()
+                    handover = SyncProgranServiceInstance.update_fields(handover, handover_dict)
+                    log.info("handover is new, creating it", handover=handover_dict)
+
+                handover.save()
+
+                # checking for profiles
+                try:
+                    si = ProgranServiceInstance.objects.get(name=p['Name'])
+                    log.info("Profile %s already exists, updating it" % p['Name'])
+                except IndexError:
+                    si = ProgranServiceInstance()
+                    si.name = p['Name']
+                    log.info("Profile %s is new, creating it" % p['Name'])
+
+                si = SyncProgranServiceInstance.update_fields(si, p, field_mapping, field_transformations)
+                si.handover = handover
+
+
+
+                # TODO keep track of the deleted profiles
+                # existing profiles - updated profiles = deleted profiles
+
+                si.save()
