diff --git a/Development/NSIS.hs b/Development/NSIS.hs
--- a/Development/NSIS.hs
+++ b/Development/NSIS.hs
@@ -50,26 +50,36 @@
     (&), strConcat, strLength, strTake, strDrop, strReplace, strIsPrefixOf, strUnlines,
     -- ** File system manipulation
     FileHandle, fileOpen, fileWrite, fileClose, withFile', writeFile', writeFileLines,
-    rmdir, delete, 
+    rmdir, delete, copyFiles,
     getFileTime, fileExists, findEach,
     createDirectory, createShortcut,
     -- ** Registry manipulation
     readRegStr, deleteRegKey, writeRegStr, writeRegDWORD,
+    -- ** Environment variables
+    envVar,
     -- ** Process execution
-    exec,
+    exec, execWait, execShell, sleep,
+    -- ** Plugins
+    plugin, push, pop, exp_,
+    addPluginDir,
     -- * Installer
     -- ** Global installer options
     name, outFile, installDir, setCompressor,
     installIcon, uninstallIcon, headerImage,
     installDirRegKey, allowRootDirInstall, caption, showInstDetails, showUninstDetails,
     -- ** Sections
-    SectionId, section, sectionGroup, newSectionId, sectionSetText, sectionGetText, uninstall, page, unpage,
+    SectionId, section, sectionGroup, newSectionId,
+    sectionSetText, sectionGetText, sectionSet, sectionGet,
+    uninstall, page, unpage,
+    -- ** Events
+    event, onSelChange,
+    onPageShow, onPagePre, onPageLeave,
     -- ** Section commands
     file, alwaysNonFatal, writeUninstaller, alert, setOutPath, messageBox, requestExecutionLevel,
     hideProgress, detailPrint,
     -- * Settings
     Compressor(..), HKEY(..), MessageBoxType(..), Attrib(..), Page(..), Level(..), Visibility(..),
-    FileMode(..)
+    FileMode(..), SectionFlag(..), ShowWindow(..)
     ) where
 
 import Development.NSIS.Sugar
diff --git a/Development/NSIS/Optimise.hs b/Development/NSIS/Optimise.hs
--- a/Development/NSIS/Optimise.hs
+++ b/Development/NSIS/Optimise.hs
@@ -39,11 +39,11 @@
 
 -- Label whose next statement is a good, 
 elimLabeledGoto :: [NSIS] -> [NSIS]
-elimLabeledGoto x = transform f x
+elimLabeledGoto x = transformBi f x
     where
-        f (Labeled x:xs) = Labeled x : xs
-        f (x:xs) | null (children x :: [NSIS]) = transformBi moveBounce x : xs
-        f x = x
+        f (Labeled x) = Labeled x
+        f x | null (children x) = descendBi moveBounce x
+            | otherwise = x
 
         moveBounce x = fromMaybe x $ lookup x bounce
         bounce = flip concatMap (universe x) $ \x -> case x of
diff --git a/Development/NSIS/Plugins/Base64.hs b/Development/NSIS/Plugins/Base64.hs
new file mode 100644
--- /dev/null
+++ b/Development/NSIS/Plugins/Base64.hs
@@ -0,0 +1,19 @@
+
+-- | Base64 plugin: <http://nsis.sourceforge.net/Base64_plug-in>
+module Development.NSIS.Plugins.Base64(encrypt, decrypt) where
+
+import Development.NSIS
+
+
+-- | Base64 data encryption.
+encrypt :: Exp String -> Exp String
+encrypt x = share x $ \x -> do
+    plugin "Base64" "Encrypt" [exp_ x, exp_ $ strLength x]
+    pop
+
+
+-- | Base64 decryption. Reverse of 'encrypt'.
+decrypt :: Exp String -> Exp String
+decrypt x = share x $ \x -> do
+    plugin "Base64" "Decrypt" [exp_ x, exp_ $ strLength x]
+    pop
diff --git a/Development/NSIS/Plugins/Taskbar.hs b/Development/NSIS/Plugins/Taskbar.hs
new file mode 100644
--- /dev/null
+++ b/Development/NSIS/Plugins/Taskbar.hs
@@ -0,0 +1,10 @@
+
+-- | Windows 7 Taskbar Progress plugin: <http://nsis.sourceforge.net/TaskbarProgress_plug-in>
+module Development.NSIS.Plugins.Taskbar(taskbar) where
+
+import Development.NSIS
+
+
+-- | Enable Windows 7 taskbar plugin, called anywhere.
+taskbar :: Action ()
+taskbar = onPageShow InstFiles $ plugin "w7tbp" "Start" []
diff --git a/Development/NSIS/Show.hs b/Development/NSIS/Show.hs
--- a/Development/NSIS/Show.hs
+++ b/Development/NSIS/Show.hs
@@ -3,8 +3,10 @@
 module Development.NSIS.Show(showNSIS) where
 
 import Development.NSIS.Type
+import Control.Arrow
 import Data.Generics.Uniplate.Data
 import Data.Char
+import Data.Function
 import Data.List
 
 
@@ -12,19 +14,25 @@
 showNSIS xs =
     ["!Include MUI2.nsh"] ++
     ["Var _" ++ show v | v <- sort $ nub [i | Var i <- universeBi xs]] ++
-    outs (filter isGlobal xs) ++
+    outs fs (filter isGlobal xs) ++
     ["!insertmacro MUI_LANGUAGE \"English\""] ++
-    concat [("Function " ++ show name) : map indent (outs body) ++ ["FunctionEnd"] | Function name body <- universeBi xs] ++
-    outs (filter isSection xs) ++
-    ["Function .onInit" | not $ null inits] ++
-    map indent (outs inits) ++
-    ["FunctionEnd" | not $ null inits] ++
+    (if null plugins then [] else
+        ["Function NSIS_UnusedPluginPreload"
+        ,"  # Put all plugins are at the start of the archive, ensuring fast extraction (esp. LZMA solid)"] ++
+        map indent plugins ++
+        ["FunctionEnd"]) ++
+    outs fs (filter isSection xs) ++
+    concat [("Function " ++ show name) : map indent (outs fs body) ++ ["FunctionEnd"] | (name,body) <- funs] ++
     (if null descs then [] else
         ["!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN"] ++
         map indent ["!insertmacro MUI_DESCRIPTION_TEXT " ++ show i ++ " " ++ show d | (i,d) <- descs] ++
         ["!insertmacro MUI_FUNCTION_DESCRIPTION_END"])
     where descs = filter (not . null . snd) $ concatMap secDescs $ universeBi xs
           inits = filter (\x -> not (isSection x) && not (isGlobal x)) xs
+          fs = map fst funs
+          funs = map (fst . head &&& concatMap snd) $ groupBy ((==) `on` fst) $ sortBy (compare `on` fst) $
+                     [(Fun ".onInit",inits) | not $ null inits] ++ [(name,body) | Function name body <- universeBi xs]
+          plugins = sort $ nub [a ++ "::" ++ b | Plugin a b _ <- universeBi xs]
 
 
 secDescs :: NSIS -> [(SectionId, Val)]
@@ -45,6 +53,7 @@
     Page{} -> True
     Unpage{} -> True
     RequestExecutionLevel{} -> True
+    AddPluginDir{} -> True
     InstallDirRegKey{} -> True
     AllowRootDirInstall{} -> True
     ShowInstDetails{} -> True
@@ -59,43 +68,51 @@
     _ -> False
 
 
-outs :: [NSIS] -> [String]
-outs = concatMap out
+outs :: [Fun] -> [NSIS] -> [String]
+outs fs = concatMap (out fs)
 
-out :: NSIS -> [String]
-out (Assign v x) = ["StrCpy " ++ show v ++ " " ++ show x]
-out (SetCompressor ACompressor{..}) = [unwords $ "SetCompressor" : ["/solid"|compSolid] ++ ["/final"|compFinal] ++ [map toLower $ show compType]]
-out (Section ASection{secId=SectionId secId, ..} xs) =
+out :: [Fun] -> NSIS -> [String]
+out fs (Assign v x) = ["StrCpy " ++ show v ++ " " ++ show x]
+out fs (SetCompressor ACompressor{..}) = [unwords $ "SetCompressor" : ["/solid"|compSolid] ++ ["/final"|compFinal] ++ [map toLower $ show compType]]
+out fs (Section ASection{secId=SectionId secId, ..} xs) =
     [unwords $ "Section" : ["/o"|secUnselected] ++ [show $ [Literal "!"|secBold] ++ secName, "_sec" ++ show secId]] ++
-    map indent (["SectionIn RO" | secRequired] ++ outs xs) ++
+    map indent (["SectionIn RO" | secRequired] ++ outs fs xs) ++
     ["SectionEnd"]
-out (SectionGroup ASectionGroup{secgId=SectionId secgId, ..} xs) =
+out fs (SectionGroup ASectionGroup{secgId=SectionId secgId, ..} xs) =
     [unwords $ "SectionGroup" : ["/e"|secgExpanded] ++ [show secgName, "_sec" ++ show secgId]] ++
-    map indent (outs xs) ++
+    map indent (outs fs xs) ++
     ["SectionGroupEnd"]
-out (File AFile{..}) = [unwords $ "File" : ["/nonfatal"|fileNonFatal] ++ ["/r"|fileRecursive] ++ [show filePath]]
-out (Labeled i) = [show i ++ ":"]
-out (CreateShortcut AShortcut{..}) = return $ unwords $
+out fs (File AFile{..}) = [unwords $ "File" : ["/nonfatal"|fileNonFatal] ++ ["/r"|fileRecursive] ++ [show filePath]]
+out fs (Labeled i) = [show i ++ ":"]
+out fs (CreateShortcut AShortcut{..}) = return $ unwords $
     ["CreateShortcut", show scFile, show scTarget, show scParameters, show scIconFile
     ,show scIconIndex, show scStartOptions, show scKeyboardShortcut, show scDescription]
-out (InstallIcon x) = ["!define MUI_ICON " ++ show x]
-out (UninstallIcon x) = ["!define MUI_UNICON " ++ show x]
-out (HeaderImage x) = "!define MUI_HEADERIMAGE" : ["!define MUI_HEADERIMAGE_BITMAP " ++ show x | Just x <- [x]]
-out (Page x) = ["!insertmacro MUI_PAGE_" ++ showPage x]
-out (Unpage x) = ["!insertmacro MUI_UNPAGE_" ++ showPage x]
-out Function{} = []
-out (Delete ADelete{..}) = [unwords $ "Delete" : ["/rebootok"|delRebootOK] ++ [show delFile]]
-out (RMDir ARMDir{..}) = [unwords $ "RMDir" : ["/r"|rmRecursive] ++ ["/rebootok"|rmRebootOK] ++ [show rmDir]]
-out (MessageBox flags txt lbls) = [unwords $ "MessageBox" : intercalate "|" (map show flags) : show txt :
+out fs (InstallIcon x) = ["!define MUI_ICON " ++ show x]
+out fs (UninstallIcon x) = ["!define MUI_UNICON " ++ show x]
+out fs (HeaderImage x) = "!define MUI_HEADERIMAGE" : ["!define MUI_HEADERIMAGE_BITMAP " ++ show x | Just x <- [x]]
+out fs (Page x) = let y = showPageCtor x in
+    ["!define MUI_PAGE_CUSTOMFUNCTION_PRE Pre" ++ y | "Pre" ++ y `elem` map show fs] ++
+    ["!define MUI_PAGE_CUSTOMFUNCTION_SHOW Show" ++ y | "Show" ++ y `elem` map show fs] ++
+    ["!define MUI_PAGE_CUSTOMFUNCTION_LEAVE Leave" ++ y | "Leave" ++ y `elem` map show fs] ++
+    ["!insertmacro MUI_PAGE_" ++ showPage x]
+out fs (Unpage x) = ["!insertmacro MUI_UNPAGE_" ++ showPage x]
+out fs Function{} = []
+out fs (Delete ADelete{..}) = [unwords $ "Delete" : ["/rebootok"|delRebootOK] ++ [show delFile]]
+out fs (RMDir ARMDir{..}) = [unwords $ "RMDir" : ["/r"|rmRecursive] ++ ["/rebootok"|rmRebootOK] ++ [show rmDir]]
+out fs (CopyFiles ACopyFiles{..}) = [unwords $ "CopyFiles" : ["/silent"|cpSilent] ++ ["/filesonly"|cpFilesOnly] ++ [show cpFrom, show cpTo]]
+out fs (MessageBox flags txt lbls) = [unwords $ "MessageBox" : intercalate "|" (map show flags) : show txt :
     ["ID" ++ a ++ " " ++ show b | (a,b) <- lbls]]
-out (Goto x) = ["Goto " ++ show x | x /= Label 0]
+out fs (Goto x) = ["Goto " ++ show x | x /= Label 0]
+out fs (IntOp a b "~" _) = [unwords $ "IntOp" : [show a, show b, "~"]] -- the only unary IntOp
+out fs (ExecShell AExecShell{..}) = [unwords ["ExecShell","\"\"",show esCommand,show esShow]]
+out fs (Plugin a b cs) = [unwords $ (a ++ "::" ++ b) : map show cs]
+out fs (AddPluginDir a) = [unwords ["!addplugindir",show a]]
 
-out x = [show x]
+out fs x = [show x]
 
 
 showPage :: Page -> String
 showPage (License x) = "LICENSE \"" ++ x ++ "\""
 showPage x = map toUpper $ show x
-
 
 indent x = "  " ++ x
diff --git a/Development/NSIS/Sugar.hs b/Development/NSIS/Sugar.hs
--- a/Development/NSIS/Sugar.hs
+++ b/Development/NSIS/Sugar.hs
@@ -1,8 +1,10 @@
 {-# LANGUAGE OverloadedStrings, EmptyDataDecls, ScopedTypeVariables, TypeSynonymInstances #-}
 {-# LANGUAGE FlexibleInstances, GeneralizedNewtypeDeriving, DeriveDataTypeable #-}
+{-# OPTIONS_GHC -fno-warn-missing-methods #-} -- Bits.popCount only introduced in 7.6
 
 module Development.NSIS.Sugar(
-    Compressor(..), HKEY(..), MessageBoxType(..), Page(..), Level(..), Visibility(..), FileMode(..),
+    Compressor(..), HKEY(..), MessageBoxType(..), Page(..), Level(..), Visibility(..), FileMode(..), SectionFlag(..),
+    ShowWindow(..),
     module Development.NSIS.Sugar, Label, SectionId
     ) where
 
@@ -12,7 +14,8 @@
 import Data.Maybe
 import Data.Monoid
 import Data.String
-import Data.Typeable
+import Data.Data
+import Data.Bits
 import Control.Applicative
 import Control.Monad
 import Control.Monad.Trans.State
@@ -225,6 +228,19 @@
             f (x:xs) = x : f xs
             f [] = []
 
+instance Bits (Exp Int) where
+    (.&.) = intOp "&"
+    (.|.) = intOp "|"
+    xor = intOp "^"
+    complement a = intOp "~" a 0
+    shiftL a b = intOp "<<" a (fromInteger $ toInteger b)
+    shiftR a b = intOp ">>" a (fromInteger $ toInteger b)
+    rotate = error "rotate is not available for Exp"
+    bitSize = error "bitSize is not available for Exp"
+    isSigned _ = True
+    testBit i = error "testBit is not available for Exp"
+    bit i = fromInteger $ toInteger (bit i :: Int)
+
 intOp :: String -> Exp Int -> Exp Int -> Exp Int
 intOp cmd x y = do Value x <- x; Value y <- y; v <- var; emit $ IntOp v x cmd y; return $ Value $ val v
 
@@ -317,8 +333,8 @@
 --   To introduce a new scope, see 'scope'.
 --
 -- @
--- 'constant' "HELLO" "Hello World"
--- 'alert' "$HELLO!"
+-- 'constant' \"HELLO\" \"Hello World\"
+-- 'alert' \"$HELLO!\"
 -- @
 constant :: Typeable t => String -> Exp t -> Action (Exp t)
 constant name x = do x <- constant_ x; xx <- x; addScope name xx; return x
@@ -436,7 +452,36 @@
 int :: Int -> Exp Int
 int = return . Value . lit . show
 
+-- | Erase the type of an Exp, only useful with 'plugin'.
+exp_ :: Exp a -> Exp ()
+exp_ = fmap (Value . fromValue)
 
+-- | Pop a value off the stack, will set an error if there is nothing on the stack.
+--   Only useful with 'plugin'.
+pop :: Exp String
+pop = do v <- var; emit $ Pop v; return $ Value $ val v
+
+-- | Push a value onto the stack. Only useful with 'plugin'.
+push :: Exp a -> Action ()
+push a = do Value a <- a; emit $ Push a
+
+-- | Call a plugin. If the arguments are of different types use 'exp_'. As an example:
+--
+-- @
+-- encrypt x = 'share' x $ \\x -> do
+--     'plugin' \"Base64\" \"Encrypt\" ['exp_' x, 'exp_' $ 'strLength' x]
+-- @
+--
+--   The only thing to be careful about is that we use the @x@ parameter twice, so should 'share'
+--   it to ensure it is only evaluated once.
+plugin :: String -> String -> [Exp a] -> Action ()
+plugin dll name args = do args <- mapM (fmap fromValue) args; emit $ Plugin dll name args
+
+-- | Add a plugin directory
+addPluginDir :: Exp String -> Action ()
+addPluginDir a = do Value a <- a; emit $ AddPluginDir a
+
+
 -- | Return the length of a string, @strLength \"test\" '%==' 4@.
 strLength :: Exp String -> Exp Int
 strLength a = do Value a <- a; v <- var; emit $ StrLen v a; return $ Value $ val v
@@ -454,16 +499,16 @@
 getFileTime :: Exp FilePath -> Exp String
 getFileTime x = do Value x <- x; v1 <- var; v2 <- var; emit $ GetFileTime x v1 v2; strConcat [return $ Value $ val v1, "#", return $ Value $ val v2]
 
-sectionGetText :: SectionId -> Exp String
-sectionGetText x = do v <- var; emit $ SectionGetText x v; return $ Value $ val v
-
 readRegStr :: HKEY -> Exp String -> Exp String -> Exp String
 readRegStr k a b = do v <- var; emit2 (ReadRegStr v k) a b; return $ Value $ val v
 
 deleteRegKey :: HKEY -> Exp String -> Action ()
 deleteRegKey k = emit1 (DeleteRegKey k)
 
+envVar :: Exp String -> Exp String
+envVar a = do v <- var; emit1 (ReadEnvStr v) a; return $ Value $ val v
 
+
 ---------------------------------------------------------------------
 -- ATTRIBUTES
 
@@ -471,6 +516,8 @@
     = Solid
     | Final
     | RebootOK
+    | Silent
+    | FilesOnly
     | NonFatal
     | Recursive
     | Unselected
@@ -743,9 +790,48 @@
 exec :: Exp String -> Action ()
 exec = emit1 Exec
 
+execWait :: Exp String -> Action ()
+execWait = emit1 ExecWait
+
+execShell :: [ShowWindow] -> Exp String -> Action ()
+execShell sw x = do
+    Value x <- x
+    let d = def{esCommand=x}
+    emit $ ExecShell $ if null sw then d else d{esShow=last sw}
+
 sectionSetText :: SectionId -> Exp String -> Action ()
 sectionSetText x = emit1 $ SectionSetText x
 
+sectionGetText :: SectionId -> Exp String
+sectionGetText x = do v <- var; emit $ SectionGetText x v; return $ Value $ val v
+
+data SectionFlag
+    = SF_Selected
+    | SF_SectionGroup
+    | SF_SectionGroupEnd
+    | SF_Bold
+    | SF_ReadOnly
+    | SF_Expand
+    | SF_PartiallySelected
+      deriving (Show,Data,Typeable,Read,Bounded,Enum,Eq,Ord)
+
+sectionGet :: SectionId -> SectionFlag -> Exp Bool
+sectionGet sec flag = do
+    v <- var
+    emit $ SectionGetFlags sec v
+    let b = bit $ fromEnum flag :: Exp Int
+    b %== (return (Value $ val v) .&. b)
+
+sectionSet :: SectionId -> SectionFlag -> Exp Bool -> Action ()
+sectionSet sec flag set = do
+    v <- var
+    emit $ SectionGetFlags sec v
+    v <- return (return $ Value $ val v :: Exp Int)
+    iff set
+        (emit1 (SectionSetFlags sec) $ setBit   v (fromEnum flag))
+        (emit1 (SectionSetFlags sec) $ clearBit v (fromEnum flag))
+
+
 -- don't want to accidentally dupe the message box, so make it in Action Exp
 messageBox :: [MessageBoxType] -> Exp String -> Action (Exp String)
 messageBox ty x = do
@@ -782,12 +868,31 @@
 --   Useful for functions which do a large amount of computation, or have loops.
 hideProgress :: Action a -> Action a
 hideProgress act = do
-    fun <- fmap Fun unique
+    fun <- fmap newFun unique
     (xs, v) <- capture act
     emit $ Function fun xs
     emit $ Call fun
     return v
 
+-- | Sleep time in milliseconds
+sleep :: Exp Int -> Action ()
+sleep = emit1 Sleep
+
+-- | Create a function, useful for registering actions
+event :: String -> Action () -> Action ()
+event name act = do
+    (xs, _) <- capture act
+    emit $ Function (Fun name) xs
+
+onSelChange :: Action () -> Action ()
+onSelChange = event ".onSelChange"
+
+onPageShow, onPagePre, onPageLeave :: Page -> Action () -> Action ()
+-- these names are special and bound by Show
+onPageShow  p = event $ "Show" ++ showPageCtor p
+onPagePre   p = event $ "Pre" ++ showPageCtor p
+onPageLeave p = event $ "Show" ++ showPageCtor p
+
 allowRootDirInstall :: Bool -> Action ()
 allowRootDirInstall = emit . AllowRootDirInstall
 
@@ -927,6 +1032,17 @@
         f c RebootOK = c{rmRebootOK=True}
         f c Recursive = c{rmRecursive=True}
         f c x = error $ "Invalid attribute to rmdir: " ++ show x
+
+-- | Both file paths are on the installing system. Do not use relative paths.
+copyFiles :: [Attrib] -> Exp FilePath -> Exp FilePath -> Action ()
+copyFiles as from to = do
+    Value from <- from
+    Value to <- to
+    emit $ CopyFiles $ foldl f def{cpFrom=from, cpTo=to} as
+    where
+        f c Silent = c{cpSilent=True}
+        f c FilesOnly = c{cpFilesOnly=True}
+        f c x = error $ "Invalid attribute to copyFiles: " ++ show x
 
 -- | Creates a shortcut file that links to a 'Traget' file, with optional 'Parameters'. The icon used for the shortcut
 --   is 'IconFile','IconIndex'. 'StartOptions' should be one of: SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED.
diff --git a/Development/NSIS/Type.hs b/Development/NSIS/Type.hs
--- a/Development/NSIS/Type.hs
+++ b/Development/NSIS/Type.hs
@@ -19,9 +19,11 @@
 instance Show Label where show (Label i) = if i == 0 then "0" else "_lbl" ++ show i
 
 
-newtype Fun = Fun Int deriving (Data,Typeable)
-instance Show Fun where show (Fun i) = "_fun" ++ show i
+newtype Fun = Fun String deriving (Data,Typeable,Eq,Ord)
+instance Show Fun where show (Fun i) = i
 
+newFun :: Int -> Fun
+newFun i = Fun $ "_fun" ++ show i
 
 newtype SectionId = SectionId Int deriving (Data,Typeable)
 instance Show SectionId where show (SectionId i) = "${_sec" ++ show i ++ "}"
@@ -62,10 +64,14 @@
     | IfErrors Label Label
     | SectionGetText SectionId Var
     | SectionSetText SectionId Val
+    | SectionGetFlags SectionId Var
+    | SectionSetFlags SectionId Val
     | IfFileExists Val Label Label
     | FindFirst Var Var Val
     | FindNext Val Var
     | FindClose Val
+    | Push Val
+    | Pop Var
 
       -- blocks
     | Section ASection [NSIS]
@@ -98,17 +104,24 @@
     | WriteRegDWORD HKEY Val Val Val
     | ReadRegStr Var HKEY Val Val
     | DeleteRegKey HKEY Val
+    | ReadEnvStr Var Val
     | Exec Val
+    | ExecWait Val
+    | ExecShell AExecShell
     | ClearErrors
     | Delete ADelete
     | RMDir ARMDir
+    | CopyFiles ACopyFiles
     | RequestExecutionLevel Level
+    | AddPluginDir Val
     | InstallDirRegKey HKEY Val Val
     | AllowRootDirInstall Bool
     | Caption Val
     | ShowInstDetails Visibility
     | ShowUninstDetails Visibility
     | DetailPrint Val
+    | Plugin String String [Val]
+    | Sleep Val
       deriving (Data,Typeable,Show)
 
 -- | Mode to use with 'Development.
@@ -192,6 +205,32 @@
 
 instance Default ADelete where def = ADelete def False
 
+data AExecShell = AExecShell
+    {esCommand :: Val
+    ,esShow :: ShowWindow
+    } deriving (Data,Typeable,Show)
+
+instance Default AExecShell where def = AExecShell def def
+
+data ACopyFiles = ACopyFiles
+    {cpFrom :: Val
+    ,cpTo :: Val
+    ,cpSilent :: Bool
+    ,cpFilesOnly :: Bool
+    } deriving (Data,Typeable,Show)
+
+instance Default ACopyFiles where def = ACopyFiles def def False False
+
+data ShowWindow
+    = SW_SHOWDEFAULT
+    | SW_SHOWNORMAL
+    | SW_SHOWMAXIMIZED
+    | SW_SHOWMINIMIZED
+    | SW_HIDE
+     deriving (Show,Data,Typeable,Read,Bounded,Enum,Eq,Ord)
+
+instance Default ShowWindow where def = SW_SHOWDEFAULT
+
 data HKEY
     = HKCR  | HKEY_CLASSES_ROOT
     | HKLM  | HKEY_LOCAL_MACHINE
@@ -234,6 +273,10 @@
     | InstFiles
     | Confirm
      deriving (Show,Data,Typeable,Read,Eq,Ord)
+
+showPageCtor :: Page -> String
+showPageCtor (License _) = "License"
+showPageCtor x = show x
 
 data Level = None | User | Highest | Admin
      deriving (Show,Data,Typeable,Read,Bounded,Enum,Eq,Ord)
diff --git a/Examples/Base64.hs b/Examples/Base64.hs
new file mode 100644
--- /dev/null
+++ b/Examples/Base64.hs
@@ -0,0 +1,27 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Examples.Base64(base64) where
+
+import Development.NSIS
+import Development.NSIS.Plugins.Base64
+
+
+base64 = do
+    name "base64"
+    allowRootDirInstall True
+    outFile "base64.exe"
+    caption "Base64 test"
+    showInstDetails Show
+    installDir "$EXEDIR"
+    requestExecutionLevel User
+    addPluginDir "."
+
+    page Directory
+    page InstFiles
+
+    section "" [] $ do
+        setOutPath "$INSTDIR"
+        let src = "Hello NSIS Plugin!"
+        enc <- constant_ $ encrypt src
+        dec <- constant_ $ decrypt enc
+        alert $ "Source: " & src & "\nEncrypted: " & enc & "\nDecrypted: " & dec
diff --git a/Examples/Taskbar.hs b/Examples/Taskbar.hs
new file mode 100644
--- /dev/null
+++ b/Examples/Taskbar.hs
@@ -0,0 +1,27 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Examples.Taskbar(taskbar) where
+
+import Control.Monad
+import Development.NSIS
+import qualified Development.NSIS.Plugins.Taskbar as T
+
+
+taskbar = do
+    name "taskbar"
+    allowRootDirInstall True
+    outFile "taskbar.exe"
+    caption "Taskbar test"
+    showInstDetails Show
+    installDir "$EXEDIR"
+    requestExecutionLevel User
+    addPluginDir "."
+    T.taskbar
+
+    page Directory
+    page InstFiles
+
+    section "" [] $
+        replicateM_ 20 $ do
+            sleep 100
+            detailPrint "hello"
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,340 +1,30 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year  name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
+Copyright Neil Mitchell 2012-2013.
+All rights reserved.
 
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
 
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
 
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
 
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
+    * Neither the name of Neil Mitchell nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
 
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -7,29 +7,49 @@
 import System.Cmd
 import System.Environment
 import System.Exit
+import System.Info
 
 import Development.NSIS
+import Examples.Base64
 import Examples.Example1
 import Examples.Example2
 import Examples.Primes
+import Examples.Taskbar
 
 
-examples = let (*) = (,) in ["example1" * example1, "example2" * example2, "primes" * primes]
+examples = let (*) = (,) in
+    ["base64" * base64, "example1" * example1, "example2" * example2, "primes" * primes, "taskbar" * taskbar]
 
 
 main = do
     args <- getArgs
     let (flags,names) = partition ("-" `isPrefixOf`) args
-    names <- return $ concatMap (\x -> if x == "all" then map fst examples else [x]) names
-    if null names then
-        putStrLn $ "Type the name of an example: " ++ unwords (map fst examples)
-     else do
-        forM_ names $ \name -> do
-            let script = fromMaybe (error $ "Unknown example: " ++ name) $ lookup name examples
-            unless ("--nowrite" `elem` flags) $ writeFile (name ++ ".nsi") $ nsis script
-            unless ("--nobuild" `elem` flags) $ do
-                r <- system $ "\"C:/Program Files/NSIS/makensis.exe\" " ++ name ++ ".nsi"
+    when ("--help" `elem` flags) $ do
+        putStr $ unlines
+            ["nsis-test [FLAGS] [EXAMPLES]"
+            ,"Examples:"
+            ,"  " ++ unwords (map fst examples)
+            ,"Flags:"
+            ,"  --help     Show this message"
+            ,"  --nowrite  Don't write out the scripts"
+            ,"  --nobuild  Don't build"
+            ,"  --run      Run the result"
+            ]
+        exitSuccess
+    when (null args) $ do
+        putStrLn "*****************************************************************"
+        putStrLn "** Running nsis test suite, run with '--help' to see arguments **"
+        putStrLn "*****************************************************************"
+    names <- return $ if null names then map fst examples else names
+    forM_ names $ \name -> do
+        let script = fromMaybe (error $ "Unknown example: " ++ name) $ lookup name examples
+        unless ("--nowrite" `elem` flags) $ writeFile (name ++ ".nsi") $ nsis script
+        unless ("--nobuild" `elem` flags) $
+            if os == "mingw32" then do
+                r <- system $ "makensis " ++ name ++ ".nsi"
                 when (r /= ExitSuccess) $ error "NSIS FAILED"
-            when ("--run" `elem` flags) $ do
-                system $ name ++ ".exe"
-                return ()
+            else
+                putStrLn "Not building because not on Windows"
+        when ("--run" `elem` flags) $ do
+            system $ name ++ ".exe"
+            return ()
diff --git a/nsis.cabal b/nsis.cabal
--- a/nsis.cabal
+++ b/nsis.cabal
@@ -1,9 +1,8 @@
-cabal-version:      >= 1.6
+cabal-version:      >= 1.10
 build-type:         Simple
 name:               nsis
-version:            0.2.2
--- license is GPL v2 only
-license:            GPL
+version:            0.2.3
+license:            BSD3
 license-file:       LICENSE
 category:           Development
 author:             Neil Mitchell <ndmitchell@gmail.com>
@@ -20,10 +19,11 @@
 stability:          Beta
 
 source-repository head
-    type:     darcs
-    location: http://community.haskell.org/~ndm/darcs/nsis/
+    type:     git
+    location: https://github.com/ndmitchell/nsis.git
 
 library
+    default-language: Haskell2010
     build-depends:
         base == 4.*,
         transformers >= 0.2 && < 0.4,
@@ -31,6 +31,8 @@
 
     exposed-modules:
         Development.NSIS
+        Development.NSIS.Plugins.Base64
+        Development.NSIS.Plugins.Taskbar
     other-modules:
         Development.NSIS.Library
         Development.NSIS.Optimise
@@ -38,21 +40,19 @@
         Development.NSIS.Sugar
         Development.NSIS.Type
 
-flag testprog
-    default: False
-    description: Build the test program
-
-
-executable nsis
+test-suite shake-test
+    default-language: Haskell2010
+    type: exitcode-stdio-1.0
     main-is: Main.hs
-    if flag(testprog)
-        buildable: True
-    else
-        buildable: False
     build-depends:
+        base == 4.*,
+        transformers >= 0.2 && < 0.4,
+        uniplate >= 1.5 && < 1.7,
         process
 
     other-modules:
+        Examples.Base64
         Examples.Example1
         Examples.Example2
         Examples.Primes
+        Examples.Taskbar
