diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,10 @@
+20210131 haskell-debug-adapter-0.0.34.0
+  * [FIX] issue#11 Test fails to run
+  * [FIX] issue#12 Debugger Freezing/Debug Actions Not Working in Visual Studio
+  * [FIX] issue#16 stack.exe and ghci-dap.exe Leak When IDE Not Stopped Properly
+  * [FIX][hdx4vim] issue#4 Vimspector official support
+
+
 20200209 haskell-debug-adapter-0.0.33.0
   * [INFO] support ghci-dap-0.0.14.0.
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -42,7 +42,7 @@
 # Limitation
 Currently this project is an __experimental__ design and implementation.
 
-* Developed and tested on windows10 ghc-8.6
+* Developed and tested on windows10 ghc-8.10.3
 * The source file extension must be ".hs"
 * Can not use STDIN handle while debugging. 
 
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -3,7 +3,6 @@
 import System.Exit
 import System.IO
 import Control.Exception.Safe
-import Data.Default
 import Options.Applicative
 import Paths_haskell_debug_adapter (version)
 import Data.Version (showVersion)
@@ -32,28 +31,22 @@
 getArgs :: IO ArgData
 getArgs = execParser parseInfo
 
+
 -- |
 --
 parseInfo :: ParserInfo ArgData
-parseInfo = info options $ mconcat
+parseInfo = info (helper <*> verOpt <*> options) $ mconcat
   [ fullDesc
   , header ""
   , footer ""
   , progDesc "Please see README.md"
   ]
 
--- |
---
-options :: Parser ArgData
-options = (<*>) helper
-  $ def
-  <$> verOption
-  <*> hackageOption
 
 -- |
 --
-verOption :: Parser (a -> a)
-verOption = infoOption msg $ mconcat
+verOpt :: Parser (a -> a)
+verOpt = infoOption msg $ mconcat
   [ short 'v'
   , long  "version"
   , help  "Show version"
@@ -61,11 +54,29 @@
   where
     msg = "haskell-debug-adapter-" ++ showVersion version
 
+
 -- |
 --
+options  :: Parser ArgData
+options  = ArgData
+  <$> hackageOption
+  <*> stdioLogFileOption
+
+
+-- |
+--
 hackageOption :: Parser (Maybe String)
 hackageOption = optional $ strOption $ mconcat
   [ long "hackage-version"
   , help "hackage version"
+  ]
+
+
+-- |
+--
+stdioLogFileOption :: Parser (Maybe FilePath)
+stdioLogFileOption = optional $ strOption $ mconcat
+  [ long "stdio-log-file"
+  , help "stdio log file"
   ]
 
diff --git a/haskell-debug-adapter.cabal b/haskell-debug-adapter.cabal
--- a/haskell-debug-adapter.cabal
+++ b/haskell-debug-adapter.cabal
@@ -1,13 +1,13 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.31.2.
+-- This file has been generated from package.yaml by hpack version 0.33.0.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: da77e0a33d754f6f5d7c7f1c43908127b950c2399a352febb7a7d8203d324a5d
+-- hash: 759e4fd20245e808dfc294c1f45d3a9d75b6d46b0332c670ccbed8462ac86894
 
 name:           haskell-debug-adapter
-version:        0.0.33.0
+version:        0.0.34.0
 synopsis:       Haskell Debug Adapter.
 description:    Please see README.md
 category:       Development
@@ -15,7 +15,7 @@
 bug-reports:    https://github.com/phoityne/haskell-debug-adapter/issues
 author:         phoityne_hs
 maintainer:     phoityne.hs@gmail.com
-copyright:      2016-2020 phoityne_hs
+copyright:      2016-2021 phoityne_hs
 license:        BSD3
 license-file:   LICENSE
 build-type:     Simple
@@ -52,7 +52,6 @@
       Haskell.Debug.Adapter.State.Shutdown
       Haskell.Debug.Adapter.State.Utility
       Haskell.Debug.Adapter.TH.Utility
-      Haskell.Debug.Adapter.Thread
       Haskell.Debug.Adapter.Type
       Haskell.Debug.Adapter.Utility
       Haskell.Debug.Adapter.Watch
@@ -75,8 +74,8 @@
     , directory
     , filepath
     , fsnotify
-    , ghci-dap >=0.0.14.0
-    , haskell-dap >=0.0.14.0
+    , ghci-dap >=0.0.15.0
+    , haskell-dap >=0.0.15.0
     , hslogger
     , lens
     , mtl
@@ -86,7 +85,7 @@
     , resourcet
     , safe-exceptions
     , text
-  if impl(ghc < 8.4.0)
+  if impl(ghc < 8.6.0)
     buildable: False
   default-language: Haskell2010
 
@@ -112,8 +111,8 @@
     , directory
     , filepath
     , fsnotify
-    , ghci-dap >=0.0.14.0
-    , haskell-dap >=0.0.14.0
+    , ghci-dap >=0.0.15.0
+    , haskell-dap >=0.0.15.0
     , haskell-debug-adapter
     , hslogger
     , lens
@@ -124,7 +123,7 @@
     , resourcet
     , safe-exceptions
     , text
-  if impl(ghc < 8.4.0)
+  if impl(ghc < 8.6.0)
     buildable: False
   default-language: Haskell2010
 
@@ -153,8 +152,8 @@
     , directory
     , filepath
     , fsnotify
-    , ghci-dap >=0.0.14.0
-    , haskell-dap >=0.0.14.0
+    , ghci-dap >=0.0.15.0
+    , haskell-dap >=0.0.15.0
     , haskell-debug-adapter
     , hslogger
     , hspec
@@ -166,6 +165,6 @@
     , resourcet
     , safe-exceptions
     , text
-  if impl(ghc < 8.4.0)
+  if impl(ghc < 8.6.0)
     buildable: False
   default-language: Haskell2010
diff --git a/src/Haskell/Debug/Adapter/Application.hs b/src/Haskell/Debug/Adapter/Application.hs
--- a/src/Haskell/Debug/Adapter/Application.hs
+++ b/src/Haskell/Debug/Adapter/Application.hs
@@ -2,8 +2,6 @@
 
 module Haskell.Debug.Adapter.Application where
 
-import Paths_haskell_debug_adapter (version)
-import Data.Version (showVersion)
 import Control.Monad.IO.Class
 import Data.Conduit
 import Control.Lens
@@ -12,11 +10,11 @@
 import Control.Monad.State.Lazy
 import Control.Monad.Except
 import qualified System.Log.Logger as L
-import qualified System.IO as S
 
 import Haskell.Debug.Adapter.Type
 import Haskell.Debug.Adapter.Utility
 import Haskell.Debug.Adapter.Constant
+import Haskell.Debug.Adapter.State.Utility
 import Haskell.Debug.Adapter.State.Init()
 import Haskell.Debug.Adapter.State.GHCiRun()
 import Haskell.Debug.Adapter.State.DebugRun()
@@ -26,49 +24,6 @@
 
 -- |
 --
-defaultAppStores :: S.Handle -> S.Handle -> IO AppStores
-defaultAppStores inHdl outHdl = do
-  reqStore <- newMVar []
-  resStore <- newMVar []
-  evtStore <- newMVar []
-  wsStore  <- newMVar ""
-  logPRStore <- newMVar L.WARNING
-  procStore <- newEmptyMVar
-  verStore <- newEmptyMVar
-  return AppStores {
-    -- Read Only
-      _appNameAppStores     = "haskell-debug-adapter"
-    , _appVerAppStores      = showVersion version
-    , _inHandleAppStores    = inHdl
-    , _outHandleAppStores   = outHdl
-    , _asyncsAppStores      = []
-
-    -- Read/Write from Application
-    , _appStateWAppStores   = WrapAppState InitState
-    , _resSeqAppStores      = 0
-    , _startupAppStores     = ""
-    , _startupFuncAppStores = ""
-    , _startupArgsAppStores = ""
-    , _stopOnEntryAppStores = False
-    , _ghciPmptAppStores    = _GHCI_PROMPT_HDA
-    , _mainArgsAppStores    = ""
-    , _launchReqSeqAppStores = -1
-    , _debugReRunableAppStores = False
-
-
-    -- Read/Write ASync
-    , _reqStoreAppStores    = reqStore
-    , _resStoreAppStores    = resStore
-    , _eventStoreAppStores  = evtStore
-    , _workspaceAppStores   = wsStore
-    , _logPriorityAppStores = logPRStore
-    , _ghciProcAppStores    = procStore
-    , _ghciVerAppStores     = verStore
-    }
-
-
--- |
---
 run :: AppStores -> IO ()
 run appData = do
   L.debugM _LOG_APP "satrt application app"
@@ -144,8 +99,9 @@
       return ()
     Just (WrapRequest (DisconnectRequest req)) -> do
       liftIO $ L.debugM _LOG_APP $ show req
-      liftIO $ L.infoM _LOG_APP $ "disconnect. end of application thread."
+      liftIO $ L.infoM _LOG_APP $ "disconnect."
       lift $ sendDisconnectResponse req
+      sink
     Just (WrapRequest (PauseRequest req)) -> do
       liftIO $ L.debugM _LOG_APP $ show req
       lift $ sendConsoleEventLF $ "pause request is not supported."
diff --git a/src/Haskell/Debug/Adapter/Control.hs b/src/Haskell/Debug/Adapter/Control.hs
--- a/src/Haskell/Debug/Adapter/Control.hs
+++ b/src/Haskell/Debug/Adapter/Control.hs
@@ -10,13 +10,16 @@
 import qualified System.Log.Logger as L
 import qualified Control.Exception.Safe as E
 import Control.Concurrent.Async
+import Control.Concurrent.MVar
+import Data.Version (showVersion)
+import Paths_haskell_debug_adapter (version)
+import Control.Lens
 
 import Haskell.Debug.Adapter.Type
 import Haskell.Debug.Adapter.Constant
 import qualified Haskell.Debug.Adapter.Application as A
 import qualified Haskell.Debug.Adapter.Request as RQ
 import qualified Haskell.Debug.Adapter.Response as RP
-import qualified Haskell.Debug.Adapter.Thread as TD
 import qualified Haskell.Debug.Adapter.Watch as W
 
 
@@ -50,7 +53,7 @@
     -> Handle  -- ^IN handle. used to get request from the debug adapter client.
     -> Handle  -- ^OUT handle. used to response to the debug adapter client.
     -> IO ()
-run _ inHdl outHdl = E.bracket initialize finalize go
+run argDat inHdl outHdl = E.bracket initialize finalize go
 
   where
     -- |
@@ -64,8 +67,45 @@
       hSetBuffering outHdl NoBuffering
       hSetEncoding  outHdl utf8
 
-      A.defaultAppStores inHdl outHdl
+      reqStore <- newMVar []
+      resStore <- newMVar []
+      evtStore <- newMVar []
+      wsStore  <- newMVar ""
+      logPRStore <- newMVar L.WARNING
+      procStore  <- newEmptyMVar
+      verStore   <- newEmptyMVar
 
+      return AppStores {
+        -- Read Only
+          _appNameAppStores     = "haskell-debug-adapter"
+        , _appVerAppStores      = showVersion version
+        , _inHandleAppStores    = inHdl
+        , _outHandleAppStores   = outHdl
+        , _asyncsAppStores      = []
+        , _stdioLogFileAppStores = argDat^.stdioLogFileArgData
+
+        -- Read/Write from Application
+        , _appStateWAppStores   = WrapAppState InitState
+        , _resSeqAppStores      = 0
+        , _startupAppStores     = ""
+        , _startupFuncAppStores = ""
+        , _startupArgsAppStores = ""
+        , _stopOnEntryAppStores = False
+        , _ghciPmptAppStores    = _GHCI_PROMPT_HDA
+        , _mainArgsAppStores    = ""
+        , _launchReqSeqAppStores = -1
+        , _debugReRunableAppStores = False
+
+        -- Read/Write ASync
+        , _reqStoreAppStores    = reqStore
+        , _resStoreAppStores    = resStore
+        , _eventStoreAppStores  = evtStore
+        , _workspaceAppStores   = wsStore
+        , _logPriorityAppStores = logPRStore
+        , _ghciProcAppStores    = procStore
+        , _ghciVerAppStores     = verStore
+        }
+
     -- |
     --
     finalize _ = do
@@ -85,6 +125,8 @@
                 , W.run  appData    -- file watch
                 ]
 
-      TD.start appData ths >>= wait
-
+      as <- mapM async ths
+      waitAnyCatchCancel as >>= \case
+        (_, Right _) -> L.infoM _LOG_NAME $ "some threads stopped. exit."
+        (_, Left e)  -> L.criticalM _LOG_NAME $ "some threads stopped. " ++ show e
 
diff --git a/src/Haskell/Debug/Adapter/Request.hs b/src/Haskell/Debug/Adapter/Request.hs
--- a/src/Haskell/Debug/Adapter/Request.hs
+++ b/src/Haskell/Debug/Adapter/Request.hs
@@ -54,7 +54,10 @@
 
   where
     goApp :: AppContext B.ByteString
-    goApp = getContentLength >>= getContent
+    goApp = do
+      bs <- getContentLength >>= getContent
+      stdinLogging bs
+      return bs
 
 
 -- |
@@ -68,7 +71,7 @@
 --
 getContentLength :: AppContext Int
 getContentLength = go B.empty
-  where    
+  where
     go :: B.ByteString -> AppContext Int
     go buf = updateBuf buf >>= findLength
 
@@ -76,7 +79,7 @@
     updateBuf buf = do
       hdl <- view inHandleAppStores <$> get
       B.append buf <$> readCharL hdl
-    
+
     findLength :: B.ByteString -> AppContext Int
     findLength buf = case parse parser "find ContentLength parser" (lbs2str buf) of
       Left _  -> go buf
@@ -125,7 +128,7 @@
 -- |
 --
 createWrapRequest :: B.ByteString -> DAP.Request -> AppContext WrapRequest
-createWrapRequest bs req 
+createWrapRequest bs req
   | "initialize" == DAP.commandRequest req = WrapRequest . InitializeRequest <$> (liftEither (eitherDecode bs))
   | "launch"     == DAP.commandRequest req = WrapRequest . LaunchRequest <$> (liftEither (eitherDecode bs))
   | "disconnect" == DAP.commandRequest req = WrapRequest . DisconnectRequest <$> (liftEither (eitherDecode bs))
@@ -157,9 +160,6 @@
     Nothing  -> do
       throwError $ "unexpected Nothing."
       return ()
-    Just req@(WrapRequest DisconnectRequest{}) -> do
-      lift $ goApp req
-      liftIO $ L.infoM _LOG_REQUEST $ "disconnect. end of request thread."
     Just req -> do
       lift $ goApp req
       sink
diff --git a/src/Haskell/Debug/Adapter/Response.hs b/src/Haskell/Debug/Adapter/Response.hs
--- a/src/Haskell/Debug/Adapter/Response.hs
+++ b/src/Haskell/Debug/Adapter/Response.hs
@@ -107,7 +107,7 @@
       bs <- lift $ goApp res
       yield bs
       res2lbs
-  
+
   where
     goApp :: Response -> AppContext B.ByteString
     goApp = return . encode
@@ -131,6 +131,7 @@
   where
     goApp bs = do
       wHdl <- view outHandleAppStores <$> get
+      stdoutLogging bs
       liftIO $ sendResponse wHdl bs
 
     cont str
@@ -142,6 +143,7 @@
 --
 _KEY_DISCONNECT_RESPONCE :: String
 _KEY_DISCONNECT_RESPONCE = "\"command\":\"disconnect\""
+
 
 -- |
 --
diff --git a/src/Haskell/Debug/Adapter/State/Contaminated.hs b/src/Haskell/Debug/Adapter/State/Contaminated.hs
--- a/src/Haskell/Debug/Adapter/State/Contaminated.hs
+++ b/src/Haskell/Debug/Adapter/State/Contaminated.hs
@@ -4,9 +4,7 @@
 module Haskell.Debug.Adapter.State.Contaminated where
 
 import Control.Monad.IO.Class
---import Control.Monad.Except
 import qualified System.Log.Logger as L
-import Control.Concurrent (threadDelay)
 
 import qualified Haskell.DAP as DAP
 import Haskell.Debug.Adapter.Type
@@ -282,7 +280,6 @@
 restartEvent :: AppContext ()
 restartEvent = do
   SU.terminateGHCi
-  liftIO $ threadDelay _1_SEC
 
   U.sendConsoleEventLF ""
   U.sendConsoleEventLF "restarting debug adapter."
diff --git a/src/Haskell/Debug/Adapter/State/DebugRun/Continue.hs b/src/Haskell/Debug/Adapter/State/DebugRun/Continue.hs
--- a/src/Haskell/Debug/Adapter/State/DebugRun/Continue.hs
+++ b/src/Haskell/Debug/Adapter/State/DebugRun/Continue.hs
@@ -35,7 +35,7 @@
 
   P.command cmd
   U.debugEV _LOG_APP dbg
-  P.expectPmpt >>= SU.takeDapResult >>= dapHdl
+  outStr <- P.expectPmpt
 
   resSeq <- U.getIncreasedResponseSequence
   let res = DAP.defaultContinueResponse {
@@ -45,6 +45,8 @@
           }
 
   U.addResponse $ ContinueResponse res
+
+  SU.takeDapResult outStr >>= dapHdl
 
   return Nothing
 
diff --git a/src/Haskell/Debug/Adapter/State/DebugRun/InternalTerminate.hs b/src/Haskell/Debug/Adapter/State/DebugRun/InternalTerminate.hs
--- a/src/Haskell/Debug/Adapter/State/DebugRun/InternalTerminate.hs
+++ b/src/Haskell/Debug/Adapter/State/DebugRun/InternalTerminate.hs
@@ -5,7 +5,6 @@
 
 import Control.Monad.IO.Class
 import qualified System.Log.Logger as L
-import Control.Concurrent (threadDelay)
 
 import Haskell.Debug.Adapter.Type
 import Haskell.Debug.Adapter.Constant
@@ -25,8 +24,6 @@
 app :: HdaInternalTerminateRequest -> AppContext (Maybe StateTransit)
 app _ = do
   SU.terminateGHCi
-
-  liftIO $ threadDelay _1_SEC
 
   U.sendTerminatedEvent
   U.sendExitedEvent
diff --git a/src/Haskell/Debug/Adapter/State/DebugRun/Next.hs b/src/Haskell/Debug/Adapter/State/DebugRun/Next.hs
--- a/src/Haskell/Debug/Adapter/State/DebugRun/Next.hs
+++ b/src/Haskell/Debug/Adapter/State/DebugRun/Next.hs
@@ -35,7 +35,7 @@
 
   P.command cmd
   U.debugEV _LOG_APP dbg
-  P.expectPmpt >>= SU.takeDapResult >>= dapHdl
+  outStr <- P.expectPmpt
 
   resSeq <- U.getIncreasedResponseSequence
   let res = DAP.defaultNextResponse {
@@ -45,6 +45,8 @@
           }
 
   U.addResponse $ NextResponse res
+
+  SU.takeDapResult outStr >>= dapHdl
 
   return Nothing
 
diff --git a/src/Haskell/Debug/Adapter/State/DebugRun/StepIn.hs b/src/Haskell/Debug/Adapter/State/DebugRun/StepIn.hs
--- a/src/Haskell/Debug/Adapter/State/DebugRun/StepIn.hs
+++ b/src/Haskell/Debug/Adapter/State/DebugRun/StepIn.hs
@@ -35,7 +35,7 @@
 
   P.command cmd
   U.debugEV _LOG_APP dbg
-  P.expectPmpt >>= SU.takeDapResult >>= dapHdl
+  outStr <- P.expectPmpt
 
   resSeq <- U.getIncreasedResponseSequence
   let res = DAP.defaultStepInResponse {
@@ -45,6 +45,8 @@
           }
 
   U.addResponse $ StepInResponse res
+
+  SU.takeDapResult outStr >>= dapHdl
 
   return Nothing
 
diff --git a/src/Haskell/Debug/Adapter/State/DebugRun/Terminate.hs b/src/Haskell/Debug/Adapter/State/DebugRun/Terminate.hs
--- a/src/Haskell/Debug/Adapter/State/DebugRun/Terminate.hs
+++ b/src/Haskell/Debug/Adapter/State/DebugRun/Terminate.hs
@@ -5,7 +5,6 @@
 
 import Control.Monad.IO.Class
 import qualified System.Log.Logger as L
-import Control.Concurrent (threadDelay)
 
 import qualified Haskell.DAP as DAP
 import Haskell.Debug.Adapter.Type
@@ -26,8 +25,6 @@
 app :: DAP.TerminateRequest -> AppContext (Maybe StateTransit)
 app req = do
   SU.terminateGHCi
-
-  liftIO $ threadDelay _1_SEC
 
   resSeq <- U.getIncreasedResponseSequence
 
diff --git a/src/Haskell/Debug/Adapter/State/Init/Launch.hs b/src/Haskell/Debug/Adapter/State/Init/Launch.hs
--- a/src/Haskell/Debug/Adapter/State/Init/Launch.hs
+++ b/src/Haskell/Debug/Adapter/State/Init/Launch.hs
@@ -8,8 +8,6 @@
 import Control.Monad.State
 import Control.Concurrent
 import Control.Lens
-import System.Directory
-import System.FilePath
 import Text.Parsec
 import qualified Text.Read as R
 import qualified System.Log.Logger as L
@@ -43,7 +41,6 @@
 
   setUpConfig req
   setUpLogger req
-  createTasksJsonFile
 
   U.sendStdoutEvent "Configuration read.\n"
   U.sendConsoleEvent "Starting GHCi.\n"
@@ -128,44 +125,6 @@
   logPR <- liftIO $ readMVar $ ctx^.logPriorityAppStores
 
   liftIO $ L.setUpLogger (DAP.logFileLaunchRequestArguments args) logPR
-
-
--- |
---
-createTasksJsonFile :: AppContext ()
-createTasksJsonFile = do
-  ctx <- get
-  wsPath <- liftIO $ readMVar $ ctx^.workspaceAppStores
-  let jsonDir  = wsPath </> ".vscode"
-      jsonFile = jsonDir </> "tasks.json"
-
-  catchError
-    (checkDir jsonDir >> checkFile jsonFile >> createFile jsonFile)
-    errHdl
-
-  where
-
-    -- |
-    --
-    errHdl msg = liftIO $ L.debugM _LOG_APP msg
-
-    -- |
-    --
-    checkDir jsonDir = liftIO (doesDirectoryExist jsonDir) >>= \case
-      False -> throwError $ "setting folder not found. skip saveing tasks.json. DIR:" ++ jsonDir
-      True -> return ()
-
-    -- |
-    --
-    checkFile jsonFile = liftIO (doesFileExist jsonFile) >>= \case
-      True -> throwError $ "tasks.json file exists. " ++ jsonFile
-      False -> return ()
-
-    -- |
-    --
-    createFile jsonFile = do
-      liftIO $ U.saveFileBSL jsonFile _TASKS_JSON_FILE_CONTENTS
-      U.sendConsoleEvent $ "create tasks.json file. " ++ jsonFile ++ "\n"
 
 
 -- |
diff --git a/src/Haskell/Debug/Adapter/State/Utility.hs b/src/Haskell/Debug/Adapter/State/Utility.hs
--- a/src/Haskell/Debug/Adapter/State/Utility.hs
+++ b/src/Haskell/Debug/Adapter/State/Utility.hs
@@ -6,7 +6,9 @@
 import qualified System.Log.Logger as L
 import qualified Text.Read as R
 import Control.Monad.Except
-import Control.Concurrent (threadDelay)
+import Control.Lens
+import Control.Monad.State.Lazy
+import Control.Concurrent.MVar
 
 import qualified Haskell.DAP as DAP
 import Haskell.Debug.Adapter.Type
@@ -165,6 +167,32 @@
 
 -- |
 --
+sendDisconnectResponse :: DAP.DisconnectRequest -> AppContext ()
+sendDisconnectResponse req = do
+
+  tryTerminateGHCi
+
+  resSeq <- U.getIncreasedResponseSequence
+
+  let res = DAP.defaultDisconnectResponse {
+            DAP.seqDisconnectResponse         = resSeq
+          , DAP.request_seqDisconnectResponse = DAP.seqDisconnectRequest req
+          , DAP.successDisconnectResponse     = True
+          }
+
+  U.addResponse $ DisconnectResponse res
+
+  where
+    tryTerminateGHCi :: AppContext ()
+    tryTerminateGHCi = do
+      mver <- view ghciProcAppStores <$> get
+      U.liftIOE (isEmptyMVar mver) >>= \case
+        True -> return ()
+        False -> catchError terminateGHCi (\_->return ())
+
+
+-- |
+--
 evaluateRequest :: DAP.EvaluateRequest -> AppContext (Maybe StateTransit)
 evaluateRequest req = do
 
@@ -306,8 +334,6 @@
 terminateRequest req = do
   terminateGHCi
 
-  liftIO $ threadDelay _1_SEC
-
   resSeq <- U.getIncreasedResponseSequence
 
   let res = DAP.defaultTerminateResponse {
@@ -326,8 +352,6 @@
 internalTerminateRequest = do
 
     terminateGHCi
-
-    liftIO $ threadDelay _1_SEC
 
     U.sendTerminatedEvent
     U.sendExitedEvent
diff --git a/src/Haskell/Debug/Adapter/Thread.hs b/src/Haskell/Debug/Adapter/Thread.hs
deleted file mode 100644
--- a/src/Haskell/Debug/Adapter/Thread.hs
+++ /dev/null
@@ -1,103 +0,0 @@
-module Haskell.Debug.Adapter.Thread where
-
-import Control.Monad.IO.Class
-import Control.Concurrent.Async
-import Control.Concurrent
-import qualified System.Log.Logger as L
-import Data.Maybe
-import qualified Data.List as L
-import Control.Monad.State.Lazy
-import Control.Lens
-import Control.Monad.Except
-
-import Haskell.Debug.Adapter.Type
-import Haskell.Debug.Adapter.Utility
-import Haskell.Debug.Adapter.Constant
-
-
--- |
---
-start :: AppStores -> [IO ()] -> IO (Async ())
-start dat acts = do
-  as <- mapM async acts
-  async $ run dat {_asyncsAppStores = as}
-
-
-
--- |
---
-run :: AppStores -> IO ()
-run appData = do
-  L.debugM _LOG_THREAD_MGR "satrt thread manager"
-  runApp appData app
-  L.debugM _LOG_THREAD_MGR "stop thread manager"
-
-
--- |
---
-app :: AppContext ()
-app = catchError go errHdl
-  where
-    errHdl msg = do
-      criticalEV _LOG_THREAD_MGR msg
-      criticalEV _LOG_THREAD_MGR "stopping all threads."
-      as <- view asyncsAppStores <$> get
-      liftIO $ mapM_ cancel as
-      
-    go = isStop >>= \case
-      True  -> return ()
-      False -> do
-        takeEvent >>= \case
-          Nothing -> return ()
-          Just ev -> runEvent ev
-        liftIO $ threadDelay _1_SEC
-        go
-
-
--- |
---
-isStop :: AppContext Bool
-isStop = do
-  as <- view asyncsAppStores <$> get
-  res <- liftIO $ mapM poll as
-  when (L.any isJust res) $
-    liftIO $ L.debugM _LOG_THREAD_MGR $ "thread status." ++ show res
-
-  return $ L.all isJust res
-
-
--- |
---
-takeEvent :: AppContext (Maybe Event)
-takeEvent = do
-  appDat <- get
-  let mvar = appDat^.eventStoreAppStores
-  liftIO $ goIO mvar
-
-
-  where
-    goIO mvar = isExists mvar >>= \case
-      False -> return Nothing
-      True  -> take1 mvar
-
-    isExists mvar = readMVar mvar >>= \case
-      [] -> return False
-      _  -> return True
-
-    take1 mvar = takeMVar mvar >>= \case
-      [] -> do
-        putMVar mvar []
-        return Nothing
-      (x:xs) -> do
-        putMVar mvar xs
-        return $ Just x
-
-
--- |
---
-runEvent :: Event -> AppContext ()
-runEvent CriticalExitEvent = do
-  liftIO $ L.criticalM _LOG_THREAD_MGR "Critical exit started."
-  as <- view asyncsAppStores <$> get
-  liftIO $ mapM_ cancel as
-  
diff --git a/src/Haskell/Debug/Adapter/Type.hs b/src/Haskell/Debug/Adapter/Type.hs
--- a/src/Haskell/Debug/Adapter/Type.hs
+++ b/src/Haskell/Debug/Adapter/Type.hs
@@ -31,6 +31,7 @@
 --
 data ArgData = ArgData {
     _hackageVersionArgData :: Maybe String   -- ^deprecated.
+  , _stdioLogFileArgData   :: Maybe FilePath -- stdio log file.
   } deriving (Data, Typeable, Show, Read, Eq)
 
 makeLenses ''ArgData
@@ -47,6 +48,7 @@
 instance Default ArgData where
   def = ArgData {
         _hackageVersionArgData = Nothing
+      , _stdioLogFileArgData   = Nothing
       }
 
 
@@ -130,72 +132,72 @@
 --
 
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Source"} ''DAP.Source)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SourceBreakpoint"} ''DAP.SourceBreakpoint)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Breakpoint"} ''DAP.Breakpoint)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "FunctionBreakpoint"} ''DAP.FunctionBreakpoint)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Thread"} ''DAP.Thread)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackFrame"} ''DAP.StackFrame)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Scope"} ''DAP.Scope)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Variable"} ''DAP.Variable)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablePresentationHint"} ''DAP.VariablePresentationHint)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsItem"} ''DAP.CompletionsItem)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Source", omitNothingFields = True} ''DAP.Source)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SourceBreakpoint", omitNothingFields = True} ''DAP.SourceBreakpoint)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Breakpoint", omitNothingFields = True} ''DAP.Breakpoint)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "FunctionBreakpoint", omitNothingFields = True} ''DAP.FunctionBreakpoint)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Thread", omitNothingFields = True} ''DAP.Thread)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackFrame", omitNothingFields = True} ''DAP.StackFrame)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Scope", omitNothingFields = True} ''DAP.Scope)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Variable", omitNothingFields = True} ''DAP.Variable)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablePresentationHint", omitNothingFields = True} ''DAP.VariablePresentationHint)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsItem", omitNothingFields = True} ''DAP.CompletionsItem)
 
 
 -- jsonize
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Request"} ''DAP.Request)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Request", omitNothingFields = True} ''DAP.Request)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializeRequest"} ''DAP.InitializeRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializeRequestArguments"} ''DAP.InitializeRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializeRequest", omitNothingFields = True} ''DAP.InitializeRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializeRequestArguments", omitNothingFields = True} ''DAP.InitializeRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "LaunchRequest"} ''DAP.LaunchRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "LaunchRequestArguments"} ''DAP.LaunchRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "LaunchRequest", omitNothingFields = True} ''DAP.LaunchRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "LaunchRequestArguments", omitNothingFields = True} ''DAP.LaunchRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "DisconnectRequest"} ''DAP.DisconnectRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "DisconnectRequestArguments"} ''DAP.DisconnectRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "DisconnectRequest", omitNothingFields = True} ''DAP.DisconnectRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "DisconnectRequestArguments", omitNothingFields = True} ''DAP.DisconnectRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "PauseRequest"} ''DAP.PauseRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "PauseRequestArguments"} ''DAP.PauseRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "PauseRequest", omitNothingFields = True} ''DAP.PauseRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "PauseRequestArguments", omitNothingFields = True} ''DAP.PauseRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminateRequest"} ''DAP.TerminateRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminateRequestArguments"} ''DAP.TerminateRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminateRequest", omitNothingFields = True} ''DAP.TerminateRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminateRequestArguments", omitNothingFields = True} ''DAP.TerminateRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetBreakpointsRequest"} ''DAP.SetBreakpointsRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetBreakpointsRequestArguments"} ''DAP.SetBreakpointsRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetBreakpointsRequest", omitNothingFields = True} ''DAP.SetBreakpointsRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetBreakpointsRequestArguments", omitNothingFields = True} ''DAP.SetBreakpointsRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetFunctionBreakpointsRequest"} ''DAP.SetFunctionBreakpointsRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetFunctionBreakpointsRequestArguments"} ''DAP.SetFunctionBreakpointsRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetFunctionBreakpointsRequest", omitNothingFields = True} ''DAP.SetFunctionBreakpointsRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetFunctionBreakpointsRequestArguments", omitNothingFields = True} ''DAP.SetFunctionBreakpointsRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetExceptionBreakpointsRequest"} ''DAP.SetExceptionBreakpointsRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetExceptionBreakpointsRequestArguments"} ''DAP.SetExceptionBreakpointsRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetExceptionBreakpointsRequest", omitNothingFields = True} ''DAP.SetExceptionBreakpointsRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetExceptionBreakpointsRequestArguments", omitNothingFields = True} ''DAP.SetExceptionBreakpointsRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ConfigurationDoneRequest"} ''DAP.ConfigurationDoneRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ConfigurationDoneRequest", omitNothingFields = True} ''DAP.ConfigurationDoneRequest)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ThreadsRequest"} ''DAP.ThreadsRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ThreadsRequest", omitNothingFields = True} ''DAP.ThreadsRequest)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackTraceRequest"} ''DAP.StackTraceRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackTraceRequestArguments"} ''DAP.StackTraceRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackTraceRequest", omitNothingFields = True} ''DAP.StackTraceRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackTraceRequestArguments", omitNothingFields = True} ''DAP.StackTraceRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ScopesRequest"} ''DAP.ScopesRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ScopesRequestArguments"} ''DAP.ScopesRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ScopesRequest", omitNothingFields = True} ''DAP.ScopesRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ScopesRequestArguments", omitNothingFields = True} ''DAP.ScopesRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablesRequest"} ''DAP.VariablesRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablesRequestArguments"} ''DAP.VariablesRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablesRequest", omitNothingFields = True} ''DAP.VariablesRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablesRequestArguments", omitNothingFields = True} ''DAP.VariablesRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinueRequest"} ''DAP.ContinueRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinueRequestArguments"} ''DAP.ContinueRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinueRequest", omitNothingFields = True} ''DAP.ContinueRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinueRequestArguments", omitNothingFields = True} ''DAP.ContinueRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "NextRequest"} ''DAP.NextRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "NextRequestArguments"} ''DAP.NextRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "NextRequest", omitNothingFields = True} ''DAP.NextRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "NextRequestArguments", omitNothingFields = True} ''DAP.NextRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StepInRequest"} ''DAP.StepInRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StepInRequestArguments"} ''DAP.StepInRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StepInRequest", omitNothingFields = True} ''DAP.StepInRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StepInRequestArguments", omitNothingFields = True} ''DAP.StepInRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "EvaluateRequest"} ''DAP.EvaluateRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "EvaluateRequestArguments"} ''DAP.EvaluateRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "EvaluateRequest", omitNothingFields = True} ''DAP.EvaluateRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "EvaluateRequestArguments", omitNothingFields = True} ''DAP.EvaluateRequestArguments)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsRequest"} ''DAP.CompletionsRequest)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsRequestArguments"} ''DAP.CompletionsRequestArguments)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsRequest", omitNothingFields = True} ''DAP.CompletionsRequest)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsRequestArguments", omitNothingFields = True} ''DAP.CompletionsRequestArguments)
 
 
 -- request
@@ -231,71 +233,71 @@
 --
 
 -- jsonize
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Response"} ''DAP.Response)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ColumnDescriptor"} ''DAP.ColumnDescriptor)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ExceptionBreakpointsFilter"} ''DAP.ExceptionBreakpointsFilter)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "Response", omitNothingFields = True} ''DAP.Response)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ColumnDescriptor", omitNothingFields = True} ''DAP.ColumnDescriptor)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ExceptionBreakpointsFilter", omitNothingFields = True} ''DAP.ExceptionBreakpointsFilter)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializeResponse"} ''DAP.InitializeResponse)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializeResponseBody"} ''DAP.InitializeResponseBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializeResponse", omitNothingFields = True} ''DAP.InitializeResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializeResponseBody", omitNothingFields = True} ''DAP.InitializeResponseBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "LaunchResponse"} ''DAP.LaunchResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "LaunchResponse", omitNothingFields = True} ''DAP.LaunchResponse)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "OutputEvent"} ''DAP.OutputEvent)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "OutputEventBody"} ''DAP.OutputEventBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "OutputEvent", omitNothingFields = True} ''DAP.OutputEvent)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "OutputEventBody", omitNothingFields = True} ''DAP.OutputEventBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StoppedEvent"} ''DAP.StoppedEvent)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StoppedEventBody"} ''DAP.StoppedEventBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StoppedEvent", omitNothingFields = True} ''DAP.StoppedEvent)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StoppedEventBody", omitNothingFields = True} ''DAP.StoppedEventBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializedEvent"} ''DAP.InitializedEvent)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "InitializedEvent", omitNothingFields = True} ''DAP.InitializedEvent)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "DisconnectResponse"} ''DAP.DisconnectResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "DisconnectResponse", omitNothingFields = True} ''DAP.DisconnectResponse)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "PauseResponse"} ''DAP.PauseResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "PauseResponse", omitNothingFields = True} ''DAP.PauseResponse)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminateResponse"} ''DAP.TerminateResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminateResponse", omitNothingFields = True} ''DAP.TerminateResponse)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetBreakpointsResponse"} ''DAP.SetBreakpointsResponse)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetBreakpointsResponseBody"} ''DAP.SetBreakpointsResponseBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetBreakpointsResponse", omitNothingFields = True} ''DAP.SetBreakpointsResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetBreakpointsResponseBody", omitNothingFields = True} ''DAP.SetBreakpointsResponseBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetFunctionBreakpointsResponse"} ''DAP.SetFunctionBreakpointsResponse)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetFunctionBreakpointsResponseBody"} ''DAP.SetFunctionBreakpointsResponseBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetFunctionBreakpointsResponse", omitNothingFields = True} ''DAP.SetFunctionBreakpointsResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetFunctionBreakpointsResponseBody", omitNothingFields = True} ''DAP.SetFunctionBreakpointsResponseBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetExceptionBreakpointsResponse"} ''DAP.SetExceptionBreakpointsResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "SetExceptionBreakpointsResponse", omitNothingFields = True} ''DAP.SetExceptionBreakpointsResponse)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ConfigurationDoneResponse"} ''DAP.ConfigurationDoneResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ConfigurationDoneResponse", omitNothingFields = True} ''DAP.ConfigurationDoneResponse)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ThreadsResponse"} ''DAP.ThreadsResponse)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ThreadsResponseBody"} ''DAP.ThreadsResponseBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ThreadsResponse", omitNothingFields = True} ''DAP.ThreadsResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ThreadsResponseBody", omitNothingFields = True} ''DAP.ThreadsResponseBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackTraceResponse"} ''DAP.StackTraceResponse)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackTraceResponseBody"} ''DAP.StackTraceResponseBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackTraceResponse", omitNothingFields = True} ''DAP.StackTraceResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StackTraceResponseBody", omitNothingFields = True} ''DAP.StackTraceResponseBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ScopesResponse"} ''DAP.ScopesResponse)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ScopesResponseBody"} ''DAP.ScopesResponseBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ScopesResponse", omitNothingFields = True} ''DAP.ScopesResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ScopesResponseBody", omitNothingFields = True} ''DAP.ScopesResponseBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablesResponse"} ''DAP.VariablesResponse)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablesResponseBody"} ''DAP.VariablesResponseBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablesResponse", omitNothingFields = True} ''DAP.VariablesResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "VariablesResponseBody", omitNothingFields = True} ''DAP.VariablesResponseBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinueResponse"} ''DAP.ContinueResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinueResponse", omitNothingFields = True} ''DAP.ContinueResponse)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "NextResponse"} ''DAP.NextResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "NextResponse", omitNothingFields = True} ''DAP.NextResponse)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StepInResponse"} ''DAP.StepInResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "StepInResponse", omitNothingFields = True} ''DAP.StepInResponse)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "EvaluateResponse"} ''DAP.EvaluateResponse)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "EvaluateResponseBody"} ''DAP.EvaluateResponseBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "EvaluateResponse", omitNothingFields = True} ''DAP.EvaluateResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "EvaluateResponseBody", omitNothingFields = True} ''DAP.EvaluateResponseBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsResponse"} ''DAP.CompletionsResponse)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsResponseBody"} ''DAP.CompletionsResponseBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsResponse", omitNothingFields = True} ''DAP.CompletionsResponse)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "CompletionsResponseBody", omitNothingFields = True} ''DAP.CompletionsResponseBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminatedEvent"} ''DAP.TerminatedEvent)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminatedEventBody"} ''DAP.TerminatedEventBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminatedEvent", omitNothingFields = True} ''DAP.TerminatedEvent)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "TerminatedEventBody", omitNothingFields = True} ''DAP.TerminatedEventBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ExitedEvent"} ''DAP.ExitedEvent)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ExitedEventBody"} ''DAP.ExitedEventBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ExitedEvent", omitNothingFields = True} ''DAP.ExitedEvent)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ExitedEventBody", omitNothingFields = True} ''DAP.ExitedEventBody)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinuedEvent"} ''DAP.ContinuedEvent)
-$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinuedEventBody"} ''DAP.ContinuedEventBody)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinuedEvent", omitNothingFields = True} ''DAP.ContinuedEvent)
+$(deriveJSON defaultOptions {fieldLabelModifier = rdrop "ContinuedEventBody", omitNothingFields = True} ''DAP.ContinuedEventBody)
 
 
 -- response
@@ -408,6 +410,7 @@
   , _inHandleAppStores    :: S.Handle
   , _outHandleAppStores   :: S.Handle
   , _asyncsAppStores      :: [Async ()]
+  , _stdioLogFileAppStores :: Maybe FilePath
 
   -- Read/Write from Application
   , _appStateWAppStores   :: WrapAppState
diff --git a/src/Haskell/Debug/Adapter/Utility.hs b/src/Haskell/Debug/Adapter/Utility.hs
--- a/src/Haskell/Debug/Adapter/Utility.hs
+++ b/src/Haskell/Debug/Adapter/Utility.hs
@@ -20,7 +20,6 @@
 import qualified Data.List as L
 import qualified Control.Exception.Safe as E
 
-
 import qualified Haskell.DAP as DAP
 import Haskell.Debug.Adapter.Type
 import Haskell.Debug.Adapter.Constant
@@ -237,21 +236,7 @@
     sendStdoutEvent $ "[" ++ show pr ++ "][" ++ name ++ "] " ++ msg'
 
 
--- |
---
-sendDisconnectResponse :: DAP.DisconnectRequest -> AppContext ()
-sendDisconnectResponse req = do
-  resSeq <- getIncreasedResponseSequence
 
-  let res = DAP.defaultDisconnectResponse {
-            DAP.seqDisconnectResponse         = resSeq
-          , DAP.request_seqDisconnectResponse = DAP.seqDisconnectRequest req
-          , DAP.successDisconnectResponse     = True
-          }
-
-  addResponse $ DisconnectResponse res
-
-
 -- |
 --
 sendPauseResponse :: DAP.PauseRequest -> AppContext ()
@@ -548,4 +533,33 @@
 --
 startswith :: String -> String -> Bool
 startswith a b = T.isPrefixOf (T.pack a) (T.pack b)
+
+
+-- |
+--
+stdioLogging :: BSL.ByteString -> AppContext ()
+stdioLogging bs = do
+  logFile <- view stdioLogFileAppStores <$> get
+  go logFile
+
+  where
+    go :: Maybe FilePath -> AppContext ()
+    go Nothing  = return ()
+    go (Just f) = liftIOE $ BSL.appendFile f bs
+
+
+-- |
+--
+stdinLogging :: BSL.ByteString -> AppContext ()
+stdinLogging bs = do
+  stdioLogging $ str2lbs "[ IN]" `BSL.append` bs `BSL.append` str2lbs "\n"
+
+
+-- |
+--
+stdoutLogging :: BSL.ByteString -> AppContext ()
+stdoutLogging bs = do
+  stdioLogging $ str2lbs "[OUT]" `BSL.append` bs `BSL.append` str2lbs "\n"
+
+
 
diff --git a/test/Haskell/Debug/Adapter/ControlSpec.hs b/test/Haskell/Debug/Adapter/ControlSpec.hs
--- a/test/Haskell/Debug/Adapter/ControlSpec.hs
+++ b/test/Haskell/Debug/Adapter/ControlSpec.hs
@@ -7,6 +7,7 @@
 import Control.Concurrent (threadDelay)
 import qualified System.IO as S
 import Control.Concurrent.Async
+import Data.Default
 
 import Spec.Utility
 
@@ -50,7 +51,7 @@
             (fromServer, toServer) <- createPipe
 
             (res, _) <- runConcurrently $ (,)
-              <$> Concurrently (run fromClient toClient)
+              <$> Concurrently (run def fromClient toClient)
               <*> Concurrently (client toServer)
 
             res `shouldBe` ()
