diff --git a/ansible-serverdensity.py b/ansible-serverdensity.py
index 89522c937cee20fcbcda7c5a4576e6d76e6a3566..56cecc5760ac5fa2a55511d97f7a1b35b02c6c99 100644
--- a/ansible-serverdensity.py
+++ b/ansible-serverdensity.py
@@ -230,7 +230,7 @@ class ServerDensity(object):
                 if type(item) is list or type(item) is dict:
                     if len(item) > 0:
                         item = encoder.encode(item)
-                if type(item) is int or type(item) is unicode:
+                if type(item) is int or type(item) is unicode or type(item) is bool:
                     item = str(item)
                 if item and type(item) is str and len(item) > 0:
                     postData.__setitem__(key, item)
@@ -255,9 +255,26 @@ class ServerDensity(object):
                 return service.get('_id')
         return False
 
+    def _get_user_id(self, loginname):
+        for user in self.users:
+            if user.get('login') == loginname:
+                return user.get('_id')
+        return False
+
+    def _get_notification_id(self, type, name):
+        for notification in self.notifications:
+            if notification.get('type') == type and notification.get('name') == name:
+                return notification.get('_id')
+        return False
+
     def status(self):
         self.devices = self._request('inventory/devices')
         self.services = self._request('inventory/services')
+        self.alerts = self._request('alerts/configs')
+        self.users = self._request('users/users')
+        # TODO: Remove the following workaround if we can get the notifications from the API
+        with open(os.path.abspath(os.path.dirname(__file__) + '/notifications.json'), 'r') as content_file:
+            self.notifications = json.load(content_file)
 
     def ensure_host(self, hostname, cpuCores=None, group=None, installedRAM=None,
                     name=None, os=None, privateIPs=None, privateDNS=None,
@@ -284,6 +301,7 @@ class ServerDensity(object):
         else:
             path = 'inventory/devices/' + deviceId
         self._request(path, data)
+        # TODO: write back the HOST to self.devices if this is a new host
 
     def ensure_service(self, servicename, service):
         serviceId = self._get_service_id(servicename)
@@ -292,6 +310,49 @@ class ServerDensity(object):
         else:
             path = 'inventory/services/' + serviceId
         self._request(path, service)
+        # TODO: write back the SERVICE to self.services if this is a new service
+
+    def ensure_alert(self, alert, a_type):
+        alertId = alert.get('id')
+        if not alertId or len(alertId) == 0:
+            path = 'alerts/configs'
+        else:
+            path = 'alerts/configs/' + alertId
+
+        recipients = []
+        notify = alert.get('notify')
+        if notify:
+            for item in notify:
+                n_type = item['type']
+                n_name = item['name']
+                if n_type == 'user':
+                    id = self._get_user_id(n_name)
+                    actions = item['actions']
+                else:
+                    id = self._get_notification_id(n_type, n_name)
+                    actions = None
+                if id:
+                    recipients.append({
+                        'type': n_type,
+                        'id': id,
+                        'actions': actions,
+                    })
+
+        config = alert.get('config')
+        config.__setitem__('_id', alertId)
+        config.__setitem__('group', alert.get('group'))
+        if a_type == 'device' or a_type == 'serviceGroup':
+            config.__setitem__('subjectId', self._get_device_id(alert.get('host')))
+        elif a_type == 'service':
+            config.__setitem__('subjectId', self._get_service_id(alert.get('service')))
+        else:
+            config.__setitem__('subjectId', alert.get('group'))
+        config.__setitem__('subjectType', a_type)
+        config.__setitem__('recipients', recipients)
+        result = self._request(path, config)
+        if result.has_key('_id'):
+            if result.get('_id') != alertId:
+                callbacks.display('        ID for %s %s: %s' % (alert.get('group'), alert.get('name'), result.get('_id')))
 
 ########################################################
 if __name__ == '__main__':
@@ -327,9 +388,10 @@ if __name__ == '__main__':
         raise errors.AnsibleError('%s' % e.msg)
 
     services = {}
-    alerts = {}
+    devicegroup_alerts = {}
+    servicegroup_alerts = {}
 
-    callbacks.display('Ensure hosts and their data...')
+    callbacks.display('Ensure hosts...')
     for host in results['contacted']:
         callbacks.display('  - ' + host)
         facts = results['contacted'][host]['ansible_facts']
@@ -345,6 +407,30 @@ if __name__ == '__main__':
                 if not services.has_key(name):
                     services.__setitem__(name, host_service)
 
+        host_devicegroup_alerts = host_vars.get('sd_devicegroup_alerts')
+        if host_devicegroup_alerts:
+            for host_devicegroup_alert in host_devicegroup_alerts:
+                group = host_devicegroup_alert.get('group')
+                name = host_devicegroup_alert.get('name')
+                if not devicegroup_alerts.has_key(group):
+                    devicegroup_alerts.__setitem__(group, {})
+                alerts = devicegroup_alerts.get(group)
+                if not alerts.has_key(name):
+                    alerts.__setitem__(name, host_devicegroup_alert)
+                    devicegroup_alerts.__setitem__(group, alerts)
+
+        host_servicegroup_alerts = host_vars.get('sd_servicegroup_alerts')
+        if host_servicegroup_alerts:
+            for host_servicegroup_alert in host_servicegroup_alerts:
+                group = host_servicegroup_alert.get('group')
+                name = host_servicegroup_alert.get('name')
+                if not servicegroup_alerts.has_key(group):
+                    servicegroup_alerts.__setitem__(group, {})
+                alerts = servicegroup_alerts.get(group)
+                if not alerts.has_key(name):
+                    alerts.__setitem__(name, host_servicegroup_alert)
+                    servicegroup_alerts.__setitem__(group, alerts)
+
         sd_api.ensure_host(
             cpuCores=facts['ansible_processor_count'],
             group=host_vars.get('sd_group'),
@@ -368,8 +454,44 @@ if __name__ == '__main__':
             provider=host_vars.get('provider')
         )
 
-    callbacks.display('Ensure services and their data...')
+        alerts = host_vars.get('sd_alerts')
+        if alerts:
+            callbacks.display('    Ensure device alerts...')
+            for alertname in alerts:
+                callbacks.display('      - ' + alertname)
+                alert = alerts.get(alertname)
+                sd_api.ensure_alert(alert, 'device')
+
+    callbacks.display('Ensure device group alerts...')
+    for groupname in devicegroup_alerts:
+        callbacks.display('  - ' + groupname)
+        group_alerts = devicegroup_alerts.get(groupname)
+        for alertname in group_alerts:
+            callbacks.display('    - ' + alertname)
+            alert = group_alerts.get(alertname)
+            sd_api.ensure_alert(alert, 'deviceGroup')
+
+    callbacks.display('Ensure services...')
     for servicename in services:
         callbacks.display('  - ' + servicename)
         service = services.get(servicename)
         sd_api.ensure_service(servicename, service)
+        alerts = service.get('alerts')
+        if alerts:
+            callbacks.display('    Ensure service alerts...')
+            for alertname in alerts:
+                callbacks.display('      - ' + alertname)
+                alert = alerts.get(alertname)
+                sd_api.ensure_alert(alert, 'service')
+
+    callbacks.display('Ensure service group alerts...')
+    for groupname in servicegroup_alerts:
+        callbacks.display('  - ' + groupname)
+        group_alerts = servicegroup_alerts.get(groupname)
+        for alertname in group_alerts:
+            callbacks.display('    - ' + alertname)
+            alert = group_alerts.get(alertname)
+            sd_api.ensure_alert(alert, 'serviceGroup')
+
+    callbacks.display('Completed successfully!')
+    sys.exit(0)