diff --git a/src/Network/AWS/Wolf/Act.hs b/src/Network/AWS/Wolf/Act.hs
--- a/src/Network/AWS/Wolf/Act.hs
+++ b/src/Network/AWS/Wolf/Act.hs
@@ -95,12 +95,15 @@
               sd  <- storeDirectory wd
               isd <- inputDirectory sd
               osd <- outputDirectory sd
+              msd <- metaDirectory sd
               writeJson (dd </> "control.json") (Control uid')
               writeText (dd </> "input.json") input
+              writeText (msd </> (textToString queue <> "_input.json")) input
               download isd includes
               e <- run command
               upload osd
               output <- readText (dd </> "output.json")
+              writeText (msd </> (textToString queue <> "_output.json")) output
               maybe (completeActivity token' output) (const $ failActivity token') e
               t3 <- liftIO getCurrentTime
               traceInfo "finish" [ "dir" .= wd ]
diff --git a/src/Network/AWS/Wolf/File.hs b/src/Network/AWS/Wolf/File.hs
--- a/src/Network/AWS/Wolf/File.hs
+++ b/src/Network/AWS/Wolf/File.hs
@@ -8,6 +8,7 @@
   , storeDirectory
   , inputDirectory
   , outputDirectory
+  , metaDirectory
   , writeText
   , readText
   , writeJson
@@ -53,6 +54,15 @@
 outputDirectory :: MonadIO m => FilePath -> m FilePath
 outputDirectory dir = do
   let dir' = dir </> "output"
+  liftIO $ createDirectoryIfMissing True dir'
+  pure dir'
+
+-- | Determine path to store input/output json files and create it.
+--
+metaDirectory :: MonadIO m => FilePath -> m FilePath
+metaDirectory dir = do
+  osd <- outputDirectory dir
+  let dir' = osd </> "meta"
   liftIO $ createDirectoryIfMissing True dir'
   pure dir'
 
diff --git a/wolf.cabal b/wolf.cabal
--- a/wolf.cabal
+++ b/wolf.cabal
@@ -1,6 +1,6 @@
 cabal-version: >=1.22
 name: wolf
-version: 0.3.44
+version: 0.3.45
 license: MIT
 license-file: LICENSE
 copyright: Copyright (C) 2015-2016 Swift Navigation, Inc.
