diff --git a/fltkhs-themes.cabal b/fltkhs-themes.cabal
--- a/fltkhs-themes.cabal
+++ b/fltkhs-themes.cabal
@@ -1,13 +1,11 @@
-cabal-version: 1.24
-
--- This file has been generated from package.yaml by hpack version 0.31.1.
+-- This file has been generated from package.yaml by hpack version 0.28.2.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 9d37c0743e1b91bd5c46b144c5b33aa83c94e0ca50eee662d4a8b2e961702eeb
+-- hash: 140888cae25937b0d1dc097459ba0ba8669ee46293f6a1087be31c19f814b6b3
 
 name:           fltkhs-themes
-version:        0.1.0.7
+version:        0.2.0.0
 synopsis:       A set of themed widgets that provides drop in replacements to the ones in FLTKHS.
 description:    Please see the README on Github at <https://github.com/deech/fltkhs-themes#readme>
 category:       UI,Graphics,GUI,User Interfaces
@@ -19,6 +17,7 @@
 license:        BSD3
 license-file:   LICENSE
 build-type:     Custom
+cabal-version:  >= 1.24
 extra-source-files:
     README.org
 extra-doc-files:
@@ -95,7 +94,7 @@
   build-depends:
       base >=4.7 && <5
     , bytestring
-    , fltkhs >=0.7.0.4
+    , fltkhs >=0.8.0.0
     , load-font >=0.1.0.2
     , text >=1.2.2.0
     , vector >=0.12.0.1
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Browser.hs b/src/Graphics/UI/FLTK/Theme/Light/Browser.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Browser.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Browser.hs
@@ -17,7 +17,7 @@
 import Graphics.UI.FLTK.Theme.Light.Assets
 
 -- | The custom 'draw' function for creating the themed browser
-browserDraw :: Ref LowLevel.Browser -> IO ()
+browserDraw :: Ref LowLevel.BrowserBase -> IO ()
 browserDraw b = do
   (color :: Color) <- LowLevel.getColor b
   let slightlyDarker = colorAverage color blackColor 0.85
@@ -26,10 +26,10 @@
     (\rect _ -> do
         LowLevel.flcRectfWithColor rect color
         LowLevel.flcRectWithColor rect slightlyDarker)
-    (LowLevel.drawSuper b)
+    (LowLevel.drawBrowserBase (safeCast b))
 
 -- | Setting the theme's color, fonts etc
-browserSetup :: (?assets :: Assets) => Ref LowLevel.Browser -> IO ()
+browserSetup :: (?assets :: Assets) => Ref LowLevel.BrowserBase -> IO ()
 browserSetup b = do
   LowLevel.setColor b lightBackground
   LowLevel.setBox b BorderBox
@@ -43,8 +43,8 @@
 
 browserNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> IO (Ref LowLevel.Browser)
 browserNew rect l = do
-  b <- LowLevel.browserCustom rect l (Just browserDraw) Nothing
-  browserSetup b
+  b <- LowLevel.browserCustom rect l (Just (browserDraw . safeCast)) Nothing
+  browserSetup (safeCast b)
   return b
 
 selectBrowserNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> IO (Ref LowLevel.SelectBrowser)
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Button.hs b/src/Graphics/UI/FLTK/Theme/Light/Button.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Button.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Button.hs
@@ -35,9 +35,10 @@
 import qualified Graphics.UI.FLTK.LowLevel.FL as FL
 import qualified Graphics.UI.FLTK.LowLevel.FLTKHS as LowLevel
 import Graphics.UI.FLTK.Theme.Light.Assets
+import Data.List
 
 -- | Check of the given button is 'HiddenButtonType'
-buttonIsHidden :: Ref LowLevel.Button -> IO Bool
+buttonIsHidden :: Ref LowLevel.ButtonBase -> IO Bool
 buttonIsHidden b = do
   t <- LowLevel.getType_ b
   case t of
@@ -45,7 +46,7 @@
     _ -> return False
 
 -- | Draw a regular button, i.e not a radio button, toggle button, etc.
-drawRegularButton ::  FillSpec -> Ref LowLevel.Button -> IO ()
+drawRegularButton ::  FillSpec -> Ref LowLevel.ButtonBase -> IO ()
 drawRegularButton spec b = do
   buttonType <- LowLevel.getType_ b
   case buttonType of
@@ -64,7 +65,7 @@
 -- label so the indicator can properly position itself next to the label and the widget itself.
 drawIndicatorButton ::
   (
-    Parent orig LowLevel.Widget,
+    Parent orig LowLevel.WidgetBase,
     Match b ~ FindOp orig orig (LowLevel.ActiveR ()),
     Op (LowLevel.ActiveR ()) b orig (IO Bool),
     Match c ~ FindOp orig orig (LowLevel.GetAlign ()),
@@ -84,7 +85,7 @@
     Match k ~ FindOp orig orig (LowLevel.GetBox ()),
     Op (LowLevel.GetBox ()) k orig (IO (Boxtype)),
     Match l ~ FindOp orig orig (LowLevel.GetParent ()),
-    Op (LowLevel.GetParent ()) l orig (IO (Maybe (Ref LowLevel.Group))),
+    Op (LowLevel.GetParent ()) l orig (IO (Maybe (Ref LowLevel.GroupBase))),
     Match m ~ FindOp orig orig (LowLevel.GetColor ()),
     Op (LowLevel.GetColor ()) m orig (IO (Color)),
     Match n ~ FindOp orig orig (LowLevel.SetColor ()),
@@ -107,7 +108,7 @@
         else do
           maybeParent <- LowLevel.getParent b
           case maybeParent of
-            Just (p :: Ref LowLevel.Group) -> do
+            Just (p :: Ref LowLevel.GroupBase) -> do
               c <- LowLevel.getColor p
               () <- LowLevel.setColor b c
               focused <- isWidget b FL.focus
@@ -294,6 +295,13 @@
   () <- LowLevel.setLabelsize b commonFontSize
   LowLevel.setAlign b (Alignments [AlignTypeInside, AlignTypeCenter , AlignTypeImageNextToText])
 
+handleButtonHover :: Ref LowLevel.ButtonBase -> Event -> IO (Either UnknownEvent ())
+handleButtonHover b e = do
+  res <- handleHover b e
+  case res of
+    Left _ -> LowLevel.handleButtonBase b e
+    Right _ -> return (Right ())
+
 buttonNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> IO (Ref LowLevel.Button)
 buttonNew rectangle label = do
   b <- LowLevel.buttonCustom
@@ -301,8 +309,8 @@
          label
          (Just (\b -> do
                    spec <- buttonFillSpec b
-                   drawRegularButton spec b))
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = Just handleHover }))
+                   drawRegularButton spec (safeCast b)))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = Just (handleButtonHover . safeCast) }))
   buttonSetup b
   return b
 
@@ -313,8 +321,8 @@
          label
          (Just (\b -> do
                    spec <- buttonFillSpec b
-                   drawRegularButton spec b))
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just handleHover ) }))
+                   drawRegularButton spec (safeCast b)))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = Just (handleButtonHover . safeCast ) }))
   LowLevel.setType b ToggleButtonType
   buttonSetup b
   return (LowLevel.castTo b)
@@ -329,7 +337,7 @@
                    hidden <- buttonIsHidden (safeCast b)
                    fontSize <- LowLevel.getLabelsize b
                    drawIndicatorButton drawLight pressed False hidden fontSize b))
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just handleHover) }))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = Just (handleButtonHover . safeCast) }))
   buttonSetup b
   LowLevel.setSelectionColor b yellowColor
   LowLevel.setAlign b (Alignments [AlignTypeInside, AlignTypeCenter, AlignTypeImageNextToText])
@@ -455,8 +463,8 @@
   b <- LowLevel.returnButtonCustom rect l
          (Just ((\b -> do
                    spec <- buttonFillSpec b
-                   drawRegularButton spec b) . safeCast))
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = Just handleHover }))
+                   drawRegularButton spec (safeCast b))))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = Just (handleButtonHover . safeCast) }))
   buttonSetup b
   let (_,_,w',h') = fromRectangle rect
   LowLevel.setAlign b (Alignments [AlignTypeTextNextToImage])
diff --git a/src/Graphics/UI/FLTK/Theme/Light/ColorChooser.hs b/src/Graphics/UI/FLTK/Theme/Light/ColorChooser.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/ColorChooser.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/ColorChooser.hs
@@ -738,8 +738,14 @@
          (colorChooserSliderBounds componentBounds)
          Nothing
          (Just (drawSaturationSlider stateRef))
-         (Just (LowLevel.defaultCustomWidgetFuncs {LowLevel.handleCustom = Just handleHover}))
-  sliderSetup g
+         (Just (LowLevel.defaultCustomWidgetFuncs {
+                   LowLevel.handleCustom = Just (\s e -> do
+                                                    res <- handleHover s e
+                                                    case res of
+                                                      Left _ -> LowLevel.handleSliderBase (LowLevel.safeCast s) e
+                                                      Right _ -> return (Right ())
+                                                )}))
+  sliderSetup (LowLevel.safeCast g)
   LowLevel.setCallback g (sliderCallback stateRef c)
   let (paneX, _, paneW, _) = fromRectangle (colorChooserPreviewPaneBounds componentBounds)
       (Rectangle (Position _ (Y hueBoxY)) (Size _ (Height hueBoxHeight))) = hueBoxBounds (colorChooserHueBoxBounds componentBounds)(hueBoxHandleRadius layout) defaultGaugeHeight
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Common.hs b/src/Graphics/UI/FLTK/Theme/Light/Common.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Common.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Common.hs
@@ -51,6 +51,7 @@
 import Graphics.UI.FLTK.LowLevel.Fl_Enumerations
 import Graphics.UI.FLTK.Theme.Light.Assets
 import qualified Graphics.UI.FLTK.LowLevel.FL as FL
+import Foreign.Ptr
 
 -- | For drawing a rectangular widget that is borderless on the top or bottom. Guess
 -- it could be passed into a function as yet another Bool but we have too many of those
@@ -148,7 +149,7 @@
 commonSelectionColor = rgbColorWithRgb (50, 100, 201)
 
 -- | Check if the given references point to the same 'Widget'.
-isWidget :: (Parent a Widget) => Ref a -> IO (Maybe (Ref b)) -> IO Bool
+isWidget :: (Parent a WidgetBase) => Ref a -> IO (Maybe (Ref b)) -> IO Bool
 isWidget this thatM = thatM >>= maybe (return False) (refPtrEquals this)
 
 -- | Check if the given 'Position' is inside the 'Rectangle'. Useful for
@@ -227,7 +228,7 @@
 
 -- | Draw a bordered rectangle for the given widget according to 'BorderBoxSpec', the 'Bool'
 -- determines if it should be filled with 'borderBoxFillColor'.
-drawBorderBox :: (Parent a Widget) => Ref a -> BorderBoxSpec -> Bool -> IO ()
+drawBorderBox :: (Parent a WidgetBase) => Ref a -> BorderBoxSpec -> Bool -> IO ()
 drawBorderBox w spec shouldFill = do
   oldColor <- flcColor
   focused <- isWidget w FL.focus
@@ -245,14 +246,14 @@
 
 -- | The default FLTK widgets don't react to a mouse pointer hovering over them.
 -- This handler when applied to a customized widget initiates a 'redraw' when the
--- mouse enters and leaves the widget area.
+-- mouse enters and leaves the widget area. It also takes this widget's default 'handle'
+-- so it can be called for events that don't apply to hovering, eg. Show, Hide etc.
 handleHover ::
   (
-    Parent orig Widget,
+    orig ~ (a b),
+    Parent orig WidgetBase,
     Match x ~ FindOp orig orig (Redraw ()),
-    Op (Redraw ()) x orig (IO ()),
-    Match y ~ FindOp orig orig (HandleSuper ()),
-    Op (HandleSuper ()) y orig (Event -> IO (Either UnknownEvent ()))
+    Op (Redraw ()) x orig (IO ())
   )
   => Ref orig -> Event -> IO (Either UnknownEvent ())
 handleHover b e = do
@@ -263,27 +264,29 @@
     Leave -> do
       () <- redraw b
       return (Right ())
-    _ -> handleSuper b e
+    _ -> return (Left UnknownEvent)
 
 -- | Temporarily swap out the FLTK's box drawing function for a given 'Boxtype'
 -- with 'BoxDrawF'. The 'IO' '()' action will typically use the custom function
 -- that was just swapped in some kind custom drawing routine. For example, if a
 -- custom widget used a 'BorderBox' on the FLTK side but you don't like the
 -- default 'BorderBox' look, you can override the 'draw' function of the widget
--- with this one where the 'IO' '()' action calls 'drawSuper'. For an example
+-- with this one where the 'IO' '()' action calls 'draw' on its parent. For an example
 -- use-case see 'Graphics.UI.FLTK.Theme.Light.Input.inputDraw'.
 --
 -- NOTE: The 'IO' '()' action is /not/ exception safe.
 withCustomBoxDraw :: Boxtype -> BoxDrawF -> IO () -> IO ()
 withCustomBoxDraw boxtype customBoxDrawF action = do
-  fptr <- FL.getBoxtypePrim boxtype
+  oldFptr <- FL.getBoxtype boxtype
   dx <- FL.boxDx boxtype
   dy <- FL.boxDy boxtype
   dw <- FL.boxDw boxtype
   dh <- FL.boxDh boxtype
   FL.setBoxtype boxtype (FL.FromSpec customBoxDrawF 0 0 0 0)
   action
-  FL.setBoxtype boxtype (FL.FromFunPtr fptr (fromIntegral dx) (fromIntegral dy) (fromIntegral dw) (fromIntegral dh))
+  fptr <- FL.getBoxtype boxtype
+  when (fptr /= nullFunPtr) (freeHaskellFunPtr fptr)
+  FL.setBoxtype boxtype (FL.FromFunPtr oldFptr (fromIntegral dx) (fromIntegral dy) (fromIntegral dw) (fromIntegral dh))
 
 -- | Make the default 'FillSpec' used by most of the theme color graded with the initial 'Color'. The second 'Color'
 -- is used to determine the border color.
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Counter.hs b/src/Graphics/UI/FLTK/Theme/Light/Counter.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Counter.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Counter.hs
@@ -14,6 +14,7 @@
 import Data.List
 import Graphics.UI.FLTK.LowLevel.Fl_Enumerations
 import Graphics.UI.FLTK.LowLevel.Fl_Types
+import Graphics.UI.FLTK.LowLevel.Dispatch
 import Graphics.UI.FLTK.Theme.Light.Button
 import Graphics.UI.FLTK.Theme.Light.Common
 import Graphics.UI.FLTK.Theme.Light.Input
@@ -121,7 +122,7 @@
     Push -> setPressed
     Drag -> setPressed
     _ -> return ()
-  LowLevel.handleSuper c e
+  LowLevel.handleCounterBase (safeCast c) e
 
 counterNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> IO (Ref LowLevel.Counter)
 counterNew rect l = do
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Input.hs b/src/Graphics/UI/FLTK/Theme/Light/Input.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Input.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Input.hs
@@ -36,7 +36,7 @@
     LowLevel.flcVertex (toPrecisePosition (toPosition (x'+w'-1,y')))
     LowLevel.flcEndLine
 
-inputDraw :: Ref LowLevel.Input -> IO ()
+inputDraw :: Ref LowLevel.InputBase -> IO ()
 inputDraw i =
   withCustomBoxDraw
     BorderBox
@@ -65,7 +65,7 @@
        LowLevel.drawText i rBox)
 
 -- | Common setup function for all 'Input' widgets, sets label color, font etc.
-inputSetup :: (?assets :: Assets) => Ref LowLevel.Input -> IO ()
+inputSetup :: (?assets :: Assets) => Ref LowLevel.InputBase -> IO ()
 inputSetup i = do
   LowLevel.setColor i lightBackground
   LowLevel.setBox i BorderBox
@@ -78,8 +78,8 @@
 
 inputNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> Maybe LowLevel.FlInputType -> IO (Ref LowLevel.Input)
 inputNew rect l it = do
-  i <- LowLevel.inputCustom rect l it (Just inputDraw) Nothing
-  inputSetup i
+  i <- LowLevel.inputCustom rect l it (Just (inputDraw . safeCast)) Nothing
+  inputSetup (safeCast i)
   return i
 
 fileInputNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> IO (Ref LowLevel.FileInput)
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Menu.hs b/src/Graphics/UI/FLTK/Theme/Light/Menu.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Menu.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Menu.hs
@@ -7,6 +7,7 @@
 where
 import Graphics.UI.FLTK.LowLevel.Fl_Enumerations
 import Graphics.UI.FLTK.LowLevel.Fl_Types
+import Graphics.UI.FLTK.LowLevel.Dispatch
 import Graphics.UI.FLTK.Theme.Light.Common
 import qualified Data.Text as T
 import qualified Graphics.UI.FLTK.LowLevel.FLTKHS as LowLevel
@@ -39,7 +40,7 @@
               LowLevel.flcEndLine
               LowLevel.flcSetColor color
           )
-          (LowLevel.drawSuper m)
+          (LowLevel.drawSysMenuBarBase (safeCast m))
   m <- LowLevel.sysMenuBarCustom
          rectangle
          label
@@ -85,4 +86,4 @@
           borderBoxFillColor = color,
           borderBoxBounds = toRectangle (x,y,w-1,h-1)
         }
-  withCustomBoxDraw UpBox (\_ _ -> drawBorderBox c spec True) (LowLevel.drawSuper c)
+  withCustomBoxDraw UpBox (\_ _ -> drawBorderBox c spec True) (LowLevel.drawChoiceBase (safeCast c))
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Positioner.hs b/src/Graphics/UI/FLTK/Theme/Light/Positioner.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Positioner.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Positioner.hs
@@ -7,6 +7,7 @@
 import Graphics.UI.FLTK.Theme.Light.Common
 import qualified Data.Text as T
 import qualified Graphics.UI.FLTK.LowLevel.FLTKHS as LowLevel
+import Graphics.UI.FLTK.LowLevel.Dispatch
 import Graphics.UI.FLTK.LowLevel.Fl_Enumerations
 import Graphics.UI.FLTK.Theme.Light.Assets
 
@@ -21,7 +22,7 @@
           (\rect _ -> do
               LowLevel.flcRectfWithColor rect color
               LowLevel.flcRectWithColor rect slightlyDarker)
-          (LowLevel.drawSuper p)
+          (LowLevel.drawPositionerBase (safeCast p))
   p <- LowLevel.positionerCustom rect l (Just customDraw) Nothing
   LowLevel.setLabelfont p commonFont
   LowLevel.setLabelsize p commonFontSize
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Slider.hs b/src/Graphics/UI/FLTK/Theme/Light/Slider.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Slider.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Slider.hs
@@ -34,6 +34,7 @@
 import qualified Graphics.UI.FLTK.LowLevel.FL as FL
 import qualified Graphics.UI.FLTK.LowLevel.FLTKHS as LowLevel
 import Graphics.UI.FLTK.Theme.Light.Assets
+import Data.Either
 
 sliderKnobColor :: IO Color
 sliderKnobColor = rgbColorWithRgb (241,241,241)
@@ -47,7 +48,7 @@
 sliderIsHorizontal HorNiceSliderType  = True
 
 sliderSetup ::
-  (?assets :: Assets) => Ref LowLevel.Slider -> IO ()
+  (?assets :: Assets) => Ref LowLevel.SliderBase -> IO ()
 sliderSetup s = do
   () <- LowLevel.setColor s lightBackground
   () <- LowLevel.setBox s BorderBox
@@ -307,6 +308,12 @@
 {-# DEPRECATED horFillSliderNew "Fill sliders are not supported in the Light theme. 'horFillSliderNew' is the same as 'sliderNew'." #-}
 {-# DEPRECATED horNiceSliderNew "\"Nice\"sliders are not supported in the Light theme. 'horNiceSliderNew' is the same as 'sliderNew'." #-}
 
+handleSliderHover :: Ref LowLevel.SliderBase -> Event -> IO (Either UnknownEvent ())
+handleSliderHover s e = do
+  res <- handleHover s e
+  case res of
+    Left _ -> LowLevel.handleSliderBase s e
+    Right _ -> return (Right ())
 
 sliderNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> IO (Ref LowLevel.Slider)
 sliderNew rectangle label = do
@@ -317,8 +324,8 @@
                    bounds <- LowLevel.getRectangle s
                    drawSlider s Nothing bounds
                ))
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just handleHover) }))
-  sliderSetup s
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just (handleSliderHover . safeCast)) }))
+  sliderSetup (safeCast s)
   return s
 
 gaugeSliderNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> IO (Ref LowLevel.Slider)
@@ -330,7 +337,7 @@
                    bounds <- LowLevel.getRectangle s
                    drawSlider s (Just mkGaugeSliderSpec) bounds
                ))
-         (Just (LowLevel.defaultCustomWidgetFuncs {LowLevel.handleCustom = Just handleHover}))
+         (Just (LowLevel.defaultCustomWidgetFuncs {LowLevel.handleCustom = Just (handleSliderHover . safeCast)}))
   sliderSetup (safeCast s)
   return s
 
@@ -340,7 +347,7 @@
          rectangle
          label
          (Just drawValueSlider)
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just handleHover) }))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just (handleSliderHover . safeCast)) }))
   sliderSetup (safeCast s)
   return s
 
@@ -350,7 +357,7 @@
          rectangle
          label
          (Just drawValueSlider)
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just handleHover) }))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just (handleSliderHover . safeCast)) }))
   LowLevel.setType s HorSliderType
   sliderSetup (safeCast s)
   return (LowLevel.castTo s)
@@ -364,7 +371,7 @@
                    bounds <- LowLevel.getRectangle s
                    drawSlider s Nothing bounds
                ))
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just handleHover) }))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just (handleSliderHover . safeCast)) }))
   LowLevel.setType s HorSliderType
   sliderSetup (safeCast s)
   return (LowLevel.castTo s)
@@ -378,7 +385,7 @@
                    bounds <- LowLevel.getRectangle s
                    drawSlider s Nothing bounds
                ))
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just handleHover) }))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just (handleSliderHover . safeCast)) }))
   LowLevel.setType s VertFillSliderType
   sliderSetup (safeCast s)
   return (LowLevel.castTo s)
@@ -392,7 +399,7 @@
                    bounds <- LowLevel.getRectangle s
                    drawSlider s Nothing bounds
                ))
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just handleHover) }))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just (handleSliderHover . safeCast)) }))
   sliderSetup (safeCast s)
   LowLevel.setType s HorFillSliderType
   return (LowLevel.castTo s)
@@ -406,7 +413,7 @@
                    bounds <- LowLevel.getRectangle s
                    drawSlider s Nothing bounds
                ))
-         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just handleHover) }))
+         (Just (LowLevel.defaultCustomWidgetFuncs { LowLevel.handleCustom = (Just (handleSliderHover . safeCast)) }))
   sliderSetup (safeCast s)
   LowLevel.setType s HorNiceSliderType
   return (LowLevel.castTo s)
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Spinner.hs b/src/Graphics/UI/FLTK/Theme/Light/Spinner.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Spinner.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Spinner.hs
@@ -52,7 +52,7 @@
   case e of
     Keydown -> upOrDown
     Shortcut -> upOrDown
-    _ -> LowLevel.handleSuper (safeCast s :: Ref LowLevel.Group) e
+    _ -> LowLevel.handleSpinnerBase (safeCast s) e
 
 updateInput :: Maybe T.Text -> Double -> Ref LowLevel.Input -> IO ()
 updateInput format v i =
@@ -64,7 +64,7 @@
 
 resizeSpinner :: Ref LowLevel.Input -> Ref LowLevel.Button -> Ref LowLevel.Button -> Ref LowLevel.Spinner -> Rectangle -> IO ()
 resizeSpinner i up down s r = do
-  LowLevel.resizeSuper (safeCast s :: Ref LowLevel.Group) r
+  LowLevel.resizeSpinnerBase (safeCast s) r
   let (iRect,upRect,downRect) = spinnerComponentBounds r
   LowLevel.resize i iRect
   LowLevel.resize up upRect
@@ -168,7 +168,7 @@
                     spec <- buttonFillSpec b
                     r <- LowLevel.getRectangle b
                     s <- LowLevel.getDataSize upSmallImage
-                    drawRegularButton (spec { fillCornerRadius = 0 }) b
+                    drawRegularButton (spec { fillCornerRadius = 0 }) (safeCast b)
                     LowLevel.draw upSmallImage (centerInRectangle r s)))
                Nothing
   buttonSetup upButton
@@ -180,7 +180,7 @@
                           spec <- buttonFillSpec b
                           r <- LowLevel.getRectangle b
                           s <- LowLevel.getDataSize upSmallImage
-                          drawRegularButton (spec { fillCornerRadius = 0 }) b
+                          drawRegularButton (spec { fillCornerRadius = 0 }) (safeCast b)
                           LowLevel.draw downSmallImage (centerInRectangle r s)))
                 Nothing
   buttonSetup downButton
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Tabs.hs b/src/Graphics/UI/FLTK/Theme/Light/Tabs.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Tabs.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Tabs.hs
@@ -19,6 +19,7 @@
 import Graphics.UI.FLTK.LowLevel.Dispatch (safeCast)
 import Graphics.UI.FLTK.LowLevel.Fl_Enumerations
 import Graphics.UI.FLTK.LowLevel.Fl_Types
+import Graphics.UI.FLTK.LowLevel.Dispatch
 import Graphics.UI.FLTK.Theme.Light.Common
 import qualified Data.Text as T
 import qualified Graphics.UI.FLTK.LowLevel.FL as FL
@@ -170,7 +171,7 @@
       handleRelease = do
         tabBarRect <- tabBarRectangle spec t
         if (not (insideRectangle pos tabBarRect))
-          then LowLevel.handleSuper t e
+          then LowLevel.handleTabsBase (safeCast t) e
           else do
             lastSelected <- LowLevel.getPush t
             _ <- LowLevel.setPush t (Nothing :: (Maybe (Ref LowLevel.Widget)))
@@ -195,7 +196,7 @@
                   else return (Right ())
       handlePush =
         let adjustWhenNot yOutsideRange =
-              if yOutsideRange then LowLevel.handleSuper (safeCast t :: Ref LowLevel.Group) e
+              if yOutsideRange then LowLevel.handleTabsBase (safeCast t) e
               else
                 case nextIndex of
                   Just (AtIndex i) ->
@@ -231,7 +232,7 @@
         SpecialKeyType Kb_Left ->
           case selectedMaybe of
             Just (AtIndex i) ->
-              if (i == 0) then LowLevel.handleSuper t e
+              if (i == 0) then LowLevel.handleTabsBase (safeCast t) e
                 else
                 let (X x, _) = offsetWidths !! (i-1)
                     currOffset = x - tabsX
@@ -239,21 +240,21 @@
                  if (currOffset >= 0)
                  then return ()
                  else adjustOffset (currOffset - (if (i > 1) then partiallyShow (i-2) else 0))
-                 LowLevel.handleSuper t e
-            _ -> LowLevel.handleSuper t e
+                 LowLevel.handleTabsBase (safeCast t) e
+            _ -> LowLevel.handleTabsBase (safeCast t) e
         SpecialKeyType Kb_Right ->
           case selectedMaybe of
             Just (AtIndex i) ->
-              if (i == ((length widths) - 1)) then LowLevel.handleSuper t e
+              if (i == ((length widths) - 1)) then LowLevel.handleTabsBase (safeCast t) e
                 else
                 let (X x,Width w) = offsetWidths !! (i+1)
                     currOffset = (x+w) - (tabsX+tabsWidth)
                 in do
                  when (currOffset >= 0) (adjustOffset (currOffset + (if (i < (length widths - 2)) then partiallyShow (i+2) else 0)))
-                 LowLevel.handleSuper t e
-            _ -> LowLevel.handleSuper t e
-        _ -> LowLevel.handleSuper t e
-    _ -> LowLevel.handleSuper t e
+                 LowLevel.handleTabsBase (safeCast t) e
+            _ -> LowLevel.handleTabsBase (safeCast t) e
+        _ -> LowLevel.handleTabsBase (safeCast t) e
+    _ -> LowLevel.handleTabsBase (safeCast t) e
 
 -- | Calculate the width and x coordinate of each tab
 lightTabPositionsCustom :: TabSpec -> Ref LowLevel.Tabs -> IO (Maybe AtIndex, Int, [(X,Width)])
@@ -279,7 +280,7 @@
   let xOffsets = zip (map X (map ((+) x) (scanl (+) 0 widths))) (map Width widths)
   return (selected, (0 :: Int), xOffsets)
   where
-   selectedTab :: [(AtIndex, Ref LowLevel.Widget)] -> IO (Maybe AtIndex)
+   selectedTab :: [(AtIndex, Ref LowLevel.WidgetBase)] -> IO (Maybe AtIndex)
    selectedTab [] = return Nothing
    selectedTab ((i,w):ws) = do
      v <- LowLevel.getVisible w
@@ -333,7 +334,7 @@
       else toRectangle (tabsX,tabsY,tabsW,tabHeight))
 
 -- | Determine which tab was just selected
-lightTabWhichCustom :: TabSpec -> Ref LowLevel.Tabs -> Position -> IO (Maybe (AtIndex, Ref LowLevel.Widget))
+lightTabWhichCustom :: TabSpec -> Ref LowLevel.Tabs -> Position -> IO (Maybe (AtIndex, Ref LowLevel.WidgetBase))
 lightTabWhichCustom spec t pos = do
   tabBarRect <- tabBarRectangle spec t
   if (not (insideRectangle pos tabBarRect))
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Tree.hs b/src/Graphics/UI/FLTK/Theme/Light/Tree.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Tree.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Tree.hs
@@ -6,6 +6,7 @@
 where
 import Graphics.UI.FLTK.LowLevel.Fl_Enumerations
 import Graphics.UI.FLTK.LowLevel.Fl_Types
+import Graphics.UI.FLTK.LowLevel.Dispatch
 import Graphics.UI.FLTK.Theme.Light.Common
 import qualified Data.Text as T
 import qualified Graphics.UI.FLTK.LowLevel.FLTKHS as LowLevel
@@ -22,7 +23,7 @@
           (\rect _ -> do
               LowLevel.flcRectfWithColor rect color
               LowLevel.flcRectWithColor rect slightlyDarker)
-          (LowLevel.drawSuper t)
+          (LowLevel.drawTreeBase (safeCast t))
   t <- LowLevel.treeCustom rectangle l' (Just customDraw) Nothing
   LowLevel.setBox t BorderBox
   LowLevel.setColor t lightBackground
diff --git a/src/Graphics/UI/FLTK/Theme/Light/Valuator.hs b/src/Graphics/UI/FLTK/Theme/Light/Valuator.hs
--- a/src/Graphics/UI/FLTK/Theme/Light/Valuator.hs
+++ b/src/Graphics/UI/FLTK/Theme/Light/Valuator.hs
@@ -8,6 +8,7 @@
 where
 import Graphics.UI.FLTK.LowLevel.Fl_Enumerations
 import Graphics.UI.FLTK.LowLevel.Fl_Types
+import Graphics.UI.FLTK.LowLevel.Dispatch
 import Graphics.UI.FLTK.Theme.Light.Common
 import Graphics.UI.FLTK.Theme.Light.Input
 import qualified Data.Text as T
@@ -36,7 +37,7 @@
               LowLevel.flcRectfWithColor rect color
               focused <- isWidget vo FL.focus
               inputBox focused rect color)
-          (LowLevel.drawSuper vo)
+          (LowLevel.drawValueOutputBase (safeCast vo))
   vo <- LowLevel.valueOutputCustom rect l (Just customDraw) Nothing
   LowLevel.setColor vo lightBackground
   LowLevel.setBox vo BorderBox
@@ -58,7 +59,7 @@
               LowLevel.flcRectfWithColor rect color
               focused <- isWidget vi FL.focus
               inputBox focused rect color)
-          (LowLevel.drawSuper vi)
+          (LowLevel.drawValueInputBase (safeCast vi))
   vi <- LowLevel.valueInputCustom rect l (Just customDraw) Nothing
   LowLevel.setColor vi lightBackground
   LowLevel.setBox vi BorderBox
