diff --git a/jsaddle.cabal b/jsaddle.cabal
--- a/jsaddle.cabal
+++ b/jsaddle.cabal
@@ -1,5 +1,5 @@
 name: jsaddle
-version: 0.3.0.1
+version: 0.3.0.2
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -32,12 +32,12 @@
             build-depends:
                 gtk3 >=0.14.2 && <0.15,
                 webkitgtk3 >=0.13.0.0 && <0.15,
-                webkitgtk3-javascriptcore >=0.13.0.0 && <0.14
+                webkitgtk3-javascriptcore >=0.13.1.2 && <0.14
         else
             build-depends:
                 gtk >=0.14.2 && <0.15,
                 webkit >=0.13.0.0 && <0.15,
-                webkit-javascriptcore >=0.13.0.0 && <0.14
+                webkit-javascriptcore >=0.13.1.2 && <0.14
         build-depends:
             glib -any
     exposed-modules:
diff --git a/src/Language/Javascript/JSaddle/Evaluate.hs b/src/Language/Javascript/JSaddle/Evaluate.hs
--- a/src/Language/Javascript/JSaddle/Evaluate.hs
+++ b/src/Language/Javascript/JSaddle/Evaluate.hs
@@ -47,12 +47,14 @@
 -- >>> import Language.Javascript.JSaddle.Object (global, array, (!))
 -- >>> import Language.Javascript.JSaddle.Monad (catch)
 -- >>> import Language.Javascript.JSaddle.Exception (JSException(..))
+-- >>> testJSaddle $ return ()
+-- ...
 
 -- | Evaluates a script (like eval in java script).  Unlike 'eval' this function lets you
 --   specify a source URL and starting line number for beter error information.
 --
 -- >>> testJSaddle $ (evaluateScript "\n\n{" global "FileName" 53 >>= valToText) `catch` \(JSException e) -> array (e,e!"sourceURL", e!"line") >>= valToText
--- SyntaxError: Expected token '}',FileName,55
+-- SyntaxError: ...,FileName,55
 evaluateScript :: (ToJSString script, MakeObject this, ToJSString url)
                => script         -- ^ JavaScript to evaluate
                -> this
diff --git a/src/Language/Javascript/JSaddle/Native.hs b/src/Language/Javascript/JSaddle/Native.hs
--- a/src/Language/Javascript/JSaddle/Native.hs
+++ b/src/Language/Javascript/JSaddle/Native.hs
@@ -30,8 +30,8 @@
        (JSObjectRef, OpaqueJSString, JSStringRef, OpaqueJSContext,
         OpaqueJSValue, JSValueRef)
 import Foreign.ForeignPtr
-       (touchForeignPtr, FinalizerPtr, newForeignPtr, FinalizerEnvPtr,
-        newForeignPtrEnv, ForeignPtr)
+       (newForeignPtr_, touchForeignPtr, FinalizerPtr, newForeignPtr,
+        FinalizerEnvPtr, newForeignPtrEnv, ForeignPtr)
 import Control.Monad.IO.Class (MonadIO, MonadIO(..))
 import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
        (jsvalueprotect)
@@ -41,6 +41,7 @@
        (JSM, JSString, Object(..), JSVal)
 import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
 import Language.Javascript.JSaddle.Classes (ToJSVal(..), ToJSVal)
+import Foreign.Ptr (nullPtr)
 
 makeNewJSVal :: JSValueRef -> JSM (ForeignPtr OpaqueJSValue)
 makeNewJSVal val = do
@@ -53,12 +54,16 @@
   jsValueUnprotect :: FinalizerEnvPtr OpaqueJSContext OpaqueJSValue
 
 makeNewJSString :: MonadIO m => JSStringRef -> m (ForeignPtr OpaqueJSString)
+makeNewJSString s | s == nullPtr =
+    liftIO $ newForeignPtr_ s
 makeNewJSString s =
     liftIO $ do
         s' <- jsstringretain s
         newForeignPtr jsStringRelease s'
 
 wrapJSString :: MonadIO m => JSStringRef -> m (ForeignPtr OpaqueJSString)
+wrapJSString s | s == nullPtr =
+    liftIO $ newForeignPtr_ s
 wrapJSString s = liftIO $ newForeignPtr jsStringRelease s
 
 foreign import ccall unsafe "&JSStringRelease"
diff --git a/src/Language/Javascript/JSaddle/Object.hs b/src/Language/Javascript/JSaddle/Object.hs
--- a/src/Language/Javascript/JSaddle/Object.hs
+++ b/src/Language/Javascript/JSaddle/Object.hs
@@ -112,8 +112,8 @@
         jspropertynamearraygetcount, jsobjectcopypropertynames,
         jsobjectcallasconstructor, jsobjectmakearray,
         jsobjectcallasfunction,
-        JSObjectCallAsFunctionCallback,
-        jsobjectmakefunctionwithcallback, JSObjectCallAsFunctionCallback')
+        JSObjectCallAsFunctionCallback, mkJSObjectCallAsFunctionCallback,
+        jsobjectmakefunctionwithcallback)
 import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
        (jsvaluemakeundefined)
 import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSContextRef
@@ -121,8 +121,8 @@
 import Foreign (peekArray, nullPtr, withArrayLen)
 import Foreign.Ptr (freeHaskellFunPtr)
 import Language.Javascript.JSaddle.Native
-       (makeNewJSVal, wrapJSString, withJSVals, withObject, withJSString,
-        withToJSVal)
+       (makeNewJSString, makeNewJSVal, wrapJSString, withJSVals,
+        withObject, withJSString, withToJSVal)
 import System.IO.Unsafe (unsafePerformIO)
 import Foreign.ForeignPtr (newForeignPtr_)
 #endif
@@ -147,8 +147,9 @@
 -- $setup
 -- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
 -- >>> import Language.Javascript.JSaddle.Evaluate (eval)
--- >>> import Language.Javascript.JSaddle.Value (val)
+-- >>> import Language.Javascript.JSaddle.Value (val, valToText, JSNull(..))
 -- >>> import Control.Lens.Operators ((^.))
+-- >>> import qualified Data.Text as T (unpack)
 
 -- | Object can be made by evaluating a fnction in 'JSM' as long
 --   as it returns something we can make into a Object.
@@ -159,6 +160,7 @@
 -- | Lookup a property based on its name.
 --
 -- >>> testJSaddle $ eval "'Hello World'.length"
+-- 11
 -- >>> testJSaddle $ val "Hello World" ! "length"
 -- 11
 (!) :: (MakeObject this, ToJSString name)
@@ -175,6 +177,7 @@
 -- | Lookup a property based on its index.
 --
 -- >>> testJSaddle $ eval "'Hello World'[6]"
+-- W
 -- >>> testJSaddle $ val "Hello World" !! 6
 -- W
 (!!) :: (MakeObject this)
@@ -191,6 +194,7 @@
 -- > js name = to (!name)
 --
 -- >>> testJSaddle $ eval "'Hello World'.length"
+-- 11
 -- >>> testJSaddle $ val "Hello World" ^. js "length"
 -- 11
 js :: (MakeObject s, ToJSString name)
@@ -204,6 +208,7 @@
 -- > jss name = to (<#name)
 --
 -- >>> testJSaddle $ eval "'Hello World'.length"
+-- 11
 -- >>> testJSaddle $ val "Hello World" ^. js "length"
 -- 11
 jss :: (ToJSString name, ToJSVal val)
@@ -275,8 +280,13 @@
 -- | Handy way to get and hold onto a reference top level javascript
 --
 -- >>> testJSaddle $ eval "w = console; w.log('Hello World')"
--- >>> testJSaddle $ do w <- jsg "console"; w ^. js "log" # ["Hello World"]
--- 11
+-- ** Message: console message:  @1: Hello World
+-- <BLANKLINE>
+-- undefined
+-- >>> testJSaddle $ do w <- jsg "console"; w ^. js1 "log" "Hello World"
+-- ** Message: console message:...@0: Hello World
+-- <BLANKLINE>
+-- undefined
 jsg :: ToJSString a => a -> JSM JSVal
 jsg name = global ! name
 {-# INLINE jsg #-}
@@ -285,9 +295,10 @@
 --
 -- > jsgf name = jsg name . to (# args)
 --
--- >>> testJSaddle $ eval "globalFunc = function(x) {x.length}"
+-- >>> testJSaddle $ eval "globalFunc = function (x) {return x.length;}"
+-- function (x) {return x.length;}
 -- >>> testJSaddle $ jsgf "globalFunc" ["World"]
--- 6
+-- 5
 jsgf :: (ToJSString name, MakeArgs args) => name -> args -> JSM JSVal
 jsgf name = global # name
 {-# INLINE jsgf #-}
@@ -297,7 +308,7 @@
 -- > jsg0 name = jsgf name ()
 --
 -- >>> testJSaddle $ jsg0 "globalFunc"
--- hello world
+-- TypeError:...undefined...is not an objec...
 jsg0 :: (ToJSString name) => name -> JSM JSVal
 jsg0 name = jsgf name ()
 {-# INLINE jsg0 #-}
@@ -307,7 +318,7 @@
 -- > jsg1 name a0 = jsgf name [a0]
 --
 -- >>> testJSaddle $ jsg1 "globalFunc" "World"
--- 6
+-- 5
 jsg1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSM JSVal
 jsg1 name a0 = jsgf name [a0]
 {-# INLINE jsg1 #-}
@@ -340,6 +351,7 @@
 -- | Call a JavaScript function
 --
 -- >>> testJSaddle $ eval "'Hello World'.indexOf('World')"
+-- 6
 -- >>> testJSaddle $ val "Hello World" # "indexOf" $ ["World"]
 -- 6
 infixr 2 #
@@ -354,8 +366,10 @@
 
 -- | Call a JavaScript function
 --
--- >>> testJSaddle $ eval "something[6]('World')"
--- >>> testJSaddle $ val something ## 6 ["World"]
+-- >>> testJSaddle $ eval "something = {}; something[6]=function (x) {return x.length;}; something[6]('World')"
+-- 5
+-- >>> testJSaddle $ jsg "something" ## 6 $ ["World"]
+-- 5
 infixr 2 ##
 (##) :: (MakeObject this, MakeArgs args)
     => this -> Index -> args -> JSM JSVal
@@ -369,8 +383,9 @@
 -- | Set a JavaScript property
 --
 -- >>> testJSaddle $ eval "var j = {}; j.x = 1; j.x"
--- >>> testJSaddle $ do {j <- eval "({})"; j <# "x" 1; j!"x"}
 -- 1
+-- >>> testJSaddle $ do {j <- obj; (j <# "x") 1; j!"x"}
+-- 1
 infixr 1 <#
 (<#) :: (MakeObject this, ToJSString name, ToJSVal val)
      => this           -- ^ Object to set the property on
@@ -385,8 +400,9 @@
 -- | Set a JavaScript property
 --
 -- >>> testJSaddle $ eval "var j = {}; j[6] = 1; j[6]"
--- >>> testJSaddle $ do {j <- eval "({})"; j <## 6 1; j!!6}
 -- 1
+-- >>> testJSaddle $ do {j <- obj; (j <## 6) 1; j!!6}
+-- 1
 infixr 1 <##
 (<##) :: (MakeObject this, ToJSVal val)
      => this           -- ^ Object to set the property on
@@ -404,7 +420,7 @@
 -- JavaScript type (like Date) then this function will fail.
 --
 -- >>> testJSaddle $ new (jsg "Date") (2013, 1, 1)
--- Fri Feb 01 2013 00:00:00 GMT+1300 (NZDT)
+-- Fri Feb 01 2013 00:00:00 GMT+... (...)
 new :: (MakeObject constructor, MakeArgs args)
     => constructor
     -> args
@@ -417,6 +433,7 @@
 -- | Call function with a given @this@.  In most cases you should use '#'.
 --
 -- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
+-- Hello
 -- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
 -- Hello
 call :: (MakeObject f, MakeObject this, MakeArgs args)
@@ -430,8 +447,9 @@
 -- | Make an empty object using the default constuctor
 --
 -- >>> testJSaddle $ eval "var a = {}; a.x = 'Hello'; a.x"
--- >>> testJSaddle $ do { a <- obj; a ^. js "x" <# "Hello"; a ^. js "x" }
 -- Hello
+-- >>> testJSaddle $ do { a <- obj; (a <# "x") "Hello"; a ^. js "x" }
+-- Hello
 obj :: JSM Object
 #ifdef ghcjs_HOST_OS
 obj = liftIO Object.create
@@ -456,6 +474,9 @@
 --   a to a JavaScipt one.
 --
 -- >>> testJSaddle $ eval "(function(f) {f('Hello');})(function (a) {console.log(a)})"
+-- ** Message: console message:  @1: Hello
+-- <BLANKLINE>
+-- undefined
 -- >>> testJSaddle $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ args -> valToText (head args) >>= (liftIO . putStrLn . T.unpack) ]
 -- Hello
 -- undefined
@@ -463,11 +484,6 @@
 fun = id
 {-# INLINE fun #-}
 
-#if !defined(ghcjs_HOST_OS)
-foreign import ccall "wrapper"
-  mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
-#endif
-
 #ifdef ghcjs_HOST_OS
 type HaskellCallback = Callback (JSVal -> JSVal -> IO ())
 #else
@@ -557,9 +573,11 @@
 -- | Make an JavaScript array from a list of values
 --
 -- >>> testJSaddle $ eval "['Hello', 'World'][1]"
+-- World
 -- >>> testJSaddle $ array ["Hello", "World"] !! 1
 -- World
 -- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
+-- Hello,,,true,1
 -- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
 -- Hello,,,true,1
 array :: MakeArgs args => args -> JSM Object
@@ -634,7 +652,7 @@
 
 -- | Get a name out of a property name array
 propertyNamesAt :: MonadIO m => JSPropertyNameArray -> CSize -> m JSString
-propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index >>= wrapJSString
+propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index >>= makeNewJSString
 {-# INLINE propertyNamesAt #-}
 
 -- | Convert property array to a list
diff --git a/src/Language/Javascript/JSaddle/Test.hs b/src/Language/Javascript/JSaddle/Test.hs
--- a/src/Language/Javascript/JSaddle/Test.hs
+++ b/src/Language/Javascript/JSaddle/Test.hs
@@ -62,7 +62,7 @@
 showJSaddle = testJSaddle' True
 
 debugLog :: String -> IO ()
-debugLog = putStrLn
+debugLog _ = return ()
 
 testJSaddle' :: ToJSVal val => Bool -> JSM val -> IO ()
 testJSaddle' showWindow f = do
diff --git a/src/Language/Javascript/JSaddle/Value.hs b/src/Language/Javascript/JSaddle/Value.hs
--- a/src/Language/Javascript/JSaddle/Value.hs
+++ b/src/Language/Javascript/JSaddle/Value.hs
@@ -111,6 +111,8 @@
 -- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
 -- >>> import Language.Javascript.JSaddle.Monad (catch)
 -- >>> import Language.Javascript.JSaddle.Exception (JSException(..))
+-- >>> import Language.Javascript.JSaddle.Object (obj)
+-- >>> import qualified Data.Text as T (pack)
 
 data JSNull      = JSNull -- ^ Type that represents a value that can only be null.
                           --   Haskell of course has no null so we are adding this type.
@@ -218,7 +220,7 @@
 -- >>> testJSaddle $ valToStr (0.0 :: Double) >>= strToText
 -- 0
 -- >>> testJSaddle $ valToStr "" >>= strToText
---
+-- <BLANKLINE>
 -- >>> testJSaddle $ valToStr "1" >>= strToText
 -- 1
 valToStr :: ToJSVal value => value -> JSM JSString
@@ -263,7 +265,7 @@
 -- >>> testJSaddle $ valToJSON 0 JSNull >>= strToText
 -- null
 -- >>> testJSaddle $ valToJSON 0 () >>= strToText
---
+-- <BLANKLINE>
 -- >>> testJSaddle $ valToJSON 0 True >>= strToText
 -- true
 -- >>> testJSaddle $ valToJSON 0 False >>= strToText
@@ -295,9 +297,9 @@
 --   May throw JSException.
 --
 -- >>> testJSaddle $ (valToObject JSNull >>= valToText) `catch` \ (JSException e) -> valToText e
--- TypeError: 'null' is not an object
+-- TypeError:...null...is not an object
 -- >>> testJSaddle $ (valToObject () >>= valToText) `catch` \ (JSException e) -> valToText e
--- TypeError: 'undefined' is not an object
+-- TypeError:...undefined...is not an object
 -- >>> testJSaddle $ valToObject True
 -- true
 -- >>> testJSaddle $ valToObject False
@@ -307,7 +309,7 @@
 -- >>> testJSaddle $ valToObject (0.0 :: Double)
 -- 0
 -- >>> testJSaddle $ valToObject ""
---
+-- <BLANKLINE>
 -- >>> testJSaddle $ valToObject "1"
 -- 1
 valToObject :: ToJSVal value => value -> JSM Object
@@ -578,23 +580,23 @@
 -- | Derefernce a value reference.
 --
 -- >>> testJSaddle $ showJSValue <$> deRefVal JSNull
--- ValNull
+-- null
 -- >>> testJSaddle $ showJSValue <$> deRefVal ()
--- ValUndefined
+-- undefined
 -- >>> testJSaddle $ showJSValue <$> deRefVal True
--- ValBool True
+-- true
 -- >>> testJSaddle $ showJSValue <$> deRefVal False
--- ValBool False
+-- false
 -- >>> testJSaddle $ showJSValue <$> deRefVal (1.0 :: Double)
--- ValNumber 1.0
+-- 1.0
 -- >>> testJSaddle $ showJSValue <$> deRefVal (0.0 :: Double)
--- ValNumber 0.0
+-- 0.0
 -- >>> testJSaddle $ showJSValue <$> deRefVal ""
--- ValString ""
+-- ""
 -- >>> testJSaddle $ showJSValue <$> deRefVal "1"
--- ValString "1"
--- >>> testJSaddle $ showJSValue <$> valToObject True >>= deRefVal
--- ValObject 0x...
+-- "1"
+-- >>> testJSaddle $ showJSValue <$> (valToObject True >>= deRefVal)
+-- object
 deRefVal :: ToJSVal value => value -> JSM JSValue
 #ifdef ghcjs_HOST_OS
 deRefVal value = do
@@ -629,15 +631,15 @@
 -- | Make a JavaScript value out of a 'JSValue' ADT.
 --
 -- >>> testJSaddle $ valMakeRef ValNull
--- "null"
+-- null
 -- >>> testJSaddle $ valMakeRef ValUndefined
--- "undefined"
+-- undefined
 -- >>> testJSaddle $ valMakeRef (ValBool True)
--- "true"
+-- true
 -- >>> testJSaddle $ valMakeRef (ValNumber 1)
--- "1"
--- >>> testJSaddle $ valMakeRef (ValString $ pack "Hello")
--- "Hello"
+-- 1
+-- >>> testJSaddle $ valMakeRef (ValString $ T.pack "Hello")
+-- Hello
 valMakeRef :: JSValue -> JSM JSVal
 valMakeRef value =
     case value of
diff --git a/tests/DocTest.hs b/tests/DocTest.hs
--- a/tests/DocTest.hs
+++ b/tests/DocTest.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 module Main (
     main
 ) where
@@ -5,7 +6,27 @@
 import Test.DocTest
 
 main :: IO ()
-main = doctest ["-isrc",
+main = doctest [
+    "-idist/build/autgen",
+    "-optP-include",
+    "-optPdist/build/autogen/cabal_macros.h",
+    "-hide-all-packages",
+#ifdef VERSION_gtk3
+    "-package=gtk3-" ++ VERSION_gtk3,
+    "-package=webkitgtk3-" ++ VERSION_webkitgtk3,
+    "-package=webkitgtk3-javascriptcore-" ++ VERSION_webkitgtk3_javascriptcore,
+#else
+    "-package=gtk-" ++ VERSION_gtk,
+    "-package=webkit-" ++ VERSION_webkit,
+    "-package=webkit-javascriptcore-" ++ VERSION_webkit_javascriptcore,
+#endif
+    "-package=glib-" ++ VERSION_glib,
+    "-package=template-haskell-" ++ VERSION_template_haskell,
+    "-package=base-" ++ VERSION_base,
+    "-package=lens-" ++ VERSION_lens,
+    "-package=text-" ++ VERSION_text,
+    "-package=transformers-" ++ VERSION_transformers,
+    "-isrc",
     "src/Language/Javascript/JSaddle/Arguments.hs",
     "src/Language/Javascript/JSaddle/Classes.hs",
     "src/Language/Javascript/JSaddle/Evaluate.hs",
