diff --git a/src/startup_notification.c b/src/startup_notification.c
index 3f34e4747a119391caed5abc904ab67561f1f9a7..85fc390b6a5a8d63e12cb372b96111a79be9ed00 100644
--- a/src/startup_notification.c
+++ b/src/startup_notification.c
@@ -57,16 +57,25 @@ static gboolean sn_startup_sequence_timeout(void *data);
 
 static void sn_error_trap_push(SnDisplay * sn_display, Display * dpy)
 {
+    g_return_if_fail(sn_display != NULL);
+    g_return_if_fail(sn_context != NULL);
+
     gdk_error_trap_push();
 }
 
 static void sn_error_trap_pop(SnDisplay * sn_display, Display * dpy)
 {
+    g_return_if_fail(sn_display != NULL);
+    g_return_if_fail(sn_context != NULL);
+
     gdk_error_trap_pop();
 }
 
 static void sn_update_feedback(void)
 {
+    g_return_if_fail(sn_display != NULL);
+    g_return_if_fail(sn_context != NULL);
+
     if(startup_sequences != NULL)
     {
         XDefineCursor(dpy, root, busy_cursor);
@@ -79,6 +88,10 @@ static void sn_update_feedback(void)
 
 static void sn_add_sequence(SnStartupSequence * sequence)
 {
+    g_return_if_fail(sn_display != NULL);
+    g_return_if_fail(sn_context != NULL);
+    g_return_if_fail(sequence != NULL);
+
     sn_startup_sequence_ref(sequence);
     startup_sequences = g_slist_prepend(startup_sequences, sequence);
 
@@ -91,6 +104,10 @@ static void sn_add_sequence(SnStartupSequence * sequence)
 
 static void sn_remove_sequence(SnStartupSequence * sequence)
 {
+    g_return_if_fail(sn_display != NULL);
+    g_return_if_fail(sn_context != NULL);
+    g_return_if_fail(sequence != NULL);
+
     startup_sequences = g_slist_remove(startup_sequences, sequence);
     sn_startup_sequence_unref(sequence);
 
@@ -109,6 +126,9 @@ static void sn_collect_timed_out_foreach(void *element, void *data)
     long tv_sec, tv_usec;
     double elapsed;
 
+    g_return_if_fail(sn_display != NULL);
+    g_return_if_fail(sn_context != NULL);
+
     sn_startup_sequence_get_last_active_time(sequence, &tv_sec, &tv_usec);
 
     elapsed = ((((double)ctod->now.tv_sec - tv_sec) * G_USEC_PER_SEC + (ctod->now.tv_usec - tv_usec))) / 1000.0;
@@ -124,6 +144,9 @@ static gboolean sn_startup_sequence_timeout(void *data)
     CollectTimedOutData ctod;
     GSList *tmp;
 
+    g_return_if_fail(sn_display != NULL);
+    g_return_if_fail(sn_context != NULL);
+
     ctod.list = NULL;
     g_get_current_time(&ctod.now);
     g_slist_foreach(startup_sequences, sn_collect_timed_out_foreach, &ctod);
@@ -157,6 +180,9 @@ static void sn_screen_event(SnMonitorEvent * event, void *user_data)
     const char *wmclass;
     SnStartupSequence *sequence;
 
+    g_return_if_fail(sn_display != NULL);
+    g_return_if_fail(sn_context != NULL);
+    g_return_if_fail(event != NULL);
 
     sequence = sn_monitor_event_get_startup_sequence(event);
 
@@ -186,6 +212,9 @@ void sn_client_startup_properties(Client * c)
     GSList *tmp = NULL;
     SnStartupSequence *sequence;
 
+    g_return_if_fail(sn_display != NULL);
+    g_return_if_fail(sn_context != NULL);
+
     startup_id = clientGetStartupId(c);
 
     sequence = NULL;
@@ -259,17 +288,25 @@ void sn_client_startup_properties(Client * c)
 void sn_init_display(Display * dpy, int screen)
 {
     sn_display = NULL;
-
+    sn_context = NULL;
+    
     g_return_if_fail(dpy != NULL);
 
     sn_display = sn_display_new(dpy, sn_error_trap_push, sn_error_trap_pop);
-    sn_context = sn_monitor_context_new(sn_display, screen, sn_screen_event, NULL, NULL);
+    if (sn_display != NULL)
+    {
+        sn_context = sn_monitor_context_new(sn_display, screen, sn_screen_event, NULL, NULL);
+    }
     startup_sequences = NULL;
     startup_sequence_timeout = 0;
 }
 
 void sn_close_display(void)
 {
+    if (sn_display)
+    {
+        sn_display_unref (sn_display);
+    }
     sn_display = NULL;
 }