diff --git a/Hyena.Gui/Hyena.Data.Gui/CellContext.cs b/Hyena.Gui/Hyena.Data.Gui/CellContext.cs
index e300c20..5cf776d 100644
--- a/Hyena.Gui/Hyena.Data.Gui/CellContext.cs
+++ b/Hyena.Gui/Hyena.Data.Gui/CellContext.cs
@@ -44,7 +44,7 @@ namespace Hyena.Data.Gui
         public Pango.FontDescription FontDescription { get; set; }
         public Gtk.Widget Widget { get; set; }
         public Gtk.StateType State { get; set; }
-        public Gdk.Drawable Drawable { get; set; }
+        //public Gdk.Drawable Drawable { get; set; }
         public Theme Theme { get; set; }
         public Gdk.Rectangle Area { get; set; }
         public Gdk.Rectangle Clip { get; set; }
diff --git a/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs b/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
index 31946eb..b8aae0d 100644
--- a/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
+++ b/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
@@ -40,7 +40,7 @@ using Selection = Hyena.Collections.Selection;
 
 namespace Hyena.Data.Gui
 {
-    public partial class ListView<T> : ListViewBase
+    public partial class ListView<T> : ListViewBase, ScrollableImplementor
     {
         private enum KeyDirection {
             Press,
@@ -1088,7 +1088,7 @@ namespace Hyena.Data.Gui
             }
         }
 
-        protected override void OnSetScrollAdjustments (Adjustment hadj, Adjustment vadj)
+        /*protected override void OnSetScrollAdjustments (Adjustment hadj, Adjustment vadj)
         {
             if (hadj == null || vadj == null) {
                 return;
@@ -1098,7 +1098,7 @@ namespace Hyena.Data.Gui
             vadj.ValueChanged += OnVadjustmentChanged;
 
             UpdateAdjustments (hadj, vadj);
-        }
+        }*/
 
 #endregion
 
diff --git a/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs b/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
index 78bf70c..10a1e90 100644
--- a/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
+++ b/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
@@ -129,7 +129,7 @@ namespace Hyena.Data.Gui
             }
         }
 
-        protected override bool OnExposeEvent (EventExpose evnt)
+        protected override bool OnDamageEvent (Gdk.EventExpose evnt)
         {
             if (DoNotRenderNullModel && Model == null) {
                 return true;
@@ -140,7 +140,7 @@ namespace Hyena.Data.Gui
                 damage = damage.Union (rect);
             }
 
-            cairo_context = CairoHelper.Create (evnt.Window);
+            cairo_context = Gdk.CairoHelper.Create (evnt.Window);
 
             cell_context.Layout = PangoLayout;
             cell_context.Context = cairo_context;
diff --git a/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs b/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs
index 898e73f..46df758 100644
--- a/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs
+++ b/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs
@@ -53,7 +53,8 @@ namespace Hyena.Data.Gui
 
         protected override void OnRealized ()
         {
-            WidgetFlags |= WidgetFlags.Realized | WidgetFlags.NoWindow;
+            IsRealized = true;
+            HasWindow = false;
 
             GdkWindow = Parent.GdkWindow;
             cell_context.Drawable = GdkWindow;
@@ -88,7 +89,7 @@ namespace Hyena.Data.Gui
 
         protected override void OnUnrealized ()
         {
-            WidgetFlags &= ~WidgetFlags.Realized;
+            IsRealized = false;
 
             event_window.UserData = IntPtr.Zero;
             Hyena.Gui.GtkWorkarounds.WindowDestroy (event_window);
@@ -99,13 +100,13 @@ namespace Hyena.Data.Gui
 
         protected override void OnMapped ()
         {
-            WidgetFlags |= WidgetFlags.Mapped;
+            IsMapped = true;
             event_window.Show ();
         }
 
         protected override void OnUnmapped ()
         {
-            WidgetFlags &= ~WidgetFlags.Mapped;
+            IsMapped = false;
             event_window.Hide ();
         }
 
@@ -141,14 +142,28 @@ namespace Hyena.Data.Gui
             header_width = header_interaction_alloc.Width;
         }
 
-        protected override void OnSizeRequested (ref Requisition requisition)
+        protected override void OnGetPreferredHeight (out int minimum_height, out int natural_height)
+        {
+            var requisition = SizeRequested ();
+            minimum_height = natural_height = requisition.Height;
+        }
+
+        protected override void OnGetPreferredWidth (out int minimum_width, out int natural_width)
+        {
+            var requisition = SizeRequested ();
+            minimum_width = natural_width = requisition.Width;
+        }
+
+        protected Requisition SizeRequested ()
         {
             // TODO give the minimum height of the header
             if (Theme == null) {
-                return;
+                return null;
             }
+            var requisition = new Requisition ();
             requisition.Width = Theme.TotalBorderWidth * 2;
             requisition.Height = HeaderHeight + Theme.TotalBorderWidth * 2;
+            return requisition;
         }
 
         protected override void OnSizeAllocated (Rectangle allocation)
diff --git a/Hyena.Gui/Hyena.Gui.Canvas/CanvasHost.cs b/Hyena.Gui/Hyena.Gui.Canvas/CanvasHost.cs
index a0a4cea..3531972 100644
--- a/Hyena.Gui/Hyena.Gui.Canvas/CanvasHost.cs
+++ b/Hyena.Gui/Hyena.Gui.Canvas/CanvasHost.cs
@@ -44,7 +44,7 @@ namespace Hyena.Gui.Canvas
 
         public CanvasHost ()
         {
-            WidgetFlags |= WidgetFlags.NoWindow;
+            HasWindow = false;
             manager = new CanvasManager (this);
         }
 
@@ -83,7 +83,7 @@ namespace Hyena.Gui.Canvas
 
         protected override void OnUnrealized ()
         {
-            WidgetFlags ^= WidgetFlags.Realized;
+            IsRealized = false;
 
             event_window.UserData = IntPtr.Zero;
             Hyena.Gui.GtkWorkarounds.WindowDestroy (event_window);
@@ -114,8 +114,21 @@ namespace Hyena.Gui.Canvas
             }
         }
 
-        protected override void OnSizeRequested (ref Gtk.Requisition requisition)
+        protected override void OnGetPreferredHeight (out int minimum_height, out int natural_height)
         {
+            var requisition = SizeRequested ();
+            minimum_height = natural_height = requisition.Height;
+        }
+
+        protected override void OnGetPreferredWidth (out int minimum_width, out int natural_width)
+        {
+            var requisition = SizeRequested ();
+            minimum_width = natural_width = requisition.Width;
+        }
+
+        protected Requisition SizeRequested ()
+        {
+            var requisition = new Requisition ();
             if (canvas_child != null) {
                 Size size = canvas_child.Measure (Size.Empty);
 
@@ -127,11 +140,12 @@ namespace Hyena.Gui.Canvas
                     requisition.Height = (int)Math.Ceiling (size.Height);
                 }
             }
+            return requisition;
         }
 
         private Random rand;
 
-        protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+        protected override bool OnDamageEvent (Gdk.EventExpose evnt)
         {
             if (canvas_child == null || !canvas_child.Visible || !Visible || !IsMapped) {
                 return true;
diff --git a/Hyena.Gui/Hyena.Gui.Theming/ThemeTestModule.cs b/Hyena.Gui/Hyena.Gui.Theming/ThemeTestModule.cs
index dbf0b18..9c4915c 100644
--- a/Hyena.Gui/Hyena.Gui.Theming/ThemeTestModule.cs
+++ b/Hyena.Gui/Hyena.Gui.Theming/ThemeTestModule.cs
@@ -80,22 +80,17 @@ namespace Hyena.Gui.Theming
                 theme.Context.Radius = 10;
             }
 
-            protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+            protected override bool OnDrawn (Cairo.Context cr)
             {
-                Cairo.Context cr = null;
-                try {
-                    var alloc = new Gdk.Rectangle () {
-                        X = Allocation.X,
-                        Y = Allocation.Y,
-                        Width = Allocation.Width,
-                        Height = Allocation.Height
-                    };
-                    cr = Gdk.CairoHelper.Create (evnt.Window);
-                    theme.DrawListBackground (cr, alloc, true);
-                    theme.DrawFrameBorder (cr, alloc);
-                } finally {
-                    CairoExtensions.DisposeContext (cr);
-                }
+                var alloc = new Gdk.Rectangle () {
+                    X = Allocation.X,
+                    Y = Allocation.Y,
+                    Width = Allocation.Width,
+                    Height = Allocation.Height
+                };
+                CairoHelper.TransformToWindow (cr, this, GdkWindow);
+                theme.DrawListBackground (cr, alloc, true);
+                theme.DrawFrameBorder (cr, alloc);
                 return true;
             }
         }
diff --git a/Hyena.Gui/Hyena.Gui/CairoExtensions.cs b/Hyena.Gui/Hyena.Gui/CairoExtensions.cs
index 80cc29d..3286ab5 100644
--- a/Hyena.Gui/Hyena.Gui/CairoExtensions.cs
+++ b/Hyena.Gui/Hyena.Gui/CairoExtensions.cs
@@ -69,7 +69,8 @@ namespace Hyena.Gui
         {
             Surface surface = cr.Target.CreateSimilar (cr.Target.Content, pixbuf.Width, pixbuf.Height);
             Cairo.Context surface_cr = new Context (surface);
-            Gdk.CairoHelper.SetSourcePixbuf (surface_cr, pixbuf, 0, 0);
+            //Gdk.CairoHelper.SetSourcePixbuf (surface_cr, pixbuf, 0.0, 0.0);
+            Gdk.CairoHelper.SetSourcePixbuf (surface_cr, pixbuf, 0.0, 0.0);
             surface_cr.Paint ();
             ((IDisposable)surface_cr).Dispose ();
             return surface;
diff --git a/Hyena.Gui/Hyena.Gui/CompositeUtils.cs b/Hyena.Gui/Hyena.Gui/CompositeUtils.cs
index 4d93bb8..7608aac 100644
--- a/Hyena.Gui/Hyena.Gui/CompositeUtils.cs
+++ b/Hyena.Gui/Hyena.Gui/CompositeUtils.cs
@@ -45,7 +45,7 @@ namespace Hyena.Gui
         [DllImport ("libgdk-win32-2.0-0.dll")]
         private static extern IntPtr gdk_screen_get_rgba_colormap (IntPtr screen);
 
-        public static Colormap GetRgbaColormap (Screen screen)
+        /*public static Colormap GetRgbaColormap (Screen screen)
         {
             try {
                 IntPtr raw_ret = gdk_screen_get_rgba_colormap (screen.Handle);
@@ -60,7 +60,7 @@ namespace Hyena.Gui
             }
 
             return null;
-        }
+        }*/
 
         public static bool SetRgbaColormap (Widget w)
         {
@@ -152,10 +152,10 @@ namespace Hyena.Gui
             );
         }
 
-        public static void InputShapeCombineMask (Widget w, Pixmap shape_mask, int offset_x, int offset_y)
+        /*public static void InputShapeCombineMask (Widget w, Pixmap shape_mask, int offset_x, int offset_y)
         {
             gtk_widget_input_shape_combine_mask (w.Handle, shape_mask == null ? IntPtr.Zero : shape_mask.Handle,
                 offset_x, offset_y);
-        }
+        }*/
     }
 }
diff --git a/Hyena.Gui/Hyena.Gui/ShadingTestWindow.cs b/Hyena.Gui/Hyena.Gui/ShadingTestWindow.cs
index d82d67b..1826eeb 100644
--- a/Hyena.Gui/Hyena.Gui/ShadingTestWindow.cs
+++ b/Hyena.Gui/Hyena.Gui/ShadingTestWindow.cs
@@ -40,9 +40,9 @@ namespace Hyena.Gui
             SetSizeRequest (512, 512);
         }
 
-        protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+        protected override bool OnDrawn (Cairo.Context cr)
         {
-            Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
+            CairoHelper.TransformToWindow (cr, this, GdkWindow);
 
             double step_width = Allocation.Width / (double)steps;
             double step_height = Allocation.Height / (double)steps;
@@ -74,7 +74,6 @@ namespace Hyena.Gui
                 }
             }
 
-            CairoExtensions.DisposeContext (cr);
             return true;
         }
 
diff --git a/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs b/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs
index ba9ea15..2f11b00 100644
--- a/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs
+++ b/Hyena.Gui/Hyena.Query.Gui/FileSizeQueryValueEntry.cs
@@ -38,7 +38,7 @@ namespace Hyena.Query.Gui
     public class FileSizeQueryValueEntry : QueryValueEntry
     {
         protected SpinButton spin_button;
-        protected ComboBox combo;
+        protected ComboBoxText combo;
         protected FileSizeQueryValue query_value;
 
         protected static readonly FileSizeFactor [] factors = new FileSizeFactor [] {
@@ -57,7 +57,7 @@ namespace Hyena.Query.Gui
             spin_button.SetRange (0.0, Double.MaxValue);
             Add (spin_button);
 
-            combo = ComboBox.NewText ();
+            combo = new ComboBoxText ();
             combo.AppendText (Catalog.GetString ("bytes"));
             combo.AppendText (Catalog.GetString ("KB"));
             combo.AppendText (Catalog.GetString ("MB"));
diff --git a/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs b/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs
index 0fe4562..672095c 100644
--- a/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs
+++ b/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs
@@ -52,7 +52,7 @@ namespace Hyena.Query.Gui
             get { return limit_box; }
         }
 
-        private ComboBox terms_logic_combo;
+        private ComboBoxText terms_logic_combo;
         private CheckButton terms_enabled_checkbox;
         private Label terms_label;
         private QueryFieldSet field_set;
@@ -107,7 +107,7 @@ namespace Hyena.Query.Gui
             terms_enabled_checkbox.Toggled += OnMatchCheckBoxToggled;
             header.PackStart (terms_enabled_checkbox, false, false, 0);
 
-            terms_logic_combo = ComboBox.NewText ();
+            terms_logic_combo = new ComboBoxText ();
             terms_logic_combo.AppendText (Catalog.GetString ("all"));
             terms_logic_combo.AppendText (Catalog.GetString ("any"));
             terms_logic_combo.Show ();
diff --git a/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs b/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs
index 545b9e3..622fc03 100644
--- a/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs
+++ b/Hyena.Gui/Hyena.Query.Gui/QueryLimitBox.cs
@@ -42,8 +42,8 @@ namespace Hyena.Query.Gui
     {
         private CheckButton enabled_checkbox;
         private SpinButton count_spin;
-        private ComboBox limit_combo;
-        private ComboBox order_combo;
+        private ComboBoxText limit_combo;
+        private ComboBoxText order_combo;
 
         private QueryOrder [] orders;
         private QueryLimit [] limits;
@@ -64,12 +64,12 @@ namespace Hyena.Query.Gui
             count_spin.Value = 25;
             count_spin.SetSizeRequest (60, -1);
 
-            limit_combo = ComboBox.NewText ();
+            limit_combo = new ComboBoxText ();
             foreach (QueryLimit limit in limits) {
                 limit_combo.AppendText (limit.Label);
             }
 
-            order_combo = ComboBox.NewText ();
+            order_combo = new ComboBoxText ();
             order_combo.RowSeparatorFunc = IsRowSeparator;
             foreach (QueryOrder order in orders) {
                 if (order == null) {
diff --git a/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs b/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs
index f5413d7..36ae5d7 100644
--- a/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs
+++ b/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs
@@ -54,13 +54,13 @@ namespace Hyena.Query.Gui
 
         private QueryField [] sorted_fields;
 
-        private ComboBox field_chooser;
-        public ComboBox FieldChooser {
+        private ComboBoxText field_chooser;
+        public ComboBoxText FieldChooser {
             get { return field_chooser; }
         }
 
-        private ComboBox op_chooser;
-        public ComboBox OpChooser {
+        private ComboBoxText op_chooser;
+        public ComboBoxText OpChooser {
             get { return op_chooser; }
         }
 
@@ -82,10 +82,10 @@ namespace Hyena.Query.Gui
 
         private void BuildInterface ()
         {
-            field_chooser = ComboBox.NewText ();
+            field_chooser = new ComboBoxText ();
             field_chooser.Changed += HandleFieldChanged;
 
-            op_chooser = ComboBox.NewText ();
+            op_chooser = new ComboBoxText ();
             op_chooser.RowSeparatorFunc = IsRowSeparator;
             op_chooser.Changed += HandleOperatorChanged;
 
@@ -156,9 +156,7 @@ namespace Hyena.Query.Gui
             this.field = field;
 
             // Remove old type's operators
-            while (op_chooser.Model.IterNChildren () > 0) {
-                op_chooser.RemoveText (0);
-            }
+            op_chooser.RemoveAll ();
 
             // Add new field's operators
             int val_count = 0;
diff --git a/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs b/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs
index 0158ad1..469ddb0 100644
--- a/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs
+++ b/Hyena.Gui/Hyena.Query.Gui/TimeSpanQueryValueEntry.cs
@@ -38,7 +38,7 @@ namespace Hyena.Query.Gui
     public class TimeSpanQueryValueEntry : QueryValueEntry
     {
         protected SpinButton spin_button;
-        protected ComboBox combo;
+        protected ComboBoxText combo;
         protected TimeSpanQueryValue query_value;
         private int set_combo = 1;
 
@@ -55,7 +55,7 @@ namespace Hyena.Query.Gui
             spin_button.SetRange (0.0, Double.MaxValue);
             Add (spin_button);
 
-            combo = ComboBox.NewText ();
+            combo = new ComboBoxText ();
             combo.AppendText (Catalog.GetString ("seconds"));
             combo.AppendText (Catalog.GetString ("minutes"));
             combo.AppendText (Catalog.GetString ("hours"));
diff --git a/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs b/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs
index 4154570..2ac20a7 100644
--- a/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs
+++ b/Hyena.Gui/Hyena.Widgets/AnimatedBox.cs
@@ -61,7 +61,7 @@ namespace Hyena.Widgets
 
         protected AnimatedBox (bool horizontal)
         {
-            WidgetFlags |= WidgetFlags.NoWindow;
+            HasWindow = false;
             this.horizontal = horizontal;
             stage.ActorStep += OnActorStep;
             border_stage.Iteration += OnBorderIteration;
@@ -184,8 +184,22 @@ namespace Hyena.Widgets
             PackStart (widget, duration, easing, blocking);
         }
 
-        protected override void OnSizeRequested (ref Requisition requisition)
+
+        protected override void OnGetPreferredHeight (out int minimum_height, out int natural_height)
+        {
+            var requisition = SizeRequested ();
+            minimum_height = natural_height = requisition.Height;
+        }
+
+        protected override void OnGetPreferredWidth (out int minimum_width, out int natural_width)
+        {
+            var requisition = SizeRequested ();
+            minimum_width = natural_width = requisition.Width;
+        }
+
+        protected Requisition SizeRequested ()
         {
+            var requisition = new Requisition ();
             int width = 0;
             int height = 0;
 
@@ -208,6 +222,7 @@ namespace Hyena.Widgets
 
             requisition.Width = width;
             requisition.Height = height;
+            return requisition;
         }
 
         protected override void OnSizeAllocated (Rectangle allocation)
@@ -546,4 +561,4 @@ namespace Hyena.Widgets
 #endregion
 
     }
-}
\ No newline at end of file
+}
diff --git a/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs b/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs
index a77eadf..f91664c 100644
--- a/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs
+++ b/Hyena.Gui/Hyena.Widgets/AnimatedWidget.cs
@@ -62,7 +62,7 @@ namespace Hyena.Widgets
         private readonly bool horizontal;
         private double percent;
         private Rectangle widget_alloc;
-        private Pixmap canvas;
+        //private Pixmap canvas;
 
         public AnimatedWidget (Widget widget, uint duration, Easing easing, Blocking blocking, bool horizontal)
         {
@@ -92,7 +92,7 @@ namespace Hyena.Widgets
 
         private void OnWidgetDestroyed (object sender, EventArgs args)
         {
-            if (!IsRealized) {
+/*            if (!IsRealized) {
                 return;
             }
 
@@ -102,7 +102,7 @@ namespace Hyena.Widgets
 
             if (AnimationState != AnimationState.Going) {
                 WidgetDestroyed (this, args);
-            }
+            }*/
         }
 
 #region Overrides
@@ -117,7 +117,7 @@ namespace Hyena.Widgets
 
         protected override void OnRealized ()
         {
-            WidgetFlags |= WidgetFlags.Realized;
+            IsRealized = true;
 
             Gdk.WindowAttr attributes = new Gdk.WindowAttr ();
             attributes.WindowType = Gdk.WindowType.Child;
@@ -130,8 +130,21 @@ namespace Hyena.Widgets
             Style.Attach (GdkWindow);
         }
 
-        protected override void OnSizeRequested (ref Requisition requisition)
+        protected override void OnGetPreferredHeight (out int minimum_height, out int natural_height)
+        {
+            var requisition = SizeRequested ();
+            minimum_height = natural_height = requisition.Height;
+        }
+
+        protected override void OnGetPreferredWidth (out int minimum_width, out int natural_width)
+        {
+            var requisition = SizeRequested ();
+            minimum_width = natural_width = requisition.Width;
+        }
+
+        protected Requisition SizeRequested ()
         {
+            var requisition = new Requisition ();
             if (Widget != null) {
                 Requisition req = Widget.SizeRequest ();
                 widget_alloc.Width = req.Width;
@@ -148,6 +161,7 @@ namespace Hyena.Widgets
 
             requisition.Width = Width;
             requisition.Height = Height;
+            return requisition;
         }
 
         protected override void OnSizeAllocated (Rectangle allocation)
@@ -174,14 +188,14 @@ namespace Hyena.Widgets
             }
         }
 
-        protected override bool OnExposeEvent (EventExpose evnt)
+        protected override bool OnDrawn (Cairo.Context cr)
         {
             if (canvas != null) {
                 GdkWindow.DrawDrawable (Style.BackgroundGC (State), canvas,
                     0, 0, widget_alloc.X, widget_alloc.Y, widget_alloc.Width, widget_alloc.Height);
                 return true;
             } else {
-                return base.OnExposeEvent (evnt);
+                return base.OnDrawn (cr);
             }
         }
 
diff --git a/Hyena.Gui/Hyena.Widgets/ComplexMenuItem.cs b/Hyena.Gui/Hyena.Widgets/ComplexMenuItem.cs
index 5d3c9c0..cc07a60 100644
--- a/Hyena.Gui/Hyena.Widgets/ComplexMenuItem.cs
+++ b/Hyena.Gui/Hyena.Widgets/ComplexMenuItem.cs
@@ -64,7 +64,11 @@ namespace Hyena.Widgets
             widget.ExposeEvent += OnChildExposeEvent;
         }
 
-        [GLib.ConnectBefore]
+        private void OnChildExposeEvent(object o, EventArgs args)
+        {
+        }
+
+/*        [GLib.ConnectBefore]
         private void OnChildExposeEvent(object o, ExposeEventArgs args)
         {
             // NOTE: This is a little insane, but it allows packing of EventBox based widgets
@@ -104,7 +108,7 @@ namespace Hyena.Widgets
                     args.Event.Area, widget, "menu", x, y, width, height);
             }
         }
-
+*/
         protected override void OnSelected()
         {
             base.OnSelected();
diff --git a/Hyena.Gui/Hyena.Widgets/EntryPopup.cs b/Hyena.Gui/Hyena.Widgets/EntryPopup.cs
index e8da7fb..92e4d24 100644
--- a/Hyena.Gui/Hyena.Widgets/EntryPopup.cs
+++ b/Hyena.Gui/Hyena.Widgets/EntryPopup.cs
@@ -234,10 +234,10 @@ namespace Hyena.Widgets
             return base.OnFocusOutEvent (evnt);
         }
 
-        protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+        protected override bool OnDrawn (Cairo.Context cr)
         {
             InitializeDelayedHide ();
-            return base.OnExposeEvent (evnt);
+            return base.OnDrawn (cr);
         }
 
         protected override bool OnButtonReleaseEvent (Gdk.EventButton evnt)
diff --git a/Hyena.Gui/Hyena.Widgets/MenuButton.cs b/Hyena.Gui/Hyena.Widgets/MenuButton.cs
index c5f790d..c0351bb 100644
--- a/Hyena.Gui/Hyena.Widgets/MenuButton.cs
+++ b/Hyena.Gui/Hyena.Widgets/MenuButton.cs
@@ -54,7 +54,7 @@ namespace Hyena.Widgets
 
         protected void Construct (Widget buttonWidget, Menu menu, bool showArrow)
         {
-            WidgetFlags |= WidgetFlags.NoWindow;
+            HasWindow = false;
 
             button_widget = buttonWidget;
             Menu = menu;
@@ -121,9 +121,16 @@ namespace Hyena.Widgets
             set { alignment.Visible = value; }
         }
 
-        protected override void OnSizeRequested (ref Requisition requisition)
+        protected override void OnGetPreferredHeight (out int minimum_height, out int natural_height)
         {
-            requisition = size_widget.SizeRequest ();
+            var requisition = size_widget.SizeRequest ();
+            minimum_height = natural_height = requisition.Height;
+        }
+
+        protected override void OnGetPreferredWidth (out int minimum_width, out int natural_width)
+        {
+            var requisition = size_widget.SizeRequest ();
+            minimum_width = natural_width = requisition.Width;
         }
 
         protected override void OnSizeAllocated (Rectangle allocation)
diff --git a/Hyena.Gui/Hyena.Widgets/MessageBar.cs b/Hyena.Gui/Hyena.Widgets/MessageBar.cs
index 9582664..11f8462 100644
--- a/Hyena.Gui/Hyena.Widgets/MessageBar.cs
+++ b/Hyena.Gui/Hyena.Widgets/MessageBar.cs
@@ -128,21 +128,15 @@ namespace Hyena.Widgets
             QueueDraw ();
         }
 
-        protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+        protected override bool OnDrawn (Cairo.Context cr)
         {
-            if (!IsDrawable) {
-                return false;
-            }
-
-            Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
+            cr.Save ();
+            CairoHelper.TransformToWindow (cr, this, GdkWindow);
 
-            try {
-                Gdk.Color color = Style.Background (StateType.Normal);
-                theme.DrawFrame (cr, Allocation, CairoExtensions.GdkColorToCairoColor (color));
-                return base.OnExposeEvent (evnt);
-            } finally {
-                CairoExtensions.DisposeContext (cr);
-            }
+            Gdk.Color color = Style.Background (StateType.Normal);
+            theme.DrawFrame (cr, Allocation, CairoExtensions.GdkColorToCairoColor (color));
+            cr.Restore ();
+            return base.OnExposeEvent (evnt);
         }
 
         private bool changing_style = false;
diff --git a/Hyena.Gui/Hyena.Widgets/PulsingButton.cs b/Hyena.Gui/Hyena.Widgets/PulsingButton.cs
index 4ee6b8b..59cd39b 100644
--- a/Hyena.Gui/Hyena.Widgets/PulsingButton.cs
+++ b/Hyena.Gui/Hyena.Widgets/PulsingButton.cs
@@ -82,13 +82,14 @@ namespace Hyena.Widgets
             pulsator.Pulse += delegate { QueueDraw (); };
         }
 
-        protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+        protected override bool OnDrawn (Cairo.Context cr)
         {
             if (!pulsator.IsPulsing) {
-                return base.OnExposeEvent (evnt);
+                return base.OnDrawn (cr);
             }
 
-            Cairo.Context cr = Gdk.CairoHelper.Create (GdkWindow);
+            cr.Save ();
+            CairoHelper.TransformToWindow (cr, this, GdkWindow);
 
             double x = Allocation.X + Allocation.Width / 2;
             double y = Allocation.Y + Allocation.Height / 2;
@@ -108,8 +109,8 @@ namespace Hyena.Widgets
             cr.Fill ();
             fill.Destroy ();
 
-            CairoExtensions.DisposeContext (cr);
-            return base.OnExposeEvent (evnt);
+            cr.Restore ();
+            return base.OnDrawn (cr);
         }
 
         public void StartPulsing ()
diff --git a/Hyena.Gui/Hyena.Widgets/RatingEntry.cs b/Hyena.Gui/Hyena.Widgets/RatingEntry.cs
index 0d251ba..1d20d8c 100644
--- a/Hyena.Gui/Hyena.Widgets/RatingEntry.cs
+++ b/Hyena.Gui/Hyena.Widgets/RatingEntry.cs
@@ -56,7 +56,7 @@ namespace Hyena.Widgets
 
         public RatingEntry () : this (0)
         {
-            WidgetFlags |= Gtk.WidgetFlags.NoWindow;
+            HasWindow = false;
         }
 
         public RatingEntry (int rating) : this (rating, new RatingRenderer ())
@@ -151,7 +151,8 @@ namespace Hyena.Widgets
 
         protected override void OnRealized ()
         {
-            WidgetFlags |= WidgetFlags.Realized | WidgetFlags.NoWindow;
+            IsRealized = true;
+            HasWindow = false;
             GdkWindow = Parent.GdkWindow;
 
             Gdk.WindowAttr attributes = new Gdk.WindowAttr ();
@@ -186,7 +187,7 @@ namespace Hyena.Widgets
 
         protected override void OnUnrealized ()
         {
-            WidgetFlags &= ~WidgetFlags.Realized;
+            IsRealized = false;
 
             event_window.UserData = IntPtr.Zero;
             Hyena.Gui.GtkWorkarounds.WindowDestroy (event_window);
@@ -197,13 +198,13 @@ namespace Hyena.Widgets
 
         protected override void OnMapped ()
         {
-            WidgetFlags |= WidgetFlags.Mapped;
+            IsMapped = true;
             event_window.Show ();
         }
 
         protected override void OnUnmapped ()
         {
-            WidgetFlags &= ~WidgetFlags.Mapped;
+            IsMapped = false;
             event_window.Hide ();
         }
 
@@ -231,8 +232,21 @@ namespace Hyena.Widgets
             }
         }
 
-        protected override void OnSizeRequested (ref Gtk.Requisition requisition)
+        protected override void OnGetPreferredHeight (out int minimum_height, out int natural_height)
         {
+            var requisition = SizeRequested ();
+            minimum_height = natural_height = requisition.Height;
+        }
+
+        protected override void OnGetPreferredWidth (out int minimum_width, out int natural_width)
+        {
+            var requisition = SizeRequested ();
+            minimum_width = natural_width = requisition.Width;
+        }
+
+        protected Requisition SizeRequested ()
+        {
+            var requisition = new Requisition ();
             EnsureStyle ();
 
             Pango.FontMetrics metrics = PangoContext.GetMetrics (Style.FontDescription, PangoContext.Language);
@@ -249,30 +263,30 @@ namespace Hyena.Widgets
 
             requisition.Width = renderer.Width;
             requisition.Height = renderer.Height;
+            return requisition;
         }
 
-        protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+        protected override bool OnDrawn (Cairo.Context cr)
         {
-            if (evnt.Window != GdkWindow) {
+            if (!CairoHelper.ShouldDrawWindow(cr, GdkWindow)) {
                 return true;
             }
 
             if (HasFrame) {
                 int y_mid = (int)Math.Round ((Allocation.Height - renderer.Height) / 2.0);
-                Gtk.Style.PaintFlatBox (Style, GdkWindow, State, ShadowType.None, evnt.Area, this, "entry",
+                Gtk.Style.PaintFlatBox (Style, GdkWindow, State, ShadowType.None, cr, this, "entry",
                     Allocation.X, Allocation.Y + y_mid, Allocation.Width, renderer.Height);
                 Gtk.Style.PaintShadow (Style, GdkWindow, State, ShadowType.In,
-                    evnt.Area, this, "entry", Allocation.X, Allocation.Y + y_mid, Allocation.Width, renderer.Height);
+                    cr, this, "entry", Allocation.X, Allocation.Y + y_mid, Allocation.Width, renderer.Height);
             }
 
-            Cairo.Context cr = Gdk.CairoHelper.Create (GdkWindow);
+            CairoHelper.TransformToWindow (cr, this, GdkWindow);
             renderer.Render (cr, Allocation,
                 CairoExtensions.GdkColorToCairoColor (HasFrame ? Parent.Style.Text (State) : Parent.Style.Foreground (State)),
                 AlwaysShowEmptyStars, PreviewOnHover && hover_value >= renderer.MinRating, hover_value,
                 State == StateType.Insensitive ? 1 : 0.90,
                 State == StateType.Insensitive ? 1 : 0.55,
                 State == StateType.Insensitive ? 1 : 0.45);
-            CairoExtensions.DisposeContext (cr);
 
             return true;
         }
diff --git a/Hyena.Gui/Hyena.Widgets/RoundedFrame.cs b/Hyena.Gui/Hyena.Widgets/RoundedFrame.cs
index ac28bf0..a8417e1 100644
--- a/Hyena.Gui/Hyena.Widgets/RoundedFrame.cs
+++ b/Hyena.Gui/Hyena.Widgets/RoundedFrame.cs
@@ -36,7 +36,7 @@ using Hyena.Gui.Theming;
 
 namespace Hyena.Widgets
 {
-    public class RoundedFrame : Bin
+    public class RoundedFrame : Bin, Gtk.ScrollableImplementor
     {
         private Theme theme;
         protected Theme Theme {
@@ -95,8 +95,21 @@ namespace Hyena.Widgets
             frame_width = (int)theme.Context.Radius + 1;
         }
 
-        protected override void OnSizeRequested (ref Requisition requisition)
+        protected override void OnGetPreferredHeight (out int minimum_height, out int natural_height)
         {
+            var requisition = SizeRequested ();
+            minimum_height = natural_height = requisition.Height;
+        }
+
+        protected override void OnGetPreferredWidth (out int minimum_width, out int natural_width)
+        {
+            var requisition = SizeRequested ();
+            minimum_width = natural_width = requisition.Width;
+        }
+
+        protected Requisition SizeRequested ()
+        {
+            var requisition = new Requisition ();
             if (child != null && child.Visible) {
                 // Add the child's width/height
                 Requisition child_requisition = child.SizeRequest ();
@@ -110,6 +123,7 @@ namespace Hyena.Widgets
             // Add the frame border
             requisition.Width += ((int)BorderWidth + frame_width) * 2;
             requisition.Height += ((int)BorderWidth + frame_width) * 2;
+            return requisition;
         }
 
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
@@ -134,33 +148,25 @@ namespace Hyena.Widgets
             child.SizeAllocate (child_allocation);
         }
 
-        protected override void OnSetScrollAdjustments (Adjustment hadj, Adjustment vadj)
+        /*protected override void OnSetScrollAdjustments (Adjustment hadj, Adjustment vadj)
         {
             // This is to satisfy the gtk_widget_set_scroll_adjustments
             // inside of GtkScrolledWindow so it doesn't complain about
             // its child not being scrollable.
-        }
+        }*/
 
-        protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+        protected override bool OnDrawn (Cairo.Context cr)
         {
-            if (!IsDrawable) {
-                return false;
-            }
-
-            Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
+            CairoHelper.TransformToWindow (cr, this, GdkWindow);
 
-            try {
-                DrawFrame (cr, evnt.Area);
-                if (child != null) {
-                    PropagateExpose (child, evnt);
-                }
-                return false;
-            } finally {
-                CairoExtensions.DisposeContext (cr);
+            DrawFrame (cr);
+            if (child != null) {
+                PropagateDraw (child, cr);
             }
+            return false;
         }
 
-        private void DrawFrame (Cairo.Context cr, Gdk.Rectangle clip)
+        private void DrawFrame (Cairo.Context cr)
         {
             int x = child_allocation.X - frame_width;
             int y = child_allocation.Y - frame_width;
diff --git a/Hyena.Gui/Hyena.Widgets/SegmentedBar.cs b/Hyena.Gui/Hyena.Widgets/SegmentedBar.cs
index 66e8fab..bdb8284 100644
--- a/Hyena.Gui/Hyena.Widgets/SegmentedBar.cs
+++ b/Hyena.Gui/Hyena.Widgets/SegmentedBar.cs
@@ -106,7 +106,7 @@ namespace Hyena.Widgets
 
         public SegmentedBar ()
         {
-            WidgetFlags |= WidgetFlags.NoWindow;
+            HasWindow = false;
         }
 
         protected override void OnRealized ()
@@ -117,10 +117,14 @@ namespace Hyena.Widgets
 
 #region Size Calculations
 
-        protected override void OnSizeRequested (ref Requisition requisition)
+        protected override void OnGetPreferredHeight (out int minimum_height, out int natural_height)
         {
-            requisition.Width = 200;
-            requisition.Height = 0;
+            minimum_height = natural_height = 0;
+        }
+
+        protected override void OnGetPreferredWidth (out int minimum_width, out int natural_width)
+        {
+            minimum_width = natural_width = 200;
         }
 
         protected override void OnSizeAllocated (Gdk.Rectangle allocation)
@@ -312,13 +316,13 @@ namespace Hyena.Widgets
 
 #region Rendering
 
-        protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+        protected override bool OnDrawn (Cairo.Context cr)
         {
-            if (evnt.Window != GdkWindow) {
-                return base.OnExposeEvent (evnt);
+            if (!CairoHelper.ShouldDrawWindow (cr, GdkWindow)) {
+                return base.OnDrawn (cr);
             }
 
-            Cairo.Context cr = Gdk.CairoHelper.Create (evnt.Window);
+            CairoHelper.TransformToWindow (cr, this, GdkWindow);
 
             if (reflect) {
                 CairoExtensions.PushGroup (cr);
@@ -374,7 +378,6 @@ namespace Hyena.Widgets
             }
 
             bar.Destroy ();
-            CairoExtensions.DisposeContext (cr);
 
             return true;
         }
diff --git a/Hyena.Gui/Hyena.Widgets/WrapLabel.cs b/Hyena.Gui/Hyena.Widgets/WrapLabel.cs
index 52d3224..0655922 100644
--- a/Hyena.Gui/Hyena.Widgets/WrapLabel.cs
+++ b/Hyena.Gui/Hyena.Widgets/WrapLabel.cs
@@ -40,7 +40,7 @@ namespace Hyena.Widgets
 
         public WrapLabel ()
         {
-            WidgetFlags |= WidgetFlags.NoWindow;
+            HasWindow = false;
         }
 
         private void CreateLayout ()
@@ -100,16 +100,16 @@ namespace Hyena.Widgets
             base.OnSizeAllocated (allocation);
         }
 
-        protected override bool OnExposeEvent (Gdk.EventExpose evnt)
+        protected override bool OnDrawn (Cairo.Context cr)
         {
-            if (evnt.Window == GdkWindow) {
+            if (CairoHelper.ShouldDrawWindow (cr, GdkWindow)) {
                 // Center the text vertically
                 int lw, lh;
                 layout.GetPixelSize (out lw, out lh);
                 int y = Allocation.Y + (Allocation.Height - lh) / 2;
 
-                Gtk.Style.PaintLayout (Style, GdkWindow, State, false,
-                    evnt.Area, this, null, Allocation.X, y, layout);
+                Gtk.Style.PaintLayout (Style, cr, State, false,
+                    this, null, Allocation.X, y, layout);
             }
 
             return true;
diff --git a/Hyena.Gui/Makefile.am b/Hyena.Gui/Makefile.am
index 74fd6df..330601e 100644
--- a/Hyena.Gui/Makefile.am
+++ b/Hyena.Gui/Makefile.am
@@ -1,7 +1,7 @@
 ASSEMBLY = Hyena.Gui
 ASSEMBLY_BUILD_FLAGS = -unsafe
 TARGET = library
-LINK = -r:ICSharpCode.SharpZipLib -r:Mono.Posix -r:System -r:System.Core -r:Mono.Cairo \
+LINK = -r:ICSharpCode.SharpZipLib -r:Mono.Posix -r:System -r:System.Core -r:/opt/mono-2.10/lib/mono/gtk-sharp-3.0/cairo-sharp.dll \
 	   $(GTKSHARP_LIBS) $(GLIBSHARP_LIBS) \
 	   -r:$(DIR_BIN)/Hyena.dll
 SOURCES =  \
diff --git a/configure.ac b/configure.ac
index c2d0eeb..43226eb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -51,18 +51,20 @@ dnl Mono and gmcs
 SHAMROCK_CHECK_MONO_MODULE(1.9.1)
 SHAMROCK_FIND_MONO_2_0_COMPILER
 SHAMROCK_FIND_MONO_RUNTIME
+
+
 SHAMROCK_CHECK_MONO_2_0_GAC_ASSEMBLIES([	
-	Mono.Cairo
 	Mono.Posix
 	ICSharpCode.SharpZipLib
-])
+])dnl FIXME:seems like cairo-sharp hasn't got .pc files yet: cairo-sharp
+
 
 dnl package checks, common for all configs
-PKG_CHECK_MODULES([GTKSHARP], [gtk-sharp-2.0])
-PKG_CHECK_MODULES([GLIBSHARP], [glib-sharp-2.0])
+PKG_CHECK_MODULES([GTKSHARP], [gtk-sharp-3.0])
+PKG_CHECK_MODULES([GLIBSHARP], [glib-sharp-3.0])
 
 dnl See if Gtk# is recent enought to enable managed widget a11y
-PKG_CHECK_MODULES(GTKSHARP_A11Y, gtk-sharp-2.0 >= 2.12.10, gtksharp_with_a11y=yes, gtksharp_with_a11y=no)
+PKG_CHECK_MODULES(GTKSHARP_A11Y, gtk-sharp-3.0 >= 4.0, gtksharp_with_a11y=yes, gtksharp_with_a11y=no)
 AM_CONDITIONAL(ENABLE_ATK, test "x$gtksharp_with_a11y" = "xyes")
 
 AM_CONDITIONAL(GCONF_SCHEMAS_INSTALL, false)
@@ -115,7 +117,7 @@ cat <<EOF
 ${PACKAGE}-${VERSION}
 
 Unit Tests:        ${do_tests} (requires nunit >= ${NUNIT_REQUIRED})
-Custom a11y:       ${gtksharp_with_a11y} (requires gtk-sharp >= 2.12.10)
+Custom a11y:       ${gtksharp_with_a11y} (requires gtk-sharp >= TBD)
 
 EOF
 
