diff --git a/lib/event_notification.py b/lib/event_notification.py
new file mode 100755
index 0000000..dac6c5e
--- /dev/null
+++ b/lib/event_notification.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+
+import requests
+import websocket
+import json
+import ssl
+import gen_valid as gv
+import gen_print as gp
+
+
+class event_notification():
+    r"""
+    Main class to subscribe and receive event notifications.
+    """
+
+    def __init__(self, host, username, password):
+        r"""
+        Initialize instance variables.
+
+        Description of argument(s):
+        host        The IP or host name of the system to subscribe to.
+        username    The username for the host system.
+        password    The password for the host system.
+        """
+        self.__host = host
+        self.__user = username
+        self.__password = password
+
+    def __del__(self):
+        try:
+            self.__websocket.close()
+        except AttributeError:
+            pass
+
+    def login(self):
+        r"""
+        Login and return session object.
+        """
+        http_header = {'Content-Type': 'application/json'}
+        session = requests.session()
+        response = session.post('https://' + self.__host + '/login',
+                                headers=http_header,
+                                json={"data": [self.__user, self.__password]},
+                                verify=False, timeout=30)
+        gv.valid_value(response.status_code, valid_values=[200])
+        login_response = json.loads(response.text)
+        gp.qprint_var(login_response)
+        gv.valid_value(login_response['status'], valid_values=['ok'])
+        return session
+
+    def subscribe(self, dbus_path, enable_trace=False):
+
+        r"""
+        Subscribe to the given path and return a list of event notifications.
+
+        For more details on "subscribe" and "events" go to
+        https://github.com/openbmc/docs/blob/master/rest-api.md#event-subscription-protocol
+
+        Example robot code:
+        ${event_notifications}=  Subscribe  /xyz/openbmc_project/sensors
+        Rprint Vars  event_notifications
+
+        Example output:
+        event_notifications:
+          [0]:
+            [interface]:             xyz.openbmc_project.Sensor.Value
+            [path]:                  /xyz/openbmc_project/sensors/temperature/ambient
+            [event]:                 PropertiesChanged
+            [properties]:
+              [Value]:               23813
+
+        Description of argument(s):
+        dbus_path              The subcribing event's path (e.g.
+                               "/xyz/openbmc_project/sensors").
+        enable_trace           Enable or disable trace.
+        """
+
+        session = self.login()
+        cookies = session.cookies.get_dict()
+        # Convert from dictionary to a string of the following format:
+        # key=value;key=value...
+        cookies = gp.sprint_var(cookies, fmt=gp.no_header() | gp.strip_brackets(),
+                                col1_width=0, trailing_char="",
+                                delim="=").replace("\n", ";")
+
+        websocket.enableTrace(enable_trace)
+        self.__websocket = websocket.create_connection("wss://{host}/subscribe".format(host=self.__host),
+                                                       sslopt={"cert_reqs": ssl.CERT_NONE},
+                                                       cookie=cookies)
+        dbus_path = [path.strip() for path in dbus_path.split(',')]
+        dbus_path = {"paths": dbus_path}
+
+        self.__websocket.send(json.dumps(dbus_path))
+        event_notifications = json.loads(self.__websocket.recv())
+        self.__websocket.close()
+        return event_notifications
