diff --git a/xos/synchronizer/ceilometer/ceilometer_pub_sub/pubrecords.py b/xos/synchronizer/ceilometer/ceilometer_pub_sub/pubrecords.py
new file mode 100644
index 0000000..bca62b8
--- /dev/null
+++ b/xos/synchronizer/ceilometer/ceilometer_pub_sub/pubrecords.py
@@ -0,0 +1,95 @@
+#!/usr/bin/python
+import socket
+from oslo_utils import units
+from oslo_utils import netutils
+import kafka
+import kafka_broker
+import fnmatch
+import logging
+import copy
+
+sub_info=[] 
+class subinfo:
+    def __init__(self,scheme,app_id,app_ip,app_port,subscription_info,sub_info_filter,target):
+        logging.debug("* Updating subscription_info ") 
+        self.scheme = scheme
+        self.app_id = app_id
+        self.ipaddress = app_ip 
+        self.portno = app_port 
+        self.subscription_info = subscription_info
+        self.sub_info_filter = sub_info_filter
+        self.target = target
+        
+        if scheme == "kafka":
+            ''' Creating kafka publisher to send message over kafka '''
+            parse_target = netutils.urlsplit(target)
+            self.kafka_publisher = kafka_broker.KafkaBrokerPublisher(parse_target)
+        elif scheme == "udp":
+            ''' Creating UDP socket to send message over UDP '''
+            self.udp = socket.socket(socket.AF_INET, # Internet
+                                     socket.SOCK_DGRAM) # UDP
+            self.udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   
+
+    def update_subinfo(self):
+        logging.info("* inside %s",self.update_subinfo.__name__)
+        if not sub_info:
+            logging.debug("* -----------List is EMpty -------------") 
+            sub_info.append(self)
+            logging.debug("* Subscription is sucessful") 
+            return "Subscription is sucessful \n" 
+        for obj in sub_info:
+            if obj.app_id == self.app_id :
+               # obj.subscription_info=self.subscription_info
+                sub_info.remove(obj)
+                sub_info.append(self)
+                logging.warning("* entry already exists so overwriting this subscription \n")
+                return "entry already exists so overwriting this subscription \n" 
+        sub_info.append(self)
+        return "Subscription is sucessful \n"
+ 
+    @staticmethod
+    def delete_subinfo(app_id):
+        logging.info("* inside %s",subinfo.delete_subinfo.__name__)
+        Flag = False 
+        for obj in sub_info:
+            if obj.app_id == app_id : 
+                    sub_info.remove(obj)
+                    Flag = True
+                    logging.debug("* Un-Subscription is sucessful") 
+                    return "Un-Subscription is sucessful \n"
+        if not Flag :
+           err_str = "No subscription exists with app id: " + app_id + "\n"
+           logging.error("* No subscription exists with app id:%s ",app_id)
+           raise Exception (err_str)
+       
+    @staticmethod
+    def print_subinfo():
+        logging.info("* inside %s",subinfo.print_subinfo.__name__)
+        for obj in sub_info:
+            logging.debug("* ------------------------------------------------") 
+            logging.debug("* scheme:%s",obj.scheme)  
+            logging.debug("* app_id:%s",obj.app_id)
+            logging.debug("* portno:%s",obj.portno ) 
+            logging.debug("* ipaddress:%s",obj.ipaddress)  
+            logging.debug("* subscription_info:%s",obj.subscription_info)
+            logging.debug("* sub_info_filter:%s",obj.sub_info_filter)
+            logging.debug("* target:%s",obj.target)
+            logging.debug("* ------------------------------------------------")
+    @staticmethod
+    def get_subinfo(app_id):
+        logging.info("* inside %s",subinfo.get_subinfo.__name__)
+        Flag = False
+        for obj in sub_info:
+            if obj.app_id == app_id :
+                    return obj.subscription_info,obj.target
+        return (None,None)
+       
+ 
+    @staticmethod
+    def get_sub_list(notif_subscription_info):
+        logging.info("* inside %s",subinfo.get_sublist.__name__)
+        sub_list=[]  
+        for obj in sub_info:
+            if obj.subscription_info == notif_subscription_info:
+                sub_list.append(obj)
+        return sub_list
