diff --git a/HROOT.cabal b/HROOT.cabal
--- a/HROOT.cabal
+++ b/HROOT.cabal
@@ -1,5 +1,5 @@
 Name:		HROOT
-Version:	0.6.3
+Version:	0.6.4
 Synopsis:	Wrapper for ROOT
 Description: 	Haskell FFI binding for ROOT  
 Homepage:       http://ianwookim.org/HROOT
@@ -10,7 +10,7 @@
 Category:       Graphics
 Tested-with:    GHC >= 7.0.2 && <= 7.0.3
 Build-Type: 	Custom
-cabal-version:  >=1.6
+cabal-version:  >=1.10
 Extra-source-files: CHANGES
                     Config.hs
                     csrc/HROOT.h
@@ -20,12 +20,20 @@
                     example/random2d.hs
                     example/random2dApp.hs
                     example/saveAsROOT.hs
+                    test/compiletest.hs
 Source-repository head
   type:     darcs
   location: http://ianwookim.org/public/repo/HROOT
 
+-- Test-Suite compiletest
+--   default-language: Haskell2010
+--   type: exitcode-stdio-1.0
+--   main-is: compiletest.hs
+--   build-depends: base>4, base<5, HROOT==0.6.4
+--   hs-source-dirs: test
 
 Library
+  default-language: Haskell2010
   hs-source-dirs: src
   ghc-options:  -Wall -funbox-strict-fields -fno-warn-unused-do-bind -fno-warn-orphans
   ghc-prof-options: -caf-all -auto-all
@@ -128,6 +136,9 @@
                        HROOT.Class.TH2Poly
                        HROOT.Class.TH2S
                        HROOT.Class.TH3C
+                       HROOT.Class.TCollection
+                       HROOT.Class.TSeqCollection
+                       HROOT.Class.TObjArray
   
 
 --                      HROOT
@@ -137,7 +148,7 @@
 --                      HROOT.AddOn
 --                      HROOT.AddOnFunction
   extra-libraries:    stdc++
-  Extensions:	      ForeignFunctionInterface
+-- default-extensions:	      ForeignFunctionInterface
   Include-dirs:       csrc
   Install-includes:   HROOT.h
                       addon.h
diff --git a/csrc/HROOT.cpp b/csrc/HROOT.cpp
--- a/csrc/HROOT.cpp
+++ b/csrc/HROOT.cpp
@@ -130,7 +130,12 @@
 #include "TRint.h"
 
 #include "TRandom.h"
+#include "TProfile.h"
+#include "TCollection.h"
+#include "TSeqCollection.h"
+#include "TObjArray.h"
 
+
 using namespace std;
 
 
@@ -740,6 +745,90 @@
 int  Type ## _fill2 ( Type ## _p p, double x, double y )\
 {\
 return to_nonconst<Type,Type ## _t>(p)->Fill(x, y);\
+}\
+void Type ## _fillRandom2 ( Type ## _p p, TH1_p h, int  ntimes )\
+{\
+to_nonconst<Type,Type ## _t>(p)->FillRandom(to_nonconst<TH1,TH1_t>(h), ntimes);\
+}\
+int  Type ## _findFirstBinAbove2 ( Type ## _p p, double threshold, int  axis )\
+{\
+return to_nonconst<Type,Type ## _t>(p)->FindFirstBinAbove(threshold, axis);\
+}\
+int  Type ## _findLastBinAbove2 ( Type ## _p p, double threshold, int  axis )\
+{\
+return to_nonconst<Type,Type ## _t>(p)->FindLastBinAbove(threshold, axis);\
+}\
+void Type ## _FitSlicesX ( Type ## _p p, TF1_p f1, int  firstybin, int  lastybin, int  cut, const char * option, TObjArray_p arr )\
+{\
+to_nonconst<Type,Type ## _t>(p)->FitSlicesX(to_nonconst<TF1,TF1_t>(f1), firstybin, lastybin, cut, option, to_nonconst<TObjArray,TObjArray_t>(arr));\
+}\
+void Type ## _FitSlicesY ( Type ## _p p, TF1_p f1, int  firstxbin, int  lastxbin, int  cut, const char * option, TObjArray_p arr )\
+{\
+to_nonconst<Type,Type ## _t>(p)->FitSlicesY(to_nonconst<TF1,TF1_t>(f1), firstxbin, lastxbin, cut, option, to_nonconst<TObjArray,TObjArray_t>(arr));\
+}\
+double Type ## _GetCorrelationFactor ( Type ## _p p, int  axis1, int  axis2 )\
+{\
+return to_nonconst<Type,Type ## _t>(p)->GetCorrelationFactor(axis1, axis2);\
+}\
+double Type ## _GetCovariance ( Type ## _p p, int  axis1, int  axis2 )\
+{\
+return to_nonconst<Type,Type ## _t>(p)->GetCovariance(axis1, axis2);\
+}\
+void Type ## _GetStats ( Type ## _p p, double * stats )\
+{\
+to_nonconst<Type,Type ## _t>(p)->GetStats(stats);\
+}\
+double Type ## _Integral ( Type ## _p p, int  binx1, int  binx2, int  biny1, int  biny2, const char * option )\
+{\
+return to_nonconst<Type,Type ## _t>(p)->Integral(binx1, binx2, biny1, biny2, option);\
+}\
+double Type ## _Interpolate ( Type ## _p p, double x, double y, double z )\
+{\
+return to_nonconst<Type,Type ## _t>(p)->Interpolate(x, y, z);\
+}\
+double Type ## _KolmogorovTest ( Type ## _p p, TH1_p h2, const char * option )\
+{\
+return to_nonconst<Type,Type ## _t>(p)->KolmogorovTest(to_nonconst<TH1,TH1_t>(h2), option);\
+}\
+TH2_p Type ## _RebinX ( Type ## _p p, int  ngroup, const char * newname )\
+{\
+return to_nonconst<TH2_t,TH2>((TH2*)to_nonconst<Type,Type ## _t>(p)->RebinX(ngroup, newname));\
+}\
+TH2_p Type ## _RebinY ( Type ## _p p, int  ngroup, const char * newname )\
+{\
+return to_nonconst<TH2_t,TH2>((TH2*)to_nonconst<Type,Type ## _t>(p)->RebinY(ngroup, newname));\
+}\
+TH2_p Type ## _Rebin2D ( Type ## _p p, int  nxgroup, int  nygroup, const char * newname )\
+{\
+return to_nonconst<TH2_t,TH2>((TH2*)to_nonconst<Type,Type ## _t>(p)->Rebin2D(nxgroup, nygroup, newname));\
+}\
+void Type ## _PutStats ( Type ## _p p, double * stats )\
+{\
+to_nonconst<Type,Type ## _t>(p)->PutStats(stats);\
+}\
+void Type ## _Reset ( Type ## _p p, const char * option )\
+{\
+to_nonconst<Type,Type ## _t>(p)->Reset(option);\
+}\
+void Type ## _SetShowProjectionX ( Type ## _p p, int  nbins )\
+{\
+to_nonconst<Type,Type ## _t>(p)->SetShowProjectionX(nbins);\
+}\
+void Type ## _SetShowProjectionY ( Type ## _p p, int  nbins )\
+{\
+to_nonconst<Type,Type ## _t>(p)->SetShowProjectionY(nbins);\
+}\
+TH1_p Type ## _ShowBackground ( Type ## _p p, int  niter, const char * option )\
+{\
+return to_nonconst<TH1_t,TH1>((TH1*)to_nonconst<Type,Type ## _t>(p)->ShowBackground(niter, option));\
+}\
+int  Type ## _ShowPeaks ( Type ## _p p, double sigma, const char * option, double threshold )\
+{\
+return to_nonconst<Type,Type ## _t>(p)->ShowPeaks(sigma, option, threshold);\
+}\
+void Type ## _Smooth ( Type ## _p p, int  ntimes, const char * option )\
+{\
+to_nonconst<Type,Type ## _t>(p)->Smooth(ntimes, option);\
 }
 
 #undef ROOT_TH3_DEFINITIONVIRT
@@ -879,6 +968,18 @@
 return to_nonconst<Type,Type ## _t>(p)->Uniform(x1, x2);\
 }
 
+#undef ROOT_TCOLLECTION_DEFINITIONVIRT
+#define ROOT_TCOLLECTION_DEFINITIONVIRT(Type)\
+
+
+#undef ROOT_TSEQCOLLECTION_DEFINITIONVIRT
+#define ROOT_TSEQCOLLECTION_DEFINITIONVIRT(Type)\
+
+
+#undef ROOT_TOBJARRAY_DEFINITIONVIRT
+#define ROOT_TOBJARRAY_DEFINITIONVIRT(Type)\
+
+
 #undef ROOT_DELETABLE_DEFINITIONNONVIRT
 #define ROOT_DELETABLE_DEFINITIONNONVIRT(Type)\
 
@@ -1428,7 +1529,14 @@
 
 #undef ROOT_TH2_DEFINITIONNONVIRT
 #define ROOT_TH2_DEFINITIONNONVIRT(Type)\
-
+TH1D_p Type ## _tH2ProjectionX ( Type ## _p p, const char * name, int  firstybin, int  lastybin, const char * option )\
+{\
+return to_nonconst<TH1D_t,TH1D>((TH1D*)to_nonconst<Type,Type ## _t>(p)->ProjectionX(name, firstybin, lastybin, option));\
+}\
+TH1D_p Type ## _tH2ProjectionY ( Type ## _p p, const char * name, int  firstxbin, int  lastxbin, const char * option )\
+{\
+return to_nonconst<TH1D_t,TH1D>((TH1D*)to_nonconst<Type,Type ## _t>(p)->ProjectionY(name, firstxbin, lastxbin, option));\
+}
 
 #undef ROOT_TH3_DEFINITIONNONVIRT
 #define ROOT_TH3_DEFINITIONNONVIRT(Type)\
@@ -1464,7 +1572,11 @@
 
 #undef ROOT_TH2D_DEFINITIONNONVIRT
 #define ROOT_TH2D_DEFINITIONNONVIRT(Type)\
-
+Type ## _p Type ## _newTH2D ( const char * name, const char * title, int  nbinsx, double xlow, double xup, int  nbinsy, double ylow, double yup )\
+{\
+Type * newp = new Type (name, title, nbinsx, xlow, xup, nbinsy, ylow, yup); \
+return to_nonconst<Type ## _t, Type >(newp);\
+}
 
 #undef ROOT_TH2F_DEFINITIONNONVIRT
 #define ROOT_TH2F_DEFINITIONNONVIRT(Type)\
@@ -1574,6 +1686,21 @@
 return to_nonconst<Type ## _t, Type >(newp);\
 }
 
+#undef ROOT_TCOLLECTION_DEFINITIONNONVIRT
+#define ROOT_TCOLLECTION_DEFINITIONNONVIRT(Type)\
+
+
+#undef ROOT_TSEQCOLLECTION_DEFINITIONNONVIRT
+#define ROOT_TSEQCOLLECTION_DEFINITIONNONVIRT(Type)\
+
+
+#undef ROOT_TOBJARRAY_DEFINITIONNONVIRT
+#define ROOT_TOBJARRAY_DEFINITIONNONVIRT(Type)\
+
+
+ROOT_DELETABLE_DEFINITIONVIRT(TObjArray)
+ROOT_DELETABLE_DEFINITIONVIRT(TSeqCollection)
+ROOT_DELETABLE_DEFINITIONVIRT(TCollection)
 ROOT_DELETABLE_DEFINITIONVIRT(TRandom)
 ROOT_DELETABLE_DEFINITIONVIRT(TRint)
 ROOT_DELETABLE_DEFINITIONVIRT(TApplication)
@@ -1968,6 +2095,9 @@
 ROOT_TCANVAS_DEFINITIONVIRT(TCanvas)
 ROOT_TCHAIN_DEFINITIONVIRT(TChain)
 ROOT_TCLASS_DEFINITIONVIRT(TClass)
+ROOT_TCOLLECTION_DEFINITIONVIRT(TObjArray)
+ROOT_TCOLLECTION_DEFINITIONVIRT(TSeqCollection)
+ROOT_TCOLLECTION_DEFINITIONVIRT(TCollection)
 ROOT_TCROWN_DEFINITIONVIRT(TCrown)
 ROOT_TCURLYARC_DEFINITIONVIRT(TCurlyArc)
 ROOT_TCURLYLINE_DEFINITIONVIRT(TCurlyArc)
@@ -2115,6 +2245,10 @@
 ROOT_TNAMED_DEFINITIONVIRT(TNamed)
 ROOT_TNTUPLE_DEFINITIONVIRT(TNtuple)
 ROOT_TNTUPLED_DEFINITIONVIRT(TNtupleD)
+ROOT_TOBJARRAY_DEFINITIONVIRT(TObjArray)
+ROOT_TOBJECT_DEFINITIONVIRT(TObjArray)
+ROOT_TOBJECT_DEFINITIONVIRT(TSeqCollection)
+ROOT_TOBJECT_DEFINITIONVIRT(TCollection)
 ROOT_TOBJECT_DEFINITIONVIRT(TRandom)
 ROOT_TOBJECT_DEFINITIONVIRT(TRint)
 ROOT_TOBJECT_DEFINITIONVIRT(TApplication)
@@ -2246,6 +2380,8 @@
 ROOT_TRANDOM_DEFINITIONVIRT(TRandom)
 ROOT_TRINT_DEFINITIONVIRT(TRint)
 ROOT_TSPHE_DEFINITIONVIRT(TSPHE)
+ROOT_TSEQCOLLECTION_DEFINITIONVIRT(TObjArray)
+ROOT_TSEQCOLLECTION_DEFINITIONVIRT(TSeqCollection)
 ROOT_TSHAPE_DEFINITIONVIRT(TXTRU)
 ROOT_TSHAPE_DEFINITIONVIRT(TSPHE)
 ROOT_TSHAPE_DEFINITIONVIRT(TPCON)
@@ -2389,3 +2525,6 @@
 ROOT_TAPPLICATION_DEFINITIONNONVIRT(TApplication)
 ROOT_TRINT_DEFINITIONNONVIRT(TRint)
 ROOT_TRANDOM_DEFINITIONNONVIRT(TRandom)
+ROOT_TCOLLECTION_DEFINITIONNONVIRT(TCollection)
+ROOT_TSEQCOLLECTION_DEFINITIONNONVIRT(TSeqCollection)
+ROOT_TOBJARRAY_DEFINITIONNONVIRT(TObjArray)
diff --git a/csrc/HROOT.h b/csrc/HROOT.h
--- a/csrc/HROOT.h
+++ b/csrc/HROOT.h
@@ -382,7 +382,28 @@
 
 #undef ROOT_TH2_DECLARATIONVIRT
 #define ROOT_TH2_DECLARATIONVIRT(Type) \
-int  Type ## _fill2 ( Type ## _p p, double x, double y )
+int  Type ## _fill2 ( Type ## _p p, double x, double y ); \
+void Type ## _fillRandom2 ( Type ## _p p, TH1_p h, int  ntimes ); \
+int  Type ## _findFirstBinAbove2 ( Type ## _p p, double threshold, int  axis ); \
+int  Type ## _findLastBinAbove2 ( Type ## _p p, double threshold, int  axis ); \
+void Type ## _FitSlicesX ( Type ## _p p, TF1_p f1, int  firstybin, int  lastybin, int  cut, const char * option, TObjArray_p arr ); \
+void Type ## _FitSlicesY ( Type ## _p p, TF1_p f1, int  firstxbin, int  lastxbin, int  cut, const char * option, TObjArray_p arr ); \
+double Type ## _GetCorrelationFactor ( Type ## _p p, int  axis1, int  axis2 ); \
+double Type ## _GetCovariance ( Type ## _p p, int  axis1, int  axis2 ); \
+void Type ## _GetStats ( Type ## _p p, double * stats ); \
+double Type ## _Integral ( Type ## _p p, int  binx1, int  binx2, int  biny1, int  biny2, const char * option ); \
+double Type ## _Interpolate ( Type ## _p p, double x, double y, double z ); \
+double Type ## _KolmogorovTest ( Type ## _p p, TH1_p h2, const char * option ); \
+TH2_p Type ## _RebinX ( Type ## _p p, int  ngroup, const char * newname ); \
+TH2_p Type ## _RebinY ( Type ## _p p, int  ngroup, const char * newname ); \
+TH2_p Type ## _Rebin2D ( Type ## _p p, int  nxgroup, int  nygroup, const char * newname ); \
+void Type ## _PutStats ( Type ## _p p, double * stats ); \
+void Type ## _Reset ( Type ## _p p, const char * option ); \
+void Type ## _SetShowProjectionX ( Type ## _p p, int  nbins ); \
+void Type ## _SetShowProjectionY ( Type ## _p p, int  nbins ); \
+TH1_p Type ## _ShowBackground ( Type ## _p p, int  niter, const char * option ); \
+int  Type ## _ShowPeaks ( Type ## _p p, double sigma, const char * option, double threshold ); \
+void Type ## _Smooth ( Type ## _p p, int  ntimes, const char * option )
 
 #undef ROOT_TH3_DECLARATIONVIRT
 #define ROOT_TH3_DECLARATIONVIRT(Type) \
@@ -506,6 +527,18 @@
 double Type ## _Gaus ( Type ## _p p, double mean, double sigma ); \
 double Type ## _Uniform ( Type ## _p p, double x1, double x2 )
 
+#undef ROOT_TCOLLECTION_DECLARATIONVIRT
+#define ROOT_TCOLLECTION_DECLARATIONVIRT(Type) \
+
+
+#undef ROOT_TSEQCOLLECTION_DECLARATIONVIRT
+#define ROOT_TSEQCOLLECTION_DECLARATIONVIRT(Type) \
+
+
+#undef ROOT_TOBJARRAY_DECLARATIONVIRT
+#define ROOT_TOBJARRAY_DECLARATIONVIRT(Type) \
+
+
 #undef ROOT_DELETABLE_DECLARATIONNONVIRT
 #define ROOT_DELETABLE_DECLARATIONNONVIRT(Type) \
 
@@ -746,7 +779,8 @@
 TAxis_p Type ## _tH1GetZaxis ( Type ## _p p )
 #undef ROOT_TH2_DECLARATIONNONVIRT
 #define ROOT_TH2_DECLARATIONNONVIRT(Type) \
-
+TH1D_p Type ## _tH2ProjectionX ( Type ## _p p, const char * name, int  firstybin, int  lastybin, const char * option ); \
+TH1D_p Type ## _tH2ProjectionY ( Type ## _p p, const char * name, int  firstxbin, int  lastxbin, const char * option )
 #undef ROOT_TH3_DECLARATIONNONVIRT
 #define ROOT_TH3_DECLARATIONNONVIRT(Type) \
 
@@ -770,7 +804,7 @@
 
 #undef ROOT_TH2D_DECLARATIONNONVIRT
 #define ROOT_TH2D_DECLARATIONNONVIRT(Type) \
-
+Type ## _p Type ## _newTH2D ( const char * name, const char * title, int  nbinsx, double xlow, double xup, int  nbinsy, double ylow, double yup )
 #undef ROOT_TH2F_DECLARATIONNONVIRT
 #define ROOT_TH2F_DECLARATIONNONVIRT(Type) \
 Type ## _p Type ## _newTH2F ( const char * name, const char * title, int  nbinsx, double xlow, double xup, int  nbinsy, double ylow, double yup )
@@ -837,7 +871,16 @@
 #undef ROOT_TRANDOM_DECLARATIONNONVIRT
 #define ROOT_TRANDOM_DECLARATIONNONVIRT(Type) \
 Type ## _p Type ## _newTRandom ( int  seed )
+#undef ROOT_TCOLLECTION_DECLARATIONNONVIRT
+#define ROOT_TCOLLECTION_DECLARATIONNONVIRT(Type) \
 
+#undef ROOT_TSEQCOLLECTION_DECLARATIONNONVIRT
+#define ROOT_TSEQCOLLECTION_DECLARATIONNONVIRT(Type) \
+
+#undef ROOT_TOBJARRAY_DECLARATIONNONVIRT
+#define ROOT_TOBJARRAY_DECLARATIONNONVIRT(Type) \
+
+
 ROOT_TYPE_DECLARATION(Deletable);
 ROOT_TYPE_DECLARATION(TObject);
 ROOT_TYPE_DECLARATION(TNamed);
@@ -946,7 +989,13 @@
 ROOT_TYPE_DECLARATION(TApplication);
 ROOT_TYPE_DECLARATION(TRint);
 ROOT_TYPE_DECLARATION(TRandom);
+ROOT_TYPE_DECLARATION(TCollection);
+ROOT_TYPE_DECLARATION(TSeqCollection);
+ROOT_TYPE_DECLARATION(TObjArray);
 
+ROOT_DELETABLE_DECLARATIONVIRT(TObjArray);
+ROOT_DELETABLE_DECLARATIONVIRT(TSeqCollection);
+ROOT_DELETABLE_DECLARATIONVIRT(TCollection);
 ROOT_DELETABLE_DECLARATIONVIRT(TRandom);
 ROOT_DELETABLE_DECLARATIONVIRT(TRint);
 ROOT_DELETABLE_DECLARATIONVIRT(TApplication);
@@ -1341,6 +1390,9 @@
 ROOT_TCANVAS_DECLARATIONVIRT(TCanvas);
 ROOT_TCHAIN_DECLARATIONVIRT(TChain);
 ROOT_TCLASS_DECLARATIONVIRT(TClass);
+ROOT_TCOLLECTION_DECLARATIONVIRT(TObjArray);
+ROOT_TCOLLECTION_DECLARATIONVIRT(TSeqCollection);
+ROOT_TCOLLECTION_DECLARATIONVIRT(TCollection);
 ROOT_TCROWN_DECLARATIONVIRT(TCrown);
 ROOT_TCURLYARC_DECLARATIONVIRT(TCurlyArc);
 ROOT_TCURLYLINE_DECLARATIONVIRT(TCurlyArc);
@@ -1488,6 +1540,10 @@
 ROOT_TNAMED_DECLARATIONVIRT(TNamed);
 ROOT_TNTUPLE_DECLARATIONVIRT(TNtuple);
 ROOT_TNTUPLED_DECLARATIONVIRT(TNtupleD);
+ROOT_TOBJARRAY_DECLARATIONVIRT(TObjArray);
+ROOT_TOBJECT_DECLARATIONVIRT(TObjArray);
+ROOT_TOBJECT_DECLARATIONVIRT(TSeqCollection);
+ROOT_TOBJECT_DECLARATIONVIRT(TCollection);
 ROOT_TOBJECT_DECLARATIONVIRT(TRandom);
 ROOT_TOBJECT_DECLARATIONVIRT(TRint);
 ROOT_TOBJECT_DECLARATIONVIRT(TApplication);
@@ -1619,6 +1675,8 @@
 ROOT_TRANDOM_DECLARATIONVIRT(TRandom);
 ROOT_TRINT_DECLARATIONVIRT(TRint);
 ROOT_TSPHE_DECLARATIONVIRT(TSPHE);
+ROOT_TSEQCOLLECTION_DECLARATIONVIRT(TObjArray);
+ROOT_TSEQCOLLECTION_DECLARATIONVIRT(TSeqCollection);
 ROOT_TSHAPE_DECLARATIONVIRT(TXTRU);
 ROOT_TSHAPE_DECLARATIONVIRT(TSPHE);
 ROOT_TSHAPE_DECLARATIONVIRT(TPCON);
@@ -1869,6 +1927,12 @@
 ROOT_TRINT_DECLARATIONNONVIRT(TRint);
 
 ROOT_TRANDOM_DECLARATIONNONVIRT(TRandom);
+
+ROOT_TCOLLECTION_DECLARATIONNONVIRT(TCollection);
+
+ROOT_TSEQCOLLECTION_DECLARATIONNONVIRT(TSeqCollection);
+
+ROOT_TOBJARRAY_DECLARATIONNONVIRT(TObjArray);
 
 
 #ifdef __cplusplus
diff --git a/src/HROOT/AddOn.hs b/src/HROOT/AddOn.hs
--- a/src/HROOT/AddOn.hs
+++ b/src/HROOT/AddOn.hs
@@ -1,43 +1,13 @@
-{-# LANGUAGE TypeFamilies, GADTs, ExistentialQuantification, EmptyDataDecls #-}
+{-# LANGUAGE TypeFamilies, GADTs, ExistentialQuantification, EmptyDataDecls, ScopedTypeVariables #-}
 
 module HROOT.AddOn where
 
 {-
---import Foreign.C            
 import Foreign.ForeignPtr
---import Foreign.Marshal.Array
-
-
 import HROOT.Class.Interface
-import HROOT.Class.Implementation ()
 
-data BottomType
-
-class GADTTypeable a where
-  data GADTType a :: * -> *
-  data EGADTType a :: *
-
-instance GADTTypeable TObject where
-  data GADTType TObject a where 
-    GADTTObjectTObject :: TObject -> GADTType TObject TObject
-    GADTTObjectTH1F    :: TH1F -> GADTType TObject TH1F
-    GADTTObjectBottom  :: GADTType TObject BottomType
-  data EGADTType TObject = forall a. EGADTTObject (GADTType TObject a)
-
-
-castTObject :: Exist TObject -> IO (EGADTType TObject)
-castTObject eobj = do 
-  let obj = TObject (get_fptr eobj)
-  etclass <- isA obj  
-  cname <- case etclass of ETClass tclass -> getName tclass
-  case cname of 
-    "TObject" -> case obj of 
-        TObject fptr -> let obj' = TObject (castForeignPtr fptr :: ForeignPtr RawTObject)
-                        in  return . EGADTTObject . GADTTObjectTObject $ obj'
-    "TH1F"    -> case obj of
-        TObject fptr -> let obj' = TH1F (castForeignPtr fptr :: ForeignPtr RawTH1F)
-                        in  return . EGADTTObject . GADTTObjectTH1F $ obj'
-    _         -> return . EGADTTObject $ GADTTObjectBottom
-
+upcastTH2 :: (FPtr a, ITH2 a) => a -> TH2 
+upcastTH2 h = let fh = get_fptr h
+                  fh2 :: ForeignPtr RawTH2 =  castForeignPtr fh 
+              in cast_fptr_to_obj fh2  
 -}
-
diff --git a/src/HROOT/Class/Existential.hs b/src/HROOT/Class/Existential.hs
--- a/src/HROOT/Class/Existential.hs
+++ b/src/HROOT/Class/Existential.hs
@@ -16,6 +16,84 @@
   data GADTType a :: * -> *
   data EGADTType a :: *
 
+instance GADTTypeable TObjArray where
+  data GADTType TObjArray a where 
+    GADTTObjArrayTObjArray :: TObjArray -> GADTType TObjArray TObjArray
+    GADTTObjArrayBottom  :: GADTType TObjArray BottomType
+  data EGADTType TObjArray = forall a. EGADTTObjArray (GADTType TObjArray a)
+
+castTObjArray :: Exist TObjArray -> IO (EGADTType TObjArray)
+castTObjArray eobj = do 
+  let obj = TObjArray (get_fptr eobj)
+  etclass <- isA obj  
+  cname <- case etclass of 
+             ETClass tclass -> getName tclass
+  case cname of 
+    "TObjArray" -> case obj of
+        TObjArray fptr -> let obj' = TObjArray (castForeignPtr fptr :: ForeignPtr RawTObjArray)
+                        in  return . EGADTTObjArray . GADTTObjArrayTObjArray $ obj'
+    _         -> return . EGADTTObjArray $ GADTTObjArrayBottom
+
+
+
+
+
+instance GADTTypeable TSeqCollection where
+  data GADTType TSeqCollection a where 
+    GADTTSeqCollectionTSeqCollection :: TSeqCollection -> GADTType TSeqCollection TSeqCollection
+    GADTTSeqCollectionTObjArray :: TObjArray -> GADTType TSeqCollection TObjArray
+    GADTTSeqCollectionBottom  :: GADTType TSeqCollection BottomType
+  data EGADTType TSeqCollection = forall a. EGADTTSeqCollection (GADTType TSeqCollection a)
+
+castTSeqCollection :: Exist TSeqCollection -> IO (EGADTType TSeqCollection)
+castTSeqCollection eobj = do 
+  let obj = TSeqCollection (get_fptr eobj)
+  etclass <- isA obj  
+  cname <- case etclass of 
+             ETClass tclass -> getName tclass
+  case cname of 
+    "TSeqCollection" -> case obj of
+        TSeqCollection fptr -> let obj' = TSeqCollection (castForeignPtr fptr :: ForeignPtr RawTSeqCollection)
+                        in  return . EGADTTSeqCollection . GADTTSeqCollectionTSeqCollection $ obj'
+    "TObjArray" -> case obj of
+        TSeqCollection fptr -> let obj' = TObjArray (castForeignPtr fptr :: ForeignPtr RawTObjArray)
+                        in  return . EGADTTSeqCollection . GADTTSeqCollectionTObjArray $ obj'
+    _         -> return . EGADTTSeqCollection $ GADTTSeqCollectionBottom
+
+
+
+
+
+instance GADTTypeable TCollection where
+  data GADTType TCollection a where 
+    GADTTCollectionTCollection :: TCollection -> GADTType TCollection TCollection
+    GADTTCollectionTSeqCollection :: TSeqCollection -> GADTType TCollection TSeqCollection
+    GADTTCollectionTObjArray :: TObjArray -> GADTType TCollection TObjArray
+    GADTTCollectionBottom  :: GADTType TCollection BottomType
+  data EGADTType TCollection = forall a. EGADTTCollection (GADTType TCollection a)
+
+castTCollection :: Exist TCollection -> IO (EGADTType TCollection)
+castTCollection eobj = do 
+  let obj = TCollection (get_fptr eobj)
+  etclass <- isA obj  
+  cname <- case etclass of 
+             ETClass tclass -> getName tclass
+  case cname of 
+    "TCollection" -> case obj of
+        TCollection fptr -> let obj' = TCollection (castForeignPtr fptr :: ForeignPtr RawTCollection)
+                        in  return . EGADTTCollection . GADTTCollectionTCollection $ obj'
+    "TSeqCollection" -> case obj of
+        TCollection fptr -> let obj' = TSeqCollection (castForeignPtr fptr :: ForeignPtr RawTSeqCollection)
+                        in  return . EGADTTCollection . GADTTCollectionTSeqCollection $ obj'
+    "TObjArray" -> case obj of
+        TCollection fptr -> let obj' = TObjArray (castForeignPtr fptr :: ForeignPtr RawTObjArray)
+                        in  return . EGADTTCollection . GADTTCollectionTObjArray $ obj'
+    _         -> return . EGADTTCollection $ GADTTCollectionBottom
+
+
+
+
+
 instance GADTTypeable TRandom where
   data GADTType TRandom a where 
     GADTTRandomTRandom :: TRandom -> GADTType TRandom TRandom
@@ -2605,6 +2683,9 @@
     GADTTObjectTApplication :: TApplication -> GADTType TObject TApplication
     GADTTObjectTRint :: TRint -> GADTType TObject TRint
     GADTTObjectTRandom :: TRandom -> GADTType TObject TRandom
+    GADTTObjectTCollection :: TCollection -> GADTType TObject TCollection
+    GADTTObjectTSeqCollection :: TSeqCollection -> GADTType TObject TSeqCollection
+    GADTTObjectTObjArray :: TObjArray -> GADTType TObject TObjArray
     GADTTObjectBottom  :: GADTType TObject BottomType
   data EGADTType TObject = forall a. EGADTTObject (GADTType TObject a)
 
@@ -2876,6 +2957,15 @@
     "TRandom" -> case obj of
         TObject fptr -> let obj' = TRandom (castForeignPtr fptr :: ForeignPtr RawTRandom)
                         in  return . EGADTTObject . GADTTObjectTRandom $ obj'
+    "TCollection" -> case obj of
+        TObject fptr -> let obj' = TCollection (castForeignPtr fptr :: ForeignPtr RawTCollection)
+                        in  return . EGADTTObject . GADTTObjectTCollection $ obj'
+    "TSeqCollection" -> case obj of
+        TObject fptr -> let obj' = TSeqCollection (castForeignPtr fptr :: ForeignPtr RawTSeqCollection)
+                        in  return . EGADTTObject . GADTTObjectTSeqCollection $ obj'
+    "TObjArray" -> case obj of
+        TObject fptr -> let obj' = TObjArray (castForeignPtr fptr :: ForeignPtr RawTObjArray)
+                        in  return . EGADTTObject . GADTTObjectTObjArray $ obj'
     _         -> return . EGADTTObject $ GADTTObjectBottom
 
 
diff --git a/src/HROOT/Class/FFI.hsc b/src/HROOT/Class/FFI.hsc
--- a/src/HROOT/Class/FFI.hsc
+++ b/src/HROOT/Class/FFI.hsc
@@ -1703,6 +1703,52 @@
   :: (Ptr RawTH2) -> IO ()
 foreign import ccall "HROOT.h TH2_fill2" c_th2_fill2 
   :: (Ptr RawTH2) -> CDouble -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2_fillRandom2" c_th2_fillrandom2 
+  :: (Ptr RawTH2) -> (Ptr RawTH1) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2_findFirstBinAbove2" c_th2_findfirstbinabove2 
+  :: (Ptr RawTH2) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2_findLastBinAbove2" c_th2_findlastbinabove2 
+  :: (Ptr RawTH2) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2_FitSlicesX" c_th2_fitslicesx 
+  :: (Ptr RawTH2) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2_FitSlicesY" c_th2_fitslicesy 
+  :: (Ptr RawTH2) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2_GetCorrelationFactor" c_th2_getcorrelationfactor 
+  :: (Ptr RawTH2) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2_GetCovariance" c_th2_getcovariance 
+  :: (Ptr RawTH2) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2_GetStats" c_th2_getstats 
+  :: (Ptr RawTH2) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2_Integral" c_th2_integral 
+  :: (Ptr RawTH2) -> CInt -> CInt -> CInt -> CInt -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2_Interpolate" c_th2_interpolate 
+  :: (Ptr RawTH2) -> CDouble -> CDouble -> CDouble -> IO CDouble
+foreign import ccall "HROOT.h TH2_KolmogorovTest" c_th2_kolmogorovtest 
+  :: (Ptr RawTH2) -> (Ptr RawTH1) -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2_tH2ProjectionX" c_th2_th2projectionx 
+  :: (Ptr RawTH2) -> CString -> CInt -> CInt -> CString -> IO (Ptr RawTH1D)
+foreign import ccall "HROOT.h TH2_tH2ProjectionY" c_th2_th2projectiony 
+  :: (Ptr RawTH2) -> CString -> CInt -> CInt -> CString -> IO (Ptr RawTH1D)
+foreign import ccall "HROOT.h TH2_RebinX" c_th2_rebinx 
+  :: (Ptr RawTH2) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2_RebinY" c_th2_rebiny 
+  :: (Ptr RawTH2) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2_Rebin2D" c_th2_rebin2d 
+  :: (Ptr RawTH2) -> CInt -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2_PutStats" c_th2_putstats 
+  :: (Ptr RawTH2) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2_Reset" c_th2_reset 
+  :: (Ptr RawTH2) -> CString -> IO ()
+foreign import ccall "HROOT.h TH2_SetShowProjectionX" c_th2_setshowprojectionx 
+  :: (Ptr RawTH2) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2_SetShowProjectionY" c_th2_setshowprojectiony 
+  :: (Ptr RawTH2) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2_ShowBackground" c_th2_showbackground 
+  :: (Ptr RawTH2) -> CInt -> CString -> IO (Ptr RawTH1)
+foreign import ccall "HROOT.h TH2_ShowPeaks" c_th2_showpeaks 
+  :: (Ptr RawTH2) -> CDouble -> CString -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2_Smooth" c_th2_smooth 
+  :: (Ptr RawTH2) -> CInt -> CString -> IO ()
 
 foreign import ccall "HROOT.h TH3_Add" c_th3_add 
   :: (Ptr RawTH3) -> (Ptr RawTH1) -> CDouble -> IO ()
@@ -2434,6 +2480,48 @@
 
 foreign import ccall "HROOT.h TH2C_fill2" c_th2c_fill2 
   :: (Ptr RawTH2C) -> CDouble -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2C_fillRandom2" c_th2c_fillrandom2 
+  :: (Ptr RawTH2C) -> (Ptr RawTH1) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2C_findFirstBinAbove2" c_th2c_findfirstbinabove2 
+  :: (Ptr RawTH2C) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2C_findLastBinAbove2" c_th2c_findlastbinabove2 
+  :: (Ptr RawTH2C) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2C_FitSlicesX" c_th2c_fitslicesx 
+  :: (Ptr RawTH2C) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2C_FitSlicesY" c_th2c_fitslicesy 
+  :: (Ptr RawTH2C) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2C_GetCorrelationFactor" c_th2c_getcorrelationfactor 
+  :: (Ptr RawTH2C) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2C_GetCovariance" c_th2c_getcovariance 
+  :: (Ptr RawTH2C) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2C_GetStats" c_th2c_getstats 
+  :: (Ptr RawTH2C) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2C_Integral" c_th2c_integral 
+  :: (Ptr RawTH2C) -> CInt -> CInt -> CInt -> CInt -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2C_Interpolate" c_th2c_interpolate 
+  :: (Ptr RawTH2C) -> CDouble -> CDouble -> CDouble -> IO CDouble
+foreign import ccall "HROOT.h TH2C_KolmogorovTest" c_th2c_kolmogorovtest 
+  :: (Ptr RawTH2C) -> (Ptr RawTH1) -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2C_RebinX" c_th2c_rebinx 
+  :: (Ptr RawTH2C) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2C_RebinY" c_th2c_rebiny 
+  :: (Ptr RawTH2C) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2C_Rebin2D" c_th2c_rebin2d 
+  :: (Ptr RawTH2C) -> CInt -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2C_PutStats" c_th2c_putstats 
+  :: (Ptr RawTH2C) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2C_Reset" c_th2c_reset 
+  :: (Ptr RawTH2C) -> CString -> IO ()
+foreign import ccall "HROOT.h TH2C_SetShowProjectionX" c_th2c_setshowprojectionx 
+  :: (Ptr RawTH2C) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2C_SetShowProjectionY" c_th2c_setshowprojectiony 
+  :: (Ptr RawTH2C) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2C_ShowBackground" c_th2c_showbackground 
+  :: (Ptr RawTH2C) -> CInt -> CString -> IO (Ptr RawTH1)
+foreign import ccall "HROOT.h TH2C_ShowPeaks" c_th2c_showpeaks 
+  :: (Ptr RawTH2C) -> CDouble -> CString -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2C_Smooth" c_th2c_smooth 
+  :: (Ptr RawTH2C) -> CInt -> CString -> IO ()
 foreign import ccall "HROOT.h TH2C_Add" c_th2c_add 
   :: (Ptr RawTH2C) -> (Ptr RawTH1) -> CDouble -> IO ()
 foreign import ccall "HROOT.h TH2C_AddBinContent" c_th2c_addbincontent 
@@ -2557,6 +2645,48 @@
 
 foreign import ccall "HROOT.h TH2D_fill2" c_th2d_fill2 
   :: (Ptr RawTH2D) -> CDouble -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2D_fillRandom2" c_th2d_fillrandom2 
+  :: (Ptr RawTH2D) -> (Ptr RawTH1) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2D_findFirstBinAbove2" c_th2d_findfirstbinabove2 
+  :: (Ptr RawTH2D) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2D_findLastBinAbove2" c_th2d_findlastbinabove2 
+  :: (Ptr RawTH2D) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2D_FitSlicesX" c_th2d_fitslicesx 
+  :: (Ptr RawTH2D) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2D_FitSlicesY" c_th2d_fitslicesy 
+  :: (Ptr RawTH2D) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2D_GetCorrelationFactor" c_th2d_getcorrelationfactor 
+  :: (Ptr RawTH2D) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2D_GetCovariance" c_th2d_getcovariance 
+  :: (Ptr RawTH2D) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2D_GetStats" c_th2d_getstats 
+  :: (Ptr RawTH2D) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2D_Integral" c_th2d_integral 
+  :: (Ptr RawTH2D) -> CInt -> CInt -> CInt -> CInt -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2D_Interpolate" c_th2d_interpolate 
+  :: (Ptr RawTH2D) -> CDouble -> CDouble -> CDouble -> IO CDouble
+foreign import ccall "HROOT.h TH2D_KolmogorovTest" c_th2d_kolmogorovtest 
+  :: (Ptr RawTH2D) -> (Ptr RawTH1) -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2D_RebinX" c_th2d_rebinx 
+  :: (Ptr RawTH2D) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2D_RebinY" c_th2d_rebiny 
+  :: (Ptr RawTH2D) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2D_Rebin2D" c_th2d_rebin2d 
+  :: (Ptr RawTH2D) -> CInt -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2D_PutStats" c_th2d_putstats 
+  :: (Ptr RawTH2D) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2D_Reset" c_th2d_reset 
+  :: (Ptr RawTH2D) -> CString -> IO ()
+foreign import ccall "HROOT.h TH2D_SetShowProjectionX" c_th2d_setshowprojectionx 
+  :: (Ptr RawTH2D) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2D_SetShowProjectionY" c_th2d_setshowprojectiony 
+  :: (Ptr RawTH2D) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2D_ShowBackground" c_th2d_showbackground 
+  :: (Ptr RawTH2D) -> CInt -> CString -> IO (Ptr RawTH1)
+foreign import ccall "HROOT.h TH2D_ShowPeaks" c_th2d_showpeaks 
+  :: (Ptr RawTH2D) -> CDouble -> CString -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2D_Smooth" c_th2d_smooth 
+  :: (Ptr RawTH2D) -> CInt -> CString -> IO ()
 foreign import ccall "HROOT.h TH2D_Add" c_th2d_add 
   :: (Ptr RawTH2D) -> (Ptr RawTH1) -> CDouble -> IO ()
 foreign import ccall "HROOT.h TH2D_AddBinContent" c_th2d_addbincontent 
@@ -2677,9 +2807,53 @@
   :: (Ptr RawTH2D) -> IO (Ptr RawTClass)
 foreign import ccall "HROOT.h TH2D_delete" c_th2d_delete 
   :: (Ptr RawTH2D) -> IO ()
+foreign import ccall "HROOT.h TH2D_newTH2D" c_th2d_newth2d 
+  :: CString -> CString -> CInt -> CDouble -> CDouble -> CInt -> CDouble -> CDouble -> IO (Ptr RawTH2D)
 
 foreign import ccall "HROOT.h TH2F_fill2" c_th2f_fill2 
   :: (Ptr RawTH2F) -> CDouble -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2F_fillRandom2" c_th2f_fillrandom2 
+  :: (Ptr RawTH2F) -> (Ptr RawTH1) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2F_findFirstBinAbove2" c_th2f_findfirstbinabove2 
+  :: (Ptr RawTH2F) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2F_findLastBinAbove2" c_th2f_findlastbinabove2 
+  :: (Ptr RawTH2F) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2F_FitSlicesX" c_th2f_fitslicesx 
+  :: (Ptr RawTH2F) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2F_FitSlicesY" c_th2f_fitslicesy 
+  :: (Ptr RawTH2F) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2F_GetCorrelationFactor" c_th2f_getcorrelationfactor 
+  :: (Ptr RawTH2F) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2F_GetCovariance" c_th2f_getcovariance 
+  :: (Ptr RawTH2F) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2F_GetStats" c_th2f_getstats 
+  :: (Ptr RawTH2F) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2F_Integral" c_th2f_integral 
+  :: (Ptr RawTH2F) -> CInt -> CInt -> CInt -> CInt -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2F_Interpolate" c_th2f_interpolate 
+  :: (Ptr RawTH2F) -> CDouble -> CDouble -> CDouble -> IO CDouble
+foreign import ccall "HROOT.h TH2F_KolmogorovTest" c_th2f_kolmogorovtest 
+  :: (Ptr RawTH2F) -> (Ptr RawTH1) -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2F_RebinX" c_th2f_rebinx 
+  :: (Ptr RawTH2F) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2F_RebinY" c_th2f_rebiny 
+  :: (Ptr RawTH2F) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2F_Rebin2D" c_th2f_rebin2d 
+  :: (Ptr RawTH2F) -> CInt -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2F_PutStats" c_th2f_putstats 
+  :: (Ptr RawTH2F) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2F_Reset" c_th2f_reset 
+  :: (Ptr RawTH2F) -> CString -> IO ()
+foreign import ccall "HROOT.h TH2F_SetShowProjectionX" c_th2f_setshowprojectionx 
+  :: (Ptr RawTH2F) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2F_SetShowProjectionY" c_th2f_setshowprojectiony 
+  :: (Ptr RawTH2F) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2F_ShowBackground" c_th2f_showbackground 
+  :: (Ptr RawTH2F) -> CInt -> CString -> IO (Ptr RawTH1)
+foreign import ccall "HROOT.h TH2F_ShowPeaks" c_th2f_showpeaks 
+  :: (Ptr RawTH2F) -> CDouble -> CString -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2F_Smooth" c_th2f_smooth 
+  :: (Ptr RawTH2F) -> CInt -> CString -> IO ()
 foreign import ccall "HROOT.h TH2F_Add" c_th2f_add 
   :: (Ptr RawTH2F) -> (Ptr RawTH1) -> CDouble -> IO ()
 foreign import ccall "HROOT.h TH2F_AddBinContent" c_th2f_addbincontent 
@@ -2805,6 +2979,48 @@
 
 foreign import ccall "HROOT.h TH2I_fill2" c_th2i_fill2 
   :: (Ptr RawTH2I) -> CDouble -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2I_fillRandom2" c_th2i_fillrandom2 
+  :: (Ptr RawTH2I) -> (Ptr RawTH1) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2I_findFirstBinAbove2" c_th2i_findfirstbinabove2 
+  :: (Ptr RawTH2I) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2I_findLastBinAbove2" c_th2i_findlastbinabove2 
+  :: (Ptr RawTH2I) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2I_FitSlicesX" c_th2i_fitslicesx 
+  :: (Ptr RawTH2I) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2I_FitSlicesY" c_th2i_fitslicesy 
+  :: (Ptr RawTH2I) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2I_GetCorrelationFactor" c_th2i_getcorrelationfactor 
+  :: (Ptr RawTH2I) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2I_GetCovariance" c_th2i_getcovariance 
+  :: (Ptr RawTH2I) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2I_GetStats" c_th2i_getstats 
+  :: (Ptr RawTH2I) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2I_Integral" c_th2i_integral 
+  :: (Ptr RawTH2I) -> CInt -> CInt -> CInt -> CInt -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2I_Interpolate" c_th2i_interpolate 
+  :: (Ptr RawTH2I) -> CDouble -> CDouble -> CDouble -> IO CDouble
+foreign import ccall "HROOT.h TH2I_KolmogorovTest" c_th2i_kolmogorovtest 
+  :: (Ptr RawTH2I) -> (Ptr RawTH1) -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2I_RebinX" c_th2i_rebinx 
+  :: (Ptr RawTH2I) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2I_RebinY" c_th2i_rebiny 
+  :: (Ptr RawTH2I) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2I_Rebin2D" c_th2i_rebin2d 
+  :: (Ptr RawTH2I) -> CInt -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2I_PutStats" c_th2i_putstats 
+  :: (Ptr RawTH2I) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2I_Reset" c_th2i_reset 
+  :: (Ptr RawTH2I) -> CString -> IO ()
+foreign import ccall "HROOT.h TH2I_SetShowProjectionX" c_th2i_setshowprojectionx 
+  :: (Ptr RawTH2I) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2I_SetShowProjectionY" c_th2i_setshowprojectiony 
+  :: (Ptr RawTH2I) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2I_ShowBackground" c_th2i_showbackground 
+  :: (Ptr RawTH2I) -> CInt -> CString -> IO (Ptr RawTH1)
+foreign import ccall "HROOT.h TH2I_ShowPeaks" c_th2i_showpeaks 
+  :: (Ptr RawTH2I) -> CDouble -> CString -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2I_Smooth" c_th2i_smooth 
+  :: (Ptr RawTH2I) -> CInt -> CString -> IO ()
 foreign import ccall "HROOT.h TH2I_Add" c_th2i_add 
   :: (Ptr RawTH2I) -> (Ptr RawTH1) -> CDouble -> IO ()
 foreign import ccall "HROOT.h TH2I_AddBinContent" c_th2i_addbincontent 
@@ -2928,6 +3144,48 @@
 
 foreign import ccall "HROOT.h TH2Poly_fill2" c_th2poly_fill2 
   :: (Ptr RawTH2Poly) -> CDouble -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2Poly_fillRandom2" c_th2poly_fillrandom2 
+  :: (Ptr RawTH2Poly) -> (Ptr RawTH1) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2Poly_findFirstBinAbove2" c_th2poly_findfirstbinabove2 
+  :: (Ptr RawTH2Poly) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2Poly_findLastBinAbove2" c_th2poly_findlastbinabove2 
+  :: (Ptr RawTH2Poly) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2Poly_FitSlicesX" c_th2poly_fitslicesx 
+  :: (Ptr RawTH2Poly) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2Poly_FitSlicesY" c_th2poly_fitslicesy 
+  :: (Ptr RawTH2Poly) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2Poly_GetCorrelationFactor" c_th2poly_getcorrelationfactor 
+  :: (Ptr RawTH2Poly) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2Poly_GetCovariance" c_th2poly_getcovariance 
+  :: (Ptr RawTH2Poly) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2Poly_GetStats" c_th2poly_getstats 
+  :: (Ptr RawTH2Poly) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2Poly_Integral" c_th2poly_integral 
+  :: (Ptr RawTH2Poly) -> CInt -> CInt -> CInt -> CInt -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2Poly_Interpolate" c_th2poly_interpolate 
+  :: (Ptr RawTH2Poly) -> CDouble -> CDouble -> CDouble -> IO CDouble
+foreign import ccall "HROOT.h TH2Poly_KolmogorovTest" c_th2poly_kolmogorovtest 
+  :: (Ptr RawTH2Poly) -> (Ptr RawTH1) -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2Poly_RebinX" c_th2poly_rebinx 
+  :: (Ptr RawTH2Poly) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2Poly_RebinY" c_th2poly_rebiny 
+  :: (Ptr RawTH2Poly) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2Poly_Rebin2D" c_th2poly_rebin2d 
+  :: (Ptr RawTH2Poly) -> CInt -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2Poly_PutStats" c_th2poly_putstats 
+  :: (Ptr RawTH2Poly) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2Poly_Reset" c_th2poly_reset 
+  :: (Ptr RawTH2Poly) -> CString -> IO ()
+foreign import ccall "HROOT.h TH2Poly_SetShowProjectionX" c_th2poly_setshowprojectionx 
+  :: (Ptr RawTH2Poly) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2Poly_SetShowProjectionY" c_th2poly_setshowprojectiony 
+  :: (Ptr RawTH2Poly) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2Poly_ShowBackground" c_th2poly_showbackground 
+  :: (Ptr RawTH2Poly) -> CInt -> CString -> IO (Ptr RawTH1)
+foreign import ccall "HROOT.h TH2Poly_ShowPeaks" c_th2poly_showpeaks 
+  :: (Ptr RawTH2Poly) -> CDouble -> CString -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2Poly_Smooth" c_th2poly_smooth 
+  :: (Ptr RawTH2Poly) -> CInt -> CString -> IO ()
 foreign import ccall "HROOT.h TH2Poly_Add" c_th2poly_add 
   :: (Ptr RawTH2Poly) -> (Ptr RawTH1) -> CDouble -> IO ()
 foreign import ccall "HROOT.h TH2Poly_AddBinContent" c_th2poly_addbincontent 
@@ -3051,6 +3309,48 @@
 
 foreign import ccall "HROOT.h TH2S_fill2" c_th2s_fill2 
   :: (Ptr RawTH2S) -> CDouble -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2S_fillRandom2" c_th2s_fillrandom2 
+  :: (Ptr RawTH2S) -> (Ptr RawTH1) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2S_findFirstBinAbove2" c_th2s_findfirstbinabove2 
+  :: (Ptr RawTH2S) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2S_findLastBinAbove2" c_th2s_findlastbinabove2 
+  :: (Ptr RawTH2S) -> CDouble -> CInt -> IO CInt
+foreign import ccall "HROOT.h TH2S_FitSlicesX" c_th2s_fitslicesx 
+  :: (Ptr RawTH2S) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2S_FitSlicesY" c_th2s_fitslicesy 
+  :: (Ptr RawTH2S) -> (Ptr RawTF1) -> CInt -> CInt -> CInt -> CString -> (Ptr RawTObjArray) -> IO ()
+foreign import ccall "HROOT.h TH2S_GetCorrelationFactor" c_th2s_getcorrelationfactor 
+  :: (Ptr RawTH2S) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2S_GetCovariance" c_th2s_getcovariance 
+  :: (Ptr RawTH2S) -> CInt -> CInt -> IO CDouble
+foreign import ccall "HROOT.h TH2S_GetStats" c_th2s_getstats 
+  :: (Ptr RawTH2S) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2S_Integral" c_th2s_integral 
+  :: (Ptr RawTH2S) -> CInt -> CInt -> CInt -> CInt -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2S_Interpolate" c_th2s_interpolate 
+  :: (Ptr RawTH2S) -> CDouble -> CDouble -> CDouble -> IO CDouble
+foreign import ccall "HROOT.h TH2S_KolmogorovTest" c_th2s_kolmogorovtest 
+  :: (Ptr RawTH2S) -> (Ptr RawTH1) -> CString -> IO CDouble
+foreign import ccall "HROOT.h TH2S_RebinX" c_th2s_rebinx 
+  :: (Ptr RawTH2S) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2S_RebinY" c_th2s_rebiny 
+  :: (Ptr RawTH2S) -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2S_Rebin2D" c_th2s_rebin2d 
+  :: (Ptr RawTH2S) -> CInt -> CInt -> CString -> IO (Ptr RawTH2)
+foreign import ccall "HROOT.h TH2S_PutStats" c_th2s_putstats 
+  :: (Ptr RawTH2S) -> (Ptr CDouble) -> IO ()
+foreign import ccall "HROOT.h TH2S_Reset" c_th2s_reset 
+  :: (Ptr RawTH2S) -> CString -> IO ()
+foreign import ccall "HROOT.h TH2S_SetShowProjectionX" c_th2s_setshowprojectionx 
+  :: (Ptr RawTH2S) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2S_SetShowProjectionY" c_th2s_setshowprojectiony 
+  :: (Ptr RawTH2S) -> CInt -> IO ()
+foreign import ccall "HROOT.h TH2S_ShowBackground" c_th2s_showbackground 
+  :: (Ptr RawTH2S) -> CInt -> CString -> IO (Ptr RawTH1)
+foreign import ccall "HROOT.h TH2S_ShowPeaks" c_th2s_showpeaks 
+  :: (Ptr RawTH2S) -> CDouble -> CString -> CDouble -> IO CInt
+foreign import ccall "HROOT.h TH2S_Smooth" c_th2s_smooth 
+  :: (Ptr RawTH2S) -> CInt -> CString -> IO ()
 foreign import ccall "HROOT.h TH2S_Add" c_th2s_add 
   :: (Ptr RawTH2S) -> (Ptr RawTH1) -> CDouble -> IO ()
 foreign import ccall "HROOT.h TH2S_AddBinContent" c_th2s_addbincontent 
@@ -4091,4 +4391,49 @@
   :: (Ptr RawTRandom) -> CDouble -> CDouble -> IO CDouble
 foreign import ccall "HROOT.h TRandom_Uniform" c_trandom_uniform 
   :: (Ptr RawTRandom) -> CDouble -> CDouble -> IO CDouble
+
+foreign import ccall "HROOT.h TCollection_GetName" c_tcollection_getname 
+  :: (Ptr RawTCollection) -> IO CString
+foreign import ccall "HROOT.h TCollection_Draw" c_tcollection_draw 
+  :: (Ptr RawTCollection) -> CString -> IO ()
+foreign import ccall "HROOT.h TCollection_FindObject" c_tcollection_findobject 
+  :: (Ptr RawTCollection) -> CString -> IO (Ptr RawTObject)
+foreign import ccall "HROOT.h TCollection_SaveAs" c_tcollection_saveas 
+  :: (Ptr RawTCollection) -> CString -> CString -> IO ()
+foreign import ccall "HROOT.h TCollection_Write" c_tcollection_write 
+  :: (Ptr RawTCollection) -> CString -> CInt -> CInt -> IO CInt
+foreign import ccall "HROOT.h TCollection_IsA" c_tcollection_isa 
+  :: (Ptr RawTCollection) -> IO (Ptr RawTClass)
+foreign import ccall "HROOT.h TCollection_delete" c_tcollection_delete 
+  :: (Ptr RawTCollection) -> IO ()
+
+foreign import ccall "HROOT.h TSeqCollection_GetName" c_tseqcollection_getname 
+  :: (Ptr RawTSeqCollection) -> IO CString
+foreign import ccall "HROOT.h TSeqCollection_Draw" c_tseqcollection_draw 
+  :: (Ptr RawTSeqCollection) -> CString -> IO ()
+foreign import ccall "HROOT.h TSeqCollection_FindObject" c_tseqcollection_findobject 
+  :: (Ptr RawTSeqCollection) -> CString -> IO (Ptr RawTObject)
+foreign import ccall "HROOT.h TSeqCollection_SaveAs" c_tseqcollection_saveas 
+  :: (Ptr RawTSeqCollection) -> CString -> CString -> IO ()
+foreign import ccall "HROOT.h TSeqCollection_Write" c_tseqcollection_write 
+  :: (Ptr RawTSeqCollection) -> CString -> CInt -> CInt -> IO CInt
+foreign import ccall "HROOT.h TSeqCollection_IsA" c_tseqcollection_isa 
+  :: (Ptr RawTSeqCollection) -> IO (Ptr RawTClass)
+foreign import ccall "HROOT.h TSeqCollection_delete" c_tseqcollection_delete 
+  :: (Ptr RawTSeqCollection) -> IO ()
+
+foreign import ccall "HROOT.h TObjArray_GetName" c_tobjarray_getname 
+  :: (Ptr RawTObjArray) -> IO CString
+foreign import ccall "HROOT.h TObjArray_Draw" c_tobjarray_draw 
+  :: (Ptr RawTObjArray) -> CString -> IO ()
+foreign import ccall "HROOT.h TObjArray_FindObject" c_tobjarray_findobject 
+  :: (Ptr RawTObjArray) -> CString -> IO (Ptr RawTObject)
+foreign import ccall "HROOT.h TObjArray_SaveAs" c_tobjarray_saveas 
+  :: (Ptr RawTObjArray) -> CString -> CString -> IO ()
+foreign import ccall "HROOT.h TObjArray_Write" c_tobjarray_write 
+  :: (Ptr RawTObjArray) -> CString -> CInt -> CInt -> IO CInt
+foreign import ccall "HROOT.h TObjArray_IsA" c_tobjarray_isa 
+  :: (Ptr RawTObjArray) -> IO (Ptr RawTClass)
+foreign import ccall "HROOT.h TObjArray_delete" c_tobjarray_delete 
+  :: (Ptr RawTObjArray) -> IO ()
 
diff --git a/src/HROOT/Class/Implementation.hs b/src/HROOT/Class/Implementation.hs
--- a/src/HROOT/Class/Implementation.hs
+++ b/src/HROOT/Class/Implementation.hs
@@ -442,6 +442,18 @@
   cast = unsafeForeignPtrToPtr . castForeignPtr . get_fptr
   uncast = cast_fptr_to_obj . castForeignPtr . unsafePerformIO . newForeignPtr_ 
 
+instance (ITCollection a, FPtr a) => Castable a (Ptr RawTCollection) where
+  cast = unsafeForeignPtrToPtr . castForeignPtr . get_fptr
+  uncast = cast_fptr_to_obj . castForeignPtr . unsafePerformIO . newForeignPtr_ 
+
+instance (ITSeqCollection a, FPtr a) => Castable a (Ptr RawTSeqCollection) where
+  cast = unsafeForeignPtrToPtr . castForeignPtr . get_fptr
+  uncast = cast_fptr_to_obj . castForeignPtr . unsafePerformIO . newForeignPtr_ 
+
+instance (ITObjArray a, FPtr a) => Castable a (Ptr RawTObjArray) where
+  cast = unsafeForeignPtrToPtr . castForeignPtr . get_fptr
+  uncast = cast_fptr_to_obj . castForeignPtr . unsafePerformIO . newForeignPtr_ 
+
 instance FPtr (Exist TObject) where
   type Raw (Exist TObject) = RawTObject
   get_fptr (ETObject obj) = castForeignPtr (get_fptr obj)
@@ -1396,8 +1408,35 @@
   cast = unsafeForeignPtrToPtr . get_fptr
   uncast = cast_fptr_to_obj . unsafePerformIO . newForeignPtr_
 
+instance FPtr (Exist TCollection) where
+  type Raw (Exist TCollection) = RawTCollection
+  get_fptr (ETCollection obj) = castForeignPtr (get_fptr obj)
+  cast_fptr_to_obj fptr = ETCollection (cast_fptr_to_obj (fptr :: ForeignPtr RawTCollection) :: TCollection)
 
+instance Castable (Exist TCollection) (Ptr RawTCollection) where
+  cast = unsafeForeignPtrToPtr . get_fptr
+  uncast = cast_fptr_to_obj . unsafePerformIO . newForeignPtr_
 
+instance FPtr (Exist TSeqCollection) where
+  type Raw (Exist TSeqCollection) = RawTSeqCollection
+  get_fptr (ETSeqCollection obj) = castForeignPtr (get_fptr obj)
+  cast_fptr_to_obj fptr = ETSeqCollection (cast_fptr_to_obj (fptr :: ForeignPtr RawTSeqCollection) :: TSeqCollection)
+
+instance Castable (Exist TSeqCollection) (Ptr RawTSeqCollection) where
+  cast = unsafeForeignPtrToPtr . get_fptr
+  uncast = cast_fptr_to_obj . unsafePerformIO . newForeignPtr_
+
+instance FPtr (Exist TObjArray) where
+  type Raw (Exist TObjArray) = RawTObjArray
+  get_fptr (ETObjArray obj) = castForeignPtr (get_fptr obj)
+  cast_fptr_to_obj fptr = ETObjArray (cast_fptr_to_obj (fptr :: ForeignPtr RawTObjArray) :: TObjArray)
+
+instance Castable (Exist TObjArray) (Ptr RawTObjArray) where
+  cast = unsafeForeignPtrToPtr . get_fptr
+  uncast = cast_fptr_to_obj . unsafePerformIO . newForeignPtr_
+
+
+
 instance ITObject TObject where
   getName = xform0 c_tobject_getname
   draw = xform1 c_tobject_draw
@@ -1624,6 +1663,27 @@
 
 instance ITH2 TH2 where
   fill2 = xform2 c_th2_fill2
+  fillRandom2 = xform2 c_th2_fillrandom2
+  findFirstBinAbove2 = xform2 c_th2_findfirstbinabove2
+  findLastBinAbove2 = xform2 c_th2_findlastbinabove2
+  fitSlicesX = xform6 c_th2_fitslicesx
+  fitSlicesY = xform6 c_th2_fitslicesy
+  getCorrelationFactor = xform2 c_th2_getcorrelationfactor
+  getCovariance = xform2 c_th2_getcovariance
+  getStats = xform1 c_th2_getstats
+  integral = xform5 c_th2_integral
+  interpolate = xform3 c_th2_interpolate
+  kolmogorovTest = xform2 c_th2_kolmogorovtest
+  rebinX = xform2 c_th2_rebinx
+  rebinY = xform2 c_th2_rebiny
+  rebin2D = xform3 c_th2_rebin2d
+  putStats = xform1 c_th2_putstats
+  reset = xform1 c_th2_reset
+  setShowProjectionX = xform1 c_th2_setshowprojectionx
+  setShowProjectionY = xform1 c_th2_setshowprojectiony
+  showBackground = xform2 c_th2_showbackground
+  showPeaks = xform3 c_th2_showpeaks
+  smooth = xform2 c_th2_smooth
 
 instance ITH3 TH3 where
 
@@ -1690,6 +1750,21 @@
   gaus = xform2 c_trandom_gaus
   uniform = xform2 c_trandom_uniform
 
+instance ITCollection TCollection where
+
+instance ITSeqCollection TSeqCollection where
+
+instance ITObjArray TObjArray where
+
+instance IDeletable TObjArray where
+  delete = xform0 c_tobjarray_delete
+
+instance IDeletable TSeqCollection where
+  delete = xform0 c_tseqcollection_delete
+
+instance IDeletable TCollection where
+  delete = xform0 c_tcollection_delete
+
 instance IDeletable TRandom where
   delete = xform0 c_trandom_delete
 
@@ -2780,6 +2855,10 @@
 
 instance ITCanvas TDialogCanvas where
 
+instance ITCollection TObjArray where
+
+instance ITCollection TSeqCollection where
+
 instance ITCurlyLine TCurlyArc where
 
 instance ITDictionary TClass where
@@ -3736,21 +3815,147 @@
 
 instance ITH2 TH2S where
   fill2 = xform2 c_th2s_fill2
+  fillRandom2 = xform2 c_th2s_fillrandom2
+  findFirstBinAbove2 = xform2 c_th2s_findfirstbinabove2
+  findLastBinAbove2 = xform2 c_th2s_findlastbinabove2
+  fitSlicesX = xform6 c_th2s_fitslicesx
+  fitSlicesY = xform6 c_th2s_fitslicesy
+  getCorrelationFactor = xform2 c_th2s_getcorrelationfactor
+  getCovariance = xform2 c_th2s_getcovariance
+  getStats = xform1 c_th2s_getstats
+  integral = xform5 c_th2s_integral
+  interpolate = xform3 c_th2s_interpolate
+  kolmogorovTest = xform2 c_th2s_kolmogorovtest
+  rebinX = xform2 c_th2s_rebinx
+  rebinY = xform2 c_th2s_rebiny
+  rebin2D = xform3 c_th2s_rebin2d
+  putStats = xform1 c_th2s_putstats
+  reset = xform1 c_th2s_reset
+  setShowProjectionX = xform1 c_th2s_setshowprojectionx
+  setShowProjectionY = xform1 c_th2s_setshowprojectiony
+  showBackground = xform2 c_th2s_showbackground
+  showPeaks = xform3 c_th2s_showpeaks
+  smooth = xform2 c_th2s_smooth
 
 instance ITH2 TH2Poly where
   fill2 = xform2 c_th2poly_fill2
+  fillRandom2 = xform2 c_th2poly_fillrandom2
+  findFirstBinAbove2 = xform2 c_th2poly_findfirstbinabove2
+  findLastBinAbove2 = xform2 c_th2poly_findlastbinabove2
+  fitSlicesX = xform6 c_th2poly_fitslicesx
+  fitSlicesY = xform6 c_th2poly_fitslicesy
+  getCorrelationFactor = xform2 c_th2poly_getcorrelationfactor
+  getCovariance = xform2 c_th2poly_getcovariance
+  getStats = xform1 c_th2poly_getstats
+  integral = xform5 c_th2poly_integral
+  interpolate = xform3 c_th2poly_interpolate
+  kolmogorovTest = xform2 c_th2poly_kolmogorovtest
+  rebinX = xform2 c_th2poly_rebinx
+  rebinY = xform2 c_th2poly_rebiny
+  rebin2D = xform3 c_th2poly_rebin2d
+  putStats = xform1 c_th2poly_putstats
+  reset = xform1 c_th2poly_reset
+  setShowProjectionX = xform1 c_th2poly_setshowprojectionx
+  setShowProjectionY = xform1 c_th2poly_setshowprojectiony
+  showBackground = xform2 c_th2poly_showbackground
+  showPeaks = xform3 c_th2poly_showpeaks
+  smooth = xform2 c_th2poly_smooth
 
 instance ITH2 TH2I where
   fill2 = xform2 c_th2i_fill2
+  fillRandom2 = xform2 c_th2i_fillrandom2
+  findFirstBinAbove2 = xform2 c_th2i_findfirstbinabove2
+  findLastBinAbove2 = xform2 c_th2i_findlastbinabove2
+  fitSlicesX = xform6 c_th2i_fitslicesx
+  fitSlicesY = xform6 c_th2i_fitslicesy
+  getCorrelationFactor = xform2 c_th2i_getcorrelationfactor
+  getCovariance = xform2 c_th2i_getcovariance
+  getStats = xform1 c_th2i_getstats
+  integral = xform5 c_th2i_integral
+  interpolate = xform3 c_th2i_interpolate
+  kolmogorovTest = xform2 c_th2i_kolmogorovtest
+  rebinX = xform2 c_th2i_rebinx
+  rebinY = xform2 c_th2i_rebiny
+  rebin2D = xform3 c_th2i_rebin2d
+  putStats = xform1 c_th2i_putstats
+  reset = xform1 c_th2i_reset
+  setShowProjectionX = xform1 c_th2i_setshowprojectionx
+  setShowProjectionY = xform1 c_th2i_setshowprojectiony
+  showBackground = xform2 c_th2i_showbackground
+  showPeaks = xform3 c_th2i_showpeaks
+  smooth = xform2 c_th2i_smooth
 
 instance ITH2 TH2F where
   fill2 = xform2 c_th2f_fill2
+  fillRandom2 = xform2 c_th2f_fillrandom2
+  findFirstBinAbove2 = xform2 c_th2f_findfirstbinabove2
+  findLastBinAbove2 = xform2 c_th2f_findlastbinabove2
+  fitSlicesX = xform6 c_th2f_fitslicesx
+  fitSlicesY = xform6 c_th2f_fitslicesy
+  getCorrelationFactor = xform2 c_th2f_getcorrelationfactor
+  getCovariance = xform2 c_th2f_getcovariance
+  getStats = xform1 c_th2f_getstats
+  integral = xform5 c_th2f_integral
+  interpolate = xform3 c_th2f_interpolate
+  kolmogorovTest = xform2 c_th2f_kolmogorovtest
+  rebinX = xform2 c_th2f_rebinx
+  rebinY = xform2 c_th2f_rebiny
+  rebin2D = xform3 c_th2f_rebin2d
+  putStats = xform1 c_th2f_putstats
+  reset = xform1 c_th2f_reset
+  setShowProjectionX = xform1 c_th2f_setshowprojectionx
+  setShowProjectionY = xform1 c_th2f_setshowprojectiony
+  showBackground = xform2 c_th2f_showbackground
+  showPeaks = xform3 c_th2f_showpeaks
+  smooth = xform2 c_th2f_smooth
 
 instance ITH2 TH2D where
   fill2 = xform2 c_th2d_fill2
+  fillRandom2 = xform2 c_th2d_fillrandom2
+  findFirstBinAbove2 = xform2 c_th2d_findfirstbinabove2
+  findLastBinAbove2 = xform2 c_th2d_findlastbinabove2
+  fitSlicesX = xform6 c_th2d_fitslicesx
+  fitSlicesY = xform6 c_th2d_fitslicesy
+  getCorrelationFactor = xform2 c_th2d_getcorrelationfactor
+  getCovariance = xform2 c_th2d_getcovariance
+  getStats = xform1 c_th2d_getstats
+  integral = xform5 c_th2d_integral
+  interpolate = xform3 c_th2d_interpolate
+  kolmogorovTest = xform2 c_th2d_kolmogorovtest
+  rebinX = xform2 c_th2d_rebinx
+  rebinY = xform2 c_th2d_rebiny
+  rebin2D = xform3 c_th2d_rebin2d
+  putStats = xform1 c_th2d_putstats
+  reset = xform1 c_th2d_reset
+  setShowProjectionX = xform1 c_th2d_setshowprojectionx
+  setShowProjectionY = xform1 c_th2d_setshowprojectiony
+  showBackground = xform2 c_th2d_showbackground
+  showPeaks = xform3 c_th2d_showpeaks
+  smooth = xform2 c_th2d_smooth
 
 instance ITH2 TH2C where
   fill2 = xform2 c_th2c_fill2
+  fillRandom2 = xform2 c_th2c_fillrandom2
+  findFirstBinAbove2 = xform2 c_th2c_findfirstbinabove2
+  findLastBinAbove2 = xform2 c_th2c_findlastbinabove2
+  fitSlicesX = xform6 c_th2c_fitslicesx
+  fitSlicesY = xform6 c_th2c_fitslicesy
+  getCorrelationFactor = xform2 c_th2c_getcorrelationfactor
+  getCovariance = xform2 c_th2c_getcovariance
+  getStats = xform1 c_th2c_getstats
+  integral = xform5 c_th2c_integral
+  interpolate = xform3 c_th2c_interpolate
+  kolmogorovTest = xform2 c_th2c_kolmogorovtest
+  rebinX = xform2 c_th2c_rebinx
+  rebinY = xform2 c_th2c_rebiny
+  rebin2D = xform3 c_th2c_rebin2d
+  putStats = xform1 c_th2c_putstats
+  reset = xform1 c_th2c_reset
+  setShowProjectionX = xform1 c_th2c_setshowprojectionx
+  setShowProjectionY = xform1 c_th2c_setshowprojectiony
+  showBackground = xform2 c_th2c_showbackground
+  showPeaks = xform3 c_th2c_showpeaks
+  smooth = xform2 c_th2c_smooth
 
 instance ITH3 TH3S where
 
@@ -3921,6 +4126,30 @@
 
 
 
+instance ITObject TObjArray where
+  getName = xform0 c_tobjarray_getname
+  draw = xform1 c_tobjarray_draw
+  findObject = xform1 c_tobjarray_findobject
+  saveAs = xform2 c_tobjarray_saveas
+  write = xform3 c_tobjarray_write
+  isA = xform0 c_tobjarray_isa
+
+instance ITObject TSeqCollection where
+  getName = xform0 c_tseqcollection_getname
+  draw = xform1 c_tseqcollection_draw
+  findObject = xform1 c_tseqcollection_findobject
+  saveAs = xform2 c_tseqcollection_saveas
+  write = xform3 c_tseqcollection_write
+  isA = xform0 c_tseqcollection_isa
+
+instance ITObject TCollection where
+  getName = xform0 c_tcollection_getname
+  draw = xform1 c_tcollection_draw
+  findObject = xform1 c_tcollection_findobject
+  saveAs = xform2 c_tcollection_saveas
+  write = xform3 c_tcollection_write
+  isA = xform0 c_tcollection_isa
+
 instance ITObject TRandom where
   getName = xform0 c_trandom_getname
   draw = xform1 c_trandom_draw
@@ -4673,6 +4902,8 @@
 
 instance ITQObject TVirtualPad where
 
+instance ITSeqCollection TObjArray where
+
 instance ITShape TXTRU where
 
 instance ITShape TSPHE where
@@ -4950,6 +5181,10 @@
 newTH1F = xform4 c_th1f_newth1f
 
 
+newTH2D :: String -> String -> Int -> Double -> Double -> Int -> Double -> Double -> IO TH2D
+newTH2D = xform7 c_th2d_newth2d
+
+
 newTH2F :: String -> String -> Int -> Double -> Double -> Int -> Double -> Double -> IO TH2F
 newTH2F = xform7 c_th2f_newth2f
 
@@ -4992,3 +5227,9 @@
 
 tH1GetZaxis :: TH1 -> IO TAxis
 tH1GetZaxis = xform0 c_th1_th1getzaxis
+
+tH2ProjectionX :: TH2 -> String -> Int -> Int -> String -> IO TH1D
+tH2ProjectionX = xform4 c_th2_th2projectionx
+
+tH2ProjectionY :: TH2 -> String -> Int -> Int -> String -> IO TH1D
+tH2ProjectionY = xform4 c_th2_th2projectiony
diff --git a/src/HROOT/Class/Interface.hs b/src/HROOT/Class/Interface.hs
--- a/src/HROOT/Class/Interface.hs
+++ b/src/HROOT/Class/Interface.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE ForeignFunctionInterface, TypeFamilies, MultiParamTypeClasses, 
              FlexibleInstances, TypeSynonymInstances, UndecidableInstances, 
-             EmptyDataDecls, IncoherentInstances, ExistentialQuantification #-}
+             EmptyDataDecls, IncoherentInstances, ExistentialQuantification, 
+             ScopedTypeVariables #-}
 
 -- module HROOT.Class.Interface where
 
@@ -1084,7 +1085,34 @@
 instance Existable TRandom where
   data Exist TRandom = forall a. (FPtr a, ITRandom a) => ETRandom a
 
+data RawTCollection
+newtype TCollection = TCollection (ForeignPtr RawTCollection) deriving (Eq, Ord, Show)
+instance FPtr TCollection where
+   type Raw TCollection = RawTCollection
+   get_fptr (TCollection fptr) = fptr
+   cast_fptr_to_obj = TCollection
+instance Existable TCollection where
+  data Exist TCollection = forall a. (FPtr a, ITCollection a) => ETCollection a
 
+data RawTSeqCollection
+newtype TSeqCollection = TSeqCollection (ForeignPtr RawTSeqCollection) deriving (Eq, Ord, Show)
+instance FPtr TSeqCollection where
+   type Raw TSeqCollection = RawTSeqCollection
+   get_fptr (TSeqCollection fptr) = fptr
+   cast_fptr_to_obj = TSeqCollection
+instance Existable TSeqCollection where
+  data Exist TSeqCollection = forall a. (FPtr a, ITSeqCollection a) => ETSeqCollection a
+
+data RawTObjArray
+newtype TObjArray = TObjArray (ForeignPtr RawTObjArray) deriving (Eq, Ord, Show)
+instance FPtr TObjArray where
+   type Raw TObjArray = RawTObjArray
+   get_fptr (TObjArray fptr) = fptr
+   cast_fptr_to_obj = TObjArray
+instance Existable TObjArray where
+  data Exist TObjArray = forall a. (FPtr a, ITObjArray a) => ETObjArray a
+
+
 class IDeletable a where
 
     delete :: a -> IO () 
@@ -1513,10 +1541,117 @@
 
 
 class (ITH1 a) => ITH2 a where
+    -- | 
+    --   > Int_t    Fill(Double_t x, Double_t y);
 
     fill2 :: a -> Double -> Double -> IO Int 
+    -- | 
+    --   > void     FillRandom(TH1 *h, Int_t ntimes=5000);
+    --   
 
+    fillRandom2 :: (ITH1 c0, FPtr c0) => a -> c0 -> Int -> IO () 
+    -- | 
+    --   > Int_t    FindFirstBinAbove(Double_t threshold=0, Int_t axis=1) const;
+    --   
 
+    findFirstBinAbove2 :: a -> Double -> Int -> IO Int 
+    -- | 
+    --   > Int_t    FindLastBinAbove (Double_t threshold=0, Int_t axis=1) const;
+    --   
+
+    findLastBinAbove2 :: a -> Double -> Int -> IO Int 
+    -- | 
+    --   > void     FitSlicesX(TF1 *f1=0,Int_t firstybin=0, Int_t lastybin=-1, Int_t cut=0, Option_t *option="QNR", TObjArray* arr = 0); // *MENU*
+    --   
+
+    fitSlicesX :: (ITObjArray c1, FPtr c1, ITF1 c0, FPtr c0) => a -> c0 -> Int -> Int -> Int -> String -> c1 -> IO () 
+    -- | 
+    --   > void     FitSlicesY(TF1 *f1=0,Int_t firstxbin=0, Int_t lastxbin=-1, Int_t cut=0, Option_t *option="QNR", TObjArray* arr = 0); // *MENU*
+    --   
+
+    fitSlicesY :: (ITObjArray c1, FPtr c1, ITF1 c0, FPtr c0) => a -> c0 -> Int -> Int -> Int -> String -> c1 -> IO () 
+    -- | 
+    --   > Double_t GetCorrelationFactor(Int_t axis1=1,Int_t axis2=2) const;
+    --   
+
+    getCorrelationFactor :: a -> Int -> Int -> IO Double 
+    -- | 
+    --   > Double_t GetCovariance(Int_t axis1=1,Int_t axis2=2) const;
+    --   
+
+    getCovariance :: a -> Int -> Int -> IO Double 
+    -- | 
+    --   > void     GetStats(Double_t *stats) const;
+    --   
+
+    getStats :: a -> [Double] -> IO () 
+    -- | 
+    --   > Double_t Integral(Int_t binx1, Int_t binx2, Int_t biny1, Int_t biny2, Option_t *option="") const;
+    --   
+
+    integral :: a -> Int -> Int -> Int -> Int -> String -> IO Double 
+    -- | 
+    --   > Double_t Interpolate(Double_t x, Double_t y, Double_t z);
+    --   
+
+    interpolate :: a -> Double -> Double -> Double -> IO Double 
+    -- | 
+    --   > Double_t KolmogorovTest(const TH1 *h2, Option_t *option="") const;
+    --   
+
+    kolmogorovTest :: (ITH1 c0, FPtr c0) => a -> c0 -> String -> IO Double 
+    -- | 
+    --   > TH2     *RebinX(Int_t ngroup=2, const char *newname="");
+    --   
+
+    rebinX :: a -> Int -> String -> IO (Exist TH2) 
+    -- | 
+    --   > TH2     *RebinY(Int_t ngroup=2, const char *newname="");  
+    --   
+
+    rebinY :: a -> Int -> String -> IO (Exist TH2) 
+    -- | 
+    --   > TH2     *Rebin2D(Int_t nxgroup=2, Int_t nygroup=2, const char *newname="");     
+    --   
+
+    rebin2D :: a -> Int -> Int -> String -> IO (Exist TH2) 
+    -- | 
+    --   > void     PutStats(Double_t *stats);
+    --   
+
+    putStats :: a -> [Double] -> IO () 
+    -- | 
+    --   > void     Reset(Option_t *option="");
+    --   
+
+    reset :: a -> String -> IO () 
+    -- | 
+    --   > void     SetShowProjectionX(Int_t nbins);  // *MENU*
+    --   
+
+    setShowProjectionX :: a -> Int -> IO () 
+    -- | 
+    --   > void     SetShowProjectionY(Int_t nbins);  // *MENU*
+    --   
+
+    setShowProjectionY :: a -> Int -> IO () 
+    -- | 
+    --   > TH1     *ShowBackground(Int_t niter=20, Option_t *option="same");
+    --   
+
+    showBackground :: a -> Int -> String -> IO (Exist TH1) 
+    -- | 
+    --   > Int_t    ShowPeaks(Double_t sigma=2, Option_t *option="", Double_t threshold=0.05); // *MENU*
+    --   
+
+    showPeaks :: a -> Double -> String -> Double -> IO Int 
+    -- | 
+    --   > void     Smooth(Int_t ntimes=1, Option_t *option=""); // *MENU*
+    --   
+
+    smooth :: a -> Int -> String -> IO () 
+
+
 class (ITH1 a,ITAtt3D a) => ITH3 a where
 
 
@@ -1615,3 +1750,557 @@
     gaus :: a -> Double -> Double -> IO Double 
 
     uniform :: a -> Double -> Double -> IO Double 
+
+
+class (ITObject a) => ITCollection a where
+
+
+class (ITCollection a) => ITSeqCollection a where
+
+
+class (ITSeqCollection a) => ITObjArray a where
+
+upcastTObject :: (FPtr a, ITObject a) => a -> TObject
+upcastTObject h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTObject = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTNamed :: (FPtr a, ITNamed a) => a -> TNamed
+upcastTNamed h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTNamed = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTClass :: (FPtr a, ITClass a) => a -> TClass
+upcastTClass h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTClass = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTFormula :: (FPtr a, ITFormula a) => a -> TFormula
+upcastTFormula h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTFormula = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTAtt3D :: (FPtr a, ITAtt3D a) => a -> TAtt3D
+upcastTAtt3D h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTAtt3D = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTAttAxis :: (FPtr a, ITAttAxis a) => a -> TAttAxis
+upcastTAttAxis h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTAttAxis = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTAttBBox :: (FPtr a, ITAttBBox a) => a -> TAttBBox
+upcastTAttBBox h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTAttBBox = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTAttCanvas :: (FPtr a, ITAttCanvas a) => a -> TAttCanvas
+upcastTAttCanvas h = let fh = get_fptr h
+                         fh2 :: ForeignPtr RawTAttCanvas = castForeignPtr fh
+                     in cast_fptr_to_obj fh2
+
+upcastTAttFill :: (FPtr a, ITAttFill a) => a -> TAttFill
+upcastTAttFill h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTAttFill = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTAttImage :: (FPtr a, ITAttImage a) => a -> TAttImage
+upcastTAttImage h = let fh = get_fptr h
+                        fh2 :: ForeignPtr RawTAttImage = castForeignPtr fh
+                    in cast_fptr_to_obj fh2
+
+upcastTAttLine :: (FPtr a, ITAttLine a) => a -> TAttLine
+upcastTAttLine h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTAttLine = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTAttMarker :: (FPtr a, ITAttMarker a) => a -> TAttMarker
+upcastTAttMarker h = let fh = get_fptr h
+                         fh2 :: ForeignPtr RawTAttMarker = castForeignPtr fh
+                     in cast_fptr_to_obj fh2
+
+upcastTAttPad :: (FPtr a, ITAttPad a) => a -> TAttPad
+upcastTAttPad h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTAttPad = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTAttParticle :: (FPtr a, ITAttParticle a) => a -> TAttParticle
+upcastTAttParticle h = let fh = get_fptr h
+                           fh2 :: ForeignPtr RawTAttParticle = castForeignPtr fh
+                       in cast_fptr_to_obj fh2
+
+upcastTAttText :: (FPtr a, ITAttText a) => a -> TAttText
+upcastTAttText h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTAttText = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTHStack :: (FPtr a, ITHStack a) => a -> THStack
+upcastTHStack h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTHStack = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTF1 :: (FPtr a, ITF1 a) => a -> TF1
+upcastTF1 h = let fh = get_fptr h
+                  fh2 :: ForeignPtr RawTF1 = castForeignPtr fh
+              in cast_fptr_to_obj fh2
+
+upcastTGraph :: (FPtr a, ITGraph a) => a -> TGraph
+upcastTGraph h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTGraph = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTGraphAsymmErrors :: (FPtr a, ITGraphAsymmErrors a) => a -> TGraphAsymmErrors
+upcastTGraphAsymmErrors h = let fh = get_fptr h
+                                fh2 :: ForeignPtr RawTGraphAsymmErrors = castForeignPtr fh
+                            in cast_fptr_to_obj fh2
+
+upcastTCutG :: (FPtr a, ITCutG a) => a -> TCutG
+upcastTCutG h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTCutG = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTGraphBentErrors :: (FPtr a, ITGraphBentErrors a) => a -> TGraphBentErrors
+upcastTGraphBentErrors h = let fh = get_fptr h
+                               fh2 :: ForeignPtr RawTGraphBentErrors = castForeignPtr fh
+                           in cast_fptr_to_obj fh2
+
+upcastTGraphErrors :: (FPtr a, ITGraphErrors a) => a -> TGraphErrors
+upcastTGraphErrors h = let fh = get_fptr h
+                           fh2 :: ForeignPtr RawTGraphErrors = castForeignPtr fh
+                       in cast_fptr_to_obj fh2
+
+upcastTGraphPolar :: (FPtr a, ITGraphPolar a) => a -> TGraphPolar
+upcastTGraphPolar h = let fh = get_fptr h
+                          fh2 :: ForeignPtr RawTGraphPolar = castForeignPtr fh
+                      in cast_fptr_to_obj fh2
+
+upcastTGraphQQ :: (FPtr a, ITGraphQQ a) => a -> TGraphQQ
+upcastTGraphQQ h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTGraphQQ = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTEllipse :: (FPtr a, ITEllipse a) => a -> TEllipse
+upcastTEllipse h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTEllipse = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTArc :: (FPtr a, ITArc a) => a -> TArc
+upcastTArc h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTArc = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTCrown :: (FPtr a, ITCrown a) => a -> TCrown
+upcastTCrown h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTCrown = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTLine :: (FPtr a, ITLine a) => a -> TLine
+upcastTLine h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTLine = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTArrow :: (FPtr a, ITArrow a) => a -> TArrow
+upcastTArrow h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTArrow = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTGaxis :: (FPtr a, ITGaxis a) => a -> TGaxis
+upcastTGaxis h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTGaxis = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTShape :: (FPtr a, ITShape a) => a -> TShape
+upcastTShape h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTShape = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTBRIK :: (FPtr a, ITBRIK a) => a -> TBRIK
+upcastTBRIK h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTBRIK = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTTUBE :: (FPtr a, ITTUBE a) => a -> TTUBE
+upcastTTUBE h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTTUBE = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTPCON :: (FPtr a, ITPCON a) => a -> TPCON
+upcastTPCON h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTPCON = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTSPHE :: (FPtr a, ITSPHE a) => a -> TSPHE
+upcastTSPHE h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTSPHE = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTXTRU :: (FPtr a, ITXTRU a) => a -> TXTRU
+upcastTXTRU h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTXTRU = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTBox :: (FPtr a, ITBox a) => a -> TBox
+upcastTBox h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTBox = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTPave :: (FPtr a, ITPave a) => a -> TPave
+upcastTPave h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTPave = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTPaveText :: (FPtr a, ITPaveText a) => a -> TPaveText
+upcastTPaveText h = let fh = get_fptr h
+                        fh2 :: ForeignPtr RawTPaveText = castForeignPtr fh
+                    in cast_fptr_to_obj fh2
+
+upcastTDiamond :: (FPtr a, ITDiamond a) => a -> TDiamond
+upcastTDiamond h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTDiamond = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTPaveStats :: (FPtr a, ITPaveStats a) => a -> TPaveStats
+upcastTPaveStats h = let fh = get_fptr h
+                         fh2 :: ForeignPtr RawTPaveStats = castForeignPtr fh
+                     in cast_fptr_to_obj fh2
+
+upcastTPavesText :: (FPtr a, ITPavesText a) => a -> TPavesText
+upcastTPavesText h = let fh = get_fptr h
+                         fh2 :: ForeignPtr RawTPavesText = castForeignPtr fh
+                     in cast_fptr_to_obj fh2
+
+upcastTLegend :: (FPtr a, ITLegend a) => a -> TLegend
+upcastTLegend h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTLegend = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTPaveLabel :: (FPtr a, ITPaveLabel a) => a -> TPaveLabel
+upcastTPaveLabel h = let fh = get_fptr h
+                         fh2 :: ForeignPtr RawTPaveLabel = castForeignPtr fh
+                     in cast_fptr_to_obj fh2
+
+upcastTPaveClass :: (FPtr a, ITPaveClass a) => a -> TPaveClass
+upcastTPaveClass h = let fh = get_fptr h
+                         fh2 :: ForeignPtr RawTPaveClass = castForeignPtr fh
+                     in cast_fptr_to_obj fh2
+
+upcastTWbox :: (FPtr a, ITWbox a) => a -> TWbox
+upcastTWbox h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTWbox = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTFrame :: (FPtr a, ITFrame a) => a -> TFrame
+upcastTFrame h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTFrame = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTSliderBox :: (FPtr a, ITSliderBox a) => a -> TSliderBox
+upcastTSliderBox h = let fh = get_fptr h
+                         fh2 :: ForeignPtr RawTSliderBox = castForeignPtr fh
+                     in cast_fptr_to_obj fh2
+
+upcastTTree :: (FPtr a, ITTree a) => a -> TTree
+upcastTTree h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTTree = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTChain :: (FPtr a, ITChain a) => a -> TChain
+upcastTChain h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTChain = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTNtuple :: (FPtr a, ITNtuple a) => a -> TNtuple
+upcastTNtuple h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTNtuple = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTNtupleD :: (FPtr a, ITNtupleD a) => a -> TNtupleD
+upcastTNtupleD h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTNtupleD = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTTreeSQL :: (FPtr a, ITTreeSQL a) => a -> TTreeSQL
+upcastTTreeSQL h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTTreeSQL = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTPolyLine :: (FPtr a, ITPolyLine a) => a -> TPolyLine
+upcastTPolyLine h = let fh = get_fptr h
+                        fh2 :: ForeignPtr RawTPolyLine = castForeignPtr fh
+                    in cast_fptr_to_obj fh2
+
+upcastTCurlyLine :: (FPtr a, ITCurlyLine a) => a -> TCurlyLine
+upcastTCurlyLine h = let fh = get_fptr h
+                         fh2 :: ForeignPtr RawTCurlyLine = castForeignPtr fh
+                     in cast_fptr_to_obj fh2
+
+upcastTCurlyArc :: (FPtr a, ITCurlyArc a) => a -> TCurlyArc
+upcastTCurlyArc h = let fh = get_fptr h
+                        fh2 :: ForeignPtr RawTCurlyArc = castForeignPtr fh
+                    in cast_fptr_to_obj fh2
+
+upcastTEfficiency :: (FPtr a, ITEfficiency a) => a -> TEfficiency
+upcastTEfficiency h = let fh = get_fptr h
+                          fh2 :: ForeignPtr RawTEfficiency = castForeignPtr fh
+                      in cast_fptr_to_obj fh2
+
+upcastTAxis :: (FPtr a, ITAxis a) => a -> TAxis
+upcastTAxis h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTAxis = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTLatex :: (FPtr a, ITLatex a) => a -> TLatex
+upcastTLatex h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTLatex = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTText :: (FPtr a, ITText a) => a -> TText
+upcastTText h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTText = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTDirectory :: (FPtr a, ITDirectory a) => a -> TDirectory
+upcastTDirectory h = let fh = get_fptr h
+                         fh2 :: ForeignPtr RawTDirectory = castForeignPtr fh
+                     in cast_fptr_to_obj fh2
+
+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
+
+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
+
+upcastTBranch :: (FPtr a, ITBranch a) => a -> TBranch
+upcastTBranch h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTBranch = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTVirtualTreePlayer :: (FPtr a, ITVirtualTreePlayer a) => a -> TVirtualTreePlayer
+upcastTVirtualTreePlayer h = let fh = get_fptr h
+                                 fh2 :: ForeignPtr RawTVirtualTreePlayer = castForeignPtr fh
+                             in cast_fptr_to_obj fh2
+
+upcastTTreePlayer :: (FPtr a, ITTreePlayer a) => a -> TTreePlayer
+upcastTTreePlayer h = let fh = get_fptr h
+                          fh2 :: ForeignPtr RawTTreePlayer = castForeignPtr fh
+                      in cast_fptr_to_obj fh2
+
+upcastTArray :: (FPtr a, ITArray a) => a -> TArray
+upcastTArray h = let fh = get_fptr h
+                     fh2 :: ForeignPtr RawTArray = castForeignPtr fh
+                 in cast_fptr_to_obj fh2
+
+upcastTArrayC :: (FPtr a, ITArrayC a) => a -> TArrayC
+upcastTArrayC h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTArrayC = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTArrayD :: (FPtr a, ITArrayD a) => a -> TArrayD
+upcastTArrayD h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTArrayD = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTArrayF :: (FPtr a, ITArrayF a) => a -> TArrayF
+upcastTArrayF h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTArrayF = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTArrayI :: (FPtr a, ITArrayI a) => a -> TArrayI
+upcastTArrayI h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTArrayI = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTArrayL :: (FPtr a, ITArrayL a) => a -> TArrayL
+upcastTArrayL h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTArrayL = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTArrayL64 :: (FPtr a, ITArrayL64 a) => a -> TArrayL64
+upcastTArrayL64 h = let fh = get_fptr h
+                        fh2 :: ForeignPtr RawTArrayL64 = castForeignPtr fh
+                    in cast_fptr_to_obj fh2
+
+upcastTArrayS :: (FPtr a, ITArrayS a) => a -> TArrayS
+upcastTArrayS h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTArrayS = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTH1 :: (FPtr a, ITH1 a) => a -> TH1
+upcastTH1 h = let fh = get_fptr h
+                  fh2 :: ForeignPtr RawTH1 = castForeignPtr fh
+              in cast_fptr_to_obj fh2
+
+upcastTH2 :: (FPtr a, ITH2 a) => a -> TH2
+upcastTH2 h = let fh = get_fptr h
+                  fh2 :: ForeignPtr RawTH2 = castForeignPtr fh
+              in cast_fptr_to_obj fh2
+
+upcastTH3 :: (FPtr a, ITH3 a) => a -> TH3
+upcastTH3 h = let fh = get_fptr h
+                  fh2 :: ForeignPtr RawTH3 = castForeignPtr fh
+              in cast_fptr_to_obj fh2
+
+upcastTH1C :: (FPtr a, ITH1C a) => a -> TH1C
+upcastTH1C h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH1C = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH1D :: (FPtr a, ITH1D a) => a -> TH1D
+upcastTH1D h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH1D = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH1F :: (FPtr a, ITH1F a) => a -> TH1F
+upcastTH1F h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH1F = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH1I :: (FPtr a, ITH1I a) => a -> TH1I
+upcastTH1I h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH1I = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH1S :: (FPtr a, ITH1S a) => a -> TH1S
+upcastTH1S h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH1S = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH2C :: (FPtr a, ITH2C a) => a -> TH2C
+upcastTH2C h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH2C = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH2D :: (FPtr a, ITH2D a) => a -> TH2D
+upcastTH2D h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH2D = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH2F :: (FPtr a, ITH2F a) => a -> TH2F
+upcastTH2F h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH2F = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH2I :: (FPtr a, ITH2I a) => a -> TH2I
+upcastTH2I h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH2I = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH2Poly :: (FPtr a, ITH2Poly a) => a -> TH2Poly
+upcastTH2Poly h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTH2Poly = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTH2S :: (FPtr a, ITH2S a) => a -> TH2S
+upcastTH2S h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH2S = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH3C :: (FPtr a, ITH3C a) => a -> TH3C
+upcastTH3C h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH3C = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH3D :: (FPtr a, ITH3D a) => a -> TH3D
+upcastTH3D h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH3D = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH3F :: (FPtr a, ITH3F a) => a -> TH3F
+upcastTH3F h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH3F = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH3I :: (FPtr a, ITH3I a) => a -> TH3I
+upcastTH3I h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH3I = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTH3S :: (FPtr a, ITH3S a) => a -> TH3S
+upcastTH3S h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTH3S = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTQObject :: (FPtr a, ITQObject a) => a -> TQObject
+upcastTQObject h = let fh = get_fptr h
+                       fh2 :: ForeignPtr RawTQObject = castForeignPtr fh
+                   in cast_fptr_to_obj fh2
+
+upcastTVirtualPad :: (FPtr a, ITVirtualPad a) => a -> TVirtualPad
+upcastTVirtualPad h = let fh = get_fptr h
+                          fh2 :: ForeignPtr RawTVirtualPad = castForeignPtr fh
+                      in cast_fptr_to_obj fh2
+
+upcastTPad :: (FPtr a, ITPad a) => a -> TPad
+upcastTPad h = let fh = get_fptr h
+                   fh2 :: ForeignPtr RawTPad = castForeignPtr fh
+               in cast_fptr_to_obj fh2
+
+upcastTButton :: (FPtr a, ITButton a) => a -> TButton
+upcastTButton h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTButton = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTGroupButton :: (FPtr a, ITGroupButton a) => a -> TGroupButton
+upcastTGroupButton h = let fh = get_fptr h
+                           fh2 :: ForeignPtr RawTGroupButton = castForeignPtr fh
+                       in cast_fptr_to_obj fh2
+
+upcastTCanvas :: (FPtr a, ITCanvas a) => a -> TCanvas
+upcastTCanvas h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTCanvas = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTDialogCanvas :: (FPtr a, ITDialogCanvas a) => a -> TDialogCanvas
+upcastTDialogCanvas h = let fh = get_fptr h
+                            fh2 :: ForeignPtr RawTDialogCanvas = castForeignPtr fh
+                        in cast_fptr_to_obj fh2
+
+upcastTInspectCanvas :: (FPtr a, ITInspectCanvas a) => a -> TInspectCanvas
+upcastTInspectCanvas h = let fh = get_fptr h
+                             fh2 :: ForeignPtr RawTInspectCanvas = castForeignPtr fh
+                         in cast_fptr_to_obj fh2
+
+upcastTEvePad :: (FPtr a, ITEvePad a) => a -> TEvePad
+upcastTEvePad h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTEvePad = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTSlider :: (FPtr a, ITSlider a) => a -> TSlider
+upcastTSlider h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTSlider = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTApplication :: (FPtr a, ITApplication a) => a -> TApplication
+upcastTApplication h = let fh = get_fptr h
+                           fh2 :: ForeignPtr RawTApplication = castForeignPtr fh
+                       in cast_fptr_to_obj fh2
+
+upcastTRint :: (FPtr a, ITRint a) => a -> TRint
+upcastTRint h = let fh = get_fptr h
+                    fh2 :: ForeignPtr RawTRint = castForeignPtr fh
+                in cast_fptr_to_obj fh2
+
+upcastTRandom :: (FPtr a, ITRandom a) => a -> TRandom
+upcastTRandom h = let fh = get_fptr h
+                      fh2 :: ForeignPtr RawTRandom = castForeignPtr fh
+                  in cast_fptr_to_obj fh2
+
+upcastTCollection :: (FPtr a, ITCollection a) => a -> TCollection
+upcastTCollection h = let fh = get_fptr h
+                          fh2 :: ForeignPtr RawTCollection = castForeignPtr fh
+                      in cast_fptr_to_obj fh2
+
+upcastTSeqCollection :: (FPtr a, ITSeqCollection a) => a -> TSeqCollection
+upcastTSeqCollection h = let fh = get_fptr h
+                             fh2 :: ForeignPtr RawTSeqCollection = castForeignPtr fh
+                         in cast_fptr_to_obj fh2
+
+upcastTObjArray :: (FPtr a, ITObjArray a) => a -> TObjArray
+upcastTObjArray h = let fh = get_fptr h
+                        fh2 :: ForeignPtr RawTObjArray = castForeignPtr fh
+                    in cast_fptr_to_obj fh2
diff --git a/src/HROOT/Class/TCollection.hs b/src/HROOT/Class/TCollection.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Class/TCollection.hs
@@ -0,0 +1,9 @@
+module HROOT.Class.TCollection
+  (
+    TCollection(..)
+  , ITCollection 
+  ) where
+
+import HROOT.Class.Interface
+import HROOT.Class.Implementation ()
+
diff --git a/src/HROOT/Class/TObjArray.hs b/src/HROOT/Class/TObjArray.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Class/TObjArray.hs
@@ -0,0 +1,9 @@
+module HROOT.Class.TObjArray
+  (
+    TObjArray(..)
+  , ITObjArray 
+  ) where
+
+import HROOT.Class.Interface
+import HROOT.Class.Implementation ()
+
diff --git a/src/HROOT/Class/TSeqCollection.hs b/src/HROOT/Class/TSeqCollection.hs
new file mode 100644
--- /dev/null
+++ b/src/HROOT/Class/TSeqCollection.hs
@@ -0,0 +1,9 @@
+module HROOT.Class.TSeqCollection
+  (
+    TSeqCollection(..)
+  , ITSeqCollection 
+  ) where
+
+import HROOT.Class.Interface
+import HROOT.Class.Implementation ()
+
diff --git a/test/compiletest.hs b/test/compiletest.hs
new file mode 100644
--- /dev/null
+++ b/test/compiletest.hs
@@ -0,0 +1,7 @@
+module Main where
+
+import HROOT
+
+main :: IO () 
+main = do 
+  putStrLn "compile test success"
