diff --git a/gtk-traymanager.cabal b/gtk-traymanager.cabal
--- a/gtk-traymanager.cabal
+++ b/gtk-traymanager.cabal
@@ -1,5 +1,5 @@
 name: gtk-traymanager
-version: 0.1.6
+version: 1.0.0
 synopsis: A wrapper around the eggtraymanager library for Linux system trays
 license: LGPL-2.1
 license-file: LICENSE
@@ -22,10 +22,10 @@
 library
   default-language: Haskell2010
   exposed-modules: Graphics.UI.Gtk.Misc.TrayManager
-  build-depends: gtk >= 0.12.1 && < 0.15,
-                 glib >= 0.12.1 && < 0.15,
-                 base > 3 && < 5
-  pkgconfig-depends: gtk+-2.0, x11
+  build-depends: base > 3 && < 5
+               , glib >= 0.12.1 && < 0.15
+               , gtk3
+  pkgconfig-depends: gtk+-3.0, x11
   hs-source-dirs: src
   c-sources: src/c/eggtraymanager.c, src/c/eggmarshalers.c, src/c/gdk-helper.c
   ghc-options: -Wall
diff --git a/src/Graphics/UI/Gtk/Misc/TrayManager.hs b/src/Graphics/UI/Gtk/Misc/TrayManager.hs
--- a/src/Graphics/UI/Gtk/Misc/TrayManager.hs
+++ b/src/Graphics/UI/Gtk/Misc/TrayManager.hs
@@ -97,7 +97,6 @@
 toTrayManager = unsafeCastGObject . toGObject
 
 instance TrayManagerClass TrayManager
-instance ObjectClass TrayManager
 instance GObjectClass TrayManager where
   toGObject = GObject . castForeignPtr . unTrayManager
   unsafeCastGObject = TrayManager . castForeignPtr . unGObject
diff --git a/src/c/eggtraymanager.c b/src/c/eggtraymanager.c
--- a/src/c/eggtraymanager.c
+++ b/src/c/eggtraymanager.c
@@ -19,9 +19,7 @@
 
 #include <string.h>
 #include <gdk/gdkx.h>
-#include <gtk/gtkinvisible.h>
-#include <gtk/gtksocket.h>
-#include <gtk/gtkwindow.h>
+#include <gtk/gtk.h>
 #include "eggtraymanager.h"
 #include "eggmarshalers.h"
 #include "gdk-helper.h"
@@ -41,7 +39,7 @@
 {
   long id, len;
   long remaining_len;
-  
+
   long timeout;
   Window window;
   char *str;
@@ -100,12 +98,12 @@
 egg_tray_manager_class_init (EggTrayManagerClass *klass)
 {
   GObjectClass *gobject_class;
-  
+
   parent_class = g_type_class_peek_parent (klass);
   gobject_class = (GObjectClass *)klass;
 
   gobject_class->finalize = egg_tray_manager_finalize;
-  
+
   manager_signals[TRAY_ICON_ADDED] =
     g_signal_new ("tray_icon_added",
 		  G_OBJECT_CLASS_TYPE (klass),
@@ -162,11 +160,11 @@
 egg_tray_manager_finalize (GObject *object)
 {
   EggTrayManager *manager;
-  
+
   manager = EGG_TRAY_MANAGER (object);
 
   egg_tray_manager_unmanage (manager);
-  
+
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -182,7 +180,7 @@
 
 static gboolean
 egg_tray_manager_plug_removed (GtkSocket       *socket,
-			       EggTrayManager  *manager)
+                               EggTrayManager  *manager)
 {
   Window *window;
 
@@ -191,7 +189,7 @@
   g_hash_table_remove (manager->socket_table, GINT_TO_POINTER (*window));
   g_object_set_data (G_OBJECT (socket), "egg-tray-child-window",
 		     NULL);
-  
+
   g_signal_emit (manager, manager_signals[TRAY_ICON_REMOVED], 0, socket);
 
   /* This destroys the socket. */
@@ -200,20 +198,20 @@
 
 static void
 egg_tray_manager_handle_dock_request (EggTrayManager       *manager,
-				      XClientMessageEvent  *xevent)
+                                      XClientMessageEvent  *xevent)
 {
   GtkWidget *socket;
   Window *window;
-  
+
   socket = gtk_socket_new ();
-  
+
   /* We need to set the child window here
    * so that the client can call _get functions
    * in the signal handler
    */
   window = g_new (Window, 1);
   *window = xevent->data.l[2];
-      
+
   g_object_set_data_full (G_OBJECT (socket),
 			  "egg-tray-child-window",
 			  window, g_free);
@@ -225,7 +223,7 @@
     {
       g_signal_connect (socket, "plug_removed",
 			G_CALLBACK (egg_tray_manager_plug_removed), manager);
-      
+
       gtk_socket_add_id (GTK_SOCKET (socket), xevent->data.l[2]);
 
       g_hash_table_insert (manager->socket_table, GINT_TO_POINTER (xevent->data.l[2]), socket);
@@ -247,7 +245,7 @@
 {
   GList *p;
   int len;
-  
+
   /* Try to see if we can find the
    * pending message in the list
    */
@@ -277,7 +275,7 @@
 		}
 	      manager->messages = g_list_remove_link (manager->messages,
 						      p);
-	      
+
 	      pending_message_free (msg);
 	    }
 
@@ -327,9 +325,9 @@
 					XClientMessageEvent  *xevent)
 {
   GtkSocket *socket;
-  
+
   socket = g_hash_table_lookup (manager->socket_table, GINT_TO_POINTER (xevent->window));
-  
+
   if (socket)
     {
       g_signal_emit (manager, manager_signals[MESSAGE_CANCELLED], 0,
@@ -339,7 +337,7 @@
 
 static GdkFilterReturn
 egg_tray_manager_handle_event (EggTrayManager       *manager,
-			       XClientMessageEvent  *xevent)
+                               XClientMessageEvent  *xevent)
 {
   switch (xevent->data.l[1])
     {
@@ -384,7 +382,7 @@
       g_signal_emit (manager, manager_signals[LOST_SELECTION], 0);
       egg_tray_manager_unmanage (manager);
     }
-  
+
   return GDK_FILTER_CONTINUE;
 }
 
@@ -400,19 +398,20 @@
 
   invisible = manager->invisible;
   g_assert (GTK_IS_INVISIBLE (invisible));
-  g_assert (GTK_WIDGET_REALIZED (invisible));
-  g_assert (GDK_IS_WINDOW (invisible->window));
-  
-  display = GDK_WINDOW_XDISPLAY (invisible->window);
-  
+  g_assert (gtk_widget_get_realized(invisible));
+  g_assert (GDK_IS_WINDOW (gtk_widget_get_window(invisible)));
+
+  display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window(invisible));
+
   if (XGetSelectionOwner (display, manager->selection_atom) ==
-      GDK_WINDOW_XWINDOW (invisible->window))
+      GDK_WINDOW_XID (gtk_widget_get_window(invisible)))
     {
-      timestamp = gdk_x11_get_server_time (invisible->window);      
+      timestamp = gdk_x11_get_server_time (gtk_widget_get_window(invisible));
       XSetSelectionOwner (display, manager->selection_atom, None, timestamp);
     }
 
-  gdk_window_remove_filter (invisible->window, egg_tray_manager_window_filter, manager);  
+  gdk_window_remove_filter (gtk_widget_get_window(invisible),
+                            egg_tray_manager_window_filter, manager);
 
   manager->invisible = NULL; /* prior to destroy for reentrancy paranoia */
   gtk_widget_destroy (invisible);
@@ -426,7 +425,7 @@
   char *selection_atom_name;
   guint32 timestamp;
   GdkScreen *screen;
-  
+
   g_return_val_if_fail (EGG_IS_TRAY_MANAGER (manager), FALSE);
   g_return_val_if_fail (manager->screen == NULL, FALSE);
 
@@ -439,10 +438,10 @@
 #endif
   screen = gdk_display_get_screen (gdk_x11_lookup_xdisplay (DisplayOfScreen (xscreen)),
 				   XScreenNumberOfScreen (xscreen));
-  
+
   invisible = gtk_invisible_new_for_screen (screen);
   gtk_widget_realize (invisible);
-  
+
   gtk_widget_add_events (invisible, GDK_PROPERTY_CHANGE_MASK | GDK_STRUCTURE_MASK);
 
   selection_atom_name = g_strdup_printf ("_NET_SYSTEM_TRAY_S%d",
@@ -450,14 +449,14 @@
   manager->selection_atom = XInternAtom (DisplayOfScreen (xscreen), selection_atom_name, False);
 
   g_free (selection_atom_name);
-  
-  timestamp = gdk_x11_get_server_time (invisible->window);
+
+  timestamp = gdk_x11_get_server_time (gtk_widget_get_window(invisible));
   XSetSelectionOwner (DisplayOfScreen (xscreen), manager->selection_atom,
-		      GDK_WINDOW_XWINDOW (invisible->window), timestamp);
+		      GDK_WINDOW_XID (gtk_widget_get_window(invisible)), timestamp);
 
   /* Check if we were could set the selection owner successfully */
   if (XGetSelectionOwner (DisplayOfScreen (xscreen), manager->selection_atom) ==
-      GDK_WINDOW_XWINDOW (invisible->window))
+      GDK_WINDOW_XID (gtk_widget_get_window(invisible)))
     {
       XClientMessageEvent xev;
 
@@ -468,7 +467,7 @@
       xev.format = 32;
       xev.data.l[0] = timestamp;
       xev.data.l[1] = manager->selection_atom;
-      xev.data.l[2] = GDK_WINDOW_XWINDOW (invisible->window);
+      xev.data.l[2] = GDK_WINDOW_XID (gtk_widget_get_window(invisible));
       xev.data.l[3] = 0;	/* manager specific data */
       xev.data.l[4] = 0;	/* manager specific data */
 
@@ -478,7 +477,7 @@
 
       manager->invisible = invisible;
       g_object_ref (G_OBJECT (manager->invisible));
-      
+
       manager->opcode_atom = XInternAtom (DisplayOfScreen (xscreen),
 					  "_NET_SYSTEM_TRAY_OPCODE",
 					  False);
@@ -488,13 +487,13 @@
 						False);
 
       /* Add a window filter */
-      gdk_window_add_filter (invisible->window, egg_tray_manager_window_filter, manager);
+      gdk_window_add_filter (gtk_widget_get_window(invisible), egg_tray_manager_window_filter, manager);
       return TRUE;
     }
   else
     {
       gtk_widget_destroy (invisible);
- 
+
       return FALSE;
     }
 }
@@ -506,7 +505,7 @@
   g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
   g_return_val_if_fail (manager->screen == NULL, FALSE);
 
-  return egg_tray_manager_manage_xscreen (manager, 
+  return egg_tray_manager_manage_xscreen (manager,
 					  GDK_SCREEN_XSCREEN (screen));
 }
 
@@ -550,7 +549,7 @@
 
   g_return_val_if_fail (EGG_IS_TRAY_MANAGER (manager), NULL);
   g_return_val_if_fail (GTK_IS_SOCKET (child), NULL);
-  
+
   child_window = g_object_get_data (G_OBJECT (child),
 				    "egg-tray-child-window");
 
@@ -566,7 +565,7 @@
 			       False, utf8_string,
 			       &type, &format, &nitems,
 			       &bytes_after, (guchar **)&val);
-  
+
   if (gdk_error_trap_pop () || result != Success)
     return NULL;
 
