diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for minilight
 
+## 0.4.4 -- 2020-05-05
+
+* Add `registerComponent` and `extend9tiles` functions
+
 ## 0.4.3 -- 2020-03-11
 
 * Support GHC 8.8
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -16,6 +16,8 @@
 ~$ sudo apt install -y libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-gfx-dev
 ```
 
+For ghc-8.8, use a version `>= 0.4.3`
+
 ## Tutorial
 
 Create a new project. Assume that you have the `resource` directory under the project root, which contains the resource stuff.
diff --git a/minilight.cabal b/minilight.cabal
--- a/minilight.cabal
+++ b/minilight.cabal
@@ -3,7 +3,7 @@
 --   For further documentation, see http://haskell.org/cabal/users-guide/
 
 name:                minilight
-version:             0.4.3
+version:             0.4.4
 synopsis:            A SDL2-based graphics library, batteries-included.
 description:
   This package provides the wheel for a graphical application or a game.
diff --git a/src/MiniLight.hs b/src/MiniLight.hs
--- a/src/MiniLight.hs
+++ b/src/MiniLight.hs
@@ -21,6 +21,7 @@
   runComponentEnv,
   (@@!),
   quit,
+  registerComponent,
 ) where
 
 import Control.Concurrent (threadDelay, forkIO)
@@ -189,6 +190,31 @@
   reg <- view _registry
   v   <- reg R.! key
   runComponentEnv v $ emit (Just key) $ ev
+
+
+-- | Register a component to the component system
+registerComponent
+  :: ( HasLoaderEnv env
+     , HasLightEnv env
+     , MonadIO m
+     , MonadMask m
+     , ComponentUnit c
+     )
+  => T.Text
+  -> c
+  -> LightT env m Component
+registerComponent name cu = do
+  uuid <- newUID
+  comp <- newComponent uuid cu
+
+  reg  <- view _registry
+  R.register reg uuid comp
+
+  tag <- view _tagRegistry
+  liftIO $ modifyIORef' tag $ HM.insert name uuid
+
+  return comp
+
 
 -- | Same as 'runMainloop' but fixing the type.
 runMiniloop :: LoopConfig -> s -> (s -> MiniLoop s) -> MiniLight ()
diff --git a/src/MiniLight/Figure.hs b/src/MiniLight/Figure.hs
--- a/src/MiniLight/Figure.hs
+++ b/src/MiniLight/Figure.hs
@@ -56,6 +56,59 @@
                              (c2 - c1 + fmap (`div` 2) (s1 + s2))
   | otherwise = union y x
 
+
+-- | Split a figure into 9 pieces and extend it to the given size frame.
+extend9tiles :: Figure -> Vect.V2 Int -> MiniLight Figure
+extend9tiles fig size = do
+  mrenderer <- view _renderer
+  target    <- flip mapM mrenderer $ \renderer -> do
+    let siz      = fmap toEnum size
+    let Just tex = texture fig
+    let texSize  = fmap toEnum $ getFigureSize fig
+
+    tinfo  <- SDL.queryTexture tex
+
+    target <- SDL.createTexture renderer
+                                (SDL.texturePixelFormat tinfo)
+                                SDL.TextureAccessTarget
+                                siz
+    SDL.rendererRenderTarget renderer SDL.$= Just target
+    SDL.textureBlendMode target SDL.$= SDL.BlendAlphaBlend
+
+    let tileSize = fmap (`div` 3) texSize
+
+    forM_ [0 .. 2] $ \ix -> forM_ [0 .. 2] $ \iy -> do
+      let targetSize = Vect.V2
+            (if ix == 1 then siz ^. _x - 2 * tileSize ^. _x else tileSize ^. _x)
+            (if iy == 1 then siz ^. _y - 2 * tileSize ^. _y else tileSize ^. _y)
+      let targetLoc = Vect.V2
+            ( if ix == 0
+              then 0
+              else if ix == 1
+                then tileSize ^. _x
+                else siz ^. _x - tileSize ^. _x
+            )
+            ( if iy == 0
+              then 0
+              else if iy == 1
+                then tileSize ^. _y
+                else siz ^. _y - tileSize ^. _y
+            )
+
+      SDL.copy
+        renderer
+        tex
+        (Just $ SDL.Rectangle (SDL.P (tileSize * Vect.V2 ix iy)) tileSize)
+        (Just $ SDL.Rectangle (SDL.P targetLoc) targetSize)
+
+    SDL.rendererRenderTarget renderer SDL.$= Nothing
+
+    return target
+
+  tex <- maybe (return emptyFigure) fromTexture target
+  return tex
+
+
 -- | Render a figure.
 render :: (HasLightEnv env, MonadIO m, MonadMask m) => Figure -> LightT env m ()
 render fig = do
