diff --git a/CHANGES b/CHANGES
new file mode 100644
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,60 @@
+# Changelog for HROOT
+
+## 0.10.0.1
+- Use hackage-version of fficxx (#18)
+- Generate docs in CI (#17)
+- Update flake.nix with recent fficxx and ormolu format (#16)
+- Update fficxx to support GHC 9.4 (#15)
+- Add TMutex and test multithreading with GUI (#12)
+- HROOT now uses common stdcxx (#11)
+- idealized gas simulation (#10)
+- Add TMarker and Range. Test 2D graphics using gas example (#9)
+- HROOT generation and packing via nix (#8)
+- Revive umbrella package generation (#7)
+- Static files (Config.hs, Setup.lhs) and custom-setup dependency (#6)
+- Modernize HROOT with fficxx 0.5.1 (#5)
+
+## 0.9.0.1
+
+## 0.9
+- HROOT-tree
+- HROOT only support ROOT > 6
+
+## 0.8
+- separate packages into HROOT-core, HROOT-hist, HROOT-io, HROOT-math, HROOT-graf and HROOT is now an umbrella package
+
+## 0.7
+- separate all class interfaces and implementation in different modules
+- overhaul Existential
+
+## 0.7.1
+- support for static methods
+- add TROOT
+
+## 0.6.9
+- implement almost all class methods of TLine, TAttLine, TAttMarker, TAttText and TAttPad
+
+## 0.6.8
+- implement almost all class methods of TH2, TH3, TFormula, TF1 and TGraph
+
+## 0.6.7
+- implement almost all TH1 class methods
+
+## 0.6.6
+- do not need OverlappingInstances, IncoherentInstances, UndecidableInstances
+
+## 0.6.4
+- add many TH2 class methods
+
+## 0.6.3
+- Implement Existential Types
+
+## 0.6
+- implement Deletable. delete method for every object
+- refactor HROOT generated file names (Interface.hs, Implementation.hs, FFI.hs)
+
+## 0.5.1
+- support for delete
+
+## 0.5.0
+- initial preview release
diff --git a/HROOT-net.cabal b/HROOT-net.cabal
new file mode 100644
--- /dev/null
+++ b/HROOT-net.cabal
@@ -0,0 +1,55 @@
+Cabal-version: 3.0
+Name:          HROOT-net
+Version:       0.10.0.1
+Synopsis:      Haskell binding to ROOT Net modules
+Description:
+  HROOT is a haskell Foreign Function Interface (FFI) binding to ROOT.
+  ROOT(http://root.cern.ch) is an object-oriented program and library
+  developed by CERN for physics data analysis.
+Homepage:      https://wavewave.github.io/HROOT
+license:       LGPL-2.1-or-later
+license-file:  LICENSE
+Author:        Ian-Woo Kim
+Maintainer:    Ian-Woo Kim <ianwookim@gmail.com>
+Category:      Graphics, Statistics, Math, Numerical
+Tested-with:   GHC == 9.0.2 || == 9.2.4 || == 9.4.2 
+Extra-source-files:
+  CHANGES
+  csrc/HROOTNetTHttpServer.h
+  csrc/HROOTNetTHttpServer.cpp
+Build-Type: Custom
+custom-setup
+  setup-depends: Cabal < 4, base > 4 && < 5, process
+
+Source-repository head
+  type:     git
+  location: https://github.com/wavewave/HROOT
+
+Library
+  default-language: Haskell2010
+  hs-source-dirs: src
+  ghc-options:  -Wall -funbox-strict-fields -fno-warn-unused-do-bind -fno-warn-orphans -fno-warn-unused-imports
+  cxx-options: -std=c++17
+  Build-Depends: base > 4 && < 5, fficxx >= 0.7, fficxx-runtime >= 0.7, template-haskell, stdcxx, HROOT-core == 0.10.0.1, HROOT-io == 0.10.0.1
+  Exposed-Modules:
+                       HROOT.Net
+                       HROOT.Net.Ordinary
+                       HROOT.Net.Template
+                       HROOT.Net.TH
+                       HROOT.Net.THttpServer
+                       HROOT.Net.THttpServer.RawType
+                       HROOT.Net.THttpServer.FFI
+                       HROOT.Net.THttpServer.Interface
+                       HROOT.Net.THttpServer.Cast
+                       HROOT.Net.THttpServer.Implementation
+  Other-Modules:
+  extra-lib-dirs: 
+  extra-libraries:    RHTTP
+  Include-dirs:       csrc 
+  pkgconfig-depends: 
+  Install-includes:
+                       HROOT-netType.h
+                       HROOTNetTHttpServer.h
+  Cxx-sources:
+                       csrc/HROOTNetTHttpServer.cpp
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,27 @@
+import Distribution.Simple
+import Distribution.Simple.Setup
+import Distribution.PackageDescription
+import Distribution.Simple.LocalBuildInfo
+import Config
+
+myconfigHook = simpleUserHooks { confHook = hookfunction }
+
+hookfunction x y = do
+  binfo <- confHook simpleUserHooks x y
+  r_pbi <- config binfo
+  let pkg_descr = localPkgDescr binfo
+
+  let newbinfo = case r_pbi of
+                   Just pbi ->  binfo { localPkgDescr = updatePackageDescription pbi pkg_descr }
+                   Nothing -> do
+                     let r_lib = library pkg_descr
+                     case r_lib of
+                       Just lib ->
+                         let binfo2 = libBuildInfo lib
+                             newlib = lib { libBuildInfo = binfo2 { cSources = [] }}
+                          in  binfo { localPkgDescr = pkg_descr { library = Just newlib }}
+                       Nothing -> error "some library setting is wrong."
+--   putStrLn (show (localPkgDescr newbinfo))
+  return newbinfo
+
+main = defaultMainWithHooks myconfigHook
diff --git a/csrc/HROOT-netType.h b/csrc/HROOT-netType.h
new file mode 100644
--- /dev/null
+++ b/csrc/HROOT-netType.h
@@ -0,0 +1,13 @@
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#pragma once
+
+// Opaque type definition for $classname
+typedef struct THttpServer_tag THttpServer_t;typedef THttpServer_t * THttpServer_p;typedef THttpServer_t const* const_THttpServer_p;
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/csrc/HROOTNetTHttpServer.cpp b/csrc/HROOTNetTHttpServer.cpp
new file mode 100644
--- /dev/null
+++ b/csrc/HROOTNetTHttpServer.cpp
@@ -0,0 +1,25 @@
+
+#include "MacroPatternMatch.h"
+
+#include "HROOTCoreTNamed.h"
+
+#include "THttpServer.h"
+
+#include "HROOTNetTHttpServer.h"
+
+using namespace ROOT;
+
+#define CHECKPROTECT(x,y) FXIS_PAREN(IS_ ## x ## _ ## y ## _PROTECTED)
+
+#define TYPECASTMETHOD(cname,mname,oname) \
+  FXIIF( CHECKPROTECT(cname,mname) ) ( \
+  (from_nonconst_to_nonconst<oname,cname ## _t>), \
+  (from_nonconst_to_nonconst<cname,cname ## _t>) )
+
+TNAMED_DEF_VIRT(THttpServer)
+TOBJECT_DEF_VIRT(THttpServer)
+DELETABLE_DEF_VIRT(THttpServer)
+THTTPSERVER_DEF_VIRT(THttpServer)
+THTTPSERVER_DEF_NONVIRT(THttpServer)
+THTTPSERVER_DEF_ACCESSOR(THttpServer)
+
diff --git a/csrc/HROOTNetTHttpServer.h b/csrc/HROOTNetTHttpServer.h
new file mode 100644
--- /dev/null
+++ b/csrc/HROOTNetTHttpServer.h
@@ -0,0 +1,61 @@
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#pragma once
+
+
+#include "HROOT-netType.h"
+
+#include "HROOTCoreTNamed.h"
+
+#include "HROOTCoreTObject.h"
+
+#include "STDDeletable.h"
+
+#include "HROOT-coreType.h"
+
+
+#define THTTPSERVER_DECL_VIRT(Type) \
+
+
+
+#define THTTPSERVER_DECL_NONVIRT(Type) \
+Type##_p Type##_newTHttpServer ( const char* engine );\
+void Type##_tHttpServer_SetReadOnly ( Type##_p p, bool readonly );
+
+
+#define THTTPSERVER_DECL_ACCESSOR(Type) \
+
+
+
+#define THTTPSERVER_DEF_VIRT(Type) \
+
+
+
+#define THTTPSERVER_DEF_NONVIRT(Type) \
+Type##_p Type##_newTHttpServer ( const char* engine ) {\
+Type* newp=new Type(engine);return from_nonconst_to_nonconst<Type##_t, Type>(newp);\
+}\
+\
+void Type##_tHttpServer_SetReadOnly ( Type##_p p, bool readonly ) {\
+((TYPECASTMETHOD(Type, tHttpServer_SetReadOnly, THttpServer))(p))->SetReadOnly(readonly);\
+}
+
+
+#define THTTPSERVER_DEF_ACCESSOR(Type) \
+
+
+
+TNAMED_DECL_VIRT(THttpServer)
+TOBJECT_DECL_VIRT(THttpServer)
+DELETABLE_DECL_VIRT(THttpServer)
+THTTPSERVER_DECL_VIRT(THttpServer)
+THTTPSERVER_DECL_NONVIRT(THttpServer)
+THTTPSERVER_DECL_ACCESSOR(THttpServer)
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/src/HROOT/Net.hs b/src/HROOT/Net.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE FlexibleContexts, FlexibleInstances,
+  ForeignFunctionInterface, InterruptibleFFI #-}
+module HROOT.Net
+       (module HROOT.Net.THttpServer, module HROOT.Net.Ordinary,
+        module HROOT.Net.Template, module HROOT.Net.TH)
+       where
+import HROOT.Net.THttpServer
+import HROOT.Net.Template
+import HROOT.Net.TH
+import HROOT.Net.Ordinary
diff --git a/src/HROOT/Net/Ordinary.hs b/src/HROOT/Net/Ordinary.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net/Ordinary.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE FlexibleContexts, FlexibleInstances,
+  ForeignFunctionInterface, InterruptibleFFI #-}
+module HROOT.Net.Ordinary () where
+import Foreign.C
+import Foreign.Ptr
+import FFICXX.Runtime.Cast
diff --git a/src/HROOT/Net/TH.hs b/src/HROOT/Net/TH.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net/TH.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE FlexibleContexts, FlexibleInstances,
+  ForeignFunctionInterface, InterruptibleFFI, TemplateHaskell #-}
+module HROOT.Net.TH () where
+import Data.Char
+import Data.List
+import Data.Monoid
+import Foreign.C.Types
+import Foreign.Ptr
+import Language.Haskell.TH
+import Language.Haskell.TH.Syntax
+import FFICXX.Runtime.CodeGen.Cxx
+import FFICXX.Runtime.TH
diff --git a/src/HROOT/Net/THttpServer.hs b/src/HROOT/Net/THttpServer.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net/THttpServer.hs
@@ -0,0 +1,7 @@
+module HROOT.Net.THttpServer
+       (THttpServer(..), ITHttpServer, upcastTHttpServer,
+        downcastTHttpServer, newTHttpServer, tHttpServer_SetReadOnly)
+       where
+import HROOT.Net.THttpServer.RawType
+import HROOT.Net.THttpServer.Interface
+import HROOT.Net.THttpServer.Implementation
diff --git a/src/HROOT/Net/THttpServer/Cast.hs b/src/HROOT/Net/THttpServer/Cast.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net/THttpServer/Cast.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE FlexibleInstances, FlexibleContexts, TypeFamilies,
+  MultiParamTypeClasses, OverlappingInstances, IncoherentInstances
+  #-}
+module HROOT.Net.THttpServer.Cast where
+import Foreign.Ptr
+import FFICXX.Runtime.Cast
+import System.IO.Unsafe
+import HROOT.Net.THttpServer.RawType
+import HROOT.Net.THttpServer.Interface
+
+instance (ITHttpServer a, FPtr a) =>
+         Castable (a) (Ptr RawTHttpServer)
+         where
+        cast x f = f (castPtr (get_fptr x))
+        uncast x f = f (cast_fptr_to_obj (castPtr x))
+
+instance () => Castable (THttpServer) (Ptr RawTHttpServer) where
+        cast x f = f (castPtr (get_fptr x))
+        uncast x f = f (cast_fptr_to_obj (castPtr x))
diff --git a/src/HROOT/Net/THttpServer/FFI.hsc b/src/HROOT/Net/THttpServer/FFI.hsc
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net/THttpServer/FFI.hsc
@@ -0,0 +1,77 @@
+{-# LANGUAGE ForeignFunctionInterface, InterruptibleFFI #-}
+module HROOT.Net.THttpServer.FFI where
+import Data.Word
+import Data.Int
+import Foreign.C
+import Foreign.Ptr
+import HROOT.Net.THttpServer.RawType
+import HROOT.Net.THttpServer.RawType
+import HROOT.Core.TObject.RawType
+import HROOT.Core.TClass.RawType
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_SetName" c_thttpserver_setname
+               :: Ptr RawTHttpServer -> CString -> IO ()
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_SetNameTitle"
+               c_thttpserver_setnametitle ::
+               Ptr RawTHttpServer -> CString -> CString -> IO ()
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_SetTitle" c_thttpserver_settitle
+               :: Ptr RawTHttpServer -> CString -> IO ()
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_Clear" c_thttpserver_clear ::
+               Ptr RawTHttpServer -> CString -> IO ()
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_Draw" c_thttpserver_draw ::
+               Ptr RawTHttpServer -> CString -> IO ()
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_FindObject"
+               c_thttpserver_findobject ::
+               Ptr RawTHttpServer -> CString -> IO (Ptr RawTObject)
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_GetName" c_thttpserver_getname
+               :: Ptr RawTHttpServer -> IO CString
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_IsA" c_thttpserver_isa ::
+               Ptr RawTHttpServer -> IO (Ptr RawTClass)
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_Paint" c_thttpserver_paint ::
+               Ptr RawTHttpServer -> CString -> IO ()
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_printObj" c_thttpserver_printobj
+               :: Ptr RawTHttpServer -> CString -> IO ()
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_SaveAs" c_thttpserver_saveas ::
+               Ptr RawTHttpServer -> CString -> CString -> IO ()
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_Write" c_thttpserver_write ::
+               Ptr RawTHttpServer -> CString -> CInt -> CInt -> IO CInt
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_Write_" c_thttpserver_write_ ::
+               Ptr RawTHttpServer -> IO CInt
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_delete" c_thttpserver_delete ::
+               Ptr RawTHttpServer -> IO ()
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_newTHttpServer"
+               c_thttpserver_newthttpserver :: CString -> IO (Ptr RawTHttpServer)
+
+foreign import ccall interruptible
+               "HROOTNetTHttpServer.h THttpServer_tHttpServer_SetReadOnly"
+               c_thttpserver_thttpserver_setreadonly ::
+               Ptr RawTHttpServer -> CBool -> IO ()
diff --git a/src/HROOT/Net/THttpServer/Implementation.hs b/src/HROOT/Net/THttpServer/Implementation.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net/THttpServer/Implementation.hs
@@ -0,0 +1,64 @@
+{-# LANGUAGE EmptyDataDecls, FlexibleContexts, FlexibleInstances,
+  ForeignFunctionInterface, IncoherentInstances,
+  MultiParamTypeClasses, OverlappingInstances, TemplateHaskell,
+  TypeFamilies, TypeSynonymInstances #-}
+module HROOT.Net.THttpServer.Implementation where
+import Data.Monoid
+import Data.Word
+import Data.Int
+import Foreign.C
+import Foreign.Ptr
+import Language.Haskell.TH
+import Language.Haskell.TH.Syntax
+import System.IO.Unsafe
+import FFICXX.Runtime.Cast
+import FFICXX.Runtime.CodeGen.Cxx
+import FFICXX.Runtime.TH
+import HROOT.Net.THttpServer.RawType
+import HROOT.Net.THttpServer.FFI
+import HROOT.Net.THttpServer.Interface
+import HROOT.Net.THttpServer.Cast
+import HROOT.Net.THttpServer.RawType
+import HROOT.Net.THttpServer.Cast
+import HROOT.Net.THttpServer.Interface
+import HROOT.Core.TClass.RawType
+import HROOT.Core.TClass.Cast
+import HROOT.Core.TClass.Interface
+import HROOT.Core.TNamed.RawType
+import HROOT.Core.TNamed.Cast
+import HROOT.Core.TNamed.Interface
+import HROOT.Core.TObject.RawType
+import HROOT.Core.TObject.Cast
+import HROOT.Core.TObject.Interface
+import STD.Deletable.RawType
+import STD.Deletable.Cast
+import STD.Deletable.Interface
+
+instance () => ITHttpServer (THttpServer) where
+
+instance () => ITNamed (THttpServer) where
+        setName = xform1 c_thttpserver_setname
+        setNameTitle = xform2 c_thttpserver_setnametitle
+        setTitle = xform1 c_thttpserver_settitle
+
+instance () => ITObject (THttpServer) where
+        clear = xform1 c_thttpserver_clear
+        draw = xform1 c_thttpserver_draw
+        findObject = xform1 c_thttpserver_findobject
+        getName = xform0 c_thttpserver_getname
+        isA = xform0 c_thttpserver_isa
+        paint = xform1 c_thttpserver_paint
+        printObj = xform1 c_thttpserver_printobj
+        saveAs = xform2 c_thttpserver_saveas
+        write = xform3 c_thttpserver_write
+        write_ = xform0 c_thttpserver_write_
+
+instance () => IDeletable (THttpServer) where
+        delete = xform0 c_thttpserver_delete
+
+newTHttpServer :: (Castable c0 CString) => c0 -> IO THttpServer
+newTHttpServer = xform0 c_thttpserver_newthttpserver
+
+tHttpServer_SetReadOnly :: () => THttpServer -> CBool -> IO ()
+tHttpServer_SetReadOnly
+  = xform1 c_thttpserver_thttpserver_setreadonly
diff --git a/src/HROOT/Net/THttpServer/Interface.hs b/src/HROOT/Net/THttpServer/Interface.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net/THttpServer/Interface.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE EmptyDataDecls, ExistentialQuantification,
+  FlexibleContexts, FlexibleInstances, ForeignFunctionInterface,
+  MultiParamTypeClasses, ScopedTypeVariables, TypeFamilies,
+  TypeSynonymInstances #-}
+module HROOT.Net.THttpServer.Interface where
+import Data.Word
+import Data.Int
+import Foreign.C
+import Foreign.Ptr
+import FFICXX.Runtime.Cast
+import HROOT.Net.THttpServer.RawType
+import HROOT.Core.TNamed.Interface
+
+class (ITNamed a) => ITHttpServer a where
+
+upcastTHttpServer ::
+                  forall a . (FPtr a, ITHttpServer a) => a -> THttpServer
+upcastTHttpServer h
+  = let fh = get_fptr h
+        fh2 :: Ptr RawTHttpServer = castPtr fh
+      in cast_fptr_to_obj fh2
+
+downcastTHttpServer ::
+                    forall a . (FPtr a, ITHttpServer a) => THttpServer -> a
+downcastTHttpServer h
+  = let fh = get_fptr h
+        fh2 = castPtr fh
+      in cast_fptr_to_obj fh2
diff --git a/src/HROOT/Net/THttpServer/RawType.hs b/src/HROOT/Net/THttpServer/RawType.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net/THttpServer/RawType.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE ForeignFunctionInterface, TypeFamilies,
+  MultiParamTypeClasses, FlexibleInstances, TypeSynonymInstances,
+  EmptyDataDecls, ExistentialQuantification, ScopedTypeVariables #-}
+module HROOT.Net.THttpServer.RawType where
+import Foreign.Ptr
+import FFICXX.Runtime.Cast
+
+data RawTHttpServer
+
+newtype THttpServer = THttpServer (Ptr RawTHttpServer)
+                        deriving (Eq, Ord, Show)
+
+instance () => FPtr (THttpServer) where
+        type Raw THttpServer = RawTHttpServer
+        get_fptr (THttpServer ptr) = ptr
+        cast_fptr_to_obj = THttpServer
diff --git a/src/HROOT/Net/Template.hs b/src/HROOT/Net/Template.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Net/Template.hs
@@ -0,0 +1,7 @@
+{-# LANGUAGE EmptyDataDecls, FlexibleInstances,
+  ForeignFunctionInterface, InterruptibleFFI, MultiParamTypeClasses,
+  TypeFamilies #-}
+module HROOT.Net.Template () where
+import Foreign.C.Types
+import Foreign.Ptr
+import FFICXX.Runtime.Cast
