diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -17,6 +17,12 @@
 webpack
 ```
 
+or you can bundle with `pulp`:
+
+```
+pulp browserify --skip-compile -o dce-output -t app.js
+```
+
 You can also specify modules as entry points, which is the same as specifying
 all exported identifiers.
 
diff --git a/app/Command/DCE.hs b/app/Command/DCE.hs
--- a/app/Command/DCE.hs
+++ b/app/Command/DCE.hs
@@ -113,6 +113,14 @@
       <> " The default target is 'js', but if this option is used only the targets specified will be used."
       )
 
+dceNoEvalOpt :: Opts.Parser Bool
+dceNoEvalOpt = Opts.flag True False $
+     Opts.short 'e'
+  <> Opts.long "no-eval"
+  <> Opts.showDefault
+  <> Opts.internal
+  <> Opts.help "do not evaluate"
+
 targets :: M.Map String P.CodegenTarget
 targets = M.fromList
   [ ("js", P.JS)
@@ -164,6 +172,7 @@
   <*> pureScriptOptions
   <*> (not <$> noPrefix)
   <*> jsonErrors
+  <*> dceNoEvalOpt
 
 readInput :: [FilePath] -> IO [Either (FilePath, JSONPath, String) (Version, CoreFn.Module CoreFn.Ann)]
 readInput inputFiles = forM inputFiles (\f -> addPath f . decodeCoreFn <$> BSL.readFile f)
@@ -289,7 +298,9 @@
     -- run `dceEval` and `dce` on the `CoreFn`
     (mods, warns) <- mapExceptT (fmap $ first CompilationError)
         $ runWriterT
-        $ dceEval (snd `map` rights inpts) >>= return . flip dce entryPoints
+        $ if dceNoEval
+            then return $ dce (snd `map` rights inpts) entryPoints
+            else dceEval (snd `map` rights inpts) >>= return . flip dce entryPoints
     relPath <- liftIO getCurrentDirectory
     liftIO $ traverse_ (hPutStrLn stderr . uncurry (displayDCEWarning relPath)) (zip (zip [1..] (repeat (length warns))) warns)
     let filePathMap = M.fromList $ map (\m -> (CoreFn.moduleName m, Right $ CoreFn.modulePath m)) mods
@@ -299,6 +310,15 @@
         liftIO
         $ P.runMake dcePureScriptOptions
         $ runSupplyT 0 $ traverse (\m -> P.codegen makeActions m P.initEnvironment mempty) mods
+
+    -- copy externs files
+    -- we do not have access to data to regenerate extern files (they relay on
+    -- more information than is present in `CoreFn.Module`).
+    _ <- for mods $ \m -> lift $ do
+      let mn = P.runModuleName $ CoreFn.moduleName m
+      exts <- BSL.readFile (dceInputDir </> T.unpack mn </> "externs.json")
+      BSL.writeFile (dceOutputDir </> T.unpack mn </> "externs.json") exts
+
     when dceForeign $
       forM_ mods $ \(CoreFn.Module{moduleName,moduleForeign}) -> liftIO $
         case moduleName `M.lookup` foreigns of
diff --git a/app/Command/DCEOptions.hs b/app/Command/DCEOptions.hs
--- a/app/Command/DCEOptions.hs
+++ b/app/Command/DCEOptions.hs
@@ -14,4 +14,5 @@
   , dcePureScriptOptions :: P.Options
   , dceUsePrefix         :: Bool
   , dceJsonErrors        :: Bool
+  , dceNoEval            :: Bool
   }
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -16,6 +16,7 @@
 import           Data.Maybe (fromJust, fromMaybe, isJust, maybe)
 import           Data.Text (Text)
 import qualified Data.Text as T
+import           Data.Semigroup ((<>))
 import           System.Directory
                   ( createDirectoryIfMissing
                   , doesDirectoryExist
@@ -148,6 +149,15 @@
   , LibTest ["Eval.evalUnderObjectLiteral"] Nothing "require('./dce-output/Eval').evalUnderObjectLiteral;" True
   , LibTest ["Eval.evalVars"] Nothing "require('./dce-output/Eval').evalVars;" True
   , LibTest ["Eval"] Nothing "require('./dce-output/Eval').evalVars;" True
+  , LibTest ["Eval.recordUpdate"] Nothing
+       ( " var eval = require('./dce-output/Eval');\n"
+      <> " var foo = eval.recordUpdate({foo: '', bar: 0})(eval.Foo.create('foo')).foo;\n"
+      <> " if (foo != 'foo') {\n"
+      <> "    console.error(foo)\n"
+      <> "    throw('Error: ' + foo)\n"
+      <> " }\n"
+      )
+      True
   ]
 
 data KarmaTest = KarmaTest
@@ -411,6 +421,6 @@
   TestDCECoreFn.main
   TestDCEEval.main
 
-  hspec $ changeDir "test/tests" libSpec
+  hspec $ changeDir "test/lib-tests" libSpec
   -- hspec $ changeDir ".temp" coreLibSpec
   -- hspec karmaSpec
diff --git a/zephyr.cabal b/zephyr.cabal
--- a/zephyr.cabal
+++ b/zephyr.cabal
@@ -1,5 +1,5 @@
 name:                zephyr
-version:             0.2.0
+version:             0.2.1
 synopsis:           
   Zephyr tree shaking for PureScript Language
 description:
