diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,8 @@
 Changelog for NSIS
 
+0.3.1
+    #11, add unsafeInject and unsafeInjectGlobal
+    #10, add unicode function
 0.3
     Make strCheck take a message
     Add a plugin for helping with radio button
diff --git a/Development/NSIS.hs b/Development/NSIS.hs
--- a/Development/NSIS.hs
+++ b/Development/NSIS.hs
@@ -68,7 +68,8 @@
     -- ** Global installer options
     name, outFile, installDir, setCompressor,
     installIcon, uninstallIcon, headerImage,
-    installDirRegKey, allowRootDirInstall, caption, showInstDetails, showUninstDetails,
+    installDirRegKey, allowRootDirInstall, caption,
+    showInstDetails, showUninstDetails, unicode,
     -- ** Sections
     SectionId, section, sectionGroup, newSectionId,
     sectionSetText, sectionGetText, sectionSet, sectionGet,
@@ -79,6 +80,8 @@
     -- ** Section commands
     file, alwaysNonFatal, writeUninstaller, alert, setOutPath, messageBox, requestExecutionLevel,
     hideProgress, detailPrint, setDetailsPrint,
+    -- * Escape hatch
+    unsafeInject, unsafeInjectGlobal,
     -- * Settings
     Compressor(..), HKEY(..), MessageBoxType(..), Attrib(..), Page(..), Level(..), Visibility(..),
     FileMode(..), SectionFlag(..), ShowWindow(..), FinishOptions(..), DetailsPrint(..)
@@ -92,12 +95,18 @@
 
 
 -- | Create the contents of an NSIS script from an installer specification.
+--
+-- Beware, 'unsafeInject' and 'unsafeInjectGlobal' may break 'nsis'. The
+-- optimizer relies on invariants that may not hold when arbitrary lines are
+-- injected. Consider using 'nsisNoOptimise' if problems arise.
 nsis :: Action a -> String
 nsis = unlines . showNSIS . optimise . runAction . void
 
 
--- | Like 'nsis', but don't try and optimise the resulting NSIS script. Useful
---   to figure out how the underlying installer works, or if you believe the
---   optimisations are introducing bugs (but please do report any such bugs!).
+-- | Like 'nsis', but don't try and optimise the resulting NSIS script.
+--
+-- Useful to figure out how the underlying installer works, or if you believe
+-- the optimisations are introducing bugs. Please do report any such bugs,
+-- especially if you aren't using 'unsafeInject' or 'unsafeInjectGlobal'!
 nsisNoOptimise :: Action a -> String
 nsisNoOptimise = unlines . showNSIS . runAction . void
diff --git a/Development/NSIS/Show.hs b/Development/NSIS/Show.hs
--- a/Development/NSIS/Show.hs
+++ b/Development/NSIS/Show.hs
@@ -60,6 +60,8 @@
     ShowInstDetails{} -> True
     ShowUninstDetails{} -> True
     Caption{} -> True
+    Unicode{} -> True
+    UnsafeInjectGlobal{} -> True
     _ -> False
 
 isSection :: NSIS -> Bool
@@ -111,6 +113,9 @@
 out fs (AddPluginDir a) = [unwords ["!addplugindir",show a]]
 out fs (FindWindow a b c d e) = [unwords $ "FindWindow" : show a : map show ([b,c] ++ maybeToList d ++ maybeToList e)]
 out fs (SendMessage a b c d e f) = [unwords $ "SendMessage" : show a : show b : show c : show d : show e : ["/TIMEOUT=" ++ show x | Just x <- [f]]]
+out fs (Unicode x) = ["Unicode " ++ if x then "true" else "false"]
+out fs (UnsafeInject x) = [x]
+out fs (UnsafeInjectGlobal x) = [x]
 
 out fs x = [show x]
 
diff --git a/Development/NSIS/Sugar.hs b/Development/NSIS/Sugar.hs
--- a/Development/NSIS/Sugar.hs
+++ b/Development/NSIS/Sugar.hs
@@ -933,6 +933,9 @@
 showUninstDetails :: Visibility -> Action ()
 showUninstDetails = emit . ShowUninstDetails
 
+-- | Note: Requires NSIS 3.0
+unicode :: Bool -> Action ()
+unicode = emit . Unicode
 
 -- | The type of a file handle, created by 'fileOpen'.
 data FileHandle deriving Typeable
@@ -1083,7 +1086,7 @@
 -- > createDirectory "$SMPROGRAMS/My Company"
 -- > createShortcut "$SMPROGRAMS/My Company/My Program.lnk"
 -- >    [Target "$INSTDIR/My Program.exe"
--- >    ,Parameter "some command line parameters"
+-- >    ,Parameters "some command line parameters"
 -- >    ,IconFile "$INSTDIR/My Program.exe", IconIndex 2
 -- >    ,StartOptions "SW_SHOWNORMAL"
 -- >    ,KeyboardShortcut "ALT|CONTROL|SHIFT|F5"
@@ -1151,3 +1154,11 @@
 
 abort :: Exp String -> Action ()
 abort = emit1 Abort
+
+-- | Inject arbitrary text into a non-global section of the script.
+unsafeInject :: String -> Action ()
+unsafeInject = emit . UnsafeInject
+
+-- | Inject arbitrary text into the script's global header section.
+unsafeInjectGlobal :: String -> Action ()
+unsafeInjectGlobal = emit . UnsafeInjectGlobal
diff --git a/Development/NSIS/Type.hs b/Development/NSIS/Type.hs
--- a/Development/NSIS/Type.hs
+++ b/Development/NSIS/Type.hs
@@ -121,6 +121,7 @@
     | Caption Val
     | ShowInstDetails Visibility
     | ShowUninstDetails Visibility
+    | Unicode Bool
     | SetDetailsPrint DetailsPrint
     | DetailPrint Val
     | Plugin String String [Val]
@@ -129,6 +130,10 @@
     | GetDlgItem Var Val Val
     | SendMessage Val Val Val Val Var (Maybe Int)
     | Abort Val
+
+      -- Escape hatch
+    | UnsafeInject String
+    | UnsafeInjectGlobal String
       deriving (Data,Typeable,Show)
 
 -- | Value to use with 'setDetailsPrint'.
diff --git a/Examples/Example2.hs b/Examples/Example2.hs
--- a/Examples/Example2.hs
+++ b/Examples/Example2.hs
@@ -23,7 +23,7 @@
     outFile "example$Ex.exe"
 
     -- The default installation directory
-    installDir "$PROGRAMFILES/Example2"
+    installDir "$PROGRAMFILES64/Example2"
 
     -- Registry key to check for directory (so if you install again, it will 
     -- overwrite the old one automatically)
@@ -32,6 +32,9 @@
     -- Request application privileges for Windows Vista
     requestExecutionLevel Admin
 
+    -- Inject a literal setting that's not currently supported by the DSL
+    unsafeInjectGlobal "# ignore me (could be an injected literal)"
+
     ----------------------------------
 
     -- Pages
@@ -53,6 +56,9 @@
 
         -- Put file there
         file [] "Examples/Example$Ex.hs"
+
+        -- Inject a non-global literal setting
+        unsafeInject "# ignore me (could be an injected literal)"
 
         -- Write the installation path into the registry
         writeRegStr HKLM "SOFTWARE/NSIS_Example2" "Install_Dir" "$INSTDIR"
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright Neil Mitchell 2012-2015.
+Copyright Neil Mitchell 2012-2017.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/nsis.cabal b/nsis.cabal
--- a/nsis.cabal
+++ b/nsis.cabal
@@ -1,15 +1,15 @@
-cabal-version:      >= 1.10
+cabal-version:      >= 1.18
 build-type:         Simple
 name:               nsis
-version:            0.3
+version:            0.3.1
 license:            BSD3
 license-file:       LICENSE
 category:           Development
 author:             Neil Mitchell <ndmitchell@gmail.com>
 maintainer:         Neil Mitchell <ndmitchell@gmail.com>
-copyright:          Neil Mitchell 2012-2015
+copyright:          Neil Mitchell 2012-2017
 synopsis:           DSL for producing Windows Installer using NSIS.
-tested-with:        GHC==7.10.1, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2, GHC==7.2.2
+tested-with:        GHC==8.0.2, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
 description:
     NSIS (Nullsoft Scriptable Install System, <http://nsis.sourceforge.net/>) is a tool that allows programmers
     to create installers for Windows.
@@ -19,7 +19,7 @@
 homepage:           https://github.com/ndmitchell/nsis#readme
 bug-reports:        https://github.com/ndmitchell/nsis/issues
 
-extra-source-files:
+extra-doc-files:
     CHANGES.txt
     README.md
 
