diff --git a/data/base/List/Basic.hs b/data/base/List/Basic.hs
--- a/data/base/List/Basic.hs
+++ b/data/base/List/Basic.hs
@@ -8,7 +8,7 @@
 -}
 
 import Bool
-import Prelude ( (-), Num, Int, Bool )
+import Prelude ( (-), Int, Bool )
 
 
 infixr 5 ++
diff --git a/data/base/ListLive.hs b/data/base/ListLive.hs
--- a/data/base/ListLive.hs
+++ b/data/base/ListLive.hs
@@ -17,7 +17,7 @@
 import Tuple
 import Function
 import Bool
-import Prelude ( (-), (+), (*), Num, Int, Integer, Integral, Bool, foldr, null, reverse )
+import Prelude ( (-), (+), (*), Int, Integer, Integral, Bool, foldr, null, reverse )
 
 
 cons :: a -> [a] -> [a] ;
diff --git a/http/enable/HTTPServer/Option.hs b/http/enable/HTTPServer/Option.hs
--- a/http/enable/HTTPServer/Option.hs
+++ b/http/enable/HTTPServer/Option.hs
@@ -1,6 +1,6 @@
 module HTTPServer.Option where
 
-import Option.Utility ( parseNumber )
+import Shell.Utility.ParseArgument ( parseNumber )
 
 import qualified System.Console.GetOpt as Opt
 import System.Console.GetOpt (ArgDescr(..), )
diff --git a/live-sequencer.cabal b/live-sequencer.cabal
--- a/live-sequencer.cabal
+++ b/live-sequencer.cabal
@@ -1,12 +1,12 @@
 Name:          live-sequencer
-Version:       0.0.6.2
+Version:       0.0.6.3
 Author:        Henning Thielemann and Johannes Waldmann
 Maintainer:    Henning Thielemann <haskell@henning-thielemann.de>, Johannes Waldmann <waldmann@imn.htwk-leipzig.de>
 Category:      Sound, Music, GUI
 License:       GPL
 License-file:  LICENSE
-Cabal-Version: >= 1.6
-Tested-With:   GHC==7.8.4, GHC==8.0.1
+Cabal-Version: >= 1.10
+Tested-With:   GHC==8.2.2, GHC==9.6.3
 Homepage:      http://www.haskell.org/haskellwiki/Live-Sequencer
 Bug-Reports:   https://hub.darcs.net/thielema/livesequencer
 Synopsis:      Live coding of MIDI music
@@ -60,6 +60,8 @@
 Extra-Source-Files:
   Changes.md
   README.md
+  wxc.nix
+  shell.nix
   http/enable/HTTPServer.hs
   http/enable/HTTPServer/GUI.hs
   http/enable/HTTPServer/Option.hs
@@ -71,7 +73,7 @@
   Location: https://hub.darcs.net/thielema/livesequencer
 
 Source-Repository this
-  Tag: 0.0.6.2
+  Tag: 0.0.6.3
   Type: darcs
   Location: https://hub.darcs.net/thielema/livesequencer
 
@@ -89,13 +91,15 @@
 
 
 Library
-  Hs-Source-Dirs: data/base, data/example
+  Default-Language: Haskell98
   GHC-Options: -Wall
+  Hs-Source-Dirs: data/base, data/example
   Build-Depends:
     -- for Render
+    midi >=0.2.1 && <0.3,
     non-negative >=0.0.6 && <0.2,
     event-list >=0.0.11 && <0.2,
-    base >=4.2 && <5
+    base >=4.10 && <5
   Exposed-Modules:
     Render
     Bool
@@ -132,10 +136,11 @@
     ALSA
     Event
     InOut
+    Exception
     Module
     ModuleBase
     Option
-    Option.Utility
+    ControllerBase
     Program
     Rewrite
     Rule
@@ -146,17 +151,19 @@
     Time
     Type
     Log
+    HTTPServer.Option
     Paths_live_sequencer
   Other-Modules:
     Lilypond
+  Default-Language: Haskell98
   GHC-Options: -Wall -threaded
   If impl(ghc>=7.0)
     GHC-Options: -fwarn-unused-do-bind -fwarn-missing-import-lists
   Build-Depends:
     stm-split >=0.0 && <0.1,
     concurrent-split >=0.0 && <0.1,
-    transformers >=0.2.2 && <0.6,
-    explicit-exception >=0.1.9 && <0.2,
+    transformers >=0.2.2 && <0.7,
+    explicit-exception >=0.1.9 && <0.3,
     parsec >=2.1 && <3.2,
     pretty >=1.0 && <1.2,
     midi-alsa >=0.2 && <0.3,
@@ -165,25 +172,27 @@
     alsa-core >=0.5 && <0.6,
     data-accessor-transformers >=0.2.1 && <0.3,
     data-accessor >=0.2.1 && <0.3,
-    strict >=0.3.2 && <0.4,
+    strict >=0.3.2 && <0.6,
     utility-ht >=0.0.8 && <0.1,
     non-empty >=0.2 && <0.4,
     semigroups >=0.1 && <1.0,
-    containers >=0.3 && <0.6,
-    bytestring >=0.9 && <0.11,
+    containers >=0.3 && <0.8,
+    bytestring >=0.9 && <0.13,
+    shell-utility >=0.0 && <0.2,
     process >=1.0 && <1.7,
     pathtype >=0.8.1 && <0.9,
-    base >=4.2 && <5
+    base >=4.10 && <5
 
 Executable live-sequencer-gui
   If flag(gui)
     Build-Depends:
-      wx >=0.12.1 && <0.93,
-      wxcore >=0.13.2 && <0.93,
-      stm >=2.2 && <2.5,
+      wx >=0.12.1 && <0.94,
+      wxcore >=0.13.2 && <0.94,
+      stm-split >=0.0 && <0.1,
+      stm >=2.2 && <2.6,
       concurrent-split >=0.0 && <0.1,
-      transformers >=0.2.2 && <0.6,
-      explicit-exception >=0.1.9 && <0.2,
+      transformers >=0.2.2 && <0.7,
+      explicit-exception >=0.1.9 && <0.3,
       parsec >=2.1 && <3.2,
       pretty >=1.0 && <1.2,
       midi-alsa >=0.2 && <0.3,
@@ -192,15 +201,16 @@
       alsa-core >=0.5 && <0.6,
       data-accessor-transformers >=0.2.1 && <0.3,
       data-accessor >=0.2.1 && <0.3,
-      strict >=0.3.2 && <0.4,
+      strict >=0.3.2 && <0.6,
       non-empty >=0.2 && <0.4,
       semigroups >=0.1 && <1.0,
       utility-ht >=0.0.8 && <0.1,
-      containers >=0.3 && <0.6,
-      bytestring >=0.9 && <0.11,
+      containers >=0.3 && <0.8,
+      bytestring >=0.9 && <0.13,
+      shell-utility >=0.0 && <0.2,
       process >=1.0 && <1.7,
       pathtype >=0.8.1 && <0.9,
-      base >=4.2 && <5
+      base >=4.10 && <5
   Else
     Buildable: False
 
@@ -214,7 +224,6 @@
     Module
     ModuleBase
     Option
-    Option.Utility
     Controller
     ControllerBase
     Program
@@ -231,6 +240,7 @@
     Utility.Concurrent
     Utility.WX
 
+  Default-Language: Haskell98
   GHC-Options: -threaded -Wall
   If impl(ghc>=7.0)
     GHC-Options: -fwarn-tabs -fwarn-incomplete-uni-patterns
@@ -241,9 +251,10 @@
       HTTPServer
     Build-Depends:
       httpd-shed >=0.4 && <0.5,
-      network >=2.6 && <2.7,
-      network-uri >= 2.6 && <2.7,
-      cgi >=3001.1 && <3001.4,
+      network >=2.6 && <3.2,
+      network-uri >= 2.6 && <2.8,
+      network-uri-flag == 0.1.*,
+      cgi >=3001.1 && <3001.6,
       html >=1.0 && <1.1
   Else
     Hs-Source-Dirs: http/disable
@@ -255,22 +266,22 @@
 Executable live-mplayer-control
   If flag(mplayer)
     Build-Depends:
+      shell-utility,
+      pathtype,
       midi-alsa >=0.2 && <0.3,
       midi >=0.2 && <0.3,
       alsa-seq >=0.6 && <0.7,
       alsa-core >=0.5 && <0.6,
-      unix >=2.4 && <2.8,
-      transformers >=0.2.2 && <0.6,
-      base >=4.2 && <5
+      unix >=2.4 && <2.9,
+      transformers >=0.2.2 && <0.7,
+      base >=4.10 && <5
   Else
     Buildable: False
 
   Hs-Source-Dirs: src
   Main-is: MPlayer.hs
 
-  Other-Modules:
-    Option.Utility
-
+  Default-Language: Haskell98
   GHC-Options: -threaded -Wall
   If impl(ghc>=7.0)
     GHC-Options: -fwarn-tabs -fwarn-incomplete-uni-patterns
diff --git a/shell.nix b/shell.nix
new file mode 100644
--- /dev/null
+++ b/shell.nix
@@ -0,0 +1,27 @@
+{ pkgs ? import <nixpkgs> {} }:
+
+let
+  wxc = pkgs.callPackage (import ./wxc.nix pkgs) {};
+
+in
+pkgs.mkShell {
+  nativeBuildInputs = [
+    pkgs.pkg-config
+  ];
+  buildInputs = [
+    wxc
+    pkgs.wxGTK32 # wxdirect needs wx-config
+    pkgs.libGL # for OpenGLRaw
+    pkgs.libGLU # for GLURaw
+# for compiling application packages in Nix
+    pkgs.haskell.compiler.ghc963
+    pkgs.cabal-install
+    pkgs.gmp
+    pkgs.numactl
+    pkgs.alsa-lib
+    pkgs.alsa-plugins
+  ];
+  shellHook = ''
+    export ALSA_PLUGIN_DIR=${pkgs.alsa-plugins}/lib/alsa-lib
+  '';
+}
diff --git a/src/Console.hs b/src/Console.hs
--- a/src/Console.hs
+++ b/src/Console.hs
@@ -29,7 +29,7 @@
 import Control.Functor.HT ( void )
 
 import qualified System.IO as IO
-import Option.Utility ( exitFailureMsg )
+import Shell.Utility.Exit ( exitFailureMsg )
 
 
 type Term = Term.Term ModuleRange
diff --git a/src/GUI.hs b/src/GUI.hs
--- a/src/GUI.hs
+++ b/src/GUI.hs
@@ -53,7 +53,6 @@
 import Program ( Program )
 import TermFocus ( TermFocus )
 import TermParser ( lexer )
-import Option.Utility ( exitFailureMsg )
 import Utility.WX ( cursor, editable, notebookSelection, splitterWindowSetSashGravity )
 
 import qualified HTTPServer.GUI as HTTPGui
@@ -118,6 +117,7 @@
 import Control.Exception ( bracket, finally, try )
 import qualified System.IO as IO
 import qualified System.IO.Error as Err
+import Shell.Utility.Exit ( exitFailureMsg )
 
 import qualified System.Path.IO as PathIO
 import qualified System.Path as Path
diff --git a/src/MPlayer.hs b/src/MPlayer.hs
--- a/src/MPlayer.hs
+++ b/src/MPlayer.hs
@@ -47,7 +47,7 @@
 
 import qualified Text.Printf as Printf
 
-import Option.Utility (exitFailureMsg)
+import Shell.Utility.Exit (exitFailureMsg)
 
 
 defltPipeName :: Path.AbsRelFile
diff --git a/src/Option.hs b/src/Option.hs
--- a/src/Option.hs
+++ b/src/Option.hs
@@ -3,8 +3,11 @@
 import qualified Module
 import qualified Time
 import qualified InOut
-import Option.Utility ( exitFailureMsg, fmapOptDescr, parseNumber )
 import qualified HTTPServer.Option as HTTP
+
+import Shell.Utility.ParseArgument (parseNumber)
+import Shell.Utility.Exit (exitFailureMsg)
+import Shell.Utility.GetOpt (fmapOptDescr)
 
 import qualified Text.ParserCombinators.Parsec as Parsec
 
diff --git a/src/Option/Utility.hs b/src/Option/Utility.hs
deleted file mode 100644
--- a/src/Option/Utility.hs
+++ /dev/null
@@ -1,34 +0,0 @@
-module Option.Utility where
-
-import qualified System.Console.GetOpt as G
-import qualified System.Exit as Exit
-import qualified System.IO as IO
-
-
-parseNumber ::
-   (Read a) =>
-   String -> (a -> Bool) -> String -> String -> IO a
-parseNumber name constraint constraintName str =
-   case reads str of
-      [(n, "")] ->
-         if constraint n
-           then return n
-           else exitFailureMsg $ name ++ " must be a " ++ constraintName ++ " number"
-      _ ->
-         exitFailureMsg $ name ++ " must be a number, but is '" ++ str ++ "'"
-
-exitFailureMsg :: String -> IO a
-exitFailureMsg msg = do
-    IO.hPutStrLn IO.stderr msg
-    Exit.exitFailure
-
-fmapArgDescr :: (a -> b) -> (G.ArgDescr a -> G.ArgDescr b)
-fmapArgDescr f d =
-    case d of
-        G.NoArg a -> G.NoArg $ f a
-        G.ReqArg g str -> G.ReqArg (f.g) str
-        G.OptArg g str -> G.OptArg (f.g) str
-
-fmapOptDescr :: (a -> b) -> (G.OptDescr a -> G.OptDescr b)
-fmapOptDescr f (G.Option short long arg help) =
-    G.Option short long (fmapArgDescr f arg) help
diff --git a/src/Term.hs b/src/Term.hs
--- a/src/Term.hs
+++ b/src/Term.hs
@@ -19,6 +19,7 @@
 
 import qualified Control.Monad.Exception.Synchronous as ME
 import Control.Monad.Exception.Synchronous ( Exceptional(Exception) )
+import Control.Monad.Fail ( MonadFail )
 import Control.Monad ( liftM2, mzero )
 import Control.Applicative ( (<$>) )
 import Data.Char (isUpper, isLower)
@@ -109,7 +110,7 @@
 viewNode _ = Nothing
 
 
-liftMonadFail :: (Monad m) => Exceptional String a -> m a
+liftMonadFail :: (MonadFail m) => Exceptional String a -> m a
 liftMonadFail = ME.switch fail return
 
 {- |
diff --git a/src/Type.hs b/src/Type.hs
--- a/src/Type.hs
+++ b/src/Type.hs
@@ -72,7 +72,6 @@
 table :: (ParserRange range) => Expr.OperatorTable Char st (Term range)
 table = map ( map binary ) operators
 
--- duplicate to Term.binary, however, lexer and operatorLetter are different
 binary ::
     (ParserRange range) =>
     (String, Assoc) -> Expr.Operator Char st (Term range)
diff --git a/wxc.nix b/wxc.nix
new file mode 100644
--- /dev/null
+++ b/wxc.nix
@@ -0,0 +1,10 @@
+pkgs:
+
+pkgs.fetchFromGitHub {
+  owner = "wxHaskell";
+  repo = "wxHaskell";
+  rev = "152d1e0f4ead34d76240727fab87185bc0a89c0b";
+  sha256 = "sha256-JYYt1D71jj6BZK8l9tq8he26ZUxXc48TdNBXnm402Ao=";
+}
++
+"/wxc/package.nix"
