diff --git a/CHANGES b/CHANGES
deleted file mode 100644
--- a/CHANGES
+++ /dev/null
@@ -1,39 +0,0 @@
-0.5.0: 31 Jul 2011
-   * initial preview release
-
-0.5.1: 3 Aug 2011
-   * support for delete 
-
-0.6: 16 Aug 2011
-   * implement Deletable. delete method for every object
-   * refactor HROOT generated file names (Interface.hs, Implementation.hs, FFI.hs) 
-
-0.6.3: 22 Sep 2011 
-   * Implement Existential Types 
-
-0.6.4: 28 Sep 2011 
-   * add many TH2 class methods
-
-0.6.6: 7 Oct 2011 
-   * do not need OverlappingInstances, IncoherentInstances, UndecidableInstances 
-
-
-0.6.7: 18 Oct 2011
-   * implement almost all TH1 class methods
-
-0.6.8: 20 Oct 2011
-   * implement almost all class methods of TH2, TH3, TFormula, TF1 and TGraph
-
-0.6.9: 20 Oct 2011 
-   * implement almost all class methods of TLine, TAttLine, TAttMarker, TAttText and TAttPad
-
-0.7 : 8 Nov 2011
-   * separate all class interfaces and implementation in different modules
-   * overhaul Existential 
-
-0.7.1 : 12 Nov 2011 
-   * support for static methods
-   * add TROOT
-
-0.8 : 17 Jun 2014
-   * separate packages into HROOT-core, HROOT-hist, HROOT-io, HROOT-math, HROOT-graf and HROOT is now an umbrella package
diff --git a/Config.hs b/Config.hs
deleted file mode 100644
--- a/Config.hs
+++ /dev/null
@@ -1,85 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-
-module Config where
- 
-import Distribution.Simple
-import Distribution.Simple.Setup
-import Distribution.PackageDescription
-import Distribution.Simple.LocalBuildInfo
-
-import System.Exit
-import System.Process
-
-config :: LocalBuildInfo -> IO (Maybe HookedBuildInfo)
-config bInfo = do 
-  (excode, out, err) <- readProcessWithExitCode "root-config" ["--glibs"] ""
-  liboptset' <- case excode of 
-                  ExitSuccess -> do  
-                    return . Just .  mkLibraryOptionSet . words $ out
-                  _ -> do 
-                    putStrLn $ "root-config failure but I am installing HROOT without ROOT. It will not work. This is only for documentation." 
-                    return Nothing              
-  (excode2,out2,err2) <- readProcessWithExitCode "root-config" ["--incdir"] ""
-  incdir' <- case excode2 of 
-               ExitSuccess -> do  
-                 return . Just . head . words $ out2
-               _ -> do 
-                 putStrLn $ "root-config failure but I am installing HROOT without ROOT. It will not work. This is only for documentation." 
-                 return Nothing
-  let Just lib = library . localPkgDescr $ bInfo
-      buildinfo = libBuildInfo lib
-  let (r :: Maybe HookedBuildInfo) = case liboptset' of 
-            Nothing -> Nothing
-            Just liboptset -> 
-              case incdir' of 
-                Nothing -> Nothing 
-                Just incdir -> 
-                  let hbi = emptyBuildInfo { extraLibs = extraLibs buildinfo 
-                                                         ++ libs liboptset
-                                           , extraLibDirs = libdirs liboptset 
-                                           , includeDirs = incdir : includeDirs buildinfo
-                                           }
-                  in Just (Just hbi, []) 
-  return r 
-
-
-data LibraryOptionSet = LibraryOptionSet { 
-  libs :: [String], 
-  libdirs :: [String], 
-  libopts :: [String]
-} deriving Show
-
-data LibraryOption = Lib String 
-                   | Dir String
-                   | Opt String 
-                   deriving Show
-
-mkLibraryOptionSet :: [String] -> LibraryOptionSet
-mkLibraryOptionSet strs = let opts = libraryOptions strs
-                          in  foldr f (LibraryOptionSet [] [] []) opts 
-  where f x (LibraryOptionSet l d o) = case x of
-                                         Lib st -> LibraryOptionSet (st:l) d o 
-                                         Dir st -> LibraryOptionSet l (st:d) o 
-                                         Opt st -> LibraryOptionSet l d (st:o) 
-
-libraryOptions :: [String] -> [LibraryOption] -- LibraryOptionSet 
-libraryOptions = map f 
-  where f x = let r = parseLibraryOptionClassifier x
-              in  case r of 
-                    Left msg -> error (show msg)
-                    Right result -> result
-
-
-parseLibraryOptionClassifier :: String -> Either String LibraryOption 
-parseLibraryOptionClassifier [] = Left "empty option"
-parseLibraryOptionClassifier str@(x:xs) = 
-  case x of
-    '-' -> if null xs 
-             then Left "parse error"
-             else let (y:ys) = xs
-                  in  case y of
-                        'L' -> Right (Dir ys)
-                        'l' -> Right (Lib ys)
-                        _ -> Right (Opt str)
-    _ -> Right (Opt str) 
-
diff --git a/HROOT-io.cabal b/HROOT-io.cabal
--- a/HROOT-io.cabal
+++ b/HROOT-io.cabal
@@ -1,19 +1,17 @@
-Name:		HROOT-io
-Version:	0.8
-Synopsis:	Haskell binding to ROOT IO 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.
+Name:                HROOT-io
+Version:     0.9
+Synopsis:    Haskell binding to ROOT IO 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:       http://ianwookim.org/HROOT
-License:        LGPL-2.1
-License-file:   LICENSE
-Author:		Ian-Woo Kim
-Maintainer: 	Ian-Woo Kim <ianwookim@gmail.com>
+license: LGPL-2.1
+license-file: LICENSE
+Author:              Ian-Woo Kim
+Maintainer:  Ian-Woo Kim <ianwookim@gmail.com>
 Category:       Graphics, Statistics, Math, Numerical
 Tested-with:    GHC >= 7.6
-Build-Type: 	Custom
+Build-Type:  Custom
 cabal-version:  >=1.10
-Extra-source-files: 
-                       CHANGES
-                       Config.hs
+Extra-source-files:
                        csrc/HROOTIOTDirectoryFile.h
                        csrc/HROOTIOTFile.h
                        csrc/HROOTIOTDirectoryFile.cpp
@@ -27,7 +25,8 @@
   hs-source-dirs: src
   ghc-options:  -Wall -funbox-strict-fields -fno-warn-unused-do-bind -fno-warn-orphans -fno-warn-unused-imports
   ghc-prof-options: -caf-all -auto-all
-  Build-Depends:      base>4 && < 5, fficxx-runtime >= 0.0.999 ,HROOT-core
+  cc-options: -std=c++14
+  Build-Depends:      base>4 && < 5, fficxx >= 0.3, fficxx-runtime >= 0.3, template-haskell,HROOT-core
   Exposed-Modules:
                        HROOT.IO
                        HROOT.IO.TDirectoryFile
@@ -42,22 +41,19 @@
                        HROOT.IO.TFile.Cast
                        HROOT.IO.TDirectoryFile.Implementation
                        HROOT.IO.TFile.Implementation
-  
+
   Other-Modules:
 
   extra-lib-dirs: 
   extra-libraries:    stdc++ 
-  Include-dirs:       csrc  
-  Install-includes:   
+  Include-dirs:       csrc 
+  Install-includes:
                        HROOT-ioType.h
                        HROOTIOTDirectoryFile.h
                        HROOTIOTFile.h
 
-  C-sources:          
+  C-sources:
                        csrc/HROOTIOTDirectoryFile.cpp
                        csrc/HROOTIOTFile.cpp
-
-
-   
 
 
diff --git a/csrc/HROOT-ioType.h b/csrc/HROOT-ioType.h
--- a/csrc/HROOT-ioType.h
+++ b/csrc/HROOT-ioType.h
@@ -10,13 +10,16 @@
 typedef TDirectoryFile_t * TDirectoryFile_p; 
 typedef TDirectoryFile_t const* const_TDirectoryFile_p; 
 
+
 // Opaque type definition for TFile 
 typedef struct TFile_tag TFile_t; 
 typedef TFile_t * TFile_p; 
 typedef TFile_t const* const_TFile_p; 
 
+
 #endif // __HROOT_IO__
 
 #ifdef __cplusplus
 }
 #endif
+
diff --git a/csrc/HROOTIOTDirectoryFile.cpp b/csrc/HROOTIOTDirectoryFile.cpp
--- a/csrc/HROOTIOTDirectoryFile.cpp
+++ b/csrc/HROOTIOTDirectoryFile.cpp
@@ -1,33 +1,10 @@
 #include <MacroPatternMatch.h>
-
 #include "HROOTCoreTDirectory.h"
 #include "TDirectoryFile.h"
 #include "HROOTIOTDirectoryFile.h"
 
-using namespace std;
 
 
-template<class ToType, class FromType>
-const ToType* to_const(const FromType* x) {
-  return reinterpret_cast<const ToType*>(x);
-}
-
-template<class ToType, class FromType>
-ToType* to_nonconst(FromType* x) {
-  return reinterpret_cast<ToType*>(x);
-}
-
-template<class ToType, class FromType>
-const ToType& to_constref(const FromType& x) {
-  return reinterpret_cast<const ToType&>(x);
-}
-
-template<class ToType, class FromType>
-ToType& to_nonconstref(FromType& x) {
-  return reinterpret_cast<ToType&>(x);
-}
-
-
 #define CHECKPROTECT(x,y) IS_PAREN(IS_ ## x ## _ ## y ## _PROTECTED)
 
 #define TYPECASTMETHOD(cname,mname,oname) \
@@ -44,5 +21,4 @@
 TDIRECTORYFILE_DEF_VIRT(TDirectoryFile)
 
 TDIRECTORYFILE_DEF_NONVIRT(TDirectoryFile)
-
 
diff --git a/csrc/HROOTIOTDirectoryFile.h b/csrc/HROOTIOTDirectoryFile.h
--- a/csrc/HROOTIOTDirectoryFile.h
+++ b/csrc/HROOTIOTDirectoryFile.h
@@ -1,23 +1,22 @@
 #ifdef __cplusplus
 extern "C" { 
-#endif 
+#endif
 
 #ifndef __HROOT_IO__TDirectoryFile__
 #define __HROOT_IO__TDirectoryFile__
 
 #include "HROOT-ioType.h"
-
 #include "HROOTCoreTDirectory.h"
 #include "HROOTCoreTNamed.h"
 #include "HROOTCoreTObject.h"
 #include "HROOTCoreDeletable.h"
 #include "HROOT-coreType.h"
 
-#undef TDIRECTORYFILE_DECL_VIRT
+#undef TDIRECTORYFILE_DECL_VIRT 
 #define TDIRECTORYFILE_DECL_VIRT(Type) \
 
 
-#undef TDIRECTORYFILE_DECL_NONVIRT
+#undef TDIRECTORYFILE_DECL_NONVIRT 
 #define TDIRECTORYFILE_DECL_NONVIRT(Type) \
 
 
@@ -46,3 +45,4 @@
 #ifdef __cplusplus
 }
 #endif
+
diff --git a/csrc/HROOTIOTFile.cpp b/csrc/HROOTIOTFile.cpp
--- a/csrc/HROOTIOTFile.cpp
+++ b/csrc/HROOTIOTFile.cpp
@@ -1,33 +1,10 @@
 #include <MacroPatternMatch.h>
-
 #include "HROOTIOTDirectoryFile.h"
 #include "TFile.h"
 #include "HROOTIOTFile.h"
 
-using namespace std;
 
 
-template<class ToType, class FromType>
-const ToType* to_const(const FromType* x) {
-  return reinterpret_cast<const ToType*>(x);
-}
-
-template<class ToType, class FromType>
-ToType* to_nonconst(FromType* x) {
-  return reinterpret_cast<ToType*>(x);
-}
-
-template<class ToType, class FromType>
-const ToType& to_constref(const FromType& x) {
-  return reinterpret_cast<const ToType&>(x);
-}
-
-template<class ToType, class FromType>
-ToType& to_nonconstref(FromType& x) {
-  return reinterpret_cast<ToType&>(x);
-}
-
-
 #define CHECKPROTECT(x,y) IS_PAREN(IS_ ## x ## _ ## y ## _PROTECTED)
 
 #define TYPECASTMETHOD(cname,mname,oname) \
@@ -45,5 +22,4 @@
 TFILE_DEF_VIRT(TFile)
 
 TFILE_DEF_NONVIRT(TFile)
-
 
diff --git a/csrc/HROOTIOTFile.h b/csrc/HROOTIOTFile.h
--- a/csrc/HROOTIOTFile.h
+++ b/csrc/HROOTIOTFile.h
@@ -1,23 +1,22 @@
 #ifdef __cplusplus
 extern "C" { 
-#endif 
+#endif
 
 #ifndef __HROOT_IO__TFile__
 #define __HROOT_IO__TFile__
 
 #include "HROOT-ioType.h"
-
 #include "HROOTIOTDirectoryFile.h"
 #include "HROOTCoreTDirectory.h"
 #include "HROOTCoreTNamed.h"
 #include "HROOTCoreTObject.h"
 #include "HROOTCoreDeletable.h"
 
-#undef TFILE_DECL_VIRT
+#undef TFILE_DECL_VIRT 
 #define TFILE_DECL_VIRT(Type) \
 
 
-#undef TFILE_DECL_NONVIRT
+#undef TFILE_DECL_NONVIRT 
 #define TFILE_DECL_NONVIRT(Type) \
 Type ## _p Type ## _newTFile ( const char* fname, const char* option, const char* ftitle, int compress )
 
@@ -51,3 +50,4 @@
 #ifdef __cplusplus
 }
 #endif
+
diff --git a/src/HROOT/IO.hs b/src/HROOT/IO.hs
--- a/src/HROOT/IO.hs
+++ b/src/HROOT/IO.hs
@@ -1,6 +1,6 @@
 module HROOT.IO (
-module HROOT.IO.TDirectoryFile
-, module HROOT.IO.TFile 
+  module HROOT.IO.TDirectoryFile
+, module HROOT.IO.TFile
 ) where
 
 import HROOT.IO.TDirectoryFile
diff --git a/src/HROOT/IO/TDirectoryFile.hs b/src/HROOT/IO/TDirectoryFile.hs
--- a/src/HROOT/IO/TDirectoryFile.hs
+++ b/src/HROOT/IO/TDirectoryFile.hs
@@ -1,15 +1,7 @@
 module HROOT.IO.TDirectoryFile
-  (
-    TDirectoryFile(..)
-  , ITDirectoryFile
-  , upcastTDirectoryFile
-  , downcastTDirectoryFile
-
- 
-  ) where
-
+       (TDirectoryFile(..), ITDirectoryFile, upcastTDirectoryFile,
+        downcastTDirectoryFile)
+       where
 import HROOT.IO.TDirectoryFile.RawType
 import HROOT.IO.TDirectoryFile.Interface
 import HROOT.IO.TDirectoryFile.Implementation
-
-
diff --git a/src/HROOT/IO/TDirectoryFile/Cast.hs b/src/HROOT/IO/TDirectoryFile/Cast.hs
--- a/src/HROOT/IO/TDirectoryFile/Cast.hs
+++ b/src/HROOT/IO/TDirectoryFile/Cast.hs
@@ -1,22 +1,18 @@
-{-# LANGUAGE FlexibleInstances, FlexibleContexts, TypeFamilies, 
-             MultiParamTypeClasses, OverlappingInstances, IncoherentInstances #-}
-
+{-# LANGUAGE FlexibleInstances, FlexibleContexts, TypeFamilies,
+  MultiParamTypeClasses, OverlappingInstances, IncoherentInstances
+  #-}
 module HROOT.IO.TDirectoryFile.Cast where
-
-
 import Foreign.Ptr
-import Foreign.ForeignPtr (castForeignPtr, newForeignPtr_)
-import Foreign.ForeignPtr.Unsafe
 import FFICXX.Runtime.Cast
 import System.IO.Unsafe
-
 import HROOT.IO.TDirectoryFile.RawType
 import HROOT.IO.TDirectoryFile.Interface
 
-instance (ITDirectoryFile a, FPtr a) => Castable a (Ptr RawTDirectoryFile) where
-  cast = unsafeForeignPtrToPtr . castForeignPtr . get_fptr
-  uncast = cast_fptr_to_obj . castForeignPtr . unsafePerformIO . newForeignPtr_ 
+instance (ITDirectoryFile a, FPtr a) => Castable a
+         (Ptr RawTDirectoryFile) where
+        cast x f = f (castPtr (get_fptr x))
+        uncast x f = f (cast_fptr_to_obj (castPtr x))
 
 instance Castable TDirectoryFile (Ptr RawTDirectoryFile) where
-  cast = unsafeForeignPtrToPtr . castForeignPtr . get_fptr
-  uncast = cast_fptr_to_obj . castForeignPtr . unsafePerformIO . newForeignPtr_ 
+        cast x f = f (castPtr (get_fptr x))
+        uncast x f = f (cast_fptr_to_obj (castPtr x))
diff --git a/src/HROOT/IO/TDirectoryFile/FFI.hsc b/src/HROOT/IO/TDirectoryFile/FFI.hsc
--- a/src/HROOT/IO/TDirectoryFile/FFI.hsc
+++ b/src/HROOT/IO/TDirectoryFile/FFI.hsc
@@ -1,75 +1,90 @@
 {-# LANGUAGE ForeignFunctionInterface #-}
-
--- module HROOT.Class.FFI where
-
 module HROOT.IO.TDirectoryFile.FFI where
-
-
-import Foreign.C            
+import Foreign.C
 import Foreign.Ptr
-
--- import HROOT.Class.Interface
-
--- #include ""
-
 import HROOT.IO.TDirectoryFile.RawType
 import HROOT.Core.TObject.RawType
 import HROOT.Core.TKey.RawType
 import HROOT.Core.TClass.RawType
 
-#include "HROOTIOTDirectoryFile.h"
-
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_Append" c_tdirectoryfile_append 
-  :: (Ptr RawTDirectoryFile) -> (Ptr RawTObject) -> CInt -> IO ()
-
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_addD" c_tdirectoryfile_addd 
-  :: (Ptr RawTDirectoryFile) -> (Ptr RawTObject) -> CInt -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_Append"
+               c_tdirectoryfile_append ::
+               Ptr RawTDirectoryFile -> Ptr RawTObject -> CInt -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_AppendKey" c_tdirectoryfile_appendkey 
-  :: (Ptr RawTDirectoryFile) -> (Ptr RawTKey) -> IO CInt
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_addD" c_tdirectoryfile_addd
+               :: Ptr RawTDirectoryFile -> Ptr RawTObject -> CInt -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_Close" c_tdirectoryfile_close 
-  :: (Ptr RawTDirectoryFile) -> CString -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_AppendKey"
+               c_tdirectoryfile_appendkey ::
+               Ptr RawTDirectoryFile -> Ptr RawTKey -> IO CInt
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_Get" c_tdirectoryfile_get 
-  :: (Ptr RawTDirectoryFile) -> CString -> IO (Ptr RawTObject)
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_Close"
+               c_tdirectoryfile_close :: Ptr RawTDirectoryFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_cd_TDirectory" c_tdirectoryfile_cd_tdirectory 
-  :: (Ptr RawTDirectoryFile) -> CString -> IO CInt
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_Get" c_tdirectoryfile_get
+               :: Ptr RawTDirectoryFile -> CString -> IO (Ptr RawTObject)
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_SetName" c_tdirectoryfile_setname 
-  :: (Ptr RawTDirectoryFile) -> CString -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_cd_TDirectory"
+               c_tdirectoryfile_cd_tdirectory ::
+               Ptr RawTDirectoryFile -> CString -> IO CInt
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_SetNameTitle" c_tdirectoryfile_setnametitle 
-  :: (Ptr RawTDirectoryFile) -> CString -> CString -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_SetName"
+               c_tdirectoryfile_setname ::
+               Ptr RawTDirectoryFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_SetTitle" c_tdirectoryfile_settitle 
-  :: (Ptr RawTDirectoryFile) -> CString -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_SetNameTitle"
+               c_tdirectoryfile_setnametitle ::
+               Ptr RawTDirectoryFile -> CString -> CString -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_Draw" c_tdirectoryfile_draw 
-  :: (Ptr RawTDirectoryFile) -> CString -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_SetTitle"
+               c_tdirectoryfile_settitle ::
+               Ptr RawTDirectoryFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_FindObject" c_tdirectoryfile_findobject 
-  :: (Ptr RawTDirectoryFile) -> CString -> IO (Ptr RawTObject)
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_Draw" c_tdirectoryfile_draw
+               :: Ptr RawTDirectoryFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_GetName" c_tdirectoryfile_getname 
-  :: (Ptr RawTDirectoryFile) -> IO CString
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_FindObject"
+               c_tdirectoryfile_findobject ::
+               Ptr RawTDirectoryFile -> CString -> IO (Ptr RawTObject)
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_IsA" c_tdirectoryfile_isa 
-  :: (Ptr RawTDirectoryFile) -> IO (Ptr RawTClass)
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_GetName"
+               c_tdirectoryfile_getname :: Ptr RawTDirectoryFile -> IO CString
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_Paint" c_tdirectoryfile_paint 
-  :: (Ptr RawTDirectoryFile) -> CString -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_IsA" c_tdirectoryfile_isa
+               :: Ptr RawTDirectoryFile -> IO (Ptr RawTClass)
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_printObj" c_tdirectoryfile_printobj 
-  :: (Ptr RawTDirectoryFile) -> CString -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_Paint"
+               c_tdirectoryfile_paint :: Ptr RawTDirectoryFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_SaveAs" c_tdirectoryfile_saveas 
-  :: (Ptr RawTDirectoryFile) -> CString -> CString -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_printObj"
+               c_tdirectoryfile_printobj ::
+               Ptr RawTDirectoryFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_Write" c_tdirectoryfile_write 
-  :: (Ptr RawTDirectoryFile) -> CString -> CInt -> CInt -> IO CInt
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_SaveAs"
+               c_tdirectoryfile_saveas ::
+               Ptr RawTDirectoryFile -> CString -> CString -> IO ()
 
-foreign import ccall "HROOTIOTDirectoryFile.h TDirectoryFile_delete" c_tdirectoryfile_delete 
-  :: (Ptr RawTDirectoryFile) -> IO ()
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_Write"
+               c_tdirectoryfile_write ::
+               Ptr RawTDirectoryFile -> CString -> CInt -> CInt -> IO CInt
 
+foreign import ccall safe
+               "HROOTIOTDirectoryFile.h TDirectoryFile_delete"
+               c_tdirectoryfile_delete :: Ptr RawTDirectoryFile -> IO ()
diff --git a/src/HROOT/IO/TDirectoryFile/Implementation.hs b/src/HROOT/IO/TDirectoryFile/Implementation.hs
--- a/src/HROOT/IO/TDirectoryFile/Implementation.hs
+++ b/src/HROOT/IO/TDirectoryFile/Implementation.hs
@@ -1,12 +1,13 @@
-{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
-             FlexibleInstances, TypeSynonymInstances, EmptyDataDecls, 
-             OverlappingInstances, IncoherentInstances #-}
-
+{-# LANGUAGE EmptyDataDecls, FlexibleContexts, FlexibleInstances,
+  ForeignFunctionInterface, IncoherentInstances,
+  MultiParamTypeClasses, OverlappingInstances, TypeFamilies,
+  TypeSynonymInstances #-}
 module HROOT.IO.TDirectoryFile.Implementation where
-
-
 import FFICXX.Runtime.Cast
-
+import Data.Word
+import Foreign.C
+import Foreign.Ptr
+import System.IO.Unsafe
 import HROOT.IO.TDirectoryFile.RawType
 import HROOT.IO.TDirectoryFile.FFI
 import HROOT.IO.TDirectoryFile.Interface
@@ -30,70 +31,30 @@
 import HROOT.Core.Deletable.Cast
 import HROOT.Core.Deletable.Interface
 
-import Data.Word
-import Foreign.C
-import Foreign.Ptr 
-import Foreign.ForeignPtr
-
-import System.IO.Unsafe
-
+instance ITDirectoryFile TDirectoryFile
 
-instance ITDirectoryFile TDirectoryFile where
 instance ITDirectory TDirectoryFile where
-  append = xform2 c_tdirectoryfile_append
-  addD = xform2 c_tdirectoryfile_addd
-  appendKey = xform1 c_tdirectoryfile_appendkey
-  close = xform1 c_tdirectoryfile_close
-  get = xform1 c_tdirectoryfile_get
-  cd_TDirectory = xform1 c_tdirectoryfile_cd_tdirectory
-instance ITNamed TDirectoryFile where
-  setName = xform1 c_tdirectoryfile_setname
-  setNameTitle = xform2 c_tdirectoryfile_setnametitle
-  setTitle = xform1 c_tdirectoryfile_settitle
-instance ITObject TDirectoryFile where
-  draw = xform1 c_tdirectoryfile_draw
-  findObject = xform1 c_tdirectoryfile_findobject
-  getName = xform0 c_tdirectoryfile_getname
-  isA = xform0 c_tdirectoryfile_isa
-  paint = xform1 c_tdirectoryfile_paint
-  printObj = xform1 c_tdirectoryfile_printobj
-  saveAs = xform2 c_tdirectoryfile_saveas
-  write = xform3 c_tdirectoryfile_write
-instance IDeletable TDirectoryFile where
-  delete = xform0 c_tdirectoryfile_delete
-
-instance ITDirectoryFile (Exist TDirectoryFile) where
-
-instance ITDirectory (Exist TDirectoryFile) where
-  append (ETDirectoryFile x) = append x
-  addD (ETDirectoryFile x) = addD x
-  appendKey (ETDirectoryFile x) = appendKey x
-  close (ETDirectoryFile x) = close x
-  get (ETDirectoryFile x) = get x
-  cd_TDirectory (ETDirectoryFile x) = cd_TDirectory x
-instance ITNamed (Exist TDirectoryFile) where
-  setName (ETDirectoryFile x) = setName x
-  setNameTitle (ETDirectoryFile x) = setNameTitle x
-  setTitle (ETDirectoryFile x) = setTitle x
-instance ITObject (Exist TDirectoryFile) where
-  draw (ETDirectoryFile x) = draw x
-  findObject (ETDirectoryFile x) = findObject x
-  getName (ETDirectoryFile x) = getName x
-  isA (ETDirectoryFile x) = isA x
-  paint (ETDirectoryFile x) = paint x
-  printObj (ETDirectoryFile x) = printObj x
-  saveAs (ETDirectoryFile x) = saveAs x
-  write (ETDirectoryFile x) = write x
-instance IDeletable (Exist TDirectoryFile) where
-  delete (ETDirectoryFile x) = delete x
-
-
-
-
+        append = xform2 c_tdirectoryfile_append
+        addD = xform2 c_tdirectoryfile_addd
+        appendKey = xform1 c_tdirectoryfile_appendkey
+        close = xform1 c_tdirectoryfile_close
+        get = xform1 c_tdirectoryfile_get
+        cd_TDirectory = xform1 c_tdirectoryfile_cd_tdirectory
 
+instance ITNamed TDirectoryFile where
+        setName = xform1 c_tdirectoryfile_setname
+        setNameTitle = xform2 c_tdirectoryfile_setnametitle
+        setTitle = xform1 c_tdirectoryfile_settitle
 
+instance ITObject TDirectoryFile where
+        draw = xform1 c_tdirectoryfile_draw
+        findObject = xform1 c_tdirectoryfile_findobject
+        getName = xform0 c_tdirectoryfile_getname
+        isA = xform0 c_tdirectoryfile_isa
+        paint = xform1 c_tdirectoryfile_paint
+        printObj = xform1 c_tdirectoryfile_printobj
+        saveAs = xform2 c_tdirectoryfile_saveas
+        write = xform3 c_tdirectoryfile_write
 
-instance FPtr (Exist TDirectoryFile) where
-  type Raw (Exist TDirectoryFile) = RawTDirectoryFile
-  get_fptr (ETDirectoryFile obj) = castForeignPtr (get_fptr obj)
-  cast_fptr_to_obj fptr = ETDirectoryFile (cast_fptr_to_obj (fptr :: ForeignPtr RawTDirectoryFile) :: TDirectoryFile)
+instance IDeletable TDirectoryFile where
+        delete = xform0 c_tdirectoryfile_delete
diff --git a/src/HROOT/IO/TDirectoryFile/Interface.hs b/src/HROOT/IO/TDirectoryFile/Interface.hs
--- a/src/HROOT/IO/TDirectoryFile/Interface.hs
+++ b/src/HROOT/IO/TDirectoryFile/Interface.hs
@@ -1,36 +1,27 @@
-{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
-             FlexibleInstances, TypeSynonymInstances, 
-             EmptyDataDecls, ExistentialQuantification, ScopedTypeVariables #-}
-
--- module HROOT.Class.Interface where
-
+{-# LANGUAGE EmptyDataDecls, ExistentialQuantification,
+  FlexibleContexts, FlexibleInstances, ForeignFunctionInterface,
+  MultiParamTypeClasses, ScopedTypeVariables, TypeFamilies,
+  TypeSynonymInstances #-}
 module HROOT.IO.TDirectoryFile.Interface where
-
-
 import Data.Word
 import Foreign.C
 import Foreign.Ptr
-import Foreign.ForeignPtr
 import FFICXX.Runtime.Cast
-
 import HROOT.IO.TDirectoryFile.RawType
-
 import HROOT.Core.TDirectory.Interface
----- ============ ----
 
-
-
-class (ITDirectory a) => ITDirectoryFile a where
-
-instance Existable TDirectoryFile where
-  data Exist TDirectoryFile = forall a. (FPtr a, ITDirectoryFile a) => ETDirectoryFile a
+class ITDirectory a => ITDirectoryFile a
 
-upcastTDirectoryFile :: (FPtr a, ITDirectoryFile a) => a -> TDirectoryFile
-upcastTDirectoryFile h = let fh = get_fptr h
-                             fh2 :: ForeignPtr RawTDirectoryFile = castForeignPtr fh
-                         in cast_fptr_to_obj fh2
+upcastTDirectoryFile ::
+                     forall a . (FPtr a, ITDirectoryFile a) => a -> TDirectoryFile
+upcastTDirectoryFile h
+  = let fh = get_fptr h
+        fh2 :: Ptr RawTDirectoryFile = castPtr fh
+      in cast_fptr_to_obj fh2
 
-downcastTDirectoryFile :: (FPtr a, ITDirectoryFile a) => TDirectoryFile -> a 
-downcastTDirectoryFile h = let fh = get_fptr h
-                               fh2 = castForeignPtr fh
-                           in cast_fptr_to_obj fh2
+downcastTDirectoryFile ::
+                       forall a . (FPtr a, ITDirectoryFile a) => TDirectoryFile -> a
+downcastTDirectoryFile h
+  = let fh = get_fptr h
+        fh2 = castPtr fh
+      in cast_fptr_to_obj fh2
diff --git a/src/HROOT/IO/TDirectoryFile/RawType.hs b/src/HROOT/IO/TDirectoryFile/RawType.hs
--- a/src/HROOT/IO/TDirectoryFile/RawType.hs
+++ b/src/HROOT/IO/TDirectoryFile/RawType.hs
@@ -1,16 +1,16 @@
-{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
-             FlexibleInstances, TypeSynonymInstances, 
-             EmptyDataDecls, ExistentialQuantification, ScopedTypeVariables #-}
-
+{-# LANGUAGE ForeignFunctionInterface, TypeFamilies,
+  MultiParamTypeClasses, FlexibleInstances, TypeSynonymInstances,
+  EmptyDataDecls, ExistentialQuantification, ScopedTypeVariables #-}
 module HROOT.IO.TDirectoryFile.RawType where
+import Foreign.Ptr
+import FFICXX.Runtime.Cast
 
+data RawTDirectoryFile
 
-import Foreign.ForeignPtr
-import FFICXX.Runtime.Cast  
+newtype TDirectoryFile = TDirectoryFile (Ptr RawTDirectoryFile)
+                       deriving (Eq, Ord, Show)
 
-data RawTDirectoryFile
-newtype TDirectoryFile = TDirectoryFile (ForeignPtr RawTDirectoryFile) deriving (Eq, Ord, Show)
 instance FPtr TDirectoryFile where
-   type Raw TDirectoryFile = RawTDirectoryFile
-   get_fptr (TDirectoryFile fptr) = fptr
-   cast_fptr_to_obj = TDirectoryFile
+        type Raw TDirectoryFile = RawTDirectoryFile
+        get_fptr (TDirectoryFile ptr) = ptr
+        cast_fptr_to_obj = TDirectoryFile
diff --git a/src/HROOT/IO/TFile.hs b/src/HROOT/IO/TFile.hs
--- a/src/HROOT/IO/TFile.hs
+++ b/src/HROOT/IO/TFile.hs
@@ -1,15 +1,5 @@
 module HROOT.IO.TFile
-  (
-    TFile(..)
-  , ITFile
-  , upcastTFile
-  , downcastTFile
-  , newTFile
- 
-  ) where
-
+       (TFile(..), ITFile, upcastTFile, downcastTFile, newTFile) where
 import HROOT.IO.TFile.RawType
 import HROOT.IO.TFile.Interface
 import HROOT.IO.TFile.Implementation
-
-
diff --git a/src/HROOT/IO/TFile/Cast.hs b/src/HROOT/IO/TFile/Cast.hs
--- a/src/HROOT/IO/TFile/Cast.hs
+++ b/src/HROOT/IO/TFile/Cast.hs
@@ -1,22 +1,17 @@
-{-# LANGUAGE FlexibleInstances, FlexibleContexts, TypeFamilies, 
-             MultiParamTypeClasses, OverlappingInstances, IncoherentInstances #-}
-
+{-# LANGUAGE FlexibleInstances, FlexibleContexts, TypeFamilies,
+  MultiParamTypeClasses, OverlappingInstances, IncoherentInstances
+  #-}
 module HROOT.IO.TFile.Cast where
-
-
 import Foreign.Ptr
-import Foreign.ForeignPtr (castForeignPtr, newForeignPtr_)
-import Foreign.ForeignPtr.Unsafe
 import FFICXX.Runtime.Cast
 import System.IO.Unsafe
-
 import HROOT.IO.TFile.RawType
 import HROOT.IO.TFile.Interface
 
 instance (ITFile a, FPtr a) => Castable a (Ptr RawTFile) where
-  cast = unsafeForeignPtrToPtr . castForeignPtr . get_fptr
-  uncast = cast_fptr_to_obj . castForeignPtr . unsafePerformIO . newForeignPtr_ 
+        cast x f = f (castPtr (get_fptr x))
+        uncast x f = f (cast_fptr_to_obj (castPtr x))
 
 instance Castable TFile (Ptr RawTFile) where
-  cast = unsafeForeignPtrToPtr . castForeignPtr . get_fptr
-  uncast = cast_fptr_to_obj . castForeignPtr . unsafePerformIO . newForeignPtr_ 
+        cast x f = f (castPtr (get_fptr x))
+        uncast x f = f (cast_fptr_to_obj (castPtr x))
diff --git a/src/HROOT/IO/TFile/FFI.hsc b/src/HROOT/IO/TFile/FFI.hsc
--- a/src/HROOT/IO/TFile/FFI.hsc
+++ b/src/HROOT/IO/TFile/FFI.hsc
@@ -1,78 +1,67 @@
 {-# LANGUAGE ForeignFunctionInterface #-}
-
--- module HROOT.Class.FFI where
-
 module HROOT.IO.TFile.FFI where
-
-
-import Foreign.C            
+import Foreign.C
 import Foreign.Ptr
-
--- import HROOT.Class.Interface
-
--- #include ""
-
 import HROOT.IO.TFile.RawType
 import HROOT.Core.TObject.RawType
 import HROOT.Core.TKey.RawType
 import HROOT.Core.TClass.RawType
 
-#include "HROOTIOTFile.h"
-
-foreign import ccall "HROOTIOTFile.h TFile_Append" c_tfile_append 
-  :: (Ptr RawTFile) -> (Ptr RawTObject) -> CInt -> IO ()
-
-foreign import ccall "HROOTIOTFile.h TFile_addD" c_tfile_addd 
-  :: (Ptr RawTFile) -> (Ptr RawTObject) -> CInt -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_Append"
+               c_tfile_append :: Ptr RawTFile -> Ptr RawTObject -> CInt -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_AppendKey" c_tfile_appendkey 
-  :: (Ptr RawTFile) -> (Ptr RawTKey) -> IO CInt
+foreign import ccall safe "HROOTIOTFile.h TFile_addD" c_tfile_addd
+               :: Ptr RawTFile -> Ptr RawTObject -> CInt -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_Close" c_tfile_close 
-  :: (Ptr RawTFile) -> CString -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_AppendKey"
+               c_tfile_appendkey :: Ptr RawTFile -> Ptr RawTKey -> IO CInt
 
-foreign import ccall "HROOTIOTFile.h TFile_Get" c_tfile_get 
-  :: (Ptr RawTFile) -> CString -> IO (Ptr RawTObject)
+foreign import ccall safe "HROOTIOTFile.h TFile_Close"
+               c_tfile_close :: Ptr RawTFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_cd_TDirectory" c_tfile_cd_tdirectory 
-  :: (Ptr RawTFile) -> CString -> IO CInt
+foreign import ccall safe "HROOTIOTFile.h TFile_Get" c_tfile_get ::
+               Ptr RawTFile -> CString -> IO (Ptr RawTObject)
 
-foreign import ccall "HROOTIOTFile.h TFile_SetName" c_tfile_setname 
-  :: (Ptr RawTFile) -> CString -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_cd_TDirectory"
+               c_tfile_cd_tdirectory :: Ptr RawTFile -> CString -> IO CInt
 
-foreign import ccall "HROOTIOTFile.h TFile_SetNameTitle" c_tfile_setnametitle 
-  :: (Ptr RawTFile) -> CString -> CString -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_SetName"
+               c_tfile_setname :: Ptr RawTFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_SetTitle" c_tfile_settitle 
-  :: (Ptr RawTFile) -> CString -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_SetNameTitle"
+               c_tfile_setnametitle :: Ptr RawTFile -> CString -> CString -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_Draw" c_tfile_draw 
-  :: (Ptr RawTFile) -> CString -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_SetTitle"
+               c_tfile_settitle :: Ptr RawTFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_FindObject" c_tfile_findobject 
-  :: (Ptr RawTFile) -> CString -> IO (Ptr RawTObject)
+foreign import ccall safe "HROOTIOTFile.h TFile_Draw" c_tfile_draw
+               :: Ptr RawTFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_GetName" c_tfile_getname 
-  :: (Ptr RawTFile) -> IO CString
+foreign import ccall safe "HROOTIOTFile.h TFile_FindObject"
+               c_tfile_findobject ::
+               Ptr RawTFile -> CString -> IO (Ptr RawTObject)
 
-foreign import ccall "HROOTIOTFile.h TFile_IsA" c_tfile_isa 
-  :: (Ptr RawTFile) -> IO (Ptr RawTClass)
+foreign import ccall safe "HROOTIOTFile.h TFile_GetName"
+               c_tfile_getname :: Ptr RawTFile -> IO CString
 
-foreign import ccall "HROOTIOTFile.h TFile_Paint" c_tfile_paint 
-  :: (Ptr RawTFile) -> CString -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_IsA" c_tfile_isa ::
+               Ptr RawTFile -> IO (Ptr RawTClass)
 
-foreign import ccall "HROOTIOTFile.h TFile_printObj" c_tfile_printobj 
-  :: (Ptr RawTFile) -> CString -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_Paint"
+               c_tfile_paint :: Ptr RawTFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_SaveAs" c_tfile_saveas 
-  :: (Ptr RawTFile) -> CString -> CString -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_printObj"
+               c_tfile_printobj :: Ptr RawTFile -> CString -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_Write" c_tfile_write 
-  :: (Ptr RawTFile) -> CString -> CInt -> CInt -> IO CInt
+foreign import ccall safe "HROOTIOTFile.h TFile_SaveAs"
+               c_tfile_saveas :: Ptr RawTFile -> CString -> CString -> IO ()
 
-foreign import ccall "HROOTIOTFile.h TFile_delete" c_tfile_delete 
-  :: (Ptr RawTFile) -> IO ()
+foreign import ccall safe "HROOTIOTFile.h TFile_Write"
+               c_tfile_write :: Ptr RawTFile -> CString -> CInt -> CInt -> IO CInt
 
-foreign import ccall "HROOTIOTFile.h TFile_newTFile" c_tfile_newtfile 
-  :: CString -> CString -> CString -> CInt -> IO (Ptr RawTFile)
+foreign import ccall safe "HROOTIOTFile.h TFile_delete"
+               c_tfile_delete :: Ptr RawTFile -> IO ()
 
+foreign import ccall safe "HROOTIOTFile.h TFile_newTFile"
+               c_tfile_newtfile ::
+               CString -> CString -> CString -> CInt -> IO (Ptr RawTFile)
diff --git a/src/HROOT/IO/TFile/Implementation.hs b/src/HROOT/IO/TFile/Implementation.hs
--- a/src/HROOT/IO/TFile/Implementation.hs
+++ b/src/HROOT/IO/TFile/Implementation.hs
@@ -1,12 +1,13 @@
-{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
-             FlexibleInstances, TypeSynonymInstances, EmptyDataDecls, 
-             OverlappingInstances, IncoherentInstances #-}
-
+{-# LANGUAGE EmptyDataDecls, FlexibleContexts, FlexibleInstances,
+  ForeignFunctionInterface, IncoherentInstances,
+  MultiParamTypeClasses, OverlappingInstances, TypeFamilies,
+  TypeSynonymInstances #-}
 module HROOT.IO.TFile.Implementation where
-
-
 import FFICXX.Runtime.Cast
-
+import Data.Word
+import Foreign.C
+import Foreign.Ptr
+import System.IO.Unsafe
 import HROOT.IO.TFile.RawType
 import HROOT.IO.TFile.FFI
 import HROOT.IO.TFile.Interface
@@ -33,75 +34,37 @@
 import HROOT.Core.Deletable.Cast
 import HROOT.Core.Deletable.Interface
 
-import Data.Word
-import Foreign.C
-import Foreign.Ptr 
-import Foreign.ForeignPtr
-
-import System.IO.Unsafe
+instance ITFile TFile
 
+instance ITDirectoryFile TFile
 
-instance ITFile TFile where
-instance ITDirectoryFile TFile where
 instance ITDirectory TFile where
-  append = xform2 c_tfile_append
-  addD = xform2 c_tfile_addd
-  appendKey = xform1 c_tfile_appendkey
-  close = xform1 c_tfile_close
-  get = xform1 c_tfile_get
-  cd_TDirectory = xform1 c_tfile_cd_tdirectory
-instance ITNamed TFile where
-  setName = xform1 c_tfile_setname
-  setNameTitle = xform2 c_tfile_setnametitle
-  setTitle = xform1 c_tfile_settitle
-instance ITObject TFile where
-  draw = xform1 c_tfile_draw
-  findObject = xform1 c_tfile_findobject
-  getName = xform0 c_tfile_getname
-  isA = xform0 c_tfile_isa
-  paint = xform1 c_tfile_paint
-  printObj = xform1 c_tfile_printobj
-  saveAs = xform2 c_tfile_saveas
-  write = xform3 c_tfile_write
-instance IDeletable TFile where
-  delete = xform0 c_tfile_delete
-
-instance ITFile (Exist TFile) where
+        append = xform2 c_tfile_append
+        addD = xform2 c_tfile_addd
+        appendKey = xform1 c_tfile_appendkey
+        close = xform1 c_tfile_close
+        get = xform1 c_tfile_get
+        cd_TDirectory = xform1 c_tfile_cd_tdirectory
 
-instance ITDirectoryFile (Exist TFile) where
+instance ITNamed TFile where
+        setName = xform1 c_tfile_setname
+        setNameTitle = xform2 c_tfile_setnametitle
+        setTitle = xform1 c_tfile_settitle
 
-instance ITDirectory (Exist TFile) where
-  append (ETFile x) = append x
-  addD (ETFile x) = addD x
-  appendKey (ETFile x) = appendKey x
-  close (ETFile x) = close x
-  get (ETFile x) = get x
-  cd_TDirectory (ETFile x) = cd_TDirectory x
-instance ITNamed (Exist TFile) where
-  setName (ETFile x) = setName x
-  setNameTitle (ETFile x) = setNameTitle x
-  setTitle (ETFile x) = setTitle x
-instance ITObject (Exist TFile) where
-  draw (ETFile x) = draw x
-  findObject (ETFile x) = findObject x
-  getName (ETFile x) = getName x
-  isA (ETFile x) = isA x
-  paint (ETFile x) = paint x
-  printObj (ETFile x) = printObj x
-  saveAs (ETFile x) = saveAs x
-  write (ETFile x) = write x
-instance IDeletable (Exist TFile) where
-  delete (ETFile x) = delete x
+instance ITObject TFile where
+        draw = xform1 c_tfile_draw
+        findObject = xform1 c_tfile_findobject
+        getName = xform0 c_tfile_getname
+        isA = xform0 c_tfile_isa
+        paint = xform1 c_tfile_paint
+        printObj = xform1 c_tfile_printobj
+        saveAs = xform2 c_tfile_saveas
+        write = xform3 c_tfile_write
 
+instance IDeletable TFile where
+        delete = xform0 c_tfile_delete
 
-newTFile :: CString -> CString -> CString -> CInt -> IO TFile
+newTFile ::
+           (Castable c2 CString, Castable c1 CString, Castable c0 CString) =>
+           c0 -> c1 -> c2 -> CInt -> IO TFile
 newTFile = xform3 c_tfile_newtfile
-
-
-
-
-
-instance FPtr (Exist TFile) where
-  type Raw (Exist TFile) = RawTFile
-  get_fptr (ETFile obj) = castForeignPtr (get_fptr obj)
-  cast_fptr_to_obj fptr = ETFile (cast_fptr_to_obj (fptr :: ForeignPtr RawTFile) :: TFile)
diff --git a/src/HROOT/IO/TFile/Interface.hs b/src/HROOT/IO/TFile/Interface.hs
--- a/src/HROOT/IO/TFile/Interface.hs
+++ b/src/HROOT/IO/TFile/Interface.hs
@@ -1,36 +1,25 @@
-{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
-             FlexibleInstances, TypeSynonymInstances, 
-             EmptyDataDecls, ExistentialQuantification, ScopedTypeVariables #-}
-
--- module HROOT.Class.Interface where
-
+{-# LANGUAGE EmptyDataDecls, ExistentialQuantification,
+  FlexibleContexts, FlexibleInstances, ForeignFunctionInterface,
+  MultiParamTypeClasses, ScopedTypeVariables, TypeFamilies,
+  TypeSynonymInstances #-}
 module HROOT.IO.TFile.Interface where
-
-
 import Data.Word
 import Foreign.C
 import Foreign.Ptr
-import Foreign.ForeignPtr
 import FFICXX.Runtime.Cast
-
 import HROOT.IO.TFile.RawType
-
 import HROOT.IO.TDirectoryFile.Interface
----- ============ ----
 
-
-
-class (ITDirectoryFile a) => ITFile a where
-
-instance Existable TFile where
-  data Exist TFile = forall a. (FPtr a, ITFile a) => ETFile a
+class ITDirectoryFile a => ITFile a
 
-upcastTFile :: (FPtr a, ITFile a) => a -> TFile
-upcastTFile h = let fh = get_fptr h
-                    fh2 :: ForeignPtr RawTFile = castForeignPtr fh
-                in cast_fptr_to_obj fh2
+upcastTFile :: forall a . (FPtr a, ITFile a) => a -> TFile
+upcastTFile h
+  = let fh = get_fptr h
+        fh2 :: Ptr RawTFile = castPtr fh
+      in cast_fptr_to_obj fh2
 
-downcastTFile :: (FPtr a, ITFile a) => TFile -> a 
-downcastTFile h = let fh = get_fptr h
-                      fh2 = castForeignPtr fh
-                  in cast_fptr_to_obj fh2
+downcastTFile :: forall a . (FPtr a, ITFile a) => TFile -> a
+downcastTFile h
+  = let fh = get_fptr h
+        fh2 = castPtr fh
+      in cast_fptr_to_obj fh2
diff --git a/src/HROOT/IO/TFile/RawType.hs b/src/HROOT/IO/TFile/RawType.hs
--- a/src/HROOT/IO/TFile/RawType.hs
+++ b/src/HROOT/IO/TFile/RawType.hs
@@ -1,16 +1,16 @@
-{-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
-             FlexibleInstances, TypeSynonymInstances, 
-             EmptyDataDecls, ExistentialQuantification, ScopedTypeVariables #-}
-
+{-# LANGUAGE ForeignFunctionInterface, TypeFamilies,
+  MultiParamTypeClasses, FlexibleInstances, TypeSynonymInstances,
+  EmptyDataDecls, ExistentialQuantification, ScopedTypeVariables #-}
 module HROOT.IO.TFile.RawType where
+import Foreign.Ptr
+import FFICXX.Runtime.Cast
 
+data RawTFile
 
-import Foreign.ForeignPtr
-import FFICXX.Runtime.Cast  
+newtype TFile = TFile (Ptr RawTFile)
+              deriving (Eq, Ord, Show)
 
-data RawTFile
-newtype TFile = TFile (ForeignPtr RawTFile) deriving (Eq, Ord, Show)
 instance FPtr TFile where
-   type Raw TFile = RawTFile
-   get_fptr (TFile fptr) = fptr
-   cast_fptr_to_obj = TFile
+        type Raw TFile = RawTFile
+        get_fptr (TFile ptr) = ptr
+        cast_fptr_to_obj = TFile
