diff --git a/xos/synchronizer/steps/sync_hssdbserviceinstance.py b/xos/synchronizer/steps/sync_hssdbserviceinstance.py
index 4cb1379..aec739b 100644
--- a/xos/synchronizer/steps/sync_hssdbserviceinstance.py
+++ b/xos/synchronizer/steps/sync_hssdbserviceinstance.py
@@ -30,4 +30,71 @@
     def __init__(self, *args, **kwargs):
         super(SyncHSSDBServiceInstance, self).__init__(*args, **kwargs)
 
+    def get_extra_attributes(self, o):
+        fields = {}
+
+        fields['db_ip'] = self.get_ip_address_from_peer_service_instance_instance('db_network', o, o, 'db_ip')
+
+        return fields
+
+    def get_ip_address_from_peer_service_instance(self, network_name, sitype, o, parameter=None):
+        peer_si = self.get_peer_serviceinstance_of_type(sitype, o)
+        return self.get_ip_address_from_peer_service_instance_instance(network_name, peer_si, o, parameter)
+
+    def get_ip_address_from_peer_service_instance_instance(self, network_name, peer_si, o, parameter=None):
+        try:
+            net_id = self.get_network_id(network_name)
+            ins_id = peer_si.leaf_model.instance_id
+            ip_address = Port.objects.get(
+                network_id=net_id, instance_id=ins_id).ip
+        except Exception:
+            self.log.error("Failed to fetch parameter",
+                           parameter=parameter,
+                           network_name=network_name)
+            self.defer_sync(o, "Waiting for parameters to become available")
+
+        return ip_address
+
+    def get_peer_serviceinstance_of_type(self, sitype, o):
+        prov_link_set = ServiceInstanceLink.objects.filter(
+            subscriber_service_instance_id=o.id)
+
+        try:
+            peer_service = next(
+                p.provider_service_instance for p in prov_link_set if p.provider_service_instance.leaf_model_name == sitype)
+        except StopIteration:
+            sub_link_set = ServiceInstanceLink.objects.filter(
+                provider_service_instance_id=o.id)
+            try:
+                peer_service = next(
+                    s.subscriber_service_instance for s in sub_link_set if s.subscriber_service_instance.leaf_model_name == sitype)
+            except StopIteration:
+                self.log.error(
+                    'Could not find service type in service graph', service_type=sitype, object=o)
+                raise ServiceGraphException(
+                    "Synchronization failed due to incomplete service graph")
+
+        return peer_service
+
+    # To get each network id
+    def get_network_id(self, network_name):
+        return Network.objects.get(name=network_name).id
+
+    # To get service_instance (assumption: there is a single instance for each service)
+    def get_instance_id(self, serviceinstance):
+        instances = serviceinstance.objects.all()
+        instance_id = instances[0].instance_id
+        return instance_id
+
+    def has_instance(self, sitype, o):
+        try:
+            i = self.get_peer_serviceinstance_of_type(sitype, o)
+        except ServiceGraphException:
+            self.log.info("Missing in ServiceInstance graph",
+                          serviceinstance=sitype)
+            return False
+
+        return i.leaf_model.instance_id
+
+
 
