diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+The "MIT" License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/OpenAFP.cabal b/OpenAFP.cabal
new file mode 100644
--- /dev/null
+++ b/OpenAFP.cabal
@@ -0,0 +1,92 @@
+name:               OpenAFP
+version:            1.0
+license:            BSD3
+License-file:       LICENSE
+author:             Audrey Tang
+maintainer:         audreyt@audreyt.org
+synopsis:           IBM AFP document format parser and generator
+description:        IBM AFP document format parser and generator
+exposed-modules:    OpenAFP.Internals.Binary OpenAFP.Internals.Ebc2Asc
+                    OpenAFP.Internals.UConv
+                    OpenAFP.Prelude.Utils OpenAFP.Prelude.Instances OpenAFP.Prelude.InstanceT
+                    OpenAFP.Prelude.Lookups
+                    OpenAFP.Prelude.InstanceAFP OpenAFP.Prelude.InstancePTX OpenAFP.Prelude.Exts
+                    OpenAFP.Records.T.LDOPM OpenAFP.Records.T.OSFO OpenAFP.Records.T.FRMT
+                    OpenAFP.Records.T.OCH OpenAFP.Records.T.MO OpenAFP.Records.T.T2FRMT
+                    OpenAFP.Records.T.FDS OpenAFP.Records.T.OCL OpenAFP.Records.T.OO
+                    OpenAFP.Records.T.CGCSGI OpenAFP.Records.T.PSRM OpenAFP.Records.T.TO
+                    OpenAFP.Records.T.AD OpenAFP.Records.T.RLI OpenAFP.Records.T.TS
+                    OpenAFP.Records.T.RUA OpenAFP.Records.T.CF OpenAFP.Records.T.PPI
+                    OpenAFP.Records.T.ROI OpenAFP.Records.T.EF OpenAFP.Records.T.ERLI
+                    OpenAFP.Records.T.FF OpenAFP.Records.T.MOR OpenAFP.Records.T.FCGCSGI
+                    OpenAFP.Records.T.POCP OpenAFP.Records.T.MF OpenAFP.Records.T.DP
+                    OpenAFP.Records.T.MEC OpenAFP.Records.T.CR OpenAFP.Records.T.OBE
+                    OpenAFP.Records.T.T1CRMT OpenAFP.Records.T.LDTS OpenAFP.Records.T.AV
+                    OpenAFP.Records.T.MMPN OpenAFP.Records.T.OFSS OpenAFP.Records.T.OBO
+                    OpenAFP.Records.T.UDTS OpenAFP.Records.T.ESI OpenAFP.Records.T.OCO
+                    OpenAFP.Records.T.PSMR OpenAFP.Records.T.OAS OpenAFP.Records.T.C
+                    OpenAFP.Records.T.FQN OpenAFP.Records.T.PV OpenAFP.Records.T.FHSF
+                    OpenAFP.Records.T.OOI OpenAFP.Records.T.MIS OpenAFP.Records.T.OSFE
+                    OpenAFP.Records.T.MA OpenAFP.Records.T.OAMU OpenAFP.Records.T.II
+                    OpenAFP.Records.T.AQ OpenAFP.Records.T.PC OpenAFP.Records.T.RSN
+                    OpenAFP.Records.T.FO OpenAFP.Records.T.ROT OpenAFP.Records.T.CS
+                    OpenAFP.Records.MCF.T OpenAFP.Records.AFP.ECP OpenAFP.Records.AFP.BIM
+                    OpenAFP.Records.AFP.PFC OpenAFP.Records.AFP.PTD1 OpenAFP.Records.AFP.IEL
+                    OpenAFP.Records.AFP.BMM OpenAFP.Records.AFP.ICP OpenAFP.Records.AFP.PTX
+                    OpenAFP.Records.AFP.EDT OpenAFP.Records.AFP.FNI OpenAFP.Records.AFP.IPD
+                    OpenAFP.Records.AFP.LNC OpenAFP.Records.AFP.BPM OpenAFP.Records.AFP.IRD
+                    OpenAFP.Records.AFP.PMC OpenAFP.Records.AFP.EDX OpenAFP.Records.AFP.FNM
+                    OpenAFP.Records.AFP.MCF1 OpenAFP.Records.AFP.EPT OpenAFP.Records.AFP.EBC
+                    OpenAFP.Records.AFP.BDD OpenAFP.Records.AFP.EAG OpenAFP.Records.AFP.MMT
+                    OpenAFP.Records.AFP.EDG OpenAFP.Records.AFP.FGD OpenAFP.Records.AFP.EFG
+                    OpenAFP.Records.AFP.CFI OpenAFP.Records.AFP.MBC OpenAFP.Records.AFP.MCC
+                    OpenAFP.Records.AFP.BCP OpenAFP.Records.AFP.MFC OpenAFP.Records.AFP.EOC
+                    OpenAFP.Records.AFP.FND OpenAFP.Records.AFP.ENG OpenAFP.Records.AFP.BDT
+                    OpenAFP.Records.AFP.EOG OpenAFP.Records.AFP.IOC OpenAFP.Records.AFP.EPG
+                    OpenAFP.Records.AFP.CPI OpenAFP.Records.AFP.MMC OpenAFP.Records.AFP.BDX
+                    OpenAFP.Records.AFP.ERG OpenAFP.Records.AFP.ESG OpenAFP.Records.AFP.IPG
+                    OpenAFP.Records.AFP.EMO OpenAFP.Records.AFP.MGO OpenAFP.Records.AFP.FNP
+                    OpenAFP.Records.AFP.MPG OpenAFP.Records.AFP.MIO OpenAFP.Records.AFP.BPT
+                    OpenAFP.Records.AFP.BBC OpenAFP.Records.AFP.EPS OpenAFP.Records.AFP.IPO
+                    OpenAFP.Records.AFP.MMO OpenAFP.Records.AFP.BAG OpenAFP.Records.AFP.CDD
+                    OpenAFP.Records.AFP.GAD OpenAFP.Records.AFP.IPS OpenAFP.Records.AFP.MPO
+                    OpenAFP.Records.AFP.BDG OpenAFP.Records.AFP.NOP OpenAFP.Records.AFP.ECF
+                    OpenAFP.Records.AFP.BFG OpenAFP.Records.AFP.GDD OpenAFP.Records.AFP.MPS
+                    OpenAFP.Records.AFP.BOC OpenAFP.Records.AFP.OBD OpenAFP.Records.AFP.MCF
+                    OpenAFP.Records.AFP.OCD OpenAFP.Records.AFP.CPD OpenAFP.Records.AFP.BNG
+                    OpenAFP.Records.AFP.FNC OpenAFP.Records.AFP.BOG OpenAFP.Records.AFP.CAT
+                    OpenAFP.Records.AFP.EFN OpenAFP.Records.AFP.BPG OpenAFP.Records.AFP.IOB
+                    OpenAFP.Records.AFP.BRG OpenAFP.Records.AFP.FNG OpenAFP.Records.AFP.BSG
+                    OpenAFP.Records.AFP.LLE OpenAFP.Records.AFP.EGR OpenAFP.Records.AFP.BMO
+                    OpenAFP.Records.AFP.OBP OpenAFP.Records.AFP.FNO OpenAFP.Records.AFP.MDR
+                    OpenAFP.Records.AFP.BPS OpenAFP.Records.AFP.TLE OpenAFP.Records.AFP.ECA
+                    OpenAFP.Records.AFP.BCF OpenAFP.Records.AFP.CFC OpenAFP.Records.AFP.MCA
+                    OpenAFP.Records.AFP.EDI OpenAFP.Records.AFP.BR OpenAFP.Records.AFP.EDM
+                    OpenAFP.Records.AFP.CPC OpenAFP.Records.AFP.BFN OpenAFP.Records.AFP.EII
+                    OpenAFP.Records.AFP.ER OpenAFP.Records.AFP.EFM OpenAFP.Records.AFP.PGP1
+                    OpenAFP.Records.AFP.CTC OpenAFP.Records.AFP.EIM OpenAFP.Records.AFP.BGR
+                    OpenAFP.Records.AFP.PGD OpenAFP.Records.AFP.LND OpenAFP.Records.AFP.EMM
+                    OpenAFP.Records.AFP.DXD OpenAFP.Records.AFP.EPM OpenAFP.Records.AFP.FNN
+                    OpenAFP.Records.AFP.IMM OpenAFP.Records.AFP.BCA OpenAFP.Records.AFP.BDA
+                    OpenAFP.Records.AFP.PGP OpenAFP.Records.AFP.PTD OpenAFP.Records.AFP.BDI
+                    OpenAFP.Records.AFP.IDD OpenAFP.Records.AFP.BDM OpenAFP.Records.AFP.BII
+                    OpenAFP.Records.AFP.MCD OpenAFP.Records.AFP.BFM OpenAFP.Records.AFP.MDD
+                    OpenAFP.Records.AFP.MSU OpenAFP.Records.AFP.IID OpenAFP.Records.PTX.AMI
+                    OpenAFP.Records.PTX.DBR OpenAFP.Records.PTX.BLN OpenAFP.Records.PTX.SIA
+                    OpenAFP.Records.PTX.SBI OpenAFP.Records.PTX.DIR OpenAFP.Records.PTX.RMB
+                    OpenAFP.Records.PTX.SCFL OpenAFP.Records.PTX.RMI OpenAFP.Records.PTX.SIM
+                    OpenAFP.Records.PTX.STC OpenAFP.Records.PTX.BSU OpenAFP.Records.PTX.NOP
+                    OpenAFP.Records.PTX.ESU OpenAFP.Records.PTX.AMB OpenAFP.Records.PTX.SVI
+                    OpenAFP.Records.PTX.TRN OpenAFP.Records.PTX.RPS OpenAFP.Records.PTX.STO
+                    OpenAFP.Records.AFP OpenAFP.Records.PTX OpenAFP.Records.T OpenAFP.Records.MCF
+                    OpenAFP.Types.Chunk OpenAFP.Types.Buffer OpenAFP.Types.View
+                    OpenAFP.Types.Record OpenAFP.Internals OpenAFP.Records OpenAFP.Types OpenAFP 
+category:           Data
+includes:           unicode/ucnv.h
+extensions:         CPP, ForeignFunctionInterface
+build-depends:      base, mtl, haskell98, regex-compat
+include-dirs:       /usr/include /usr/local/include /opt/local/include
+extra-lib-dirs:     /usr/lib /usr/local/lib /opt/local/lib
+ld-options:         -licuuc
+ghc-options:        -fglasgow-exts -funbox-strict-fields -fno-warn-missing-signatures
+hs-source-dirs:     src
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,10 @@
+#!/usr/bin/env runghc
+\begin{code}
+
+module Main where
+import Distribution.Simple
+
+main :: IO ()
+main = defaultMain
+
+\end{code}
diff --git a/src/OpenAFP.hs b/src/OpenAFP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP.hs
@@ -0,0 +1,97 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- This module re-exports all Records, Types, Internals and Prelude modules,
+-- and provides some toplevel convenience functions.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP (
+    module OpenAFP.Types,
+    module OpenAFP.Records,
+    module OpenAFP.Internals,
+    module OpenAFP.Prelude.Exts,
+    module OpenAFP.Prelude.Utils,
+    module OpenAFP.Prelude.Lookups,
+    module OpenAFP.Prelude.Instances,
+    module OpenAFP.Internals.UConv,
+
+    readAFP, writeAFP, filterAFP,
+    readArgs, afp_Chunks,
+) where
+import OpenAFP.Types
+import OpenAFP.Records
+import OpenAFP.Internals
+import OpenAFP.Internals.UConv
+import OpenAFP.Prelude.Utils
+import OpenAFP.Prelude.Lookups
+import OpenAFP.Prelude.Instances
+import OpenAFP.Prelude.Exts
+
+afp_Chunks :: FilePath -> [AFP_]
+afp_Chunks filename = unsafePerformIO $ readAFP filename
+
+writeAFP :: (Binary a) => FilePath -> [a] -> IO ()
+writeAFP filename c = do
+    fh  <- openBinaryFile filename WriteMode
+    bh  <- openBinIO_ fh
+    put bh $ c
+    hClose fh
+    return ()
+
+filterAFP :: FilePath -> FilePath -> [(ChunkType, AFP_ -> IO [AFP_])] -> IO ()
+filterAFP input output filters = do
+    ifh  <- openBinaryFile input ReadMode
+    ibh  <- openBinIO_ ifh
+    ofh  <- openBinaryFile output WriteMode
+    obh  <- openBinIO_ ofh
+    filterAFPChunks ibh obh filters `catchError` \e -> return ()
+    hClose ifh
+    hClose ofh
+    return ()
+
+filterAFPChunks ibh obh filters = do
+    eof <- isEOFBin ibh
+    if eof then return () else do
+	c <- get ibh :: IO AFP_
+	filterChunk c filters obh
+	filterAFPChunks ibh obh filters
+
+filterChunk c possibleFilters bh
+    | null filters  = put bh c
+    | otherwise     = mapM_ (\(_, f) -> do
+	c' <- f c
+	put bh c') filters
+    where
+	filters = filter (\(t, _) -> (t == chunkType c)) possibleFilters
+
+instance RecChunk FilePath AFP_ N3 Buffer2 where
+    readChunks = afp_Chunks
+
+instance Rec Char
+
+readAFP :: (MonadIO m) => FilePath -> m [AFP_]
+readAFP filename = liftIO $ do
+    fh  <- openBinaryFile filename ReadMode
+    bh  <- openBinIO_ fh
+    cs  <- get bh
+    return cs
+
+readArgs :: (MonadIO m) => Int -> m [String]
+readArgs n = liftIO $ do
+    args <- getArgs
+    when ((length args) < n) $ do
+        pgm <- getProgName
+        putStrLn $ "Usage: " ++ pgm ++ " input.afp output.afp"
+        exitFailure
+    return args
+
diff --git a/src/OpenAFP/Internals.hs b/src/OpenAFP/Internals.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Internals.hs
@@ -0,0 +1,110 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Internals
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- This module imports and re-exports external modules used by OpenAFP,
+-- as well as OpenAFP's own internal modules.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Internals (
+    module OpenAFP.Internals.Binary,
+    module OpenAFP.Internals.Ebc2Asc,
+
+    module Control.Exception,
+    module Control.Monad.RWS,
+    module Control.Monad.Error,
+    module Data.Array.Unboxed,
+    module Data.Bits,
+    module Data.Char,
+    module Data.List,
+    module Data.HashTable,
+    module Data.Word,
+    module Data.Typeable,
+    module Data.IORef,
+    module Data.Maybe,
+    module Debug.Trace,
+    module Foreign.C.String,
+    module Foreign.C.Types,
+    module Foreign.Marshal.Alloc,
+    module Foreign.Marshal.Array,
+    module Foreign.Marshal.Utils,
+    module Foreign.Ptr,
+    module Foreign.ForeignPtr,
+    module Foreign.Storable,
+    module System.Mem.Weak,
+    module System.Console.GetOpt,
+    module System.IO,
+    module System.Cmd,
+    module System.Environment,
+    module System.Exit,
+    module System.IO.Unsafe,
+    module System.IO.Error,
+    module System.Directory,
+    module Text.Regex,
+    module GHC.IOBase,
+
+    IOm, StateIO,
+
+    hashNew, hashLookup, hashInsert, hashDelete,
+    stateGet, statePut
+) where
+import OpenAFP.Internals.Binary
+import OpenAFP.Internals.Ebc2Asc
+
+import Control.Exception hiding (try, catch, ioError)
+import Control.Monad.Error (throwError, catchError, MonadError(..), Error(..))
+import Control.Monad.RWS hiding (get, put)
+import qualified Control.Monad.RWS (get, put)
+import Data.Array.Unboxed
+import Data.Bits
+import Data.Char
+import Data.List
+import Data.HashTable hiding (lookup, insert, delete, new)
+import qualified Data.HashTable (lookup, insert, delete, new)
+import Data.Word
+import Data.Typeable
+import Data.IORef
+import Data.Maybe
+import Debug.Trace
+import Foreign.C.String
+import Foreign.C.Types
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Array
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.ForeignPtr
+import Foreign.Storable
+import Numeric
+import System.Cmd
+import System.Console.GetOpt
+import System.IO
+import System.Environment
+import System.Exit
+import System.Mem.Weak
+import System.IO.Unsafe
+import System.IO.Error
+import System.Directory
+import Text.Regex
+import GHC.IOBase (IOArray, newIOArray, readIOArray, writeIOArray)
+
+hashNew     = Data.HashTable.new
+hashLookup  = Data.HashTable.lookup
+hashInsert  = Data.HashTable.insert
+hashDelete  = Data.HashTable.delete
+
+stateGet :: (Control.Monad.RWS.MonadState s m) => m s
+stateGet = Control.Monad.RWS.get
+statePut :: (Control.Monad.RWS.MonadState s m) => s -> m ()
+statePut = Control.Monad.RWS.put
+
+type IOm a = (MonadPlus m, MonadIO m, MonadError e m, Show e, Typeable e) => m a
+type StateIO v a = (MonadPlus m, MonadIO m, MonadReader v m, MonadError e m, Show e, Typeable e) => m a
diff --git a/src/OpenAFP/Internals/Binary.hs b/src/OpenAFP/Internals/Binary.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Internals/Binary.hs
@@ -0,0 +1,531 @@
+{-# OPTIONS -fglasgow-exts -O -funbox-strict-fields #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Internals.Binary
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- Binary IO library for buffers and file handles.
+--
+-- Based on Binary.hs from GHC source tree, (c) The University of Glasgow 2002.
+--
+-- Based on the nhc98 Binary library, which is copyright
+-- (c) Malcolm Wallace and Colin Runciman, University of York, 1998.
+-- Under the terms of the license for that software, we must tell you
+-- where you can obtain the original version of the Binary library, namely
+--     <http://www.cs.york.ac.uk/fp/nhc98/>
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Internals.Binary (
+    {-class-} Binary(..),
+    {-type-}  BinHandle,
+
+    openBinIO, openBinIO_,
+    openBinBuf, newBinBuf,
+
+    seekBin, tellBin, closeBin, isEOFBin, sizeBin,
+
+    putByte, getByte,
+
+    getBuf, putBuf, bufOf,
+
+    N0(..),
+
+    N1(..), N2(..), N3(..), N4(..),
+    I1(..), I2(..), I4(..), I8(..),
+    A1(..), A2(..), A3(..), A4(..), A6(..), A8(..), A12(..),
+    PStringLen,
+  ) where
+
+import Data.Array.Unboxed
+import Data.Bits
+import Data.Int
+import Data.Word
+import Data.Typeable
+import Control.Monad            ( when )
+import System.IO as IO
+import System.IO.Error          ( mkIOError, eofErrorType )
+import GHC.Exts
+import GHC.Word                 ( Word8(..) )
+import Foreign.Storable
+import Data.Char
+import Foreign.Ptr
+import Numeric                  (showHex)
+
+import System.Mem.Weak
+import Foreign.C.Types
+import Foreign.Marshal.Utils
+import Foreign.ForeignPtr
+
+import GHC.Base
+import GHC.IOBase
+
+---------------------------------------------------------------
+--              BinHandle
+---------------------------------------------------------------
+
+data BinHandle =
+    BinIO {             -- binary data stored in a file
+        off_r   :: !IntM,         -- the current offset (cached)
+        hdl     :: !IO.Handle           -- the file handle (must be seekable)
+    }
+    |
+    BinBuf {            -- PStringLen based buffers
+        off_r  :: !IntM,          -- the current offset (cached)
+        buf    :: !PStringLen     -- the memory buffer
+    }
+    deriving (Show, Typeable)
+
+type PStringLen = (ForeignPtr CChar, Int)
+
+---------------------------------------------------------------
+--              Accessors
+---------------------------------------------------------------
+
+bufOf :: BinHandle -> PStringLen
+bufOf (BinIO _ _) = error "bufOf not defined"
+bufOf (BinBuf _ buf) = buf
+
+instance Show IntM where
+    show i = (show $ unsafePerformIO $ readIntM i)
+
+---------------------------------------------------------------
+--              class Binary
+---------------------------------------------------------------
+
+class Binary a where
+    put    :: BinHandle -> a -> IO ()
+    get    :: BinHandle -> IO a
+
+openBinIO_ :: IO.Handle -> IO BinHandle
+openBinIO_ h = openBinIO h 
+
+openBinIO :: IO.Handle -> IO BinHandle
+openBinIO h = do
+    r <- newIntM
+    writeIntM r 0
+    return (BinIO r h)
+
+openBinBuf :: PStringLen -> IO BinHandle
+openBinBuf pstrlen = do
+   ix_r <- newIntM
+   writeIntM ix_r 0
+   return $ BinBuf ix_r pstrlen
+
+newBinBuf :: Int -> IO BinHandle
+newBinBuf size
+    | size <= 0 = error "newBinBuf: size must be >= 0"
+    | otherwise = do
+        pstr <- mallocForeignPtrBytes size
+        openBinBuf (pstr, size)
+
+tellBin :: BinHandle -> IO Int
+tellBin (BinIO  r _) = readIntM r
+tellBin (BinBuf r _) = readIntM r
+
+seekBin :: BinHandle -> Int -> IO ()
+seekBin (BinIO ix_r h) p = do 
+    writeIntM ix_r p
+    hSeek h AbsoluteSeek (fromIntegral p)
+seekBin (BinBuf ix_r _) p = do
+    writeIntM ix_r p
+
+closeBin :: BinHandle -> IO ()
+closeBin (BinIO _ h) = hClose h
+closeBin (BinBuf _ _) = return ()
+
+isEOFBin :: BinHandle -> IO Bool
+isEOFBin (BinIO _ h) = hIsEOF h
+isEOFBin (BinBuf ix_r (_, len)) = do
+    ix <- readIntM ix_r
+    return (ix >= len)
+
+sizeBin :: BinHandle -> IO Int
+sizeBin (BinIO _ h) = do
+    size <- hFileSize h
+    return $ fromEnum size
+sizeBin (BinBuf _ (_, len)) = return len
+
+-- -----------------------------------------------------------------------------
+-- Low-level reading/writing of bytes
+
+putWord8 :: BinHandle -> Word8 -> IO ()
+putWord8 (BinIO ix_r h) w = do
+    -- ix <- readIntM ix_r
+    hPutChar h $ chr $ fromEnum w   -- XXX not really correct
+    -- writeIntM ix_r (ix+1)
+    return ()
+putWord8 (BinBuf ix_r (pstr, len)) w = do
+    ix <- readIntM ix_r
+    when (ix >= len) $
+        ioError (mkIOError eofErrorType "putWord8" Nothing Nothing)
+    writeIntM ix_r (ix+1)
+    withForeignPtr pstr $ \cstr ->
+        pokeByteOff cstr ix w
+    return ()
+
+getWord8 :: BinHandle -> IO Word8
+getWord8 (BinIO ix_r h) = do
+    ix <- readIntM ix_r
+    c <- hGetChar h
+    writeIntM ix_r (ix+1)
+    return $! (fromIntegral (ord c))    -- XXX not really correct
+getWord8 (BinBuf ix_r (pstr, len)) = do
+    ix <- readIntM ix_r
+--  when (ix >= len)  $
+--      ioError (mkIOError eofErrorType "getWord8" Nothing Nothing)
+    writeIntM ix_r (ix+1)
+    withForeignPtr pstr $ \cstr ->
+        peekByteOff cstr ix
+
+getBuf :: BinHandle -> Int -> IO PStringLen
+getBuf (BinIO ix_r h) size = do
+    pstr <- mallocForeignPtrBytes size
+    withForeignPtr pstr $ \cstr -> do
+        len <- hGetBuf h cstr size
+        ix <- readIntM ix_r
+        writeIntM ix_r (ix + len)
+        return (pstr, len)
+getBuf (BinBuf ix_r (pstr, len)) size = do
+    ix <- readIntM ix_r
+    let len' = min (len - ix) size
+    writeIntM ix_r (ix + len')
+    withForeignPtr pstr $ \cstr -> do
+        pstr' <- newForeignPtr_ (plusPtr cstr ix)
+        addFinalizer pstr' $ touchForeignPtr pstr -- ???
+        return (pstr', len')
+
+putBuf :: BinHandle -> PStringLen -> IO ()
+putBuf (BinIO ix_r h) (pstr, len) = do
+    ix <- readIntM ix_r
+    writeIntM ix_r (ix + len)
+    withForeignPtr pstr $ \cstr ->
+        hPutBuf h cstr len
+putBuf (BinBuf ix_r (pstr, len)) (pstr', len') = do
+    ix <- readIntM ix_r
+    when ((ix + len') > len) $
+        ioError (mkIOError eofErrorType "putBuf" Nothing Nothing)
+    writeIntM ix_r (ix+len')
+    withForeignPtr pstr $ \cstr ->
+        withForeignPtr pstr' $ \cstr' ->
+            copyBytes (plusPtr cstr ix) cstr' len'
+
+putByte :: BinHandle -> Word8 -> IO ()
+putByte bh w = put bh w
+
+getByte :: BinHandle -> IO Word8
+getByte = getWord8
+
+-- -----------------------------------------------------------------------------
+-- Primitve Word writes
+
+instance Binary Word8 where
+  put = putWord8
+  get = getWord8
+
+instance Binary Word16 where
+  put h w = do -- XXX too slow.. inline putWord8?
+    putByte h (fromIntegral (w `shiftR` 8))
+    putByte h (fromIntegral (w .&. 0xff))
+  get h = do
+    w1 <- getWord8 h
+    w2 <- getWord8 h
+    return $! ((fromIntegral w1 `shiftL` 8) .|. fromIntegral w2)
+
+newtype A1 = A1 Word8 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary)
+newtype A2 = A2 Word16 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary)
+newtype A3 = A3 Word32 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable)
+newtype A4 = A4 Word32 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary)
+newtype A6 = A6 Word64 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable)
+newtype A8 = A8 Word64 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary)
+newtype A12 = A12 Integer deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable)
+
+newtype I1 = I1 Int8 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary, Ix, IArray UArray, Show)
+newtype I2 = I2 Int16 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary, Ix, IArray UArray, Show)
+newtype I4 = I4 Int32 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary, Ix, IArray UArray, Show)
+newtype I8 = I8 Int64 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary, Ix, IArray UArray, Show)
+
+newtype N1 = N1 Word8 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary, Ix, IArray UArray)
+newtype N2 = N2 Word16 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary)
+newtype N3 = N3 Word32 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable)
+newtype N4 = N4 Word32 deriving (Ord, Enum, Real, Integral, Eq, Num, Bits, Typeable, Storable, Binary)
+
+newtype N0 = N0 () deriving (Show, Ord, Enum, Eq, Typeable, Binary, Ix)
+
+instance Num N0 where
+    x + _           = x
+    x * _           = x
+    abs x           = x
+    signum x        = x
+    fromInteger _   = N0 ()
+
+instance Show N1 where show = zeropad 1
+instance Show N2 where show = zeropad 2
+instance Show N3 where show = zeropad 3
+instance Show N4 where show = zeropad 4
+
+instance Show A1 where show = zeropad 1
+instance Show A2 where show = zeropad 2
+instance Show A3 where show = zeropad 3
+instance Show A4 where show = zeropad 4
+instance Show A6 where show = zeropad 6
+instance Show A8 where show = zeropad 8
+instance Show A12 where show = zeropad 12
+
+{-# INLINE zeropad #-}
+zeropad :: (Integral a) => Int -> a -> String
+zeropad len str = replicate len' '0' ++ str'
+    where str' = map toUpper $ showHex str ""
+          len' = 2*len - length str'
+
+instance Storable N3 where
+    sizeOf w = 3
+    alignment w = 8
+
+instance Storable A3 where
+    sizeOf w = 3
+    alignment w = 8
+
+instance Storable A6 where
+    sizeOf w = 6
+    alignment w = 8
+
+instance Storable A12 where
+    sizeOf w = 12
+    alignment w = 8
+
+instance (Storable a, Storable b) => Storable (a, b) where
+    alignment _     = error "alignment not defined"
+    sizeOf (x, y)   = (sizeOf x) + (sizeOf y)
+
+instance Binary N3 where
+  put h w = do
+    putByte h (fromIntegral (w `shiftR` 16))
+    putByte h (fromIntegral ((w `shiftR` 8)  .&. 0xff))
+    putByte h (fromIntegral (w .&. 0xff))
+  get h = do
+    w1 <- getWord8 h
+    w2 <- getWord8 h
+    w3 <- getWord8 h
+    return $! ((fromIntegral w1 `shiftL` 16) .|. 
+               (fromIntegral w2 `shiftL`  8) .|. 
+               (fromIntegral w3))
+
+instance Binary A3 where
+  put h w = do
+    putByte h (fromIntegral (w `shiftR` 16))
+    putByte h (fromIntegral ((w `shiftR` 8)  .&. 0xff))
+    putByte h (fromIntegral (w .&. 0xff))
+  get h = do
+    w1 <- getWord8 h
+    w2 <- getWord8 h
+    w3 <- getWord8 h
+    return $! ((fromIntegral w1 `shiftL` 16) .|. 
+               (fromIntegral w2 `shiftL`  8) .|. 
+               (fromIntegral w3))
+
+instance Binary A6 where
+  put h w = do
+    putByte h (fromIntegral (w `shiftR` 40))
+    putByte h (fromIntegral ((w `shiftR` 32) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 24) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 16) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 8)  .&. 0xff))
+    putByte h (fromIntegral (w .&. 0xff))
+  get h = do
+    w1 <- getWord8 h
+    w2 <- getWord8 h
+    w3 <- getWord8 h
+    w4 <- getWord8 h
+    w5 <- getWord8 h
+    w6 <- getWord8 h
+    return $! ((fromIntegral w1 `shiftL` 40) .|. 
+               (fromIntegral w2 `shiftL` 32) .|. 
+               (fromIntegral w3 `shiftL` 24) .|. 
+               (fromIntegral w4 `shiftL` 16) .|. 
+               (fromIntegral w5 `shiftL`  8) .|. 
+               (fromIntegral w6))
+
+instance Binary A12 where
+  put h w = do
+    putByte h (fromIntegral (w `shiftR` 88))
+    putByte h (fromIntegral ((w `shiftR` 80) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 72) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 64) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 56) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 48) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 40) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 32) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 24) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 16) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 8)  .&. 0xff))
+    putByte h (fromIntegral (w .&. 0xff))
+  get h = do
+    w1 <- getWord8 h
+    w2 <- getWord8 h
+    w3 <- getWord8 h
+    w4 <- getWord8 h
+    w5 <- getWord8 h
+    w6 <- getWord8 h
+    return $! ((fromIntegral w1 `shiftL` 88) .|. 
+               (fromIntegral w2 `shiftL` 80) .|. 
+               (fromIntegral w3 `shiftL` 72) .|. 
+               (fromIntegral w4 `shiftL` 64) .|. 
+               (fromIntegral w5 `shiftL` 56) .|. 
+               (fromIntegral w2 `shiftL` 48) .|. 
+               (fromIntegral w3 `shiftL` 40) .|. 
+               (fromIntegral w2 `shiftL` 32) .|. 
+               (fromIntegral w3 `shiftL` 24) .|. 
+               (fromIntegral w4 `shiftL` 16) .|. 
+               (fromIntegral w5 `shiftL`  8) .|. 
+               (fromIntegral w6))
+
+instance Binary Word32 where
+  put h w = do
+    putByte h (fromIntegral (w `shiftR` 24))
+    putByte h (fromIntegral ((w `shiftR` 16) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 8)  .&. 0xff))
+    putByte h (fromIntegral (w .&. 0xff))
+  get h = do
+    w1 <- getWord8 h
+    w2 <- getWord8 h
+    w3 <- getWord8 h
+    w4 <- getWord8 h
+    return $! ((fromIntegral w1 `shiftL` 24) .|. 
+               (fromIntegral w2 `shiftL` 16) .|. 
+               (fromIntegral w3 `shiftL`  8) .|. 
+               (fromIntegral w4))
+
+
+instance Binary Word64 where
+  put h w = do
+    putByte h (fromIntegral (w `shiftR` 56))
+    putByte h (fromIntegral ((w `shiftR` 48) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 40) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 32) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 24) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR` 16) .&. 0xff))
+    putByte h (fromIntegral ((w `shiftR`  8) .&. 0xff))
+    putByte h (fromIntegral (w .&. 0xff))
+  get h = do
+    w1 <- getWord8 h
+    w2 <- getWord8 h
+    w3 <- getWord8 h
+    w4 <- getWord8 h
+    w5 <- getWord8 h
+    w6 <- getWord8 h
+    w7 <- getWord8 h
+    w8 <- getWord8 h
+    return $! ((fromIntegral w1 `shiftL` 56) .|. 
+               (fromIntegral w2 `shiftL` 48) .|. 
+               (fromIntegral w3 `shiftL` 40) .|. 
+               (fromIntegral w4 `shiftL` 32) .|. 
+               (fromIntegral w5 `shiftL` 24) .|. 
+               (fromIntegral w6 `shiftL` 16) .|. 
+               (fromIntegral w7 `shiftL`  8) .|. 
+               (fromIntegral w8))
+
+-- -----------------------------------------------------------------------------
+-- Primitve Int writes
+
+instance Binary Int8 where
+  put h w = put h (fromIntegral w :: Word8)
+  get h    = do w <- get h; return $! (fromIntegral (w::Word8))
+
+instance Binary Int16 where
+  put h w = put h (fromIntegral w :: Word16)
+  get h    = do w <- get h; return $! (fromIntegral (w::Word16))
+
+instance Binary Int32 where
+  put h w = put h (fromIntegral w :: Word32)
+  get h    = do w <- get h; return $! (fromIntegral (w::Word32))
+
+instance Binary Int64 where
+  put h w = put h (fromIntegral w :: Word64)
+  get h    = do w <- get h; return $! (fromIntegral (w::Word64))
+
+-- -----------------------------------------------------------------------------
+-- Instances for standard types
+
+instance Binary () where
+    put bh () = return ()
+    get  _     = return ()
+
+instance Binary Bool where
+    put bh b    = putByte bh (fromIntegral (fromEnum b))
+    get bh      = do x <- getWord8 bh; return $! (toEnum (fromEnum x))
+
+instance Binary Char where
+    put bh c    = put bh (fromIntegral (ord c) :: Word8)
+    get bh      = do x <- get bh; return $! (chr (fromEnum (x :: Word8)))
+
+-- XXX - 32-bitism
+instance Binary Int where
+    put bh i = put bh (fromIntegral i :: Int32)
+    get bh = do
+        x <- get bh
+        return $! (fromIntegral (x :: Int32))
+
+instance Binary a => Binary [a] where
+    put bh list = do mapM_ (put bh) list
+    get bh@(BinBuf ix_r (_, len)) = do
+        ix <- readIntM ix_r
+        if (ix >= len) then
+            return []
+            else do
+            x  <- get bh
+            xs <- get bh
+            return (x:xs)
+    get bh@(BinIO _ _) = (do
+        x  <- get bh
+        xs <- unsafeInterleaveIO $ get bh
+        return (x:xs)) `catch` \e -> return []
+
+instance (Binary a, Binary b) => Binary (a,b) where
+    put bh (a,b)    = do put bh a; put bh b
+    get bh          = do a <- get bh
+                         b <- get bh
+                         return (a,b)
+
+instance (Binary a, Binary b, Binary c) => Binary (a,b,c) where
+    put bh (a,b,c)  = do put bh a; put bh b; put bh c
+    get bh          = do a <- get bh
+                         b <- get bh
+                         c <- get bh
+                         return (a,b,c)
+
+instance (Binary a, Binary b, Binary c, Binary d) => Binary (a,b,c,d) where
+    put bh (a,b,c,d)= do put bh a; put bh b; put bh c; put bh d
+    get bh          = do a <- get bh
+                         b <- get bh
+                         c <- get bh
+                         d <- get bh
+                         return (a,b,c,d)
+
+---------------------------------------------------------------
+--              Support code: IntM
+---------------------------------------------------------------
+
+data IntM = IntM (MutableByteArray# RealWorld)
+
+newIntM :: IO IntM
+newIntM = IO $ \s ->
+    case newByteArray# size s of { (# s, arr #) ->
+    (# s, IntM arr #) }
+    where I# size = 4 -- XXX - 32-bitism
+
+readIntM :: IntM -> IO Int
+readIntM (IntM arr) = IO $ \s ->
+    case readIntArray# arr 0# s of { (# s, i #) ->
+    (# s, I# i #) }
+
+writeIntM :: IntM -> Int -> IO ()
+writeIntM (IntM arr) (I# i) = IO $ \s ->
+    case writeIntArray# arr 0# i s of { s ->
+    (# s, () #) }
diff --git a/src/OpenAFP/Internals/Ebc2Asc.hs b/src/OpenAFP/Internals/Ebc2Asc.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Internals/Ebc2Asc.hs
@@ -0,0 +1,76 @@
+{-# OPTIONS -O -fglasgow-exts #-}
+
+module OpenAFP.Internals.Ebc2Asc where
+import Data.Word
+import Data.Array.Unboxed
+import OpenAFP.Internals.Binary
+
+ebc2asc :: UArray N1 Char
+ebc2asc = listArray (0, 255) [
+        '\x00', '\x01', '\x02', '\x03', '\x00', '\x09', '\x00', '\x00',
+        '\x00', '\x00', '\x00', '\x0B', '\x0C', '\x0D', '\x20', '\x20',
+        '\x10', '\x11', '\x12', '\x13', '\x00', '\x00', '\x08', '\x00',
+        '\x18', '\x19', '\x00', '\x00', '\x1C', '\x1D', '\x1E', '\x1F',
+        '\x00', '\x00', '\x00', '\x00', '\x00', '\x0A', '\x17', '\x1B',
+        '\x00', '\x00', '\x00', '\x00', '\x00', '\x05', '\x06', '\x07',
+        '\x00', '\x00', '\x16', '\x00', '\x00', '\x00', '\x00', '\x04',
+        '\x00', '\x00', '\x00', '\x00', '\x14', '\x15', '\x00', '\x00',
+        '\x20', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x20', '\x20', '\x5B', '\x2E', '\x3C', '\x28', '\x2B', '\x21',
+        '\x26', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x20', '\x20', '\x5D', '\x24', '\x2A', '\x29', '\x3B', '\x5E',
+        '\x2D', '\x2F', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x20', '\x20', '\x7C', '\x2C', '\x25', '\x5F', '\x3E', '\x3F',
+        '\x20', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x20', '\x60', '\x3A', '\x23', '\x40', '\x27', '\x3D', '\x22',
+        '\x20', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67',
+        '\x68', '\x69', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x20', '\x6A', '\x6B', '\x6C', '\x6D', '\x6E', '\x6F', '\x70',
+        '\x71', '\x72', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x20', '\x7E', '\x73', '\x74', '\x75', '\x76', '\x77', '\x78',
+        '\x79', '\x7A', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x20', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x20', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x7B', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47',
+        '\x48', '\x49', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x7D', '\x4A', '\x4B', '\x4C', '\x4D', '\x4E', '\x4F', '\x50',
+        '\x51', '\x52', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x5C', '\x20', '\x53', '\x54', '\x55', '\x56', '\x57', '\x58',
+        '\x59', '\x5A', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20',
+        '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37',
+        '\x38', '\x39', '\x20', '\x20', '\x20', '\x20', '\x20', '\x20' ]
+
+asc2ebc :: UArray Int N1
+asc2ebc = listArray (0, 255) [
+        0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
+        0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x3F, 0x3F,
+        0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
+        0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+        0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
+        0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+        0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+        0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+        0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+        0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+        0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
+        0xE7, 0xE8, 0xE9, 0x4A, 0xE0, 0x6A, 0x5F, 0x6D,
+        0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+        0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+        0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
+        0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+        0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 ]
diff --git a/src/OpenAFP/Internals/UConv.hs b/src/OpenAFP/Internals/UConv.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Internals/UConv.hs
@@ -0,0 +1,67 @@
+{-# OPTIONS -#include <unicode/ucnv.h> #-}
+{-# OPTIONS -fglasgow-exts #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Internals.UConv
+-- Copyright   :  Audrey Tang
+-- License     :  BSD-style
+--
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (FFI extensions, UNIX98)
+--
+-- This module provides an interface to IBM ICU's uconv functionality
+--
+-----------------------------------------------------------------------------
+
+-- Make with: ghc --make main.hs -L/usr/local/lib -licuuc -O -I/usr/local/include
+
+module OpenAFP.Internals.UConv where
+
+import Foreign
+import Foreign.C
+import Foreign.Ptr
+import OpenAFP.Internals.Binary
+import System.IO.Unsafe(unsafePerformIO)
+
+-- |
+-- Convert a sequence of bytes from one encoding to another.
+uconv :: String         -- ^ The encoding to convert from
+      -> String         -- ^ The encoding to convert to
+      -> [N1]           -- ^ The byte sequence to convert
+      -> Maybe String   -- ^ The byte sequence converted
+uconv fromcode tocode bytes = unsafePerformIO $ do
+  -- Create a conversion descriptor
+    withCString fromcode    $ \fromcode_c -> do
+    withCString tocode      $ \tocode_c -> do
+    allocaBytes in_len      $ \in_c -> do
+        pokeArray in_c bytes
+        allocaBytes out_len $ \out_c -> do
+        alloca              $ \err -> do
+            poke err (0 :: Word8)
+            len <- ucnv_convert tocode_c 
+                                fromcode_c 
+                                (castPtr    out_c)
+                                (toEnum     out_len)
+                                (castPtr    in_c)
+                                (toEnum     in_len)
+                                err
+            errCode <- peek err :: IO Word8
+            if (errCode == 0) then
+                return . Just =<< peekCStringLen (out_c, fromEnum len)
+                else 
+                return Nothing -- ("<<error: " ++ (show errCode) ++ ">>")
+    where
+        out_len = (4 * in_len)
+        in_len  = (length bytes)
+
+foreign import ccall "ucnv_convert_3_4" ucnv_convert ::
+    CString     -> -- toConverterName
+    CString     -> -- fromConverterName
+    Ptr CChar   -> -- target
+    Int32       -> -- targetCapacity
+    Ptr CChar   -> -- source
+    Int32       -> -- sourceLength
+    Ptr Word8   -> -- pErrorCode
+    IO Int32       -- return: targetLength
diff --git a/src/OpenAFP/Prelude/Exts.hs b/src/OpenAFP/Prelude/Exts.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Prelude/Exts.hs
@@ -0,0 +1,104 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields -cpp #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Prelude.Exts
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- PreludeExts from the Haskell Wiki under the BSD license.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Prelude.Exts where
+import OpenAFP.Internals
+
+-- | Applies a bunch of functions to a value.
+rmap :: [a -> b] -> a -> [b]
+rmap fs x = map ($ x) fs
+
+-- Catch user errors, but let others through
+onUserError :: IO a -> (String -> IO a) -> IO a
+m `onUserError` h
+    = m `catchError` \e ->
+          if isUserError e
+              then h (ioeGetErrorString e)
+              else throwError e
+
+type RE = String
+(=~) :: String -> String -> Bool
+s =~ p = isJust $ matchRegex (mkRegexWithOpts p False True) s
+
+splitRegexWithMatches :: RE -> String -> ([String], [String])
+splitRegexWithMatches regexpr src = splitRegex' src
+  where
+    regex = mkRegex regexpr
+    splitRegex' :: String -> ([String], [String])
+    splitRegex' s  =
+        case matchRegexAll regex s of
+             Just (before, match, after, _) ->
+                 case splitRegex' after of (text, matches) -> (before : text, match : matches)
+             Nothing                    -> ([s], [])
+
+splitBy :: (a -> Bool) -> [a] -> [[a]]
+splitBy _ [] = []
+splitBy f list =  first : splitBy f (dropWhile f rest)
+   where 
+     (first, rest) = break f list
+
+lower :: String -> String
+lower = map toLower
+
+upper :: String -> String
+upper = map toUpper
+
+---------------------------------------------------------------------------------
+-- Tom Moertel - from lambdabot's Util module
+
+-- | Join lists with the given glue elements. Example:
+--
+-- > joinList ", " ["one","two","three"] ===> "one, two, three"
+
+joinList :: [a]   -- ^ Glue to join with
+         -> [[a]] -- ^ Elements to glue together
+         -> [a]   -- ^ Result: glued-together list
+
+joinList glue xs = (concat . intersperse glue) xs
+
+-- | Split a list into pieces that were held together by glue.  Example:
+--
+-- > split ", " "one, two, three" ===> ["one","two","three"]
+
+split :: Eq a => [a] -- ^ Glue that holds pieces together
+      -> [a]         -- ^ List to break into pieces
+      -> [[a]]       -- ^ Result: list of pieces
+
+split glue xs = split' xs
+    where
+    split' [] = []
+    split' xs = piece : split' (dropGlue rest)
+        where (piece, rest) = breakOnGlue glue xs
+    dropGlue = drop (length glue)
+
+-- | Break off the first piece of a list held together by glue,
+--   leaving the glue attached to the remainder of the list.  Example:
+--
+-- > breakOnGlue ", " "one, two, three" ===> ("one", ", two, three")
+
+breakOnGlue :: (Eq a) => [a] -- ^ Glue that holds pieces together
+            -> [a]           -- ^ List from which to break off a piece
+            -> ([a],[a])     -- ^ Result: (first piece, glue ++ rest of list)
+
+breakOnGlue _ [] = ([],[])
+breakOnGlue glue rest@(x:xs)
+    | glue `isPrefixOf` rest = ([], rest)
+    | otherwise = (x:piece, rest') where (piece, rest') = breakOnGlue glue xs
+
+split_first_word :: String -> (String, String)
+split_first_word xs = (w, dropWhile isSpace xs')
+  where (w, xs') = break isSpace xs
+
diff --git a/src/OpenAFP/Prelude/InstanceAFP.hs b/src/OpenAFP/Prelude/InstanceAFP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Prelude/InstanceAFP.hs
@@ -0,0 +1,736 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+module OpenAFP.Prelude.InstanceAFP () where
+import OpenAFP.Types
+import OpenAFP.Records
+import OpenAFP.Internals
+
+recOf :: (ChunkBuf c n b, Binary (Record r)) => c -> IO r
+recOf c = return . fromRecord =<< chunkToRecord c
+
+apply :: (MonadIO m) => (t -> IO a) -> t -> (a -> m b) -> m b
+apply ctr c f = f =<< (liftIO $ ctr c)
+
+instance Rec BAG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BAG a01 a02 a03
+    recPut bh r = do put bh $ bag_Type r; put bh $ bag_ r; put bh $ bag r; return ()
+    recSizeOf r = sum [ sizeOf $ bag_Type r, sizeOf $ bag_ r, sizeOf $ bag r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bag_Type r), viewField "_" (viewNumber $ bag_ r), viewField "" (viewNStr $ bag r) ]
+    recType = fromEnum . bag_Type
+
+instance Rec BBC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BBC a01 a02 a03
+    recPut bh r = do put bh $ bbc_Type r; put bh $ bbc_ r; put bh $ bbc r; return ()
+    recSizeOf r = sum [ sizeOf $ bbc_Type r, sizeOf $ bbc_ r, sizeOf $ bbc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bbc_Type r), viewField "_" (viewNumber $ bbc_ r), viewField "" (viewNStr $ bbc r) ]
+    recType = fromEnum . bbc_Type
+
+instance Rec BCA where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BCA a01 a02 a03
+    recPut bh r = do put bh $ bca_Type r; put bh $ bca_ r; put bh $ bca r; return ()
+    recSizeOf r = sum [ sizeOf $ bca_Type r, sizeOf $ bca_ r, sizeOf $ bca r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bca_Type r), viewField "_" (viewNumber $ bca_ r), viewField "" (viewNStr $ bca r) ]
+    recType = fromEnum . bca_Type
+
+instance Rec BCF where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BCF a01 a02 a03
+    recPut bh r = do put bh $ bcf_Type r; put bh $ bcf_ r; put bh $ bcf r; return ()
+    recSizeOf r = sum [ sizeOf $ bcf_Type r, sizeOf $ bcf_ r, sizeOf $ bcf r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bcf_Type r), viewField "_" (viewNumber $ bcf_ r), viewField "" (viewNStr $ bcf r) ]
+    recType = fromEnum . bcf_Type
+
+instance Rec BCP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BCP a01 a02 a03
+    recPut bh r = do put bh $ bcp_Type r; put bh $ bcp_ r; put bh $ bcp r; return ()
+    recSizeOf r = sum [ sizeOf $ bcp_Type r, sizeOf $ bcp_ r, sizeOf $ bcp r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bcp_Type r), viewField "_" (viewNumber $ bcp_ r), viewField "" (viewNStr $ bcp r) ]
+    recType = fromEnum . bcp_Type
+
+instance Rec BDA where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BDA a01 a02 a03
+    recPut bh r = do put bh $ bda_Type r; put bh $ bda_ r; put bh $ bda r; return ()
+    recSizeOf r = sum [ sizeOf $ bda_Type r, sizeOf $ bda_ r, sizeOf $ bda r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bda_Type r), viewField "_" (viewNumber $ bda_ r), viewField "" (viewNStr $ bda r) ]
+    recType = fromEnum . bda_Type
+
+instance Rec BDD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BDD a01 a02 a03
+    recPut bh r = do put bh $ bdd_Type r; put bh $ bdd_ r; put bh $ bdd r; return ()
+    recSizeOf r = sum [ sizeOf $ bdd_Type r, sizeOf $ bdd_ r, sizeOf $ bdd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bdd_Type r), viewField "_" (viewNumber $ bdd_ r), viewField "" (viewNStr $ bdd r) ]
+    recType = fromEnum . bdd_Type
+
+instance Rec BDG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BDG a01 a02 a03
+    recPut bh r = do put bh $ bdg_Type r; put bh $ bdg_ r; put bh $ bdg r; return ()
+    recSizeOf r = sum [ sizeOf $ bdg_Type r, sizeOf $ bdg_ r, sizeOf $ bdg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bdg_Type r), viewField "_" (viewNumber $ bdg_ r), viewField "" (viewNStr $ bdg r) ]
+    recType = fromEnum . bdg_Type
+
+instance Rec BDI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BDI a01 a02 a03
+    recPut bh r = do put bh $ bdi_Type r; put bh $ bdi_ r; put bh $ bdi r; return ()
+    recSizeOf r = sum [ sizeOf $ bdi_Type r, sizeOf $ bdi_ r, sizeOf $ bdi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bdi_Type r), viewField "_" (viewNumber $ bdi_ r), viewField "" (viewNStr $ bdi r) ]
+    recType = fromEnum . bdi_Type
+
+instance Rec BDM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BDM a01 a02 a03
+    recPut bh r = do put bh $ bdm_Type r; put bh $ bdm_ r; put bh $ bdm r; return ()
+    recSizeOf r = sum [ sizeOf $ bdm_Type r, sizeOf $ bdm_ r, sizeOf $ bdm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bdm_Type r), viewField "_" (viewNumber $ bdm_ r), viewField "" (viewNStr $ bdm r) ]
+    recType = fromEnum . bdm_Type
+
+instance Rec BDT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BDT a01 a02 a03
+    recPut bh r = do put bh $ bdt_Type r; put bh $ bdt_ r; put bh $ bdt r; return ()
+    recSizeOf r = sum [ sizeOf $ bdt_Type r, sizeOf $ bdt_ r, sizeOf $ bdt r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bdt_Type r), viewField "_" (viewNumber $ bdt_ r), viewField "" (viewNStr $ bdt r) ]
+    recType = fromEnum . bdt_Type
+
+instance Rec BDX where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BDX a01 a02 a03
+    recPut bh r = do put bh $ bdx_Type r; put bh $ bdx_ r; put bh $ bdx r; return ()
+    recSizeOf r = sum [ sizeOf $ bdx_Type r, sizeOf $ bdx_ r, sizeOf $ bdx r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bdx_Type r), viewField "_" (viewNumber $ bdx_ r), viewField "" (viewNStr $ bdx r) ]
+    recType = fromEnum . bdx_Type
+
+instance Rec BFG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BFG a01 a02 a03
+    recPut bh r = do put bh $ bfg_Type r; put bh $ bfg_ r; put bh $ bfg r; return ()
+    recSizeOf r = sum [ sizeOf $ bfg_Type r, sizeOf $ bfg_ r, sizeOf $ bfg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bfg_Type r), viewField "_" (viewNumber $ bfg_ r), viewField "" (viewNStr $ bfg r) ]
+    recType = fromEnum . bfg_Type
+
+instance Rec BFM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BFM a01 a02 a03
+    recPut bh r = do put bh $ bfm_Type r; put bh $ bfm_ r; put bh $ bfm r; return ()
+    recSizeOf r = sum [ sizeOf $ bfm_Type r, sizeOf $ bfm_ r, sizeOf $ bfm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bfm_Type r), viewField "_" (viewNumber $ bfm_ r), viewField "" (viewNStr $ bfm r) ]
+    recType = fromEnum . bfm_Type
+
+instance Rec BFN where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BFN a01 a02 a03
+    recPut bh r = do put bh $ bfn_Type r; put bh $ bfn_ r; put bh $ bfn r; return ()
+    recSizeOf r = sum [ sizeOf $ bfn_Type r, sizeOf $ bfn_ r, sizeOf $ bfn r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bfn_Type r), viewField "_" (viewNumber $ bfn_ r), viewField "" (viewNStr $ bfn r) ]
+    recType = fromEnum . bfn_Type
+
+instance Rec BGR where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BGR a01 a02 a03
+    recPut bh r = do put bh $ bgr_Type r; put bh $ bgr_ r; put bh $ bgr r; return ()
+    recSizeOf r = sum [ sizeOf $ bgr_Type r, sizeOf $ bgr_ r, sizeOf $ bgr r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bgr_Type r), viewField "_" (viewNumber $ bgr_ r), viewField "" (viewNStr $ bgr r) ]
+    recType = fromEnum . bgr_Type
+
+instance Rec BII where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BII a01 a02 a03
+    recPut bh r = do put bh $ bii_Type r; put bh $ bii_ r; put bh $ bii_ImageObjectName r; return ()
+    recSizeOf r = sum [ sizeOf $ bii_Type r, sizeOf $ bii_ r, sizeOf $ bii_ImageObjectName r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bii_Type r), viewField "_" (viewNumber $ bii_ r), viewField "ImageObjectName" (viewString $ bii_ImageObjectName r) ]
+    recType = fromEnum . bii_Type
+
+instance Rec BIM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BIM a01 a02 a03
+    recPut bh r = do put bh $ bim_Type r; put bh $ bim_ r; put bh $ bim r; return ()
+    recSizeOf r = sum [ sizeOf $ bim_Type r, sizeOf $ bim_ r, sizeOf $ bim r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bim_Type r), viewField "_" (viewNumber $ bim_ r), viewField "" (viewNStr $ bim r) ]
+    recType = fromEnum . bim_Type
+
+instance Rec BMM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BMM a01 a02 a03
+    recPut bh r = do put bh $ bmm_Type r; put bh $ bmm_ r; put bh $ bmm r; return ()
+    recSizeOf r = sum [ sizeOf $ bmm_Type r, sizeOf $ bmm_ r, sizeOf $ bmm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bmm_Type r), viewField "_" (viewNumber $ bmm_ r), viewField "" (viewNStr $ bmm r) ]
+    recType = fromEnum . bmm_Type
+
+instance Rec BMO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BMO a01 a02 a03
+    recPut bh r = do put bh $ bmo_Type r; put bh $ bmo_ r; put bh $ bmo r; return ()
+    recSizeOf r = sum [ sizeOf $ bmo_Type r, sizeOf $ bmo_ r, sizeOf $ bmo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bmo_Type r), viewField "_" (viewNumber $ bmo_ r), viewField "" (viewNStr $ bmo r) ]
+    recType = fromEnum . bmo_Type
+
+instance Rec BNG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BNG a01 a02 a03
+    recPut bh r = do put bh $ bng_Type r; put bh $ bng_ r; put bh $ bng r; return ()
+    recSizeOf r = sum [ sizeOf $ bng_Type r, sizeOf $ bng_ r, sizeOf $ bng r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bng_Type r), viewField "_" (viewNumber $ bng_ r), viewField "" (viewNStr $ bng r) ]
+    recType = fromEnum . bng_Type
+
+instance Rec BOC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BOC a01 a02 a03
+    recPut bh r = do put bh $ boc_Type r; put bh $ boc_ r; put bh $ boc r; return ()
+    recSizeOf r = sum [ sizeOf $ boc_Type r, sizeOf $ boc_ r, sizeOf $ boc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ boc_Type r), viewField "_" (viewNumber $ boc_ r), viewField "" (viewNStr $ boc r) ]
+    recType = fromEnum . boc_Type
+
+instance Rec BOG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BOG a01 a02 a03
+    recPut bh r = do put bh $ bog_Type r; put bh $ bog_ r; put bh $ bog r; return ()
+    recSizeOf r = sum [ sizeOf $ bog_Type r, sizeOf $ bog_ r, sizeOf $ bog r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bog_Type r), viewField "_" (viewNumber $ bog_ r), viewField "" (viewNStr $ bog r) ]
+    recType = fromEnum . bog_Type
+
+instance Rec BPG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BPG a01 a02 a03
+    recPut bh r = do put bh $ bpg_Type r; put bh $ bpg_ r; put bh $ bpg r; return ()
+    recSizeOf r = sum [ sizeOf $ bpg_Type r, sizeOf $ bpg_ r, sizeOf $ bpg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bpg_Type r), viewField "_" (viewNumber $ bpg_ r), viewField "" (viewNStr $ bpg r) ]
+    recType = fromEnum . bpg_Type
+
+instance Rec BPM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BPM a01 a02 a03
+    recPut bh r = do put bh $ bpm_Type r; put bh $ bpm_ r; put bh $ bpm r; return ()
+    recSizeOf r = sum [ sizeOf $ bpm_Type r, sizeOf $ bpm_ r, sizeOf $ bpm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bpm_Type r), viewField "_" (viewNumber $ bpm_ r), viewField "" (viewNStr $ bpm r) ]
+    recType = fromEnum . bpm_Type
+
+instance Rec BPS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BPS a01 a02 a03
+    recPut bh r = do put bh $ bps_Type r; put bh $ bps_ r; put bh $ bps r; return ()
+    recSizeOf r = sum [ sizeOf $ bps_Type r, sizeOf $ bps_ r, sizeOf $ bps r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bps_Type r), viewField "_" (viewNumber $ bps_ r), viewField "" (viewNStr $ bps r) ]
+    recType = fromEnum . bps_Type
+
+instance Rec BPT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BPT a01 a02 a03
+    recPut bh r = do put bh $ bpt_Type r; put bh $ bpt_ r; put bh $ bpt r; return ()
+    recSizeOf r = sum [ sizeOf $ bpt_Type r, sizeOf $ bpt_ r, sizeOf $ bpt r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bpt_Type r), viewField "_" (viewNumber $ bpt_ r), viewField "" (viewNStr $ bpt r) ]
+    recType = fromEnum . bpt_Type
+
+instance Rec BR where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BR a01 a02 a03
+    recPut bh r = do put bh $ br_Type r; put bh $ br_ r; put bh $ br r; return ()
+    recSizeOf r = sum [ sizeOf $ br_Type r, sizeOf $ br_ r, sizeOf $ br r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ br_Type r), viewField "_" (viewNumber $ br_ r), viewField "" (viewNStr $ br r) ]
+    recType = fromEnum . br_Type
+
+instance Rec BRG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BRG a01 a02 a03
+    recPut bh r = do put bh $ brg_Type r; put bh $ brg_ r; put bh $ brg r; return ()
+    recSizeOf r = sum [ sizeOf $ brg_Type r, sizeOf $ brg_ r, sizeOf $ brg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ brg_Type r), viewField "_" (viewNumber $ brg_ r), viewField "" (viewNStr $ brg r) ]
+    recType = fromEnum . brg_Type
+
+instance Rec BSG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ BSG a01 a02 a03
+    recPut bh r = do put bh $ bsg_Type r; put bh $ bsg_ r; put bh $ bsg r; return ()
+    recSizeOf r = sum [ sizeOf $ bsg_Type r, sizeOf $ bsg_ r, sizeOf $ bsg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ bsg_Type r), viewField "_" (viewNumber $ bsg_ r), viewField "" (viewNStr $ bsg r) ]
+    recType = fromEnum . bsg_Type
+
+instance Rec CAT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ CAT a01 a02 a03
+    recPut bh r = do put bh $ cat_Type r; put bh $ cat_ r; put bh $ cat r; return ()
+    recSizeOf r = sum [ sizeOf $ cat_Type r, sizeOf $ cat_ r, sizeOf $ cat r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ cat_Type r), viewField "_" (viewNumber $ cat_ r), viewField "" (viewNStr $ cat r) ]
+    recType = fromEnum . cat_Type
+
+instance Rec CDD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ CDD a01 a02 a03
+    recPut bh r = do put bh $ cdd_Type r; put bh $ cdd_ r; put bh $ cdd r; return ()
+    recSizeOf r = sum [ sizeOf $ cdd_Type r, sizeOf $ cdd_ r, sizeOf $ cdd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ cdd_Type r), viewField "_" (viewNumber $ cdd_ r), viewField "" (viewNStr $ cdd r) ]
+    recType = fromEnum . cdd_Type
+
+instance Rec CFC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; return $ CFC a01 a02 a03 a04
+    recPut bh r = do put bh $ cfc_Type r; put bh $ cfc_ r; put bh $ cfc_CFIRepeatingGroupLength r; put bh $ cfc r; return ()
+    recSizeOf r = sum [ sizeOf $ cfc_Type r, sizeOf $ cfc_ r, sizeOf $ cfc_CFIRepeatingGroupLength r, sizeOf $ cfc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ cfc_Type r), viewField "_" (viewNumber $ cfc_ r), viewField "CFIRepeatingGroupLength" (viewNumber $ cfc_CFIRepeatingGroupLength r), viewField "" (viewNStr $ cfc r) ]
+    recType = fromEnum . cfc_Type
+
+instance Rec CFI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ CFI a01 a02 a03
+    recPut bh r = do put bh $ cfi_Type r; put bh $ cfi_ r; put bh $ cfi_Data r; return ()
+    recSizeOf r = sum [ sizeOf $ cfi_Type r, sizeOf $ cfi_ r, sizeOf $ cfi_Data r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ cfi_Type r), viewField "_" (viewNumber $ cfi_ r), viewField "Data" (viewData $ cfi_Data r) ]
+    recType = fromEnum . cfi_Type
+
+instance Rec CFI_Data where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; return $ CFI_Data a01 a02 a03 a04
+    recPut bh r = do put bh $ cfi_FontCharacterSetName r; put bh $ cfi_CodePageName r; put bh $ cfi_CodedFontName r; put bh $ cfi_Section r; return ()
+    recSizeOf r = sum [ sizeOf $ cfi_FontCharacterSetName r, sizeOf $ cfi_CodePageName r, sizeOf $ cfi_CodedFontName r, sizeOf $ cfi_Section r ]
+    recView r = viewRecord (typeOf r) [ viewField "FontCharacterSetName" (viewString $ cfi_FontCharacterSetName r), viewField "CodePageName" (viewString $ cfi_CodePageName r), viewField "CodedFontName" (viewString $ cfi_CodedFontName r), viewField "Section" (viewNumber $ cfi_Section r) ]
+    recType r = 0
+
+instance RecData CFI CFI_Data where
+    readData r = cfi_Data r
+    writeData r cs = r { cfi_Data = cs }
+
+instance Rec CPC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; return $ CPC a01 a02 a03 a04 a05 a06 a07 a08
+    recPut bh r = do put bh $ cpc_Type r; put bh $ cpc_ r; put bh $ cpc_GCGID r; put bh $ cpc_UseFlags r; put bh $ cpc_CPIRepeatingGroupLength r; put bh $ cpc_SpaceCharacterSection r; put bh $ cpc_UseFlags2 r; put bh $ cpc r; return ()
+    recSizeOf r = sum [ sizeOf $ cpc_Type r, sizeOf $ cpc_ r, sizeOf $ cpc_GCGID r, sizeOf $ cpc_UseFlags r, sizeOf $ cpc_CPIRepeatingGroupLength r, sizeOf $ cpc_SpaceCharacterSection r, sizeOf $ cpc_UseFlags2 r, sizeOf $ cpc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ cpc_Type r), viewField "_" (viewNumber $ cpc_ r), viewField "GCGID" (viewString $ cpc_GCGID r), viewField "UseFlags" (viewNumber $ cpc_UseFlags r), viewField "CPIRepeatingGroupLength" (viewNumber $ cpc_CPIRepeatingGroupLength r), viewField "SpaceCharacterSection" (viewNumber $ cpc_SpaceCharacterSection r), viewField "UseFlags2" (viewNumber $ cpc_UseFlags2 r), viewField "" (viewNStr $ cpc r) ]
+    recType = fromEnum . cpc_Type
+
+instance Rec CPD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ CPD a01 a02 a03
+    recPut bh r = do put bh $ cpd_Type r; put bh $ cpd_ r; put bh $ cpd r; return ()
+    recSizeOf r = sum [ sizeOf $ cpd_Type r, sizeOf $ cpd_ r, sizeOf $ cpd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ cpd_Type r), viewField "_" (viewNumber $ cpd_ r), viewField "" (viewNStr $ cpd r) ]
+    recType = fromEnum . cpd_Type
+
+instance Rec CPI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ CPI a01 a02 a03
+    recPut bh r = do put bh $ cpi_Type r; put bh $ cpi_ r; put bh $ cpi_Data r; return ()
+    recSizeOf r = sum [ sizeOf $ cpi_Type r, sizeOf $ cpi_ r, sizeOf $ cpi_Data r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ cpi_Type r), viewField "_" (viewNumber $ cpi_ r), viewField "Data" (viewData $ cpi_Data r) ]
+    recType = fromEnum . cpi_Type
+
+instance Rec CPI_Data where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ CPI_Data a01 a02 a03
+    recPut bh r = do put bh $ cpi_GCGID r; put bh $ cpi_Section r; put bh $ cpi_CodePoint r; return ()
+    recSizeOf r = sum [ sizeOf $ cpi_GCGID r, sizeOf $ cpi_Section r, sizeOf $ cpi_CodePoint r ]
+    recView r = viewRecord (typeOf r) [ viewField "GCGID" (viewString $ cpi_GCGID r), viewField "Section" (viewNumber $ cpi_Section r), viewField "CodePoint" (viewNumber $ cpi_CodePoint r) ]
+    recType r = 0
+
+instance RecData CPI CPI_Data where
+    readData r = cpi_Data r
+    writeData r cs = r { cpi_Data = cs }
+
+instance Rec CTC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ CTC a01 a02 a03
+    recPut bh r = do put bh $ ctc_Type r; put bh $ ctc_ r; put bh $ ctc r; return ()
+    recSizeOf r = sum [ sizeOf $ ctc_Type r, sizeOf $ ctc_ r, sizeOf $ ctc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ctc_Type r), viewField "_" (viewNumber $ ctc_ r), viewField "" (viewNStr $ ctc r) ]
+    recType = fromEnum . ctc_Type
+
+instance Rec DXD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ DXD a01 a02 a03
+    recPut bh r = do put bh $ dxd_Type r; put bh $ dxd_ r; put bh $ dxd r; return ()
+    recSizeOf r = sum [ sizeOf $ dxd_Type r, sizeOf $ dxd_ r, sizeOf $ dxd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ dxd_Type r), viewField "_" (viewNumber $ dxd_ r), viewField "" (viewNStr $ dxd r) ]
+    recType = fromEnum . dxd_Type
+
+instance Rec EAG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EAG a01 a02 a03
+    recPut bh r = do put bh $ eag_Type r; put bh $ eag_ r; put bh $ eag r; return ()
+    recSizeOf r = sum [ sizeOf $ eag_Type r, sizeOf $ eag_ r, sizeOf $ eag r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ eag_Type r), viewField "_" (viewNumber $ eag_ r), viewField "" (viewNStr $ eag r) ]
+    recType = fromEnum . eag_Type
+
+instance Rec EBC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EBC a01 a02 a03
+    recPut bh r = do put bh $ ebc_Type r; put bh $ ebc_ r; put bh $ ebc r; return ()
+    recSizeOf r = sum [ sizeOf $ ebc_Type r, sizeOf $ ebc_ r, sizeOf $ ebc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ebc_Type r), viewField "_" (viewNumber $ ebc_ r), viewField "" (viewNStr $ ebc r) ]
+    recType = fromEnum . ebc_Type
+
+instance Rec ECA where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ ECA a01 a02 a03
+    recPut bh r = do put bh $ eca_Type r; put bh $ eca_ r; put bh $ eca r; return ()
+    recSizeOf r = sum [ sizeOf $ eca_Type r, sizeOf $ eca_ r, sizeOf $ eca r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ eca_Type r), viewField "_" (viewNumber $ eca_ r), viewField "" (viewNStr $ eca r) ]
+    recType = fromEnum . eca_Type
+
+instance Rec ECF where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ ECF a01 a02 a03
+    recPut bh r = do put bh $ ecf_Type r; put bh $ ecf_ r; put bh $ ecf r; return ()
+    recSizeOf r = sum [ sizeOf $ ecf_Type r, sizeOf $ ecf_ r, sizeOf $ ecf r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ecf_Type r), viewField "_" (viewNumber $ ecf_ r), viewField "" (viewNStr $ ecf r) ]
+    recType = fromEnum . ecf_Type
+
+instance Rec ECP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ ECP a01 a02 a03
+    recPut bh r = do put bh $ ecp_Type r; put bh $ ecp_ r; put bh $ ecp r; return ()
+    recSizeOf r = sum [ sizeOf $ ecp_Type r, sizeOf $ ecp_ r, sizeOf $ ecp r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ecp_Type r), viewField "_" (viewNumber $ ecp_ r), viewField "" (viewNStr $ ecp r) ]
+    recType = fromEnum . ecp_Type
+
+instance Rec EDG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EDG a01 a02 a03
+    recPut bh r = do put bh $ edg_Type r; put bh $ edg_ r; put bh $ edg r; return ()
+    recSizeOf r = sum [ sizeOf $ edg_Type r, sizeOf $ edg_ r, sizeOf $ edg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ edg_Type r), viewField "_" (viewNumber $ edg_ r), viewField "" (viewNStr $ edg r) ]
+    recType = fromEnum . edg_Type
+
+instance Rec EDI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EDI a01 a02 a03
+    recPut bh r = do put bh $ edi_Type r; put bh $ edi_ r; put bh $ edi r; return ()
+    recSizeOf r = sum [ sizeOf $ edi_Type r, sizeOf $ edi_ r, sizeOf $ edi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ edi_Type r), viewField "_" (viewNumber $ edi_ r), viewField "" (viewNStr $ edi r) ]
+    recType = fromEnum . edi_Type
+
+instance Rec EDM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EDM a01 a02 a03
+    recPut bh r = do put bh $ edm_Type r; put bh $ edm_ r; put bh $ edm r; return ()
+    recSizeOf r = sum [ sizeOf $ edm_Type r, sizeOf $ edm_ r, sizeOf $ edm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ edm_Type r), viewField "_" (viewNumber $ edm_ r), viewField "" (viewNStr $ edm r) ]
+    recType = fromEnum . edm_Type
+
+instance Rec EDT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EDT a01 a02 a03
+    recPut bh r = do put bh $ edt_Type r; put bh $ edt_ r; put bh $ edt r; return ()
+    recSizeOf r = sum [ sizeOf $ edt_Type r, sizeOf $ edt_ r, sizeOf $ edt r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ edt_Type r), viewField "_" (viewNumber $ edt_ r), viewField "" (viewNStr $ edt r) ]
+    recType = fromEnum . edt_Type
+
+instance Rec EDX where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EDX a01 a02 a03
+    recPut bh r = do put bh $ edx_Type r; put bh $ edx_ r; put bh $ edx r; return ()
+    recSizeOf r = sum [ sizeOf $ edx_Type r, sizeOf $ edx_ r, sizeOf $ edx r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ edx_Type r), viewField "_" (viewNumber $ edx_ r), viewField "" (viewNStr $ edx r) ]
+    recType = fromEnum . edx_Type
+
+instance Rec EFG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EFG a01 a02 a03
+    recPut bh r = do put bh $ efg_Type r; put bh $ efg_ r; put bh $ efg r; return ()
+    recSizeOf r = sum [ sizeOf $ efg_Type r, sizeOf $ efg_ r, sizeOf $ efg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ efg_Type r), viewField "_" (viewNumber $ efg_ r), viewField "" (viewNStr $ efg r) ]
+    recType = fromEnum . efg_Type
+
+instance Rec EFM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EFM a01 a02 a03
+    recPut bh r = do put bh $ efm_Type r; put bh $ efm_ r; put bh $ efm r; return ()
+    recSizeOf r = sum [ sizeOf $ efm_Type r, sizeOf $ efm_ r, sizeOf $ efm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ efm_Type r), viewField "_" (viewNumber $ efm_ r), viewField "" (viewNStr $ efm r) ]
+    recType = fromEnum . efm_Type
+
+instance Rec EFN where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EFN a01 a02 a03
+    recPut bh r = do put bh $ efn_Type r; put bh $ efn_ r; put bh $ efn r; return ()
+    recSizeOf r = sum [ sizeOf $ efn_Type r, sizeOf $ efn_ r, sizeOf $ efn r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ efn_Type r), viewField "_" (viewNumber $ efn_ r), viewField "" (viewNStr $ efn r) ]
+    recType = fromEnum . efn_Type
+
+instance Rec EGR where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EGR a01 a02 a03
+    recPut bh r = do put bh $ egr_Type r; put bh $ egr_ r; put bh $ egr r; return ()
+    recSizeOf r = sum [ sizeOf $ egr_Type r, sizeOf $ egr_ r, sizeOf $ egr r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ egr_Type r), viewField "_" (viewNumber $ egr_ r), viewField "" (viewNStr $ egr r) ]
+    recType = fromEnum . egr_Type
+
+instance Rec EII where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EII a01 a02 a03
+    recPut bh r = do put bh $ eii_Type r; put bh $ eii_ r; put bh $ eii_ImageObjectName r; return ()
+    recSizeOf r = sum [ sizeOf $ eii_Type r, sizeOf $ eii_ r, sizeOf $ eii_ImageObjectName r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ eii_Type r), viewField "_" (viewNumber $ eii_ r), viewField "ImageObjectName" (viewString $ eii_ImageObjectName r) ]
+    recType = fromEnum . eii_Type
+
+instance Rec EIM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EIM a01 a02 a03
+    recPut bh r = do put bh $ eim_Type r; put bh $ eim_ r; put bh $ eim r; return ()
+    recSizeOf r = sum [ sizeOf $ eim_Type r, sizeOf $ eim_ r, sizeOf $ eim r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ eim_Type r), viewField "_" (viewNumber $ eim_ r), viewField "" (viewNStr $ eim r) ]
+    recType = fromEnum . eim_Type
+
+instance Rec EMM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EMM a01 a02 a03
+    recPut bh r = do put bh $ emm_Type r; put bh $ emm_ r; put bh $ emm r; return ()
+    recSizeOf r = sum [ sizeOf $ emm_Type r, sizeOf $ emm_ r, sizeOf $ emm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ emm_Type r), viewField "_" (viewNumber $ emm_ r), viewField "" (viewNStr $ emm r) ]
+    recType = fromEnum . emm_Type
+
+instance Rec EMO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EMO a01 a02 a03
+    recPut bh r = do put bh $ emo_Type r; put bh $ emo_ r; put bh $ emo r; return ()
+    recSizeOf r = sum [ sizeOf $ emo_Type r, sizeOf $ emo_ r, sizeOf $ emo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ emo_Type r), viewField "_" (viewNumber $ emo_ r), viewField "" (viewNStr $ emo r) ]
+    recType = fromEnum . emo_Type
+
+instance Rec ENG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ ENG a01 a02 a03
+    recPut bh r = do put bh $ eng_Type r; put bh $ eng_ r; put bh $ eng r; return ()
+    recSizeOf r = sum [ sizeOf $ eng_Type r, sizeOf $ eng_ r, sizeOf $ eng r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ eng_Type r), viewField "_" (viewNumber $ eng_ r), viewField "" (viewNStr $ eng r) ]
+    recType = fromEnum . eng_Type
+
+instance Rec EOC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EOC a01 a02 a03
+    recPut bh r = do put bh $ eoc_Type r; put bh $ eoc_ r; put bh $ eoc r; return ()
+    recSizeOf r = sum [ sizeOf $ eoc_Type r, sizeOf $ eoc_ r, sizeOf $ eoc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ eoc_Type r), viewField "_" (viewNumber $ eoc_ r), viewField "" (viewNStr $ eoc r) ]
+    recType = fromEnum . eoc_Type
+
+instance Rec EOG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EOG a01 a02 a03
+    recPut bh r = do put bh $ eog_Type r; put bh $ eog_ r; put bh $ eog r; return ()
+    recSizeOf r = sum [ sizeOf $ eog_Type r, sizeOf $ eog_ r, sizeOf $ eog r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ eog_Type r), viewField "_" (viewNumber $ eog_ r), viewField "" (viewNStr $ eog r) ]
+    recType = fromEnum . eog_Type
+
+instance Rec EPG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EPG a01 a02 a03
+    recPut bh r = do put bh $ epg_Type r; put bh $ epg_ r; put bh $ epg r; return ()
+    recSizeOf r = sum [ sizeOf $ epg_Type r, sizeOf $ epg_ r, sizeOf $ epg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ epg_Type r), viewField "_" (viewNumber $ epg_ r), viewField "" (viewNStr $ epg r) ]
+    recType = fromEnum . epg_Type
+
+instance Rec EPM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EPM a01 a02 a03
+    recPut bh r = do put bh $ epm_Type r; put bh $ epm_ r; put bh $ epm r; return ()
+    recSizeOf r = sum [ sizeOf $ epm_Type r, sizeOf $ epm_ r, sizeOf $ epm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ epm_Type r), viewField "_" (viewNumber $ epm_ r), viewField "" (viewNStr $ epm r) ]
+    recType = fromEnum . epm_Type
+
+instance Rec EPS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EPS a01 a02 a03
+    recPut bh r = do put bh $ eps_Type r; put bh $ eps_ r; put bh $ eps r; return ()
+    recSizeOf r = sum [ sizeOf $ eps_Type r, sizeOf $ eps_ r, sizeOf $ eps r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ eps_Type r), viewField "_" (viewNumber $ eps_ r), viewField "" (viewNStr $ eps r) ]
+    recType = fromEnum . eps_Type
+
+instance Rec EPT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ EPT a01 a02 a03
+    recPut bh r = do put bh $ ept_Type r; put bh $ ept_ r; put bh $ ept r; return ()
+    recSizeOf r = sum [ sizeOf $ ept_Type r, sizeOf $ ept_ r, sizeOf $ ept r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ept_Type r), viewField "_" (viewNumber $ ept_ r), viewField "" (viewNStr $ ept r) ]
+    recType = fromEnum . ept_Type
+
+instance Rec ER where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ ER a01 a02 a03
+    recPut bh r = do put bh $ er_Type r; put bh $ er_ r; put bh $ er r; return ()
+    recSizeOf r = sum [ sizeOf $ er_Type r, sizeOf $ er_ r, sizeOf $ er r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ er_Type r), viewField "_" (viewNumber $ er_ r), viewField "" (viewNStr $ er r) ]
+    recType = fromEnum . er_Type
+
+instance Rec ERG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ ERG a01 a02 a03
+    recPut bh r = do put bh $ erg_Type r; put bh $ erg_ r; put bh $ erg r; return ()
+    recSizeOf r = sum [ sizeOf $ erg_Type r, sizeOf $ erg_ r, sizeOf $ erg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ erg_Type r), viewField "_" (viewNumber $ erg_ r), viewField "" (viewNStr $ erg r) ]
+    recType = fromEnum . erg_Type
+
+instance Rec ESG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ ESG a01 a02 a03
+    recPut bh r = do put bh $ esg_Type r; put bh $ esg_ r; put bh $ esg r; return ()
+    recSizeOf r = sum [ sizeOf $ esg_Type r, sizeOf $ esg_ r, sizeOf $ esg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ esg_Type r), viewField "_" (viewNumber $ esg_ r), viewField "" (viewNStr $ esg r) ]
+    recType = fromEnum . esg_Type
+
+instance Rec FGD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ FGD a01 a02 a03
+    recPut bh r = do put bh $ fgd_Type r; put bh $ fgd_ r; put bh $ fgd r; return ()
+    recSizeOf r = sum [ sizeOf $ fgd_Type r, sizeOf $ fgd_ r, sizeOf $ fgd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ fgd_Type r), viewField "_" (viewNumber $ fgd_ r), viewField "" (viewNStr $ fgd r) ]
+    recType = fromEnum . fgd_Type
+
+instance Rec FNC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; a09 <- get bh; a10 <- get bh; a11 <- get bh; a12 <- get bh; a13 <- get bh; a14 <- get bh; a15 <- get bh; a16 <- get bh; a17 <- get bh; a18 <- get bh; a19 <- get bh; return $ FNC a01 a02 a03 a04 a05 a06 a07 a08 a09 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19
+    recPut bh r = do put bh $ fnc_Type r; put bh $ fnc_ r; put bh $ fnc_Constant r; put bh $ fnc_PatternTechnologyIdentifier r; put bh $ fnc_FNCReserved1 r; put bh $ fnc_UseFlags r; put bh $ fnc_UnitXBase r; put bh $ fnc_UnitYBase r; put bh $ fnc_UnitXValue r; put bh $ fnc_UnitYValue r; put bh $ fnc_MaxWidth r; put bh $ fnc_MaxHeight r; put bh $ fnc_FNORepeatingGroupLength r; put bh $ fnc_FNIRepeatingGroupLength r; put bh $ fnc_PatternDataAlignmentCode r; put bh $ fnc_PatternDataCount1 r; put bh $ fnc_FNPRepeatingGroupLength r; put bh $ fnc_FNMRepeatingGroupLength r; put bh $ fnc r; return ()
+    recSizeOf r = sum [ sizeOf $ fnc_Type r, sizeOf $ fnc_ r, sizeOf $ fnc_Constant r, sizeOf $ fnc_PatternTechnologyIdentifier r, sizeOf $ fnc_FNCReserved1 r, sizeOf $ fnc_UseFlags r, sizeOf $ fnc_UnitXBase r, sizeOf $ fnc_UnitYBase r, sizeOf $ fnc_UnitXValue r, sizeOf $ fnc_UnitYValue r, sizeOf $ fnc_MaxWidth r, sizeOf $ fnc_MaxHeight r, sizeOf $ fnc_FNORepeatingGroupLength r, sizeOf $ fnc_FNIRepeatingGroupLength r, sizeOf $ fnc_PatternDataAlignmentCode r, sizeOf $ fnc_PatternDataCount1 r, sizeOf $ fnc_FNPRepeatingGroupLength r, sizeOf $ fnc_FNMRepeatingGroupLength r, sizeOf $ fnc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ fnc_Type r), viewField "_" (viewNumber $ fnc_ r), viewField "Constant" (viewString $ fnc_Constant r), viewField "PatternTechnologyIdentifier" (viewNumber $ fnc_PatternTechnologyIdentifier r), viewField "FNCReserved1" (viewString $ fnc_FNCReserved1 r), viewField "UseFlags" (viewNumber $ fnc_UseFlags r), viewField "UnitXBase" (viewNumber $ fnc_UnitXBase r), viewField "UnitYBase" (viewNumber $ fnc_UnitYBase r), viewField "UnitXValue" (viewNumber $ fnc_UnitXValue r), viewField "UnitYValue" (viewNumber $ fnc_UnitYValue r), viewField "MaxWidth" (viewNumber $ fnc_MaxWidth r), viewField "MaxHeight" (viewNumber $ fnc_MaxHeight r), viewField "FNORepeatingGroupLength" (viewNumber $ fnc_FNORepeatingGroupLength r), viewField "FNIRepeatingGroupLength" (viewNumber $ fnc_FNIRepeatingGroupLength r), viewField "PatternDataAlignmentCode" (viewNumber $ fnc_PatternDataAlignmentCode r), viewField "PatternDataCount1" (viewString $ fnc_PatternDataCount1 r), viewField "FNPRepeatingGroupLength" (viewNumber $ fnc_FNPRepeatingGroupLength r), viewField "FNMRepeatingGroupLength" (viewNumber $ fnc_FNMRepeatingGroupLength r), viewField "" (viewNStr $ fnc r) ]
+    recType = fromEnum . fnc_Type
+
+instance Rec FND where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ FND a01 a02 a03
+    recPut bh r = do put bh $ fnd_Type r; put bh $ fnd_ r; put bh $ fnd r; return ()
+    recSizeOf r = sum [ sizeOf $ fnd_Type r, sizeOf $ fnd_ r, sizeOf $ fnd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ fnd_Type r), viewField "_" (viewNumber $ fnd_ r), viewField "" (viewNStr $ fnd r) ]
+    recType = fromEnum . fnd_Type
+
+instance Rec FNG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ FNG a01 a02 a03
+    recPut bh r = do put bh $ fng_Type r; put bh $ fng_ r; put bh $ fng r; return ()
+    recSizeOf r = sum [ sizeOf $ fng_Type r, sizeOf $ fng_ r, sizeOf $ fng r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ fng_Type r), viewField "_" (viewNumber $ fng_ r), viewField "" (viewNStr $ fng r) ]
+    recType = fromEnum . fng_Type
+
+instance Rec FNI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ FNI a01 a02 a03
+    recPut bh r = do put bh $ fni_Type r; put bh $ fni_ r; put bh $ fni_Data r; return ()
+    recSizeOf r = sum [ sizeOf $ fni_Type r, sizeOf $ fni_ r, sizeOf $ fni_Data r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ fni_Type r), viewField "_" (viewNumber $ fni_ r), viewField "Data" (viewData $ fni_Data r) ]
+    recType = fromEnum . fni_Type
+
+instance Rec FNI_Data where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; a09 <- get bh; a10 <- get bh; a11 <- get bh; return $ FNI_Data a01 a02 a03 a04 a05 a06 a07 a08 a09 a10 a11
+    recPut bh r = do put bh $ fni_GCGID r; put bh $ fni_CharacterIncrement r; put bh $ fni_AscendHeight r; put bh $ fni_DescendDepth r; put bh $ fni_Reserved1 r; put bh $ fni_FNMCount r; put bh $ fni_ASpace r; put bh $ fni_BSpace r; put bh $ fni_CSpace r; put bh $ fni_Reserved2 r; put bh $ fni_BaseOffset r; return ()
+    recSizeOf r = sum [ sizeOf $ fni_GCGID r, sizeOf $ fni_CharacterIncrement r, sizeOf $ fni_AscendHeight r, sizeOf $ fni_DescendDepth r, sizeOf $ fni_Reserved1 r, sizeOf $ fni_FNMCount r, sizeOf $ fni_ASpace r, sizeOf $ fni_BSpace r, sizeOf $ fni_CSpace r, sizeOf $ fni_Reserved2 r, sizeOf $ fni_BaseOffset r ]
+    recView r = viewRecord (typeOf r) [ viewField "GCGID" (viewString $ fni_GCGID r), viewField "CharacterIncrement" (viewNumber $ fni_CharacterIncrement r), viewField "AscendHeight" (viewNumber $ fni_AscendHeight r), viewField "DescendDepth" (viewNumber $ fni_DescendDepth r), viewField "Reserved1" (viewNumber $ fni_Reserved1 r), viewField "FNMCount" (viewNumber $ fni_FNMCount r), viewField "ASpace" (viewNumber $ fni_ASpace r), viewField "BSpace" (viewNumber $ fni_BSpace r), viewField "CSpace" (viewNumber $ fni_CSpace r), viewField "Reserved2" (viewNumber $ fni_Reserved2 r), viewField "BaseOffset" (viewNumber $ fni_BaseOffset r) ]
+    recType r = 0
+
+instance RecData FNI FNI_Data where
+    readData r = fni_Data r
+    writeData r cs = r { fni_Data = cs }
+
+instance Rec FNM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ FNM a01 a02 a03
+    recPut bh r = do put bh $ fnm_Type r; put bh $ fnm_ r; put bh $ fnm_Data r; return ()
+    recSizeOf r = sum [ sizeOf $ fnm_Type r, sizeOf $ fnm_ r, sizeOf $ fnm_Data r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ fnm_Type r), viewField "_" (viewNumber $ fnm_ r), viewField "Data" (viewData $ fnm_Data r) ]
+    recType = fromEnum . fnm_Type
+
+instance Rec FNM_Data where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ FNM_Data a01 a02 a03
+    recPut bh r = do put bh $ fnm_Width r; put bh $ fnm_Height r; put bh $ fnm_Offset r; return ()
+    recSizeOf r = sum [ sizeOf $ fnm_Width r, sizeOf $ fnm_Height r, sizeOf $ fnm_Offset r ]
+    recView r = viewRecord (typeOf r) [ viewField "Width" (viewNumber $ fnm_Width r), viewField "Height" (viewNumber $ fnm_Height r), viewField "Offset" (viewNumber $ fnm_Offset r) ]
+    recType r = 0
+
+instance RecData FNM FNM_Data where
+    readData r = fnm_Data r
+    writeData r cs = r { fnm_Data = cs }
+
+instance Rec FNN where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ FNN a01 a02 a03
+    recPut bh r = do put bh $ fnn_Type r; put bh $ fnn_ r; put bh $ fnn r; return ()
+    recSizeOf r = sum [ sizeOf $ fnn_Type r, sizeOf $ fnn_ r, sizeOf $ fnn r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ fnn_Type r), viewField "_" (viewNumber $ fnn_ r), viewField "" (viewNStr $ fnn r) ]
+    recType = fromEnum . fnn_Type
+
+instance Rec FNO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; return $ FNO a01 a02 a03 a04 a05 a06 a07 a08
+    recPut bh r = do put bh $ fno_Type r; put bh $ fno_ r; put bh $ fno_Reserved r; put bh $ fno_CharacterRotation r; put bh $ fno_MaxBaseOffset r; put bh $ fno_MaxCharacterIncrement r; put bh $ fno_SpaceCharacterIncrement r; put bh $ fno r; return ()
+    recSizeOf r = sum [ sizeOf $ fno_Type r, sizeOf $ fno_ r, sizeOf $ fno_Reserved r, sizeOf $ fno_CharacterRotation r, sizeOf $ fno_MaxBaseOffset r, sizeOf $ fno_MaxCharacterIncrement r, sizeOf $ fno_SpaceCharacterIncrement r, sizeOf $ fno r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ fno_Type r), viewField "_" (viewNumber $ fno_ r), viewField "Reserved" (viewNumber $ fno_Reserved r), viewField "CharacterRotation" (viewNumber $ fno_CharacterRotation r), viewField "MaxBaseOffset" (viewNumber $ fno_MaxBaseOffset r), viewField "MaxCharacterIncrement" (viewNumber $ fno_MaxCharacterIncrement r), viewField "SpaceCharacterIncrement" (viewNumber $ fno_SpaceCharacterIncrement r), viewField "" (viewNStr $ fno r) ]
+    recType = fromEnum . fno_Type
+
+instance Rec FNP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ FNP a01 a02 a03
+    recPut bh r = do put bh $ fnp_Type r; put bh $ fnp_ r; put bh $ fnp r; return ()
+    recSizeOf r = sum [ sizeOf $ fnp_Type r, sizeOf $ fnp_ r, sizeOf $ fnp r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ fnp_Type r), viewField "_" (viewNumber $ fnp_ r), viewField "" (viewNStr $ fnp r) ]
+    recType = fromEnum . fnp_Type
+
+instance Rec GAD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ GAD a01 a02 a03
+    recPut bh r = do put bh $ gad_Type r; put bh $ gad_ r; put bh $ gad r; return ()
+    recSizeOf r = sum [ sizeOf $ gad_Type r, sizeOf $ gad_ r, sizeOf $ gad r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ gad_Type r), viewField "_" (viewNumber $ gad_ r), viewField "" (viewNStr $ gad r) ]
+    recType = fromEnum . gad_Type
+
+instance Rec GDD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ GDD a01 a02 a03
+    recPut bh r = do put bh $ gdd_Type r; put bh $ gdd_ r; put bh $ gdd r; return ()
+    recSizeOf r = sum [ sizeOf $ gdd_Type r, sizeOf $ gdd_ r, sizeOf $ gdd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ gdd_Type r), viewField "_" (viewNumber $ gdd_ r), viewField "" (viewNStr $ gdd r) ]
+    recType = fromEnum . gdd_Type
+
+instance Rec ICP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; return $ ICP a01 a02 a03 a04 a05 a06 a07 a08
+    recPut bh r = do put bh $ icp_Type r; put bh $ icp_ r; put bh $ icp_XCellOffset r; put bh $ icp_YCellOffset r; put bh $ icp_XCellSize r; put bh $ icp_YCellSize r; put bh $ icp_XFillSize r; put bh $ icp_YFillSize r; return ()
+    recSizeOf r = sum [ sizeOf $ icp_Type r, sizeOf $ icp_ r, sizeOf $ icp_XCellOffset r, sizeOf $ icp_YCellOffset r, sizeOf $ icp_XCellSize r, sizeOf $ icp_YCellSize r, sizeOf $ icp_XFillSize r, sizeOf $ icp_YFillSize r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ icp_Type r), viewField "_" (viewNumber $ icp_ r), viewField "XCellOffset" (viewNumber $ icp_XCellOffset r), viewField "YCellOffset" (viewNumber $ icp_YCellOffset r), viewField "XCellSize" (viewNumber $ icp_XCellSize r), viewField "YCellSize" (viewNumber $ icp_YCellSize r), viewField "XFillSize" (viewNumber $ icp_XFillSize r), viewField "YFillSize" (viewNumber $ icp_YFillSize r) ]
+    recType = fromEnum . icp_Type
+
+instance Rec IDD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ IDD a01 a02 a03
+    recPut bh r = do put bh $ idd_Type r; put bh $ idd_ r; put bh $ idd r; return ()
+    recSizeOf r = sum [ sizeOf $ idd_Type r, sizeOf $ idd_ r, sizeOf $ idd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ idd_Type r), viewField "_" (viewNumber $ idd_ r), viewField "" (viewNStr $ idd r) ]
+    recType = fromEnum . idd_Type
+
+instance Rec IEL where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ IEL a01 a02 a03
+    recPut bh r = do put bh $ iel_Type r; put bh $ iel_ r; put bh $ iel r; return ()
+    recSizeOf r = sum [ sizeOf $ iel_Type r, sizeOf $ iel_ r, sizeOf $ iel r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ iel_Type r), viewField "_" (viewNumber $ iel_ r), viewField "" (viewNStr $ iel r) ]
+    recType = fromEnum . iel_Type
+
+instance Rec IID where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; a09 <- get bh; a10 <- get bh; a11 <- get bh; a12 <- get bh; a13 <- get bh; a14 <- get bh; return $ IID a01 a02 a03 a04 a05 a06 a07 a08 a09 a10 a11 a12 a13 a14
+    recPut bh r = do put bh $ iid_Type r; put bh $ iid_ r; put bh $ iid_ConstantData1 r; put bh $ iid_XBase r; put bh $ iid_YBase r; put bh $ iid_XUnits r; put bh $ iid_YUnits r; put bh $ iid_XSize r; put bh $ iid_YSize r; put bh $ iid_ConstantData2 r; put bh $ iid_XCellSizeDefault r; put bh $ iid_YCellSizeDefault r; put bh $ iid_ConstantData3 r; put bh $ iid_Color r; return ()
+    recSizeOf r = sum [ sizeOf $ iid_Type r, sizeOf $ iid_ r, sizeOf $ iid_ConstantData1 r, sizeOf $ iid_XBase r, sizeOf $ iid_YBase r, sizeOf $ iid_XUnits r, sizeOf $ iid_YUnits r, sizeOf $ iid_XSize r, sizeOf $ iid_YSize r, sizeOf $ iid_ConstantData2 r, sizeOf $ iid_XCellSizeDefault r, sizeOf $ iid_YCellSizeDefault r, sizeOf $ iid_ConstantData3 r, sizeOf $ iid_Color r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ iid_Type r), viewField "_" (viewNumber $ iid_ r), viewField "ConstantData1" (viewString $ iid_ConstantData1 r), viewField "XBase" (viewNumber $ iid_XBase r), viewField "YBase" (viewNumber $ iid_YBase r), viewField "XUnits" (viewNumber $ iid_XUnits r), viewField "YUnits" (viewNumber $ iid_YUnits r), viewField "XSize" (viewNumber $ iid_XSize r), viewField "YSize" (viewNumber $ iid_YSize r), viewField "ConstantData2" (viewString $ iid_ConstantData2 r), viewField "XCellSizeDefault" (viewNumber $ iid_XCellSizeDefault r), viewField "YCellSizeDefault" (viewNumber $ iid_YCellSizeDefault r), viewField "ConstantData3" (viewString $ iid_ConstantData3 r), viewField "Color" (viewNumber $ iid_Color r) ]
+    recType = fromEnum . iid_Type
+
+instance Rec IMM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ IMM a01 a02 a03
+    recPut bh r = do put bh $ imm_Type r; put bh $ imm_ r; put bh $ imm r; return ()
+    recSizeOf r = sum [ sizeOf $ imm_Type r, sizeOf $ imm_ r, sizeOf $ imm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ imm_Type r), viewField "_" (viewNumber $ imm_ r), viewField "" (viewNStr $ imm r) ]
+    recType = fromEnum . imm_Type
+
+instance Rec IOB where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ IOB a01 a02 a03
+    recPut bh r = do put bh $ iob_Type r; put bh $ iob_ r; put bh $ iob r; return ()
+    recSizeOf r = sum [ sizeOf $ iob_Type r, sizeOf $ iob_ r, sizeOf $ iob r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ iob_Type r), viewField "_" (viewNumber $ iob_ r), viewField "" (viewNStr $ iob r) ]
+    recType = fromEnum . iob_Type
+
+instance Rec IOC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; a09 <- get bh; a10 <- get bh; a11 <- get bh; a12 <- get bh; return $ IOC a01 a02 a03 a04 a05 a06 a07 a08 a09 a10 a11 a12
+    recPut bh r = do put bh $ ioc_Type r; put bh $ ioc_ r; put bh $ ioc_Reserved1 r; put bh $ ioc_XOffset r; put bh $ ioc_Reserved2 r; put bh $ ioc_YOffset r; put bh $ ioc_XOrientation r; put bh $ ioc_YOrientation r; put bh $ ioc_ConstantData1 r; put bh $ ioc_XMap r; put bh $ ioc_YMap r; put bh $ ioc_ConstantData2 r; return ()
+    recSizeOf r = sum [ sizeOf $ ioc_Type r, sizeOf $ ioc_ r, sizeOf $ ioc_Reserved1 r, sizeOf $ ioc_XOffset r, sizeOf $ ioc_Reserved2 r, sizeOf $ ioc_YOffset r, sizeOf $ ioc_XOrientation r, sizeOf $ ioc_YOrientation r, sizeOf $ ioc_ConstantData1 r, sizeOf $ ioc_XMap r, sizeOf $ ioc_YMap r, sizeOf $ ioc_ConstantData2 r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ioc_Type r), viewField "_" (viewNumber $ ioc_ r), viewField "Reserved1" (viewString $ ioc_Reserved1 r), viewField "XOffset" (viewNumber $ ioc_XOffset r), viewField "Reserved2" (viewString $ ioc_Reserved2 r), viewField "YOffset" (viewNumber $ ioc_YOffset r), viewField "XOrientation" (viewNumber $ ioc_XOrientation r), viewField "YOrientation" (viewNumber $ ioc_YOrientation r), viewField "ConstantData1" (viewString $ ioc_ConstantData1 r), viewField "XMap" (viewNumber $ ioc_XMap r), viewField "YMap" (viewNumber $ ioc_YMap r), viewField "ConstantData2" (viewString $ ioc_ConstantData2 r) ]
+    recType = fromEnum . ioc_Type
+
+instance Rec IPD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ IPD a01 a02 a03
+    recPut bh r = do put bh $ ipd_Type r; put bh $ ipd_ r; put bh $ ipd r; return ()
+    recSizeOf r = sum [ sizeOf $ ipd_Type r, sizeOf $ ipd_ r, sizeOf $ ipd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ipd_Type r), viewField "_" (viewNumber $ ipd_ r), viewField "" (viewNStr $ ipd r) ]
+    recType = fromEnum . ipd_Type
+
+instance Rec IPG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ IPG a01 a02 a03
+    recPut bh r = do put bh $ ipg_Type r; put bh $ ipg_ r; put bh $ ipg r; return ()
+    recSizeOf r = sum [ sizeOf $ ipg_Type r, sizeOf $ ipg_ r, sizeOf $ ipg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ipg_Type r), viewField "_" (viewNumber $ ipg_ r), viewField "" (viewNStr $ ipg r) ]
+    recType = fromEnum . ipg_Type
+
+instance Rec IPO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ IPO a01 a02 a03
+    recPut bh r = do put bh $ ipo_Type r; put bh $ ipo_ r; put bh $ ipo r; return ()
+    recSizeOf r = sum [ sizeOf $ ipo_Type r, sizeOf $ ipo_ r, sizeOf $ ipo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ipo_Type r), viewField "_" (viewNumber $ ipo_ r), viewField "" (viewNStr $ ipo r) ]
+    recType = fromEnum . ipo_Type
+
+instance Rec IPS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ IPS a01 a02 a03
+    recPut bh r = do put bh $ ips_Type r; put bh $ ips_ r; put bh $ ips r; return ()
+    recSizeOf r = sum [ sizeOf $ ips_Type r, sizeOf $ ips_ r, sizeOf $ ips r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ips_Type r), viewField "_" (viewNumber $ ips_ r), viewField "" (viewNStr $ ips r) ]
+    recType = fromEnum . ips_Type
+
+instance Rec IRD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ IRD a01 a02 a03
+    recPut bh r = do put bh $ ird_Type r; put bh $ ird_ r; put bh $ ird_ImageData r; return ()
+    recSizeOf r = sum [ sizeOf $ ird_Type r, sizeOf $ ird_ r, sizeOf $ ird_ImageData r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ird_Type r), viewField "_" (viewNumber $ ird_ r), viewField "ImageData" (viewNStr $ ird_ImageData r) ]
+    recType = fromEnum . ird_Type
+
+instance Rec LLE where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ LLE a01 a02 a03
+    recPut bh r = do put bh $ lle_Type r; put bh $ lle_ r; put bh $ lle r; return ()
+    recSizeOf r = sum [ sizeOf $ lle_Type r, sizeOf $ lle_ r, sizeOf $ lle r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ lle_Type r), viewField "_" (viewNumber $ lle_ r), viewField "" (viewNStr $ lle r) ]
+    recType = fromEnum . lle_Type
+
+instance Rec LNC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ LNC a01 a02 a03
+    recPut bh r = do put bh $ lnc_Type r; put bh $ lnc_ r; put bh $ lnc r; return ()
+    recSizeOf r = sum [ sizeOf $ lnc_Type r, sizeOf $ lnc_ r, sizeOf $ lnc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ lnc_Type r), viewField "_" (viewNumber $ lnc_ r), viewField "" (viewNStr $ lnc r) ]
+    recType = fromEnum . lnc_Type
+
+instance Rec LND where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ LND a01 a02 a03
+    recPut bh r = do put bh $ lnd_Type r; put bh $ lnd_ r; put bh $ lnd r; return ()
+    recSizeOf r = sum [ sizeOf $ lnd_Type r, sizeOf $ lnd_ r, sizeOf $ lnd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ lnd_Type r), viewField "_" (viewNumber $ lnd_ r), viewField "" (viewNStr $ lnd r) ]
+    recType = fromEnum . lnd_Type
+
+instance Rec MBC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MBC a01 a02 a03
+    recPut bh r = do put bh $ mbc_Type r; put bh $ mbc_ r; put bh $ mbc r; return ()
+    recSizeOf r = sum [ sizeOf $ mbc_Type r, sizeOf $ mbc_ r, sizeOf $ mbc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mbc_Type r), viewField "_" (viewNumber $ mbc_ r), viewField "" (viewNStr $ mbc r) ]
+    recType = fromEnum . mbc_Type
+
+instance Rec MCA where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MCA a01 a02 a03
+    recPut bh r = do put bh $ mca_Type r; put bh $ mca_ r; put bh $ mca r; return ()
+    recSizeOf r = sum [ sizeOf $ mca_Type r, sizeOf $ mca_ r, sizeOf $ mca r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mca_Type r), viewField "_" (viewNumber $ mca_ r), viewField "" (viewNStr $ mca r) ]
+    recType = fromEnum . mca_Type
+
+instance Rec MCC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MCC a01 a02 a03
+    recPut bh r = do put bh $ mcc_Type r; put bh $ mcc_ r; put bh $ mcc r; return ()
+    recSizeOf r = sum [ sizeOf $ mcc_Type r, sizeOf $ mcc_ r, sizeOf $ mcc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mcc_Type r), viewField "_" (viewNumber $ mcc_ r), viewField "" (viewNStr $ mcc r) ]
+    recType = fromEnum . mcc_Type
+
+instance Rec MCD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MCD a01 a02 a03
+    recPut bh r = do put bh $ mcd_Type r; put bh $ mcd_ r; put bh $ mcd r; return ()
+    recSizeOf r = sum [ sizeOf $ mcd_Type r, sizeOf $ mcd_ r, sizeOf $ mcd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mcd_Type r), viewField "_" (viewNumber $ mcd_ r), viewField "" (viewNStr $ mcd r) ]
+    recType = fromEnum . mcd_Type
+
diff --git a/src/OpenAFP/Prelude/InstancePTX.hs b/src/OpenAFP/Prelude/InstancePTX.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Prelude/InstancePTX.hs
@@ -0,0 +1,211 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+module OpenAFP.Prelude.InstancePTX () where
+import OpenAFP.Types
+import OpenAFP.Records
+import OpenAFP.Internals
+
+recOf :: (ChunkBuf c n b, Binary (Record r)) => c -> IO r
+recOf c = return . fromRecord =<< chunkToRecord c
+
+apply :: (MonadIO m) => (t -> IO a) -> t -> (a -> m b) -> m b
+apply ctr c f = f =<< (liftIO $ ctr c)
+
+instance Rec PTX_AMB where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_AMB a01 a02
+    recPut bh r = do put bh $ ptx_amb_Type r; put bh $ ptx_amb r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_amb_Type r, sizeOf $ ptx_amb r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_amb_Type r), viewField "" (viewNumber $ ptx_amb r) ]
+    recType = fromEnum . ptx_amb_Type
+
+instance Rec PTX_AMI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_AMI a01 a02
+    recPut bh r = do put bh $ ptx_ami_Type r; put bh $ ptx_ami r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_ami_Type r, sizeOf $ ptx_ami r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_ami_Type r), viewField "" (viewNumber $ ptx_ami r) ]
+    recType = fromEnum . ptx_ami_Type
+
+instance Rec PTX_BLN where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_BLN a01 a02
+    recPut bh r = do put bh $ ptx_bln_Type r; put bh $ ptx_bln r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_bln_Type r, sizeOf $ ptx_bln r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_bln_Type r), viewField "" (viewNStr $ ptx_bln r) ]
+    recType = fromEnum . ptx_bln_Type
+
+instance Rec PTX_BSU where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_BSU a01 a02
+    recPut bh r = do put bh $ ptx_bsu_Type r; put bh $ ptx_bsu r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_bsu_Type r, sizeOf $ ptx_bsu r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_bsu_Type r), viewField "" (viewNStr $ ptx_bsu r) ]
+    recType = fromEnum . ptx_bsu_Type
+
+instance Rec PTX_DBR where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_DBR a01 a02
+    recPut bh r = do put bh $ ptx_dbr_Type r; put bh $ ptx_dbr r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_dbr_Type r, sizeOf $ ptx_dbr r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_dbr_Type r), viewField "" (viewNStr $ ptx_dbr r) ]
+    recType = fromEnum . ptx_dbr_Type
+
+instance Rec PTX_DIR where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_DIR a01 a02
+    recPut bh r = do put bh $ ptx_dir_Type r; put bh $ ptx_dir r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_dir_Type r, sizeOf $ ptx_dir r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_dir_Type r), viewField "" (viewNStr $ ptx_dir r) ]
+    recType = fromEnum . ptx_dir_Type
+
+instance Rec PTX_ESU where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_ESU a01 a02
+    recPut bh r = do put bh $ ptx_esu_Type r; put bh $ ptx_esu r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_esu_Type r, sizeOf $ ptx_esu r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_esu_Type r), viewField "" (viewNStr $ ptx_esu r) ]
+    recType = fromEnum . ptx_esu_Type
+
+instance Rec PTX_NOP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_NOP a01 a02
+    recPut bh r = do put bh $ ptx_nop_Type r; put bh $ ptx_nop r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_nop_Type r, sizeOf $ ptx_nop r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_nop_Type r), viewField "" (viewNStr $ ptx_nop r) ]
+    recType = fromEnum . ptx_nop_Type
+
+instance Rec PTX_RMB where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_RMB a01 a02
+    recPut bh r = do put bh $ ptx_rmb_Type r; put bh $ ptx_rmb r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_rmb_Type r, sizeOf $ ptx_rmb r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_rmb_Type r), viewField "" (viewNumber $ ptx_rmb r) ]
+    recType = fromEnum . ptx_rmb_Type
+
+instance Rec PTX_RMI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_RMI a01 a02
+    recPut bh r = do put bh $ ptx_rmi_Type r; put bh $ ptx_rmi r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_rmi_Type r, sizeOf $ ptx_rmi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_rmi_Type r), viewField "" (viewNumber $ ptx_rmi r) ]
+    recType = fromEnum . ptx_rmi_Type
+
+instance Rec PTX_RPS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_RPS a01 a02
+    recPut bh r = do put bh $ ptx_rps_Type r; put bh $ ptx_rps r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_rps_Type r, sizeOf $ ptx_rps r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_rps_Type r), viewField "" (viewNStr $ ptx_rps r) ]
+    recType = fromEnum . ptx_rps_Type
+
+instance Rec PTX_SBI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_SBI a01 a02
+    recPut bh r = do put bh $ ptx_sbi_Type r; put bh $ ptx_sbi r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_sbi_Type r, sizeOf $ ptx_sbi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_sbi_Type r), viewField "" (viewNumber $ ptx_sbi r) ]
+    recType = fromEnum . ptx_sbi_Type
+
+instance Rec PTX_SCFL where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_SCFL a01 a02
+    recPut bh r = do put bh $ ptx_scfl_Type r; put bh $ ptx_scfl r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_scfl_Type r, sizeOf $ ptx_scfl r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_scfl_Type r), viewField "" (viewNumber $ ptx_scfl r) ]
+    recType = fromEnum . ptx_scfl_Type
+
+instance Rec PTX_SIA where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_SIA a01 a02
+    recPut bh r = do put bh $ ptx_sia_Type r; put bh $ ptx_sia r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_sia_Type r, sizeOf $ ptx_sia r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_sia_Type r), viewField "" (viewNumber $ ptx_sia r) ]
+    recType = fromEnum . ptx_sia_Type
+
+instance Rec PTX_SIM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_SIM a01 a02
+    recPut bh r = do put bh $ ptx_sim_Type r; put bh $ ptx_sim r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_sim_Type r, sizeOf $ ptx_sim r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_sim_Type r), viewField "" (viewNumber $ ptx_sim r) ]
+    recType = fromEnum . ptx_sim_Type
+
+instance Rec PTX_STC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_STC a01 a02
+    recPut bh r = do put bh $ ptx_stc_Type r; put bh $ ptx_stc r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_stc_Type r, sizeOf $ ptx_stc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_stc_Type r), viewField "" (viewNStr $ ptx_stc r) ]
+    recType = fromEnum . ptx_stc_Type
+
+instance Rec PTX_STO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ PTX_STO a01 a02 a03
+    recPut bh r = do put bh $ ptx_sto_Type r; put bh $ ptx_sto_Orientation r; put bh $ ptx_sto_WrapDirection r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_sto_Type r, sizeOf $ ptx_sto_Orientation r, sizeOf $ ptx_sto_WrapDirection r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_sto_Type r), viewField "Orientation" (viewNumber $ ptx_sto_Orientation r), viewField "WrapDirection" (viewNumber $ ptx_sto_WrapDirection r) ]
+    recType = fromEnum . ptx_sto_Type
+
+instance Rec PTX_SVI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_SVI a01 a02
+    recPut bh r = do put bh $ ptx_svi_Type r; put bh $ ptx_svi r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_svi_Type r, sizeOf $ ptx_svi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_svi_Type r), viewField "" (viewNumber $ ptx_svi r) ]
+    recType = fromEnum . ptx_svi_Type
+
+instance Rec PTX_TRN where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ PTX_TRN a01 a02
+    recPut bh r = do put bh $ ptx_trn_Type r; put bh $ ptx_trn r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_trn_Type r, sizeOf $ ptx_trn r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_trn_Type r), viewField "" (viewNStr $ ptx_trn r) ]
+    recType = fromEnum . ptx_trn_Type
+
+instance ChunkBuf PTX_ N1 Buffer1 where
+    chunkCon = PTX_
+    chunkDecon (PTX_ x) = x
+    chunkTypeLookup = lookupPTX
+    chunkApply = applyPTX
+
+applyPTX :: forall m x. (MonadIO m)
+    => N1 -> PTX_ -> (forall a. (Rec a) => (a -> m x)) -> m x
+applyPTX x rec f = case x of
+    0x74 -> apply recOf rec (f :: PTX_STC -> m x)
+    0x75 -> apply recOf rec (f :: PTX_STC -> m x)
+    0xC0 -> apply recOf rec (f :: PTX_SIM -> m x)
+    0xC1 -> apply recOf rec (f :: PTX_SIM -> m x)
+    0xC2 -> apply recOf rec (f :: PTX_SIA -> m x)
+    0xC3 -> apply recOf rec (f :: PTX_SIA -> m x)
+    0xC4 -> apply recOf rec (f :: PTX_SVI -> m x)
+    0xC5 -> apply recOf rec (f :: PTX_SVI -> m x)
+    0xC6 -> apply recOf rec (f :: PTX_AMI -> m x)
+    0xC7 -> apply recOf rec (f :: PTX_AMI -> m x)
+    0xC8 -> apply recOf rec (f :: PTX_RMI -> m x)
+    0xC9 -> apply recOf rec (f :: PTX_RMI -> m x)
+    0xD0 -> apply recOf rec (f :: PTX_SBI -> m x)
+    0xD1 -> apply recOf rec (f :: PTX_SBI -> m x)
+    0xD2 -> apply recOf rec (f :: PTX_AMB -> m x)
+    0xD3 -> apply recOf rec (f :: PTX_AMB -> m x)
+    0xD4 -> apply recOf rec (f :: PTX_RMB -> m x)
+    0xD5 -> apply recOf rec (f :: PTX_RMB -> m x)
+    0xD8 -> apply recOf rec (f :: PTX_BLN -> m x)
+    0xD9 -> apply recOf rec (f :: PTX_BLN -> m x)
+    0xDA -> apply recOf rec (f :: PTX_TRN -> m x)
+    0xDB -> apply recOf rec (f :: PTX_TRN -> m x)
+    0xE4 -> apply recOf rec (f :: PTX_DIR -> m x)
+    0xE5 -> apply recOf rec (f :: PTX_DIR -> m x)
+    0xE6 -> apply recOf rec (f :: PTX_DBR -> m x)
+    0xE7 -> apply recOf rec (f :: PTX_DBR -> m x)
+    0xEE -> apply recOf rec (f :: PTX_RPS -> m x)
+    0xEF -> apply recOf rec (f :: PTX_RPS -> m x)
+    0xF0 -> apply recOf rec (f :: PTX_SCFL -> m x)
+    0xF1 -> apply recOf rec (f :: PTX_SCFL -> m x)
+    0xF2 -> apply recOf rec (f :: PTX_BSU -> m x)
+    0xF3 -> apply recOf rec (f :: PTX_BSU -> m x)
+    0xF4 -> apply recOf rec (f :: PTX_ESU -> m x)
+    0xF5 -> apply recOf rec (f :: PTX_ESU -> m x)
+    0xF6 -> apply recOf rec (f :: PTX_STO -> m x)
+    0xF7 -> apply recOf rec (f :: PTX_STO -> m x)
+    0xF8 -> apply recOf rec (f :: PTX_NOP -> m x)
+    0xF9 -> apply recOf rec (f :: PTX_NOP -> m x)
+    _    -> apply recOf rec (f :: Unknown -> m x)
+
+instance RecChunk PTX PTX_ N1 Buffer1 where
+    readChunks r = ptx_Chunks r
+    writeChunks r io = do
+        cs <- io
+        return $ r { ptx_Chunks = cs }
+
+instance Rec PTX_ where
+    recSizeOf c = 1 + (snd $ chunkToPStrLen c)
+
+instance Rec PTX where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; return $ PTX a01 a02 a03 a04
+    recPut bh r = do put bh $ ptx_Type r; put bh $ ptx_ r; put bh $ ptx_EscapeSequence r; put bh $ ptx_Chunks r; return ()
+    recSizeOf r = sum [ sizeOf $ ptx_Type r, sizeOf $ ptx_ r, sizeOf $ ptx_EscapeSequence r, sizeOf $ ptx_Chunks r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptx_Type r), viewField "_" (viewNumber $ ptx_ r), viewField "EscapeSequence" (viewNumber $ ptx_EscapeSequence r), viewField "Chunks" (viewChunks $ ptx_Chunks r) ]
+    recType = fromEnum . ptx_Type
+
diff --git a/src/OpenAFP/Prelude/InstanceT.hs b/src/OpenAFP/Prelude/InstanceT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Prelude/InstanceT.hs
@@ -0,0 +1,478 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+module OpenAFP.Prelude.InstanceT () where
+import OpenAFP.Types
+import OpenAFP.Records
+import OpenAFP.Internals
+
+recOf :: (ChunkBuf c n b, Binary (Record r)) => c -> IO r
+recOf c = return . fromRecord =<< chunkToRecord c
+
+apply :: (MonadIO m) => (t -> IO a) -> t -> (a -> m b) -> m b
+apply ctr c f = f =<< (liftIO $ ctr c)
+
+instance Rec T_AD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_AD a01 a02
+    recPut bh r = do put bh $ t_ad_Type r; put bh $ t_ad r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ad_Type r, sizeOf $ t_ad r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ad_Type r), viewField "" (viewNStr $ t_ad r) ]
+    recType = fromEnum . t_ad_Type
+
+instance Rec T_AQ where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_AQ a01 a02
+    recPut bh r = do put bh $ t_aq_Type r; put bh $ t_aq r; return ()
+    recSizeOf r = sum [ sizeOf $ t_aq_Type r, sizeOf $ t_aq r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_aq_Type r), viewField "" (viewNStr $ t_aq r) ]
+    recType = fromEnum . t_aq_Type
+
+instance Rec T_AV where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_AV a01 a02
+    recPut bh r = do put bh $ t_av_Type r; put bh $ t_av r; return ()
+    recSizeOf r = sum [ sizeOf $ t_av_Type r, sizeOf $ t_av r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_av_Type r), viewField "" (viewNStr $ t_av r) ]
+    recType = fromEnum . t_av_Type
+
+instance Rec T_C where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_C a01 a02
+    recPut bh r = do put bh $ t_c_Type r; put bh $ t_c r; return ()
+    recSizeOf r = sum [ sizeOf $ t_c_Type r, sizeOf $ t_c r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_c_Type r), viewField "" (viewNStr $ t_c r) ]
+    recType = fromEnum . t_c_Type
+
+instance Rec T_CF where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_CF a01 a02
+    recPut bh r = do put bh $ t_cf_Type r; put bh $ t_cf r; return ()
+    recSizeOf r = sum [ sizeOf $ t_cf_Type r, sizeOf $ t_cf r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_cf_Type r), viewField "" (viewNStr $ t_cf r) ]
+    recType = fromEnum . t_cf_Type
+
+instance Rec T_CGCSGI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_CGCSGI a01 a02
+    recPut bh r = do put bh $ t_cgcsgi_Type r; put bh $ t_cgcsgi r; return ()
+    recSizeOf r = sum [ sizeOf $ t_cgcsgi_Type r, sizeOf $ t_cgcsgi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_cgcsgi_Type r), viewField "" (viewNStr $ t_cgcsgi r) ]
+    recType = fromEnum . t_cgcsgi_Type
+
+instance Rec T_CR where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_CR a01 a02
+    recPut bh r = do put bh $ t_cr_Type r; put bh $ t_cr r; return ()
+    recSizeOf r = sum [ sizeOf $ t_cr_Type r, sizeOf $ t_cr r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_cr_Type r), viewField "" (viewNStr $ t_cr r) ]
+    recType = fromEnum . t_cr_Type
+
+instance Rec T_CS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_CS a01 a02
+    recPut bh r = do put bh $ t_cs_Type r; put bh $ t_cs r; return ()
+    recSizeOf r = sum [ sizeOf $ t_cs_Type r, sizeOf $ t_cs r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_cs_Type r), viewField "" (viewNStr $ t_cs r) ]
+    recType = fromEnum . t_cs_Type
+
+instance Rec T_DP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_DP a01 a02
+    recPut bh r = do put bh $ t_dp_Type r; put bh $ t_dp r; return ()
+    recSizeOf r = sum [ sizeOf $ t_dp_Type r, sizeOf $ t_dp r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_dp_Type r), viewField "" (viewNStr $ t_dp r) ]
+    recType = fromEnum . t_dp_Type
+
+instance Rec T_EF where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_EF a01 a02
+    recPut bh r = do put bh $ t_ef_Type r; put bh $ t_ef r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ef_Type r, sizeOf $ t_ef r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ef_Type r), viewField "" (viewNStr $ t_ef r) ]
+    recType = fromEnum . t_ef_Type
+
+instance Rec T_ERLI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_ERLI a01 a02
+    recPut bh r = do put bh $ t_erli_Type r; put bh $ t_erli r; return ()
+    recSizeOf r = sum [ sizeOf $ t_erli_Type r, sizeOf $ t_erli r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_erli_Type r), viewField "" (viewNStr $ t_erli r) ]
+    recType = fromEnum . t_erli_Type
+
+instance Rec T_ESI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_ESI a01 a02
+    recPut bh r = do put bh $ t_esi_Type r; put bh $ t_esi r; return ()
+    recSizeOf r = sum [ sizeOf $ t_esi_Type r, sizeOf $ t_esi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_esi_Type r), viewField "" (viewNStr $ t_esi r) ]
+    recType = fromEnum . t_esi_Type
+
+instance Rec T_FCGCSGI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_FCGCSGI a01 a02
+    recPut bh r = do put bh $ t_fcgcsgi_Type r; put bh $ t_fcgcsgi r; return ()
+    recSizeOf r = sum [ sizeOf $ t_fcgcsgi_Type r, sizeOf $ t_fcgcsgi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_fcgcsgi_Type r), viewField "" (viewNStr $ t_fcgcsgi r) ]
+    recType = fromEnum . t_fcgcsgi_Type
+
+instance Rec T_FDS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_FDS a01 a02
+    recPut bh r = do put bh $ t_fds_Type r; put bh $ t_fds r; return ()
+    recSizeOf r = sum [ sizeOf $ t_fds_Type r, sizeOf $ t_fds r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_fds_Type r), viewField "" (viewNStr $ t_fds r) ]
+    recType = fromEnum . t_fds_Type
+
+instance Rec T_FF where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_FF a01 a02
+    recPut bh r = do put bh $ t_ff_Type r; put bh $ t_ff r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ff_Type r, sizeOf $ t_ff r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ff_Type r), viewField "" (viewNStr $ t_ff r) ]
+    recType = fromEnum . t_ff_Type
+
+instance Rec T_FHSF where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_FHSF a01 a02
+    recPut bh r = do put bh $ t_fhsf_Type r; put bh $ t_fhsf r; return ()
+    recSizeOf r = sum [ sizeOf $ t_fhsf_Type r, sizeOf $ t_fhsf r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_fhsf_Type r), viewField "" (viewNStr $ t_fhsf r) ]
+    recType = fromEnum . t_fhsf_Type
+
+instance Rec T_FO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_FO a01 a02
+    recPut bh r = do put bh $ t_fo_Type r; put bh $ t_fo r; return ()
+    recSizeOf r = sum [ sizeOf $ t_fo_Type r, sizeOf $ t_fo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_fo_Type r), viewField "" (viewNStr $ t_fo r) ]
+    recType = fromEnum . t_fo_Type
+
+instance Rec T_FQN where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; return $ T_FQN a01 a02 a03 a04
+    recPut bh r = do put bh $ t_fqn_Type r; put bh $ t_fqn_SubType r; put bh $ t_fqn_Format r; put bh $ t_fqn r; return ()
+    recSizeOf r = sum [ sizeOf $ t_fqn_Type r, sizeOf $ t_fqn_SubType r, sizeOf $ t_fqn_Format r, sizeOf $ t_fqn r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_fqn_Type r), viewField "SubType" (viewNumber $ t_fqn_SubType r), viewField "Format" (viewNumber $ t_fqn_Format r), viewField "" (viewString $ t_fqn r) ]
+    recType = fromEnum . t_fqn_Type
+
+instance Rec T_FRMT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_FRMT a01 a02
+    recPut bh r = do put bh $ t_frmt_Type r; put bh $ t_frmt r; return ()
+    recSizeOf r = sum [ sizeOf $ t_frmt_Type r, sizeOf $ t_frmt r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_frmt_Type r), viewField "" (viewNStr $ t_frmt r) ]
+    recType = fromEnum . t_frmt_Type
+
+instance Rec T_II where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_II a01 a02
+    recPut bh r = do put bh $ t_ii_Type r; put bh $ t_ii r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ii_Type r, sizeOf $ t_ii r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ii_Type r), viewField "" (viewNStr $ t_ii r) ]
+    recType = fromEnum . t_ii_Type
+
+instance Rec T_LDOPM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_LDOPM a01 a02
+    recPut bh r = do put bh $ t_ldopm_Type r; put bh $ t_ldopm r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ldopm_Type r, sizeOf $ t_ldopm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ldopm_Type r), viewField "" (viewNStr $ t_ldopm r) ]
+    recType = fromEnum . t_ldopm_Type
+
+instance Rec T_LDTS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_LDTS a01 a02
+    recPut bh r = do put bh $ t_ldts_Type r; put bh $ t_ldts r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ldts_Type r, sizeOf $ t_ldts r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ldts_Type r), viewField "" (viewNStr $ t_ldts r) ]
+    recType = fromEnum . t_ldts_Type
+
+instance Rec T_MA where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_MA a01 a02
+    recPut bh r = do put bh $ t_ma_Type r; put bh $ t_ma r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ma_Type r, sizeOf $ t_ma r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ma_Type r), viewField "" (viewNStr $ t_ma r) ]
+    recType = fromEnum . t_ma_Type
+
+instance Rec T_MEC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_MEC a01 a02
+    recPut bh r = do put bh $ t_mec_Type r; put bh $ t_mec r; return ()
+    recSizeOf r = sum [ sizeOf $ t_mec_Type r, sizeOf $ t_mec r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_mec_Type r), viewField "" (viewNStr $ t_mec r) ]
+    recType = fromEnum . t_mec_Type
+
+instance Rec T_MF where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_MF a01 a02
+    recPut bh r = do put bh $ t_mf_Type r; put bh $ t_mf r; return ()
+    recSizeOf r = sum [ sizeOf $ t_mf_Type r, sizeOf $ t_mf r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_mf_Type r), viewField "" (viewNStr $ t_mf r) ]
+    recType = fromEnum . t_mf_Type
+
+instance Rec T_MIS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_MIS a01 a02
+    recPut bh r = do put bh $ t_mis_Type r; put bh $ t_mis r; return ()
+    recSizeOf r = sum [ sizeOf $ t_mis_Type r, sizeOf $ t_mis r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_mis_Type r), viewField "" (viewNStr $ t_mis r) ]
+    recType = fromEnum . t_mis_Type
+
+instance Rec T_MMPN where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_MMPN a01 a02
+    recPut bh r = do put bh $ t_mmpn_Type r; put bh $ t_mmpn r; return ()
+    recSizeOf r = sum [ sizeOf $ t_mmpn_Type r, sizeOf $ t_mmpn r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_mmpn_Type r), viewField "" (viewNStr $ t_mmpn r) ]
+    recType = fromEnum . t_mmpn_Type
+
+instance Rec T_MO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_MO a01 a02
+    recPut bh r = do put bh $ t_mo_Type r; put bh $ t_mo r; return ()
+    recSizeOf r = sum [ sizeOf $ t_mo_Type r, sizeOf $ t_mo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_mo_Type r), viewField "" (viewNStr $ t_mo r) ]
+    recType = fromEnum . t_mo_Type
+
+instance Rec T_MOR where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_MOR a01 a02
+    recPut bh r = do put bh $ t_mor_Type r; put bh $ t_mor r; return ()
+    recSizeOf r = sum [ sizeOf $ t_mor_Type r, sizeOf $ t_mor r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_mor_Type r), viewField "" (viewNStr $ t_mor r) ]
+    recType = fromEnum . t_mor_Type
+
+instance Rec T_OAMU where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OAMU a01 a02
+    recPut bh r = do put bh $ t_oamu_Type r; put bh $ t_oamu r; return ()
+    recSizeOf r = sum [ sizeOf $ t_oamu_Type r, sizeOf $ t_oamu r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_oamu_Type r), viewField "" (viewNStr $ t_oamu r) ]
+    recType = fromEnum . t_oamu_Type
+
+instance Rec T_OAS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OAS a01 a02
+    recPut bh r = do put bh $ t_oas_Type r; put bh $ t_oas r; return ()
+    recSizeOf r = sum [ sizeOf $ t_oas_Type r, sizeOf $ t_oas r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_oas_Type r), viewField "" (viewNStr $ t_oas r) ]
+    recType = fromEnum . t_oas_Type
+
+instance Rec T_OBE where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OBE a01 a02
+    recPut bh r = do put bh $ t_obe_Type r; put bh $ t_obe r; return ()
+    recSizeOf r = sum [ sizeOf $ t_obe_Type r, sizeOf $ t_obe r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_obe_Type r), viewField "" (viewNStr $ t_obe r) ]
+    recType = fromEnum . t_obe_Type
+
+instance Rec T_OBO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OBO a01 a02
+    recPut bh r = do put bh $ t_obo_Type r; put bh $ t_obo r; return ()
+    recSizeOf r = sum [ sizeOf $ t_obo_Type r, sizeOf $ t_obo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_obo_Type r), viewField "" (viewNStr $ t_obo r) ]
+    recType = fromEnum . t_obo_Type
+
+instance Rec T_OCH where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OCH a01 a02
+    recPut bh r = do put bh $ t_och_Type r; put bh $ t_och r; return ()
+    recSizeOf r = sum [ sizeOf $ t_och_Type r, sizeOf $ t_och r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_och_Type r), viewField "" (viewNStr $ t_och r) ]
+    recType = fromEnum . t_och_Type
+
+instance Rec T_OCL where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OCL a01 a02
+    recPut bh r = do put bh $ t_ocl_Type r; put bh $ t_ocl r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ocl_Type r, sizeOf $ t_ocl r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ocl_Type r), viewField "" (viewNStr $ t_ocl r) ]
+    recType = fromEnum . t_ocl_Type
+
+instance Rec T_OCO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OCO a01 a02
+    recPut bh r = do put bh $ t_oco_Type r; put bh $ t_oco r; return ()
+    recSizeOf r = sum [ sizeOf $ t_oco_Type r, sizeOf $ t_oco r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_oco_Type r), viewField "" (viewNStr $ t_oco r) ]
+    recType = fromEnum . t_oco_Type
+
+instance Rec T_OFSS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OFSS a01 a02
+    recPut bh r = do put bh $ t_ofss_Type r; put bh $ t_ofss r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ofss_Type r, sizeOf $ t_ofss r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ofss_Type r), viewField "" (viewNStr $ t_ofss r) ]
+    recType = fromEnum . t_ofss_Type
+
+instance Rec T_OO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OO a01 a02
+    recPut bh r = do put bh $ t_oo_Type r; put bh $ t_oo r; return ()
+    recSizeOf r = sum [ sizeOf $ t_oo_Type r, sizeOf $ t_oo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_oo_Type r), viewField "" (viewNStr $ t_oo r) ]
+    recType = fromEnum . t_oo_Type
+
+instance Rec T_OOI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OOI a01 a02
+    recPut bh r = do put bh $ t_ooi_Type r; put bh $ t_ooi r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ooi_Type r, sizeOf $ t_ooi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ooi_Type r), viewField "" (viewNStr $ t_ooi r) ]
+    recType = fromEnum . t_ooi_Type
+
+instance Rec T_OSFE where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OSFE a01 a02
+    recPut bh r = do put bh $ t_osfe_Type r; put bh $ t_osfe r; return ()
+    recSizeOf r = sum [ sizeOf $ t_osfe_Type r, sizeOf $ t_osfe r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_osfe_Type r), viewField "" (viewNStr $ t_osfe r) ]
+    recType = fromEnum . t_osfe_Type
+
+instance Rec T_OSFO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_OSFO a01 a02
+    recPut bh r = do put bh $ t_osfo_Type r; put bh $ t_osfo r; return ()
+    recSizeOf r = sum [ sizeOf $ t_osfo_Type r, sizeOf $ t_osfo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_osfo_Type r), viewField "" (viewNStr $ t_osfo r) ]
+    recType = fromEnum . t_osfo_Type
+
+instance Rec T_PC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_PC a01 a02
+    recPut bh r = do put bh $ t_pc_Type r; put bh $ t_pc r; return ()
+    recSizeOf r = sum [ sizeOf $ t_pc_Type r, sizeOf $ t_pc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_pc_Type r), viewField "" (viewNStr $ t_pc r) ]
+    recType = fromEnum . t_pc_Type
+
+instance Rec T_POCP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_POCP a01 a02
+    recPut bh r = do put bh $ t_pocp_Type r; put bh $ t_pocp r; return ()
+    recSizeOf r = sum [ sizeOf $ t_pocp_Type r, sizeOf $ t_pocp r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_pocp_Type r), viewField "" (viewNStr $ t_pocp r) ]
+    recType = fromEnum . t_pocp_Type
+
+instance Rec T_PPI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_PPI a01 a02
+    recPut bh r = do put bh $ t_ppi_Type r; put bh $ t_ppi r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ppi_Type r, sizeOf $ t_ppi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ppi_Type r), viewField "" (viewNStr $ t_ppi r) ]
+    recType = fromEnum . t_ppi_Type
+
+instance Rec T_PSMR where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_PSMR a01 a02
+    recPut bh r = do put bh $ t_psmr_Type r; put bh $ t_psmr r; return ()
+    recSizeOf r = sum [ sizeOf $ t_psmr_Type r, sizeOf $ t_psmr r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_psmr_Type r), viewField "" (viewNStr $ t_psmr r) ]
+    recType = fromEnum . t_psmr_Type
+
+instance Rec T_PSRM where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_PSRM a01 a02
+    recPut bh r = do put bh $ t_psrm_Type r; put bh $ t_psrm r; return ()
+    recSizeOf r = sum [ sizeOf $ t_psrm_Type r, sizeOf $ t_psrm r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_psrm_Type r), viewField "" (viewNStr $ t_psrm r) ]
+    recType = fromEnum . t_psrm_Type
+
+instance Rec T_PV where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_PV a01 a02
+    recPut bh r = do put bh $ t_pv_Type r; put bh $ t_pv r; return ()
+    recSizeOf r = sum [ sizeOf $ t_pv_Type r, sizeOf $ t_pv r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_pv_Type r), viewField "" (viewNStr $ t_pv r) ]
+    recType = fromEnum . t_pv_Type
+
+instance Rec T_RLI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ T_RLI a01 a02 a03
+    recPut bh r = do put bh $ t_rli_Type r; put bh $ t_rli_SubType r; put bh $ t_rli r; return ()
+    recSizeOf r = sum [ sizeOf $ t_rli_Type r, sizeOf $ t_rli_SubType r, sizeOf $ t_rli r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_rli_Type r), viewField "SubType" (viewNumber $ t_rli_SubType r), viewField "" (viewNumber $ t_rli r) ]
+    recType = fromEnum . t_rli_Type
+
+instance Rec T_ROI where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_ROI a01 a02
+    recPut bh r = do put bh $ t_roi_Type r; put bh $ t_roi r; return ()
+    recSizeOf r = sum [ sizeOf $ t_roi_Type r, sizeOf $ t_roi r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_roi_Type r), viewField "" (viewNStr $ t_roi r) ]
+    recType = fromEnum . t_roi_Type
+
+instance Rec T_ROT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_ROT a01 a02
+    recPut bh r = do put bh $ t_rot_Type r; put bh $ t_rot r; return ()
+    recSizeOf r = sum [ sizeOf $ t_rot_Type r, sizeOf $ t_rot r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_rot_Type r), viewField "" (viewNStr $ t_rot r) ]
+    recType = fromEnum . t_rot_Type
+
+instance Rec T_RSN where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_RSN a01 a02
+    recPut bh r = do put bh $ t_rsn_Type r; put bh $ t_rsn r; return ()
+    recSizeOf r = sum [ sizeOf $ t_rsn_Type r, sizeOf $ t_rsn r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_rsn_Type r), viewField "" (viewNStr $ t_rsn r) ]
+    recType = fromEnum . t_rsn_Type
+
+instance Rec T_RUA where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_RUA a01 a02
+    recPut bh r = do put bh $ t_rua_Type r; put bh $ t_rua r; return ()
+    recSizeOf r = sum [ sizeOf $ t_rua_Type r, sizeOf $ t_rua r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_rua_Type r), viewField "" (viewNStr $ t_rua r) ]
+    recType = fromEnum . t_rua_Type
+
+instance Rec T_T1CRMT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_T1CRMT a01 a02
+    recPut bh r = do put bh $ t_t1crmt_Type r; put bh $ t_t1crmt r; return ()
+    recSizeOf r = sum [ sizeOf $ t_t1crmt_Type r, sizeOf $ t_t1crmt r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_t1crmt_Type r), viewField "" (viewNStr $ t_t1crmt r) ]
+    recType = fromEnum . t_t1crmt_Type
+
+instance Rec T_T2FRMT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_T2FRMT a01 a02
+    recPut bh r = do put bh $ t_t2frmt_Type r; put bh $ t_t2frmt r; return ()
+    recSizeOf r = sum [ sizeOf $ t_t2frmt_Type r, sizeOf $ t_t2frmt r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_t2frmt_Type r), viewField "" (viewNStr $ t_t2frmt r) ]
+    recType = fromEnum . t_t2frmt_Type
+
+instance Rec T_TO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_TO a01 a02
+    recPut bh r = do put bh $ t_to_Type r; put bh $ t_to r; return ()
+    recSizeOf r = sum [ sizeOf $ t_to_Type r, sizeOf $ t_to r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_to_Type r), viewField "" (viewNStr $ t_to r) ]
+    recType = fromEnum . t_to_Type
+
+instance Rec T_TS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_TS a01 a02
+    recPut bh r = do put bh $ t_ts_Type r; put bh $ t_ts r; return ()
+    recSizeOf r = sum [ sizeOf $ t_ts_Type r, sizeOf $ t_ts r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_ts_Type r), viewField "" (viewNStr $ t_ts r) ]
+    recType = fromEnum . t_ts_Type
+
+instance Rec T_UDTS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; return $ T_UDTS a01 a02
+    recPut bh r = do put bh $ t_udts_Type r; put bh $ t_udts r; return ()
+    recSizeOf r = sum [ sizeOf $ t_udts_Type r, sizeOf $ t_udts r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ t_udts_Type r), viewField "" (viewNStr $ t_udts r) ]
+    recType = fromEnum . t_udts_Type
+
+instance ChunkBuf T_ N1 Buffer1 where
+    chunkCon = T_
+    chunkDecon (T_ x) = x
+    chunkTypeLookup = lookupT
+    chunkApply = applyT
+
+applyT :: forall m x. (MonadIO m)
+    => N1 -> T_ -> (forall a. (Rec a) => (a -> m x)) -> m x
+applyT x rec f = case x of
+    0x01 -> apply recOf rec (f :: T_CGCSGI -> m x)
+    0x02 -> apply recOf rec (f :: T_FQN -> m x)
+    0x04 -> apply recOf rec (f :: T_MO -> m x)
+    0x10 -> apply recOf rec (f :: T_OCL -> m x)
+    0x18 -> apply recOf rec (f :: T_MIS -> m x)
+    0x1D -> apply recOf rec (f :: T_TO -> m x)
+    0x1F -> apply recOf rec (f :: T_FDS -> m x)
+    0x20 -> apply recOf rec (f :: T_FCGCSGI -> m x)
+    0x21 -> apply recOf rec (f :: T_OFSS -> m x)
+    0x22 -> apply recOf rec (f :: T_ROT -> m x)
+    0x23 -> apply recOf rec (f :: T_ERLI -> m x)
+    0x24 -> apply recOf rec (f :: T_RLI -> m x)
+    0x25 -> apply recOf rec (f :: T_RSN -> m x)
+    0x26 -> apply recOf rec (f :: T_CR -> m x)
+    0x27 -> apply recOf rec (f :: T_LDOPM -> m x)
+    0x2D -> apply recOf rec (f :: T_OBO -> m x)
+    0x36 -> apply recOf rec (f :: T_AV -> m x)
+    0x43 -> apply recOf rec (f :: T_DP -> m x)
+    0x45 -> apply recOf rec (f :: T_MEC -> m x)
+    0x46 -> apply recOf rec (f :: T_POCP -> m x)
+    0x47 -> apply recOf rec (f :: T_RUA -> m x)
+    0x4B -> apply recOf rec (f :: T_OAMU -> m x)
+    0x4C -> apply recOf rec (f :: T_OAS -> m x)
+    0x4D -> apply recOf rec (f :: T_AD -> m x)
+    0x4E -> apply recOf rec (f :: T_CS -> m x)
+    0x50 -> apply recOf rec (f :: T_ESI -> m x)
+    0x56 -> apply recOf rec (f :: T_MMPN -> m x)
+    0x57 -> apply recOf rec (f :: T_OBE -> m x)
+    0x58 -> apply recOf rec (f :: T_OSFO -> m x)
+    0x59 -> apply recOf rec (f :: T_OSFE -> m x)
+    0x5A -> apply recOf rec (f :: T_OO -> m x)
+    0x5D -> apply recOf rec (f :: T_FHSF -> m x)
+    0x5E -> apply recOf rec (f :: T_OCO -> m x)
+    0x62 -> apply recOf rec (f :: T_LDTS -> m x)
+    0x63 -> apply recOf rec (f :: T_T2FRMT -> m x)
+    0x64 -> apply recOf rec (f :: T_OOI -> m x)
+    0x65 -> apply recOf rec (f :: T_C -> m x)
+    0x68 -> apply recOf rec (f :: T_MOR -> m x)
+    0x6C -> apply recOf rec (f :: T_ROI -> m x)
+    0x6D -> apply recOf rec (f :: T_EF -> m x)
+    0x70 -> apply recOf rec (f :: T_PSRM -> m x)
+    0x71 -> apply recOf rec (f :: T_PSMR -> m x)
+    0x72 -> apply recOf rec (f :: T_UDTS -> m x)
+    0x73 -> apply recOf rec (f :: T_II -> m x)
+    0x74 -> apply recOf rec (f :: T_TS -> m x)
+    0x75 -> apply recOf rec (f :: T_CF -> m x)
+    0x78 -> apply recOf rec (f :: T_FF -> m x)
+    0x79 -> apply recOf rec (f :: T_MA -> m x)
+    0x80 -> apply recOf rec (f :: T_AQ -> m x)
+    0x81 -> apply recOf rec (f :: T_PPI -> m x)
+    0x82 -> apply recOf rec (f :: T_PV -> m x)
+    0x83 -> apply recOf rec (f :: T_PC -> m x)
+    0x84 -> apply recOf rec (f :: T_FRMT -> m x)
+    0x85 -> apply recOf rec (f :: T_FO -> m x)
+    0x87 -> apply recOf rec (f :: T_MF -> m x)
+    _    -> apply recOf rec (f :: Unknown -> m x)
+
diff --git a/src/OpenAFP/Prelude/Instances.hs b/src/OpenAFP/Prelude/Instances.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Prelude/Instances.hs
@@ -0,0 +1,386 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+module OpenAFP.Prelude.Instances where
+import OpenAFP.Types
+import OpenAFP.Records
+import OpenAFP.Internals
+import OpenAFP.Prelude.InstanceT
+import OpenAFP.Prelude.InstancePTX
+import OpenAFP.Prelude.InstanceAFP
+
+instance Rec T_ where
+    recSizeOf c = 1 + (snd $ chunkToPStrLen c)
+
+instance ChunkBuf AFP_ N3 Buffer2 where
+    chunkCon = AFP_
+    chunkDecon (AFP_ x) = x
+    chunkTypeLookup = lookupAFP
+    chunkApply = applyAFP
+
+recOf :: (ChunkBuf c n b, Binary (Record r)) => c -> IO r
+recOf c = return . fromRecord =<< chunkToRecord c
+
+apply :: (MonadIO m) => (t -> IO a) -> t -> (a -> m b) -> m b
+apply ctr c f = f =<< (liftIO $ ctr c)
+
+applyAFP :: forall m x. (MonadIO m)
+    => N3 -> AFP_ -> (forall a. (Rec a) => (a -> m x)) -> m x
+applyAFP x rec f = case x of
+    0xD38C87 -> apply recOf rec (f :: CPI -> m x)
+    0xD38C89 -> apply recOf rec (f :: FNI -> m x)
+    0xD38C8A -> apply recOf rec (f :: CFI -> m x)
+    0xD3A088 -> apply recOf rec (f :: MFC -> m x)
+    0xD3A090 -> apply recOf rec (f :: TLE -> m x)
+    0xD3A288 -> apply recOf rec (f :: MCC -> m x)
+    0xD3A289 -> apply recOf rec (f :: FNM -> m x)
+    0xD3A66B -> apply recOf rec (f :: OBD -> m x)
+    0xD3A67B -> apply recOf rec (f :: IID -> m x)
+    0xD3A687 -> apply recOf rec (f :: CPD -> m x)
+    0xD3A688 -> apply recOf rec (f :: MDD -> m x)
+    0xD3A689 -> apply recOf rec (f :: FND -> m x)
+    0xD3A692 -> apply recOf rec (f :: CDD -> m x)
+    0xD3A69B -> apply recOf rec (f :: PTD1 -> m x)
+    0xD3A6AF -> apply recOf rec (f :: PGD -> m x)
+    0xD3A6BB -> apply recOf rec (f :: GDD -> m x)
+    0xD3A6C5 -> apply recOf rec (f :: FGD -> m x)
+    0xD3A6E3 -> apply recOf rec (f :: DXD -> m x)
+    0xD3A6E7 -> apply recOf rec (f :: LND -> m x)
+    0xD3A6EB -> apply recOf rec (f :: BDD -> m x)
+    0xD3A6FB -> apply recOf rec (f :: IDD -> m x)
+    0xD3A77B -> apply recOf rec (f :: IOC -> m x)
+    0xD3A787 -> apply recOf rec (f :: CPC -> m x)
+    0xD3A788 -> apply recOf rec (f :: MMC -> m x)
+    0xD3A789 -> apply recOf rec (f :: FNC -> m x)
+    0xD3A78A -> apply recOf rec (f :: CFC -> m x)
+    0xD3A79B -> apply recOf rec (f :: CTC -> m x)
+    0xD3A7AF -> apply recOf rec (f :: PMC -> m x)
+    0xD3A85F -> apply recOf rec (f :: BPS -> m x)
+    0xD3A877 -> apply recOf rec (f :: BCA -> m x)
+    0xD3A87B -> apply recOf rec (f :: BII -> m x)
+    0xD3A887 -> apply recOf rec (f :: BCP -> m x)
+    0xD3A889 -> apply recOf rec (f :: BFN -> m x)
+    0xD3A88A -> apply recOf rec (f :: BCF -> m x)
+    0xD3A892 -> apply recOf rec (f :: BOC -> m x)
+    0xD3A89B -> apply recOf rec (f :: BPT -> m x)
+    0xD3A8A7 -> apply recOf rec (f :: BDI -> m x)
+    0xD3A8A8 -> apply recOf rec (f :: BDT -> m x)
+    0xD3A8AD -> apply recOf rec (f :: BNG -> m x)
+    0xD3A8AF -> apply recOf rec (f :: BPG -> m x)
+    0xD3A8BB -> apply recOf rec (f :: BGR -> m x)
+    0xD3A8C4 -> apply recOf rec (f :: BDG -> m x)
+    0xD3A8C5 -> apply recOf rec (f :: BFG -> m x)
+    0xD3A8C6 -> apply recOf rec (f :: BRG -> m x)
+    0xD3A8C7 -> apply recOf rec (f :: BOG -> m x)
+    0xD3A8C9 -> apply recOf rec (f :: BAG -> m x)
+    0xD3A8CA -> apply recOf rec (f :: BDM -> m x)
+    0xD3A8CB -> apply recOf rec (f :: BPM -> m x)
+    0xD3A8CC -> apply recOf rec (f :: BMM -> m x)
+    0xD3A8CD -> apply recOf rec (f :: BFM -> m x)
+    0xD3A8CE -> apply recOf rec (f :: BR -> m x)
+    0xD3A8D9 -> apply recOf rec (f :: BSG -> m x)
+    0xD3A8DF -> apply recOf rec (f :: BMO -> m x)
+    0xD3A8E3 -> apply recOf rec (f :: BDX -> m x)
+    0xD3A8EB -> apply recOf rec (f :: BBC -> m x)
+    0xD3A8FB -> apply recOf rec (f :: BIM -> m x)
+    0xD3A95F -> apply recOf rec (f :: EPS -> m x)
+    0xD3A977 -> apply recOf rec (f :: ECA -> m x)
+    0xD3A97B -> apply recOf rec (f :: EII -> m x)
+    0xD3A987 -> apply recOf rec (f :: ECP -> m x)
+    0xD3A989 -> apply recOf rec (f :: EFN -> m x)
+    0xD3A98A -> apply recOf rec (f :: ECF -> m x)
+    0xD3A992 -> apply recOf rec (f :: EOC -> m x)
+    0xD3A99B -> apply recOf rec (f :: EPT -> m x)
+    0xD3A9A7 -> apply recOf rec (f :: EDI -> m x)
+    0xD3A9A8 -> apply recOf rec (f :: EDT -> m x)
+    0xD3A9AD -> apply recOf rec (f :: ENG -> m x)
+    0xD3A9AF -> apply recOf rec (f :: EPG -> m x)
+    0xD3A9BB -> apply recOf rec (f :: EGR -> m x)
+    0xD3A9C4 -> apply recOf rec (f :: EDG -> m x)
+    0xD3A9C5 -> apply recOf rec (f :: EFG -> m x)
+    0xD3A9C6 -> apply recOf rec (f :: ERG -> m x)
+    0xD3A9C7 -> apply recOf rec (f :: EOG -> m x)
+    0xD3A9C9 -> apply recOf rec (f :: EAG -> m x)
+    0xD3A9CA -> apply recOf rec (f :: EDM -> m x)
+    0xD3A9CB -> apply recOf rec (f :: EPM -> m x)
+    0xD3A9CC -> apply recOf rec (f :: EMM -> m x)
+    0xD3A9CD -> apply recOf rec (f :: EFM -> m x)
+    0xD3A9CE -> apply recOf rec (f :: ER -> m x)
+    0xD3A9D9 -> apply recOf rec (f :: ESG -> m x)
+    0xD3A9DF -> apply recOf rec (f :: EMO -> m x)
+    0xD3A9E3 -> apply recOf rec (f :: EDX -> m x)
+    0xD3A9EB -> apply recOf rec (f :: EBC -> m x)
+    0xD3A9FB -> apply recOf rec (f :: EIM -> m x)
+    0xD3AAE7 -> apply recOf rec (f :: LNC -> m x)
+    0xD3AB77 -> apply recOf rec (f :: MCA -> m x)
+    0xD3AB88 -> apply recOf rec (f :: MMT -> m x)
+    0xD3AB89 -> apply recOf rec (f :: FNN -> m x)
+    0xD3AB8A -> apply recOf rec (f :: MCF -> m x)
+    0xD3AB92 -> apply recOf rec (f :: MCD -> m x)
+    0xD3ABAF -> apply recOf rec (f :: MPG -> m x)
+    0xD3ABBB -> apply recOf rec (f :: MGO -> m x)
+    0xD3ABC3 -> apply recOf rec (f :: MDR -> m x)
+    0xD3ABCC -> apply recOf rec (f :: IMM -> m x)
+    0xD3ABD8 -> apply recOf rec (f :: MPO -> m x)
+    0xD3ABEA -> apply recOf rec (f :: MSU -> m x)
+    0xD3ABEB -> apply recOf rec (f :: MBC -> m x)
+    0xD3ABFB -> apply recOf rec (f :: MIO -> m x)
+    0xD3AC6B -> apply recOf rec (f :: OBP -> m x)
+    0xD3AC7B -> apply recOf rec (f :: ICP -> m x)
+    0xD3AC89 -> apply recOf rec (f :: FNP -> m x)
+    0xD3ACAF -> apply recOf rec (f :: PGP1 -> m x)
+    0xD3AE89 -> apply recOf rec (f :: FNO -> m x)
+    0xD3AF5F -> apply recOf rec (f :: IPS -> m x)
+    0xD3AFAF -> apply recOf rec (f :: IPG -> m x)
+    0xD3AFC3 -> apply recOf rec (f :: IOB -> m x)
+    0xD3AFD8 -> apply recOf rec (f :: IPO -> m x)
+    0xD3B077 -> apply recOf rec (f :: CAT -> m x)
+    0xD3B15F -> apply recOf rec (f :: MPS -> m x)
+    0xD3B18A -> apply recOf rec (f :: MCF1 -> m x)
+    0xD3B19B -> apply recOf rec (f :: PTD -> m x)
+    0xD3B1AF -> apply recOf rec (f :: PGP -> m x)
+    0xD3B1DF -> apply recOf rec (f :: MMO -> m x)
+    0xD3B288 -> apply recOf rec (f :: PFC -> m x)
+    0xD3B2A7 -> apply recOf rec (f :: IEL -> m x)
+    0xD3B490 -> apply recOf rec (f :: LLE -> m x)
+    0xD3EE7B -> apply recOf rec (f :: IRD -> m x)
+    0xD3EE89 -> apply recOf rec (f :: FNG -> m x)
+    0xD3EE92 -> apply recOf rec (f :: OCD -> m x)
+    0xD3EE9B -> apply recOf rec (f :: PTX -> m x)
+    0xD3EEBB -> apply recOf rec (f :: GAD -> m x)
+    0xD3EEEB -> apply recOf rec (f :: BDA -> m x)
+    0xD3EEEE -> apply recOf rec (f :: NOP -> m x)
+    0xD3EEFB -> apply recOf rec (f :: IPD -> m x)
+    _        -> apply recOf rec (f :: Unknown -> m x)
+
+instance ChunkBuf MCF_ N0 Buffer2 where
+    chunkCon = MCF_
+    chunkDecon (MCF_ x) = x
+    chunkTypeLookup = lookupMCF
+    chunkApply = applyMCF
+
+applyMCF :: forall m x. (MonadIO m)
+    => N0 -> MCF_ -> (forall a. (Rec a) => (a -> m x)) -> m x
+applyMCF x rec f = case x of
+    _        -> apply recOf rec (f :: MCF_T -> m x)
+
+instance RecChunk MCF MCF_ N0 Buffer2 where
+    readChunks r = mcf_Chunks r
+    writeChunks r io = do
+        cs <- io
+        return $ r { mcf_Chunks = cs }
+
+instance Rec MCF_ where
+    recSizeOf c = 2 + (snd $ chunkToPStrLen c)
+
+instance Rec MCF where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MCF a01 a02 a03
+    recPut bh r = do put bh $ mcf_Type r; put bh $ mcf_ r; put bh $ mcf_Chunks r; return ()
+    recSizeOf r = sum [ sizeOf $ mcf_Type r, sizeOf $ mcf_ r, sizeOf $ mcf_Chunks r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mcf_Type r), viewField "_" (viewNumber $ mcf_ r), viewField "Chunks" (viewChunks $ mcf_Chunks r) ]
+    recType = fromEnum . mcf_Type
+
+instance Rec MCF1_Data where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; return $ MCF1_Data a01 a02 a03 a04 a05 a06 a07 a08
+    recPut bh r = do put bh $ mcf1_CodedFontLocalId r; put bh $ mcf1_Reserved1 r; put bh $ mcf1_CodedFontResourceSectionId r; put bh $ mcf1_Reserved2 r; put bh $ mcf1_CodedFontName r; put bh $ mcf1_CodePageName r; put bh $ mcf1_FontCharacterSetName r; put bh $ mcf1_CharacterRotation r; return ()
+    recSizeOf r = sum [ sizeOf $ mcf1_CodedFontLocalId r, sizeOf $ mcf1_Reserved1 r, sizeOf $ mcf1_CodedFontResourceSectionId r, sizeOf $ mcf1_Reserved2 r, sizeOf $ mcf1_CodedFontName r, sizeOf $ mcf1_CodePageName r, sizeOf $ mcf1_FontCharacterSetName r, sizeOf $ mcf1_CharacterRotation r ]
+    recView r = viewRecord (typeOf r) [ viewField "CodedFontLocalId" (viewNumber $ mcf1_CodedFontLocalId r), viewField "Reserved1" (viewString $ mcf1_Reserved1 r), viewField "CodedFontResourceSectionId" (viewNumber $ mcf1_CodedFontResourceSectionId r), viewField "Reserved2" (viewString $ mcf1_Reserved2 r), viewField "CodedFontName" (viewString $ mcf1_CodedFontName r), viewField "CodePageName" (viewString $ mcf1_CodePageName r), viewField "FontCharacterSetName" (viewString $ mcf1_FontCharacterSetName r), viewField "CharacterRotation" (viewNumber $ mcf1_CharacterRotation r) ]
+    recType r = 0
+
+instance RecData MCF1 MCF1_Data where
+    readData r = mcf1_Data r
+    writeData r cs = r { mcf1_Data = cs }
+
+instance Rec MCF1 where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; return $ MCF1 a01 a02 a03 a04 a05
+    recPut bh r = do put bh $ mcf1_Type r; put bh $ mcf1_ r; put bh $ mcf1_RepeatingGroupLength r; put bh $ mcf1__ r; put bh $ mcf1_Data r; return ()
+    recSizeOf r = sum [ sizeOf $ mcf1_Type r, sizeOf $ mcf1_ r, sizeOf $ mcf1_RepeatingGroupLength r, sizeOf $ mcf1__ r, sizeOf $ mcf1_Data r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mcf1_Type r), viewField "_" (viewNumber $ mcf1_ r), viewField "RepeatingGroupLength" (viewNumber $ mcf1_RepeatingGroupLength r), viewField "__" (viewString $ mcf1__ r), viewField "Data" (viewData $ mcf1_Data r) ]
+    recType = fromEnum . mcf1_Type
+
+instance Rec MDD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MDD a01 a02 a03
+    recPut bh r = do put bh $ mdd_Type r; put bh $ mdd_ r; put bh $ mdd r; return ()
+    recSizeOf r = sum [ sizeOf $ mdd_Type r, sizeOf $ mdd_ r, sizeOf $ mdd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mdd_Type r), viewField "_" (viewNumber $ mdd_ r), viewField "" (viewNStr $ mdd r) ]
+    recType = fromEnum . mdd_Type
+
+instance Rec MDR where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MDR a01 a02 a03
+    recPut bh r = do put bh $ mdr_Type r; put bh $ mdr_ r; put bh $ mdr r; return ()
+    recSizeOf r = sum [ sizeOf $ mdr_Type r, sizeOf $ mdr_ r, sizeOf $ mdr r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mdr_Type r), viewField "_" (viewNumber $ mdr_ r), viewField "" (viewNStr $ mdr r) ]
+    recType = fromEnum . mdr_Type
+
+instance Rec MFC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MFC a01 a02 a03
+    recPut bh r = do put bh $ mfc_Type r; put bh $ mfc_ r; put bh $ mfc r; return ()
+    recSizeOf r = sum [ sizeOf $ mfc_Type r, sizeOf $ mfc_ r, sizeOf $ mfc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mfc_Type r), viewField "_" (viewNumber $ mfc_ r), viewField "" (viewNStr $ mfc r) ]
+    recType = fromEnum . mfc_Type
+
+instance Rec MGO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MGO a01 a02 a03
+    recPut bh r = do put bh $ mgo_Type r; put bh $ mgo_ r; put bh $ mgo r; return ()
+    recSizeOf r = sum [ sizeOf $ mgo_Type r, sizeOf $ mgo_ r, sizeOf $ mgo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mgo_Type r), viewField "_" (viewNumber $ mgo_ r), viewField "" (viewNStr $ mgo r) ]
+    recType = fromEnum . mgo_Type
+
+instance Rec MIO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MIO a01 a02 a03
+    recPut bh r = do put bh $ mio_Type r; put bh $ mio_ r; put bh $ mio r; return ()
+    recSizeOf r = sum [ sizeOf $ mio_Type r, sizeOf $ mio_ r, sizeOf $ mio r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mio_Type r), viewField "_" (viewNumber $ mio_ r), viewField "" (viewNStr $ mio r) ]
+    recType = fromEnum . mio_Type
+
+instance Rec MMC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MMC a01 a02 a03
+    recPut bh r = do put bh $ mmc_Type r; put bh $ mmc_ r; put bh $ mmc r; return ()
+    recSizeOf r = sum [ sizeOf $ mmc_Type r, sizeOf $ mmc_ r, sizeOf $ mmc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mmc_Type r), viewField "_" (viewNumber $ mmc_ r), viewField "" (viewNStr $ mmc r) ]
+    recType = fromEnum . mmc_Type
+
+instance Rec MMO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MMO a01 a02 a03
+    recPut bh r = do put bh $ mmo_Type r; put bh $ mmo_ r; put bh $ mmo r; return ()
+    recSizeOf r = sum [ sizeOf $ mmo_Type r, sizeOf $ mmo_ r, sizeOf $ mmo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mmo_Type r), viewField "_" (viewNumber $ mmo_ r), viewField "" (viewNStr $ mmo r) ]
+    recType = fromEnum . mmo_Type
+
+instance Rec MMT where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MMT a01 a02 a03
+    recPut bh r = do put bh $ mmt_Type r; put bh $ mmt_ r; put bh $ mmt r; return ()
+    recSizeOf r = sum [ sizeOf $ mmt_Type r, sizeOf $ mmt_ r, sizeOf $ mmt r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mmt_Type r), viewField "_" (viewNumber $ mmt_ r), viewField "" (viewNStr $ mmt r) ]
+    recType = fromEnum . mmt_Type
+
+instance Rec MPG where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MPG a01 a02 a03
+    recPut bh r = do put bh $ mpg_Type r; put bh $ mpg_ r; put bh $ mpg r; return ()
+    recSizeOf r = sum [ sizeOf $ mpg_Type r, sizeOf $ mpg_ r, sizeOf $ mpg r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mpg_Type r), viewField "_" (viewNumber $ mpg_ r), viewField "" (viewNStr $ mpg r) ]
+    recType = fromEnum . mpg_Type
+
+instance Rec MPO where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MPO a01 a02 a03
+    recPut bh r = do put bh $ mpo_Type r; put bh $ mpo_ r; put bh $ mpo r; return ()
+    recSizeOf r = sum [ sizeOf $ mpo_Type r, sizeOf $ mpo_ r, sizeOf $ mpo r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mpo_Type r), viewField "_" (viewNumber $ mpo_ r), viewField "" (viewNStr $ mpo r) ]
+    recType = fromEnum . mpo_Type
+
+instance Rec MPS where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MPS a01 a02 a03
+    recPut bh r = do put bh $ mps_Type r; put bh $ mps_ r; put bh $ mps r; return ()
+    recSizeOf r = sum [ sizeOf $ mps_Type r, sizeOf $ mps_ r, sizeOf $ mps r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ mps_Type r), viewField "_" (viewNumber $ mps_ r), viewField "" (viewNStr $ mps r) ]
+    recType = fromEnum . mps_Type
+
+instance Rec MSU where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ MSU a01 a02 a03
+    recPut bh r = do put bh $ msu_Type r; put bh $ msu_ r; put bh $ msu r; return ()
+    recSizeOf r = sum [ sizeOf $ msu_Type r, sizeOf $ msu_ r, sizeOf $ msu r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ msu_Type r), viewField "_" (viewNumber $ msu_ r), viewField "" (viewNStr $ msu r) ]
+    recType = fromEnum . msu_Type
+
+instance Rec NOP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ NOP a01 a02 a03
+    recPut bh r = do put bh $ nop_Type r; put bh $ nop_ r; put bh $ nop r; return ()
+    recSizeOf r = sum [ sizeOf $ nop_Type r, sizeOf $ nop_ r, sizeOf $ nop r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ nop_Type r), viewField "_" (viewNumber $ nop_ r), viewField "" (viewNStr $ nop r) ]
+    recType = fromEnum . nop_Type
+
+instance Rec OBD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ OBD a01 a02 a03
+    recPut bh r = do put bh $ obd_Type r; put bh $ obd_ r; put bh $ obd r; return ()
+    recSizeOf r = sum [ sizeOf $ obd_Type r, sizeOf $ obd_ r, sizeOf $ obd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ obd_Type r), viewField "_" (viewNumber $ obd_ r), viewField "" (viewNStr $ obd r) ]
+    recType = fromEnum . obd_Type
+
+instance Rec OBP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ OBP a01 a02 a03
+    recPut bh r = do put bh $ obp_Type r; put bh $ obp_ r; put bh $ obp r; return ()
+    recSizeOf r = sum [ sizeOf $ obp_Type r, sizeOf $ obp_ r, sizeOf $ obp r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ obp_Type r), viewField "_" (viewNumber $ obp_ r), viewField "" (viewNStr $ obp r) ]
+    recType = fromEnum . obp_Type
+
+instance Rec OCD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ OCD a01 a02 a03
+    recPut bh r = do put bh $ ocd_Type r; put bh $ ocd_ r; put bh $ ocd r; return ()
+    recSizeOf r = sum [ sizeOf $ ocd_Type r, sizeOf $ ocd_ r, sizeOf $ ocd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ocd_Type r), viewField "_" (viewNumber $ ocd_ r), viewField "" (viewNStr $ ocd r) ]
+    recType = fromEnum . ocd_Type
+
+instance Rec PFC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ PFC a01 a02 a03
+    recPut bh r = do put bh $ pfc_Type r; put bh $ pfc_ r; put bh $ pfc r; return ()
+    recSizeOf r = sum [ sizeOf $ pfc_Type r, sizeOf $ pfc_ r, sizeOf $ pfc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ pfc_Type r), viewField "_" (viewNumber $ pfc_ r), viewField "" (viewNStr $ pfc r) ]
+    recType = fromEnum . pfc_Type
+
+instance Rec PGD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; a09 <- get bh; a10 <- get bh; a11 <- get bh; return $ PGD a01 a02 a03 a04 a05 a06 a07 a08 a09 a10 a11
+    recPut bh r = do put bh $ pgd_Type r; put bh $ pgd_ r; put bh $ pgd_XUnitBase r; put bh $ pgd_YUnitBase r; put bh $ pgd_XLUnitsperUnitBase r; put bh $ pgd_YLUnitsperUnitBase r; put bh $ pgd_Reserved1 r; put bh $ pgd_XPageSize r; put bh $ pgd_Reserved2 r; put bh $ pgd_YPageSize r; put bh $ pgd__ r; return ()
+    recSizeOf r = sum [ sizeOf $ pgd_Type r, sizeOf $ pgd_ r, sizeOf $ pgd_XUnitBase r, sizeOf $ pgd_YUnitBase r, sizeOf $ pgd_XLUnitsperUnitBase r, sizeOf $ pgd_YLUnitsperUnitBase r, sizeOf $ pgd_Reserved1 r, sizeOf $ pgd_XPageSize r, sizeOf $ pgd_Reserved2 r, sizeOf $ pgd_YPageSize r, sizeOf $ pgd__ r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ pgd_Type r), viewField "_" (viewNumber $ pgd_ r), viewField "XUnitBase" (viewNumber $ pgd_XUnitBase r), viewField "YUnitBase" (viewNumber $ pgd_YUnitBase r), viewField "XLUnitsperUnitBase" (viewNumber $ pgd_XLUnitsperUnitBase r), viewField "YLUnitsperUnitBase" (viewNumber $ pgd_YLUnitsperUnitBase r), viewField "Reserved1" (viewNumber $ pgd_Reserved1 r), viewField "XPageSize" (viewNumber $ pgd_XPageSize r), viewField "Reserved2" (viewNumber $ pgd_Reserved2 r), viewField "YPageSize" (viewNumber $ pgd_YPageSize r), viewField "__" (viewNStr $ pgd__ r) ]
+    recType = fromEnum . pgd_Type
+
+instance Rec PGP where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ PGP a01 a02 a03
+    recPut bh r = do put bh $ pgp_Type r; put bh $ pgp_ r; put bh $ pgp r; return ()
+    recSizeOf r = sum [ sizeOf $ pgp_Type r, sizeOf $ pgp_ r, sizeOf $ pgp r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ pgp_Type r), viewField "_" (viewNumber $ pgp_ r), viewField "" (viewNStr $ pgp r) ]
+    recType = fromEnum . pgp_Type
+
+instance Rec PGP1 where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ PGP1 a01 a02 a03
+    recPut bh r = do put bh $ pgp1_Type r; put bh $ pgp1_ r; put bh $ pgp1 r; return ()
+    recSizeOf r = sum [ sizeOf $ pgp1_Type r, sizeOf $ pgp1_ r, sizeOf $ pgp1 r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ pgp1_Type r), viewField "_" (viewNumber $ pgp1_ r), viewField "" (viewNStr $ pgp1 r) ]
+    recType = fromEnum . pgp1_Type
+
+instance Rec PMC where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ PMC a01 a02 a03
+    recPut bh r = do put bh $ pmc_Type r; put bh $ pmc_ r; put bh $ pmc r; return ()
+    recSizeOf r = sum [ sizeOf $ pmc_Type r, sizeOf $ pmc_ r, sizeOf $ pmc r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ pmc_Type r), viewField "_" (viewNumber $ pmc_ r), viewField "" (viewNStr $ pmc r) ]
+    recType = fromEnum . pmc_Type
+
+instance Rec PTD where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ PTD a01 a02 a03
+    recPut bh r = do put bh $ ptd_Type r; put bh $ ptd_ r; put bh $ ptd r; return ()
+    recSizeOf r = sum [ sizeOf $ ptd_Type r, sizeOf $ ptd_ r, sizeOf $ ptd r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptd_Type r), viewField "_" (viewNumber $ ptd_ r), viewField "" (viewNStr $ ptd r) ]
+    recType = fromEnum . ptd_Type
+
+instance Rec PTD1 where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; return $ PTD1 a01 a02 a03
+    recPut bh r = do put bh $ ptd1_Type r; put bh $ ptd1_ r; put bh $ ptd1 r; return ()
+    recSizeOf r = sum [ sizeOf $ ptd1_Type r, sizeOf $ ptd1_ r, sizeOf $ ptd1 r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ ptd1_Type r), viewField "_" (viewNumber $ ptd1_ r), viewField "" (viewNStr $ ptd1 r) ]
+    recType = fromEnum . ptd1_Type
+
+instance RecChunk TLE T_ N1 Buffer1 where
+    readChunks r = tle_Chunks r
+    writeChunks r io = do
+        cs <- io
+        return $ r { tle_Chunks = cs }
+
+instance Rec TLE where
+    recGet bh = do a01 <- get bh; a02 <- get bh; a03 <- get bh; a04 <- get bh; a05 <- get bh; a06 <- get bh; a07 <- get bh; a08 <- get bh; a09 <- get bh; a10 <- get bh; return $ TLE a01 a02 a03 a04 a05 a06 a07 a08 a09 a10
+    recPut bh r = do put bh $ tle_Type r; put bh $ tle_ r; put bh $ tle_Chunks r; put bh $ tle_XUnitBase r; put bh $ tle_YUnitBase r; put bh $ tle_XLUnitsperUnitBase r; put bh $ tle_YLUnitsperUnitBase r; put bh $ tle_XPageSize r; put bh $ tle_YPageSize r; put bh $ tle__ r; return ()
+    recSizeOf r = sum [ sizeOf $ tle_Type r, sizeOf $ tle_ r, sizeOf $ tle_Chunks r, sizeOf $ tle_XUnitBase r, sizeOf $ tle_YUnitBase r, sizeOf $ tle_XLUnitsperUnitBase r, sizeOf $ tle_YLUnitsperUnitBase r, sizeOf $ tle_XPageSize r, sizeOf $ tle_YPageSize r, sizeOf $ tle__ r ]
+    recView r = viewRecord (typeOf r) [ viewField "Type" (viewNumber $ tle_Type r), viewField "_" (viewNumber $ tle_ r), viewField "Chunks" (viewChunks $ tle_Chunks r), viewField "XUnitBase" (viewNumber $ tle_XUnitBase r), viewField "YUnitBase" (viewNumber $ tle_YUnitBase r), viewField "XLUnitsperUnitBase" (viewNumber $ tle_XLUnitsperUnitBase r), viewField "YLUnitsperUnitBase" (viewNumber $ tle_YLUnitsperUnitBase r), viewField "XPageSize" (viewNumber $ tle_XPageSize r), viewField "YPageSize" (viewNumber $ tle_YPageSize r), viewField "__" (viewNStr $ tle__ r) ]
+    recType = fromEnum . tle_Type
+
+instance RecChunk MCF_T T_ N1 Buffer1 where
+    readChunks r = mcf_t_Chunks r
+    writeChunks r io = do
+        cs <- io
+        return $ r { mcf_t_Chunks = cs }
+
+instance Rec MCF_T where
+    recGet bh = do a01 <- get bh; return $ MCF_T a01
+    recPut bh r = do put bh $ mcf_t_Chunks r; return ()
+    recSizeOf r = sum [ sizeOf $ mcf_t_Chunks r ]
+    recView r = viewRecord (typeOf r) [ viewField "Chunks" (viewChunks $ mcf_t_Chunks r) ]
+    recType r = 0
+
diff --git a/src/OpenAFP/Prelude/Lookups.hs b/src/OpenAFP/Prelude/Lookups.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Prelude/Lookups.hs
@@ -0,0 +1,216 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+module OpenAFP.Prelude.Lookups where
+import OpenAFP.Types
+import OpenAFP.Records
+import OpenAFP.Internals
+import OpenAFP.Prelude.Instances
+import qualified Data.Map as Map
+
+descLookup :: ChunkType -> String
+descLookup typ = Map.findWithDefault "(Unknown)" typ descMap
+
+descMap :: Map.Map ChunkType String
+descMap = Map.fromList
+    [ (chunkTypeOf _MCF_T, "MCF Triplets")
+    , (chunkTypeOf _CPI, "Code Page Index")
+    , (chunkTypeOf _FNI, "Font Index")
+    , (chunkTypeOf _CFI, "Coded Font Index")
+    , (chunkTypeOf _MFC, "Medium Finishing Control")
+    , (chunkTypeOf _TLE, "Tag Logical Element")
+    , (chunkTypeOf _MCC, "Medium Copy Count")
+    , (chunkTypeOf _FNM, "Font Patterns Map")
+    , (chunkTypeOf _OBD, "Object Area Descriptor")
+    , (chunkTypeOf _IID, "IM Image Input Descriptor (C)")
+    , (chunkTypeOf _CPD, "Code Page Descriptor")
+    , (chunkTypeOf _MDD, "Medium Descriptor")
+    , (chunkTypeOf _FND, "Font Descriptor")
+    , (chunkTypeOf _CDD, "Container Data Descriptor")
+    , (chunkTypeOf _PTD1, "Presentation Text Descriptor Format-1 (C)")
+    , (chunkTypeOf _PGD, "Page Descriptor")
+    , (chunkTypeOf _GDD, "Graphics Data Descriptor")
+    , (chunkTypeOf _FGD, "Form Environment Group Descriptor (O)")
+    , (chunkTypeOf _DXD, "Data Map Transmission Subcase Descriptor")
+    , (chunkTypeOf _LND, "Line Descriptor")
+    , (chunkTypeOf _BDD, "Bar Code Data Descriptor")
+    , (chunkTypeOf _IDD, "Image Data Descriptor")
+    , (chunkTypeOf _IOC, "IM Image Output Control (C)")
+    , (chunkTypeOf _CPC, "Code Page Control")
+    , (chunkTypeOf _MMC, "Medium Modification Control")
+    , (chunkTypeOf _FNC, "Font Control")
+    , (chunkTypeOf _CFC, "Coded Font Control")
+    , (chunkTypeOf _CTC, "Composed Text Control (O)")
+    , (chunkTypeOf _PMC, "Page Modification Control")
+    , (chunkTypeOf _BPS, "Begin Page Segment")
+    , (chunkTypeOf _BCA, "Begin Color Attribute Table")
+    , (chunkTypeOf _BII, "Begin IM Image (C)")
+    , (chunkTypeOf _BCP, "Begin Code Page")
+    , (chunkTypeOf _BFN, "Begin Font")
+    , (chunkTypeOf _BCF, "Begin Coded Font")
+    , (chunkTypeOf _BOC, "Begin Object Container")
+    , (chunkTypeOf _BPT, "Begin Presentation Text Object")
+    , (chunkTypeOf _BDI, "Begin Document Index")
+    , (chunkTypeOf _BDT, "Begin Document")
+    , (chunkTypeOf _BNG, "Begin Named Page Group")
+    , (chunkTypeOf _BPG, "Begin Page")
+    , (chunkTypeOf _BGR, "Begin Graphics Object")
+    , (chunkTypeOf _BDG, "Begin Document Environment Group")
+    , (chunkTypeOf _BFG, "Begin Form Environment Group (O)")
+    , (chunkTypeOf _BRG, "Begin Resource Group")
+    , (chunkTypeOf _BOG, "Begin Object Environment Group")
+    , (chunkTypeOf _BAG, "Begin Active Environment Group")
+    , (chunkTypeOf _BDM, "Begin Data Map")
+    , (chunkTypeOf _BPM, "Begin Page Map")
+    , (chunkTypeOf _BMM, "Begin Medium Map")
+    , (chunkTypeOf _BFM, "Begin Form Map")
+    , (chunkTypeOf _BR, "Begin Resource (R)")
+    , (chunkTypeOf _BSG, "Begin Resource Environment Group")
+    , (chunkTypeOf _BMO, "Begin Overlay")
+    , (chunkTypeOf _BDX, "Begin Data Map Transmission Subcase")
+    , (chunkTypeOf _BBC, "Begin Bar Code Object")
+    , (chunkTypeOf _BIM, "Begin Image Object")
+    , (chunkTypeOf _EPS, "End Page Segment")
+    , (chunkTypeOf _ECA, "End Color Attribute Table")
+    , (chunkTypeOf _EII, "End IM Image (C)")
+    , (chunkTypeOf _ECP, "End Code Page")
+    , (chunkTypeOf _EFN, "End Font")
+    , (chunkTypeOf _ECF, "End Coded Font")
+    , (chunkTypeOf _EOC, "End Object Container")
+    , (chunkTypeOf _EPT, "End Presentation Text Object")
+    , (chunkTypeOf _EDI, "End Document Index")
+    , (chunkTypeOf _EDT, "End Document")
+    , (chunkTypeOf _ENG, "End Named Page Group")
+    , (chunkTypeOf _EPG, "End Page")
+    , (chunkTypeOf _EGR, "End Graphics Object")
+    , (chunkTypeOf _EDG, "End Document Environment Group")
+    , (chunkTypeOf _EFG, "End Form Environment Group (O)")
+    , (chunkTypeOf _ERG, "End Resource Group")
+    , (chunkTypeOf _EOG, "End Object Environment Group")
+    , (chunkTypeOf _EAG, "End Active Environment Group")
+    , (chunkTypeOf _EDM, "End Data Map")
+    , (chunkTypeOf _EPM, "End Page Map")
+    , (chunkTypeOf _EMM, "End Medium Map")
+    , (chunkTypeOf _EFM, "End Form Map")
+    , (chunkTypeOf _ER, "End Resource (R)")
+    , (chunkTypeOf _ESG, "End Resource Environment Group")
+    , (chunkTypeOf _EMO, "End Overlay")
+    , (chunkTypeOf _EDX, "End Data Map Transmission Subcase")
+    , (chunkTypeOf _EBC, "End Bar Code Object")
+    , (chunkTypeOf _EIM, "End Image Object")
+    , (chunkTypeOf _LNC, "Line Descriptor Count")
+    , (chunkTypeOf _MCA, "Map Color Attribute Table")
+    , (chunkTypeOf _MMT, "Map Media Type")
+    , (chunkTypeOf _FNN, "Font Names (Outline Fonts Only)")
+    , (chunkTypeOf _MCF, "Map Coded Font")
+    , (chunkTypeOf _MCD, "Map Container Data")
+    , (chunkTypeOf _MPG, "Map Page")
+    , (chunkTypeOf _MGO, "Map Graphics Object")
+    , (chunkTypeOf _MDR, "Map Data Resource")
+    , (chunkTypeOf _IMM, "Invoke Medium Map")
+    , (chunkTypeOf _MPO, "Map Page Overlay")
+    , (chunkTypeOf _MSU, "Map Suppression")
+    , (chunkTypeOf _MBC, "Map Bar Code Object")
+    , (chunkTypeOf _MIO, "Map Image Object")
+    , (chunkTypeOf _OBP, "Object Area Position")
+    , (chunkTypeOf _ICP, "IM Image Cell Position (C)")
+    , (chunkTypeOf _FNP, "Font Position")
+    , (chunkTypeOf _PGP1, "Page Position Format-1 (C)")
+    , (chunkTypeOf _FNO, "Font Orientation")
+    , (chunkTypeOf _IPS, "Include Page Segment")
+    , (chunkTypeOf _IPG, "Include Page")
+    , (chunkTypeOf _IOB, "Include Object")
+    , (chunkTypeOf _IPO, "Include Page Overlay")
+    , (chunkTypeOf _CAT, "Color Attribute Table")
+    , (chunkTypeOf _MPS, "Map Page Segment")
+    , (chunkTypeOf _MCF1, "Map Coded Font Format-1 (C)")
+    , (chunkTypeOf _PTD, "Presentation Text Data Descriptor")
+    , (chunkTypeOf _PGP, "Page Position")
+    , (chunkTypeOf _MMO, "Map Medium Overlay")
+    , (chunkTypeOf _PFC, "Presentation Fidelity Control")
+    , (chunkTypeOf _IEL, "Index Element")
+    , (chunkTypeOf _LLE, "Link Logical Element")
+    , (chunkTypeOf _IRD, "IM Image Raster Data (C)")
+    , (chunkTypeOf _FNG, "Font Patterns")
+    , (chunkTypeOf _OCD, "Object Container Data")
+    , (chunkTypeOf _PTX, "Presentation Text Data")
+    , (chunkTypeOf _GAD, "Graphics Data")
+    , (chunkTypeOf _BDA, "Bar Code Data")
+    , (chunkTypeOf _NOP, "No Operation")
+    , (chunkTypeOf _IPD, "Image Picture Data")
+    , (chunkTypeOf _T_CGCSGI, "Coded Graphic Character Set Global ID")
+    , (chunkTypeOf _T_FQN, "Fully Qualified Name")
+    , (chunkTypeOf _T_MO, "Mapping Option")
+    , (chunkTypeOf _T_OCL, "Object Classification")
+    , (chunkTypeOf _T_MIS, "MO:DCA Interchange Set")
+    , (chunkTypeOf _T_TO, "Text Orientation (R)")
+    , (chunkTypeOf _T_FDS, "Font Descriptor Specification")
+    , (chunkTypeOf _T_FCGCSGI, "Font Coded Graphic Character Set Global Identifier")
+    , (chunkTypeOf _T_OFSS, "Object Function Set Specification")
+    , (chunkTypeOf _T_ROT, "Resource Object Type (R)")
+    , (chunkTypeOf _T_ERLI, "Extended Resource Local ID")
+    , (chunkTypeOf _T_RLI, "Resource Local ID")
+    , (chunkTypeOf _T_RSN, "Resource Section Number")
+    , (chunkTypeOf _T_CR, "Character Rotation")
+    , (chunkTypeOf _T_LDOPM, "Line Data Object Position Migration (R)")
+    , (chunkTypeOf _T_OBO, "Object Byte Offset")
+    , (chunkTypeOf _T_AV, "Attribute Value")
+    , (chunkTypeOf _T_DP, "Descriptor Position")
+    , (chunkTypeOf _T_MEC, "Media Eject Control")
+    , (chunkTypeOf _T_POCP, "Page Overlay Conditional Processing")
+    , (chunkTypeOf _T_RUA, "Resource Usage Attribute")
+    , (chunkTypeOf _T_OAMU, "Object Area Measurement Units")
+    , (chunkTypeOf _T_OAS, "Object Area Size")
+    , (chunkTypeOf _T_AD, "Area Definition")
+    , (chunkTypeOf _T_CS, "Color Specification")
+    , (chunkTypeOf _T_ESI, "Encoding Scheme ID")
+    , (chunkTypeOf _T_MMPN, "Medium Map Page Number")
+    , (chunkTypeOf _T_OBE, "Object Byte Extent")
+    , (chunkTypeOf _T_OSFO, "Object Structured Field Offset")
+    , (chunkTypeOf _T_OSFE, "Object Structured Field Extent")
+    , (chunkTypeOf _T_OO, "Object Offset")
+    , (chunkTypeOf _T_FHSF, "Font Horizontal Scale Factor")
+    , (chunkTypeOf _T_OCO, "Object Count")
+    , (chunkTypeOf _T_LDTS, "Local Date and Time Stamp")
+    , (chunkTypeOf _T_OCH, "Object Checksum (R)")
+    , (chunkTypeOf _T_T1CRMT, "Type 1 - CRC Resource Management Triplet")
+    , (chunkTypeOf _T_T2FRMT, "Type 2 - Font Resource Management Triplet")
+    , (chunkTypeOf _T_OOI, "Object Origin Identifier (R)")
+    , (chunkTypeOf _T_C, "Comment")
+    , (chunkTypeOf _T_MOR, "Medium Orientation")
+    , (chunkTypeOf _T_ROI, "Resource Object Include")
+    , (chunkTypeOf _T_EF, "Extension Font")
+    , (chunkTypeOf _T_PSRM, "Presentation Space Reset Mixing")
+    , (chunkTypeOf _T_PSMR, "Presentation Space Mixing Rules")
+    , (chunkTypeOf _T_UDTS, "Universal Date and Time Stamp")
+    , (chunkTypeOf _T_II, "IMM Insertion (R)")
+    , (chunkTypeOf _T_TS, "Toner Saver")
+    , (chunkTypeOf _T_CF, "Color Fidelity")
+    , (chunkTypeOf _T_FF, "Font Fidelity")
+    , (chunkTypeOf _T_MA, "Metric Adjustment")
+    , (chunkTypeOf _T_AQ, "Attribute Qualifier")
+    , (chunkTypeOf _T_PPI, "Page Position Information")
+    , (chunkTypeOf _T_PV, "Parameter Value")
+    , (chunkTypeOf _T_PC, "Presentation Control")
+    , (chunkTypeOf _T_FRMT, "Font Resolution and Metric Technology")
+    , (chunkTypeOf _T_FO, "Finishing Operation")
+    , (chunkTypeOf _T_MF, "Media Fidelity")
+    , (chunkTypeOf _PTX_STC, "Set Text Color")
+    , (chunkTypeOf _PTX_SIM, "Set Inline Margin")
+    , (chunkTypeOf _PTX_SIA, "Set Intercharacter Adjustment")
+    , (chunkTypeOf _PTX_SVI, "Set Variable-Space Character Increment")
+    , (chunkTypeOf _PTX_AMI, "Absolute Move Inline")
+    , (chunkTypeOf _PTX_RMI, "Relative Move Inline")
+    , (chunkTypeOf _PTX_SBI, "Set Baseline Increment")
+    , (chunkTypeOf _PTX_AMB, "Absolute Move Baseline")
+    , (chunkTypeOf _PTX_RMB, "Relative Move Baseline")
+    , (chunkTypeOf _PTX_BLN, "Begin Line Next")
+    , (chunkTypeOf _PTX_DIR, "Draw I-Axis Rule")
+    , (chunkTypeOf _PTX_DBR, "Draw B-Axis Rule")
+    , (chunkTypeOf _PTX_RPS, "Repeat String")
+    , (chunkTypeOf _PTX_SCFL, "Set Coded Font Local")
+    , (chunkTypeOf _PTX_BSU, "Begin Suppression")
+    , (chunkTypeOf _PTX_ESU, "Begin Suppression")
+    , (chunkTypeOf _PTX_STO, "Set Text Orientation")
+    , (chunkTypeOf _PTX_NOP, "No Operation")
+    , (chunkTypeOf _PTX_TRN, "Transparent Data")
+    ]
diff --git a/src/OpenAFP/Prelude/Utils.hs b/src/OpenAFP/Prelude/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Prelude/Utils.hs
@@ -0,0 +1,201 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Prelude.Utils
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- This module provides various AFP manipulation utilities.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Prelude.Utils where
+import OpenAFP.Types
+import OpenAFP.Records
+import OpenAFP.Internals
+
+infixl 5 $$
+infixl 5 $=
+infixl 5 +=
+infixl 5 %?
+infixl 5 %:
+infixl 5 @=
+infixl 5 %=
+infixl 5 %%=
+
+readVar l = do
+    vars <- ask
+    liftIO $ readIORef $ l vars
+
+readArray l i = do
+    vars <- ask
+    liftIO $ readIOArray (l vars) i
+
+l $$ s = do
+    vars    <- ask
+    when (l vars) $ do
+        liftIO . putStrLn $ "*** " ++ s
+
+l $= f = \v -> do
+    vars    <- ask
+    liftIO $ writeIORef (l vars) (f v)
+    return ()
+l += f = \v -> do
+    vars    <- ask
+    v'      <- liftIO $ readIORef (l vars)
+    liftIO $ writeIORef (l vars) (f v + v')
+    return ()
+l @= v = do
+    vars    <- ask
+    v'      <- liftIO $ readIORef (l vars)
+    liftIO $ writeIORef (l vars) (v : v')
+    return ()
+l %= (k, v) = do
+    vars    <- ask
+    liftIO $ hashInsert (l vars) k v
+    return ()
+l %? k = do
+    vars    <- ask
+    liftIO $ hashLookup (l vars) k
+l %: k = return . fromJust'' =<< (l %? k)
+
+l %%= kvList = do
+    vars    <- ask
+    liftIO $ mapM_ (\(k, v) -> writeIOArray (l vars) k v) kvList
+
+applyToChunk :: (Rec a, ChunkBuf c n b) => (a -> x) -> c -> IOm x
+applyToChunk f c = return . f . fromRecord =<< (liftIO . chunkToRecord) c
+
+withChunk :: (ChunkBuf a n b, MonadIO m) => a -> (forall r. (Rec r) => r -> m x) -> m x
+withChunk c = chunkApply (fst . chunkDecon $ c) c
+
+splitRecords :: (ChunkBuf c n b, Typeable t) => t -> [c] -> [[c]]
+splitRecords t = groupBy (const $ not . (~~ t))
+
+findRecord :: (a -> Bool) -> [Record a] -> a
+findRecord f = fromRecord . fromJust' . find (f . fromRecord)
+
+fromJust' (Just x) = x
+fromJust' Nothing = error "fromJust1 - fail"
+
+fromJust'' (Just x) = x
+fromJust'' Nothing = error "fromJust2 - fail"
+
+matchRecord :: (RecData a b, Eq c) => c -> (b -> c) -> a -> b
+matchRecord n f = findRecord ((n ==) . f) . readData
+
+matchRecordMaybe :: (RecData a b, Eq c) => c -> (b -> c) -> a -> Maybe b
+matchRecordMaybe n f = findRecordMaybe ((n ==) . f) . readData
+
+findRecordMaybe :: (a -> Bool) -> [Record a] -> Maybe a
+findRecordMaybe f = maybe Nothing (Just . fromRecord) . find (f . fromRecord)
+
+fromA :: (Binary a, Storable a) => a -> IOm String
+fromA item = liftIO $ do
+    bh  <- newBinBuf (sizeOf item)
+    put bh item
+    seekBin bh 0
+    return . trim =<< fromAStr =<< get bh
+
+trim :: String -> String
+trim = takeWhile $ not . isSpace
+
+catBuf :: (Buf a) => a -> a -> IOm a
+catBuf b1 b2 = liftIO $ do
+    pstr    <- mallocForeignPtrBytes len
+    withForeignPtr pstr $ \cstr -> do
+        when (l1 > 0) $
+            withForeignPtr p1 $ \c1 -> copyBytes cstr c1 l1
+        when (l2 > 0) $
+            withForeignPtr p2 $ \c2 -> copyBytes (plusPtr cstr l1) c2 l2
+    return $ bufFromPStrLen (pstr, len)
+    where
+    len      = l1 + l2
+    (p1, l1) = bufToPStrLen b1
+    (p2, l2) = bufToPStrLen b2
+
+subBuf :: (Buf a, Integral b, Integral c) => a -> b -> c -> IOm a
+subBuf buf pos len = liftIO $ do
+    withForeignPtr pstr $ \cstr -> do
+        pstr' <- newForeignPtr_ (plusPtr cstr $ fromEnum pos)
+        addFinalizer pstr' $ touchForeignPtr pstr -- ???
+        return $ bufFromPStrLen (pstr', fromEnum len)
+    where
+    (pstr, _) = bufToPStrLen buf -- XXX - check size bounds?
+
+subBufs :: (Buf a, Integral b, Integral c) => [a] -> b -> c -> IOm a
+subBufs (b:bs) pos len = do
+    if (pos <= len') then
+        subBuf b pos len
+        else
+        subBufs bs (pos - len') len
+    where
+    len' = toEnum $ snd $ bufToPStrLen b -- XXX - check size bounds?
+
+showBitmap :: (Integral i, Show a) => [a] -> i -> IOm ()
+showBitmap [] _ = return ()
+showBitmap bitmap n = do
+    liftIO $ putStrLn . concatMap hex2bin . concatMap show $ genericTake n bitmap
+    showBitmap (genericDrop n bitmap) n
+
+hex2bin '0' = "...."
+hex2bin '1' = "...@"
+hex2bin '2' = "..@."
+hex2bin '3' = "..@@"
+hex2bin '4' = ".@.."
+hex2bin '5' = ".@.@"
+hex2bin '6' = ".@@."
+hex2bin '7' = ".@@@"
+hex2bin '8' = "@..."
+hex2bin '9' = "@..@"
+hex2bin 'A' = "@.@."
+hex2bin 'B' = "@.@@"
+hex2bin 'C' = "@@.."
+hex2bin 'D' = "@@.@"
+hex2bin 'E' = "@@@."
+hex2bin 'F' = "@@@@"
+
+fromA8 :: A8 -> String
+fromA8 w = [
+    (ebc2asc ! fromIntegral (w `shiftR` 56)),
+    (ebc2asc ! fromIntegral ((w `shiftR` 48) .&. 0xff)),
+    (ebc2asc ! fromIntegral ((w `shiftR` 40) .&. 0xff)),
+    (ebc2asc ! fromIntegral ((w `shiftR` 32) .&. 0xff)),
+    (ebc2asc ! fromIntegral ((w `shiftR` 24) .&. 0xff)),
+    (ebc2asc ! fromIntegral ((w `shiftR` 16) .&. 0xff)),
+    (ebc2asc ! fromIntegral ((w `shiftR` 8)  .&. 0xff)),
+    (ebc2asc ! fromIntegral (w .&. 0xff))
+    ]
+
+warn :: String -> IOm ()
+warn [] = return ()
+warn s  = liftIO $ do
+    hPutStrLn stderr $ "*** Warning: " ++ s
+
+die :: String -> IOm a
+die s = liftIO $ do
+    hPutStrLn stderr $ "*** Error: " ++ s
+    exitFailure
+
+reqArg a b c d e = Option a b (ReqArg e c) d
+noArg  a b c d   = Option a b (NoArg d) c
+
+showUsage options info arg = do
+    prg <- getProgName
+    let banner = (`usageInfo` options) $
+                 info prg ++ "\n\n" ++
+                 "Options:"
+    if (null arg) then do
+        putStrLn banner
+        exitWith ExitSuccess
+        else die $ arg ++ "\n\n" ++ banner
+
+requiredOpt :: (String -> IO a) -> String -> a
+requiredOpt usage r = unsafePerformIO $ do
+    usage $ "missing argument: --" ++ r
+
diff --git a/src/OpenAFP/Records.hs b/src/OpenAFP/Records.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records.hs
@@ -0,0 +1,329 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Records
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- This module imports and re-exports various AFP data structures, and
+-- implements an additional "Unknown" type for data without corresponding
+-- structures.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Records (
+    module OpenAFP.Records.AFP,
+    module OpenAFP.Records.PTX,
+    module OpenAFP.Records.MCF,
+    module OpenAFP.Records.T,
+    AFP_(..),
+    Unknown(..), _Unknown,
+
+    lookupAFP, lookupMCF, lookupPTX, lookupT,
+) where 
+import OpenAFP.Types
+import OpenAFP.Internals
+import OpenAFP.Records.AFP
+import OpenAFP.Records.PTX
+import OpenAFP.Records.MCF
+import OpenAFP.Records.T
+
+---[ Unknown ]--------------------------------------------------
+
+newtype Unknown = Unknown NStr
+    deriving (Show, Typeable)
+
+instance Rec Unknown where
+    recGet bh = get bh >>= return . Unknown
+    recPut bh (Unknown r) = put bh r
+    recSizeOf (Unknown r) = sizeOf r
+    recView (Unknown r) = viewRecord (typeOf _Unknown) [ viewField "" (viewNStr r) ]
+
+instance Binary Unknown where
+    get bh = return $ Unknown $ bufFromPStrLen (bufOf bh)
+    put bh (Unknown buf) = putBuf bh $ bufToPStrLen buf
+
+_Unknown = Unknown _NStr
+
+---[ AFP ]-----------------------------------------------------
+
+newtype AFP_ = AFP_ (N3, Buffer2) deriving (Show, Typeable)
+
+instance Binary AFP_ where
+    put bh (AFP_ (_, buf)) = do
+        put bh ('\x5A', buf)
+    get bh = do
+        getByte bh
+	get' AFP_ bh
+
+lookupMCF :: MCF_ -> N0 -> ChunkType
+lookupMCF _ _ = chunkTypeOf _MCF_T    -- MCF Triplets
+
+lookupAFP :: AFP_ -> N3 -> ChunkType
+lookupAFP _ x = case x of
+    0xD38C87 -> chunkTypeOf _CPI      -- Code Page Index
+    0xD38C89 -> chunkTypeOf _FNI      -- Font Index
+    0xD38C8A -> chunkTypeOf _CFI      -- Coded Font Index
+    0xD3A088 -> chunkTypeOf _MFC      -- Medium Finishing Control
+    0xD3A090 -> chunkTypeOf _TLE      -- Tag Logical Element
+    0xD3A288 -> chunkTypeOf _MCC      -- Medium Copy Count
+    0xD3A289 -> chunkTypeOf _FNM      -- Font Patterns Map
+    0xD3A66B -> chunkTypeOf _OBD      -- Object Area Descriptor
+    0xD3A67B -> chunkTypeOf _IID      -- IM Image Input Descriptor (C)
+    0xD3A687 -> chunkTypeOf _CPD      -- Code Page Descriptor
+    0xD3A688 -> chunkTypeOf _MDD      -- Medium Descriptor
+    0xD3A689 -> chunkTypeOf _FND      -- Font Descriptor
+    0xD3A692 -> chunkTypeOf _CDD      -- Container Data Descriptor
+    0xD3A69B -> chunkTypeOf _PTD1     -- Presentation Text Descriptor Format-1 (C)
+    0xD3A6AF -> chunkTypeOf _PGD      -- Page Descriptor
+    0xD3A6BB -> chunkTypeOf _GDD      -- Graphics Data Descriptor
+    0xD3A6C5 -> chunkTypeOf _FGD      -- Form Environment Group Descriptor (O)
+    0xD3A6E3 -> chunkTypeOf _DXD      -- Data Map Transmission Subcase Descriptor
+    0xD3A6E7 -> chunkTypeOf _LND      -- Line Descriptor
+    0xD3A6EB -> chunkTypeOf _BDD      -- Bar Code Data Descriptor
+    0xD3A6FB -> chunkTypeOf _IDD      -- Image Data Descriptor
+    0xD3A77B -> chunkTypeOf _IOC      -- IM Image Output Control (C)
+    0xD3A787 -> chunkTypeOf _CPC      -- Code Page Control
+    0xD3A788 -> chunkTypeOf _MMC      -- Medium Modification Control
+    0xD3A789 -> chunkTypeOf _FNC      -- Font Control
+    0xD3A78A -> chunkTypeOf _CFC      -- Coded Font Control
+    0xD3A79B -> chunkTypeOf _CTC      -- Composed Text Control (O)
+    0xD3A7AF -> chunkTypeOf _PMC      -- Page Modification Control
+    0xD3A85F -> chunkTypeOf _BPS      -- Begin Page Segment
+    0xD3A877 -> chunkTypeOf _BCA      -- Begin Color Attribute Table
+    0xD3A87B -> chunkTypeOf _BII      -- Begin IM Image (C)
+    0xD3A887 -> chunkTypeOf _BCP      -- Begin Code Page
+    0xD3A889 -> chunkTypeOf _BFN      -- Begin Font
+    0xD3A88A -> chunkTypeOf _BCF      -- Begin Coded Font
+    0xD3A892 -> chunkTypeOf _BOC      -- Begin Object Container
+    0xD3A89B -> chunkTypeOf _BPT      -- Begin Presentation Text Object
+    0xD3A8A7 -> chunkTypeOf _BDI      -- Begin Document Index
+    0xD3A8A8 -> chunkTypeOf _BDT      -- Begin Document
+    0xD3A8AD -> chunkTypeOf _BNG      -- Begin Named Page Group
+    0xD3A8AF -> chunkTypeOf _BPG      -- Begin Page
+    0xD3A8BB -> chunkTypeOf _BGR      -- Begin Graphics Object
+    0xD3A8C4 -> chunkTypeOf _BDG      -- Begin Document Environment Group
+    0xD3A8C5 -> chunkTypeOf _BFG      -- Begin Form Environment Group (O)
+    0xD3A8C6 -> chunkTypeOf _BRG      -- Begin Resource Group
+    0xD3A8C7 -> chunkTypeOf _BOG      -- Begin Object Environment Group
+    0xD3A8C9 -> chunkTypeOf _BAG      -- Begin Active Environment Group
+    0xD3A8CA -> chunkTypeOf _BDM      -- Begin Data Map
+    0xD3A8CB -> chunkTypeOf _BPM      -- Begin Page Map
+    0xD3A8CC -> chunkTypeOf _BMM      -- Begin Medium Map
+    0xD3A8CD -> chunkTypeOf _BFM      -- Begin Form Map
+    0xD3A8CE -> chunkTypeOf _BR       -- Begin Resource (R)
+    0xD3A8D9 -> chunkTypeOf _BSG      -- Begin Resource Environment Group
+    0xD3A8DF -> chunkTypeOf _BMO      -- Begin Overlay
+    0xD3A8E3 -> chunkTypeOf _BDX      -- Begin Data Map Transmission Subcase
+    0xD3A8EB -> chunkTypeOf _BBC      -- Begin Bar Code Object
+    0xD3A8FB -> chunkTypeOf _BIM      -- Begin Image Object
+    0xD3A95F -> chunkTypeOf _EPS      -- End Page Segment
+    0xD3A977 -> chunkTypeOf _ECA      -- End Color Attribute Table
+    0xD3A97B -> chunkTypeOf _EII      -- End IM Image (C)
+    0xD3A987 -> chunkTypeOf _ECP      -- End Code Page
+    0xD3A989 -> chunkTypeOf _EFN      -- End Font
+    0xD3A98A -> chunkTypeOf _ECF      -- End Coded Font
+    0xD3A992 -> chunkTypeOf _EOC      -- End Object Container
+    0xD3A99B -> chunkTypeOf _EPT      -- End Presentation Text Object
+    0xD3A9A7 -> chunkTypeOf _EDI      -- End Document Index
+    0xD3A9A8 -> chunkTypeOf _EDT      -- End Document
+    0xD3A9AD -> chunkTypeOf _ENG      -- End Named Page Group
+    0xD3A9AF -> chunkTypeOf _EPG      -- End Page
+    0xD3A9BB -> chunkTypeOf _EGR      -- End Graphics Object
+    0xD3A9C4 -> chunkTypeOf _EDG      -- End Document Environment Group
+    0xD3A9C5 -> chunkTypeOf _EFG      -- End Form Environment Group (O)
+    0xD3A9C6 -> chunkTypeOf _ERG      -- End Resource Group
+    0xD3A9C7 -> chunkTypeOf _EOG      -- End Object Environment Group
+    0xD3A9C9 -> chunkTypeOf _EAG      -- End Active Environment Group
+    0xD3A9CA -> chunkTypeOf _EDM      -- End Data Map
+    0xD3A9CB -> chunkTypeOf _EPM      -- End Page Map
+    0xD3A9CC -> chunkTypeOf _EMM      -- End Medium Map
+    0xD3A9CD -> chunkTypeOf _EFM      -- End Form Map
+    0xD3A9CE -> chunkTypeOf _ER       -- End Resource (R)
+    0xD3A9D9 -> chunkTypeOf _ESG      -- End Resource Environment Group
+    0xD3A9DF -> chunkTypeOf _EMO      -- End Overlay
+    0xD3A9E3 -> chunkTypeOf _EDX      -- End Data Map Transmission Subcase
+    0xD3A9EB -> chunkTypeOf _EBC      -- End Bar Code Object
+    0xD3A9FB -> chunkTypeOf _EIM      -- End Image Object
+    0xD3AAE7 -> chunkTypeOf _LNC      -- Line Descriptor Count
+    0xD3AB77 -> chunkTypeOf _MCA      -- Map Color Attribute Table
+    0xD3AB88 -> chunkTypeOf _MMT      -- Map Media Type
+    0xD3AB89 -> chunkTypeOf _FNN      -- Font Names (Outline Fonts Only)
+    0xD3AB8A -> chunkTypeOf _MCF      -- Map Coded Font
+    0xD3AB92 -> chunkTypeOf _MCD      -- Map Container Data
+    0xD3ABAF -> chunkTypeOf _MPG      -- Map Page
+    0xD3ABBB -> chunkTypeOf _MGO      -- Map Graphics Object
+    0xD3ABC3 -> chunkTypeOf _MDR      -- Map Data Resource
+    0xD3ABCC -> chunkTypeOf _IMM      -- Invoke Medium Map
+    0xD3ABD8 -> chunkTypeOf _MPO      -- Map Page Overlay
+    0xD3ABEA -> chunkTypeOf _MSU      -- Map Suppression
+    0xD3ABEB -> chunkTypeOf _MBC      -- Map Bar Code Object
+    0xD3ABFB -> chunkTypeOf _MIO      -- Map Image Object
+    0xD3AC6B -> chunkTypeOf _OBP      -- Object Area Position
+    0xD3AC7B -> chunkTypeOf _ICP      -- IM Image Cell Position (C)
+    0xD3AC89 -> chunkTypeOf _FNP      -- Font Position
+    0xD3ACAF -> chunkTypeOf _PGP1     -- Page Position Format-1 (C)
+    0xD3AE89 -> chunkTypeOf _FNO      -- Font Orientation
+    0xD3AF5F -> chunkTypeOf _IPS      -- Include Page Segment
+    0xD3AFAF -> chunkTypeOf _IPG      -- Include Page
+    0xD3AFC3 -> chunkTypeOf _IOB      -- Include Object
+    0xD3AFD8 -> chunkTypeOf _IPO      -- Include Page Overlay
+    0xD3B077 -> chunkTypeOf _CAT      -- Color Attribute Table
+    0xD3B15F -> chunkTypeOf _MPS      -- Map Page Segment
+    0xD3B18A -> chunkTypeOf _MCF1     -- Map Coded Font Format-1 (C)
+    0xD3B19B -> chunkTypeOf _PTD      -- Presentation Text Data Descriptor
+    0xD3B1AF -> chunkTypeOf _PGP      -- Page Position
+    0xD3B1DF -> chunkTypeOf _MMO      -- Map Medium Overlay
+    0xD3B288 -> chunkTypeOf _PFC      -- Presentation Fidelity Control
+    0xD3B2A7 -> chunkTypeOf _IEL      -- Index Element
+    0xD3B490 -> chunkTypeOf _LLE      -- Link Logical Element
+    0xD3EE7B -> chunkTypeOf _IRD      -- IM Image Raster Data (C)
+    0xD3EE89 -> chunkTypeOf _FNG      -- Font Patterns
+    0xD3EE92 -> chunkTypeOf _OCD      -- Object Container Data
+    0xD3EE9B -> chunkTypeOf _PTX      -- Presentation Text Data
+    0xD3EEBB -> chunkTypeOf _GAD      -- Graphics Data
+    0xD3EEEB -> chunkTypeOf _BDA      -- Bar Code Data
+    0xD3EEEE -> chunkTypeOf _NOP      -- No Operation
+    0xD3EEFB -> chunkTypeOf _IPD      -- Image Picture Data
+    _        -> chunkTypeOf _Unknown
+
+
+---[ Triplets ]-------------------------------------------------
+
+lookupT :: T_ -> N1 -> ChunkType
+lookupT _ x = case x of
+    0x01 -> chunkTypeOf _T_CGCSGI    -- Coded Graphic Character Set Global ID
+    0x02 -> chunkTypeOf _T_FQN       -- Fully Qualified Name
+    0x04 -> chunkTypeOf _T_MO        -- Mapping Option
+    0x10 -> chunkTypeOf _T_OCL       -- Object Classification
+    0x18 -> chunkTypeOf _T_MIS       -- MO:DCA Interchange Set
+    0x1D -> chunkTypeOf _T_TO        -- Text Orientation (R)
+    0x1F -> chunkTypeOf _T_FDS       -- Font Descriptor Specification
+    0x20 -> chunkTypeOf _T_FCGCSGI   -- Font Coded Graphic Character Set Global Identifier
+    0x21 -> chunkTypeOf _T_OFSS      -- Object Function Set Specification
+    0x22 -> chunkTypeOf _T_ROT       -- Resource Object Type (R)
+    0x23 -> chunkTypeOf _T_ERLI      -- Extended Resource Local ID
+    0x24 -> chunkTypeOf _T_RLI       -- Resource Local ID
+    0x25 -> chunkTypeOf _T_RSN       -- Resource Section Number
+    0x26 -> chunkTypeOf _T_CR        -- Character Rotation
+    0x27 -> chunkTypeOf _T_LDOPM     -- Line Data Object Position Migration (R)
+    0x2D -> chunkTypeOf _T_OBO       -- Object Byte Offset
+    0x36 -> chunkTypeOf _T_AV        -- Attribute Value
+    0x43 -> chunkTypeOf _T_DP        -- Descriptor Position
+    0x45 -> chunkTypeOf _T_MEC       -- Media Eject Control
+    0x46 -> chunkTypeOf _T_POCP      -- Page Overlay Conditional Processing
+    0x47 -> chunkTypeOf _T_RUA       -- Resource Usage Attribute
+    0x4B -> chunkTypeOf _T_OAMU      -- Object Area Measurement Units
+    0x4C -> chunkTypeOf _T_OAS       -- Object Area Size
+    0x4D -> chunkTypeOf _T_AD        -- Area Definition
+    0x4E -> chunkTypeOf _T_CS        -- Color Specification
+    0x50 -> chunkTypeOf _T_ESI       -- Encoding Scheme ID
+    0x56 -> chunkTypeOf _T_MMPN      -- Medium Map Page Number
+    0x57 -> chunkTypeOf _T_OBE       -- Object Byte Extent
+    0x58 -> chunkTypeOf _T_OSFO      -- Object Structured Field Offset
+    0x59 -> chunkTypeOf _T_OSFE      -- Object Structured Field Extent
+    0x5A -> chunkTypeOf _T_OO        -- Object Offset
+    0x5D -> chunkTypeOf _T_FHSF      -- Font Horizontal Scale Factor
+    0x5E -> chunkTypeOf _T_OCO       -- Object Count
+    0x62 -> chunkTypeOf _T_LDTS      -- Local Date and Time Stamp
+    0x63 -> chunkTypeOf _T_OCH       -- Object Checksum (R)
+--  0x63 -> chunkTypeOf _T_T1CRMT    -- Type 1 - CRC Resource Management Triplet
+--  0x63 -> chunkTypeOf _T_T2FRMT    -- Type 2 - Font Resource Management Triplet
+    0x64 -> chunkTypeOf _T_OOI       -- Object Origin Identifier (R)
+    0x65 -> chunkTypeOf _T_C         -- Comment
+    0x68 -> chunkTypeOf _T_MOR       -- Medium Orientation
+    0x6C -> chunkTypeOf _T_ROI       -- Resource Object Include
+    0x6D -> chunkTypeOf _T_EF        -- Extension Font
+    0x70 -> chunkTypeOf _T_PSRM      -- Presentation Space Reset Mixing
+    0x71 -> chunkTypeOf _T_PSMR      -- Presentation Space Mixing Rules
+    0x72 -> chunkTypeOf _T_UDTS      -- Universal Date and Time Stamp
+    0x73 -> chunkTypeOf _T_II        -- IMM Insertion (R)
+    0x74 -> chunkTypeOf _T_TS        -- Toner Saver
+    0x75 -> chunkTypeOf _T_CF        -- Color Fidelity
+    0x78 -> chunkTypeOf _T_FF        -- Font Fidelity
+    0x79 -> chunkTypeOf _T_MA        -- Metric Adjustment
+    0x80 -> chunkTypeOf _T_AQ        -- Attribute Qualifier
+    0x81 -> chunkTypeOf _T_PPI       -- Page Position Information
+    0x82 -> chunkTypeOf _T_PV        -- Parameter Value
+    0x83 -> chunkTypeOf _T_PC        -- Presentation Control
+    0x84 -> chunkTypeOf _T_FRMT      -- Font Resolution and Metric Technology
+    0x85 -> chunkTypeOf _T_FO        -- Finishing Operation
+    0x87 -> chunkTypeOf _T_MF        -- Media Fidelity
+    _    -> chunkTypeOf _Unknown
+
+---[ PTX ]------------------------------------------------------
+
+lookupPTX :: PTX_ -> N1 -> ChunkType
+lookupPTX _ x = case x of
+    0x74 -> chunkTypeOf _PTX_STC      -- Set Text Color
+    0x75 -> chunkTypeOf _PTX_STC
+    0xC0 -> chunkTypeOf _PTX_SIM      -- Set Inline Margin
+    0xC1 -> chunkTypeOf _PTX_SIM
+    0xC2 -> chunkTypeOf _PTX_SIA      -- Set Intercharacter Adjustment
+    0xC3 -> chunkTypeOf _PTX_SIA
+    0xC4 -> chunkTypeOf _PTX_SVI      -- Set Variable-Space Character Increment
+    0xC5 -> chunkTypeOf _PTX_SVI
+    0xC6 -> chunkTypeOf _PTX_AMI      -- Absolute Move Inline
+    0xC7 -> chunkTypeOf _PTX_AMI
+    0xC8 -> chunkTypeOf _PTX_RMI      -- Relative Move Inline
+    0xC9 -> chunkTypeOf _PTX_RMI
+    0xD0 -> chunkTypeOf _PTX_SBI      -- Set Baseline Increment
+    0xD1 -> chunkTypeOf _PTX_SBI
+    0xD2 -> chunkTypeOf _PTX_AMB      -- Absolute Move Baseline
+    0xD3 -> chunkTypeOf _PTX_AMB
+    0xD4 -> chunkTypeOf _PTX_RMB      -- Relative Move Baseline
+    0xD5 -> chunkTypeOf _PTX_RMB
+    0xD8 -> chunkTypeOf _PTX_BLN      -- Begin Line Next
+    0xD9 -> chunkTypeOf _PTX_BLN
+    0xE4 -> chunkTypeOf _PTX_DIR      -- Draw I-Axis Rule
+    0xE5 -> chunkTypeOf _PTX_DIR
+    0xE6 -> chunkTypeOf _PTX_DBR      -- Draw B-Axis Rule
+    0xE7 -> chunkTypeOf _PTX_DBR
+    0xEE -> chunkTypeOf _PTX_RPS      -- Repeat String
+    0xEF -> chunkTypeOf _PTX_RPS
+    0xF0 -> chunkTypeOf _PTX_SCFL     -- Set Coded Font Local
+    0xF1 -> chunkTypeOf _PTX_SCFL
+    0xF2 -> chunkTypeOf _PTX_BSU      -- Begin Suppression
+    0xF3 -> chunkTypeOf _PTX_BSU
+    0xF4 -> chunkTypeOf _PTX_ESU      -- Begin Suppression
+    0xF5 -> chunkTypeOf _PTX_ESU
+    0xF6 -> chunkTypeOf _PTX_STO      -- Set Text Orientation
+    0xF7 -> chunkTypeOf _PTX_STO
+    0xF8 -> chunkTypeOf _PTX_NOP      -- No Operation
+    0xF9 -> chunkTypeOf _PTX_NOP
+    0xDA -> chunkTypeOf _PTX_TRN      -- Transparent Data
+    0xDB -> chunkTypeOf _PTX_TRN
+    _    -> chunkTypeOf _Unknown
+
+-- XXX -- refactor it back to class
+get' :: (Binary t, Buf b, Binary b) => ((t, b) -> c) -> BinHandle -> IO c
+get' constr bh = do
+    buf     <- get bh
+    buftype <- getBufType buf
+    let chunk = constr (buftype, buf)
+    let (pstr, len) = bufToPStrLen buf
+    addFinalizer chunk $ touchForeignPtr pstr
+    return chunk
+
+getBufType buf = do
+    bh <- openBinBuf $ bufToPStrLen buf
+    get bh
+
+instance Binary PTX_ where
+    put bh (PTX_ (_, buf)) = put bh buf
+    get = get' PTX_
+
+instance Binary MCF_ where
+    put bh (MCF_ (_, buf)) = put bh buf
+    get bh = do
+        buf     <- get bh
+        return $ MCF_ (N0 (), buf)
+
+instance Binary T_ where
+    put bh (T_ (_, buf)) = put bh buf
+    get = get' T_
diff --git a/src/OpenAFP/Records/AFP.hs b/src/OpenAFP/Records/AFP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP.hs
@@ -0,0 +1,516 @@
+module OpenAFP.Records.AFP (
+    module OpenAFP.Records.AFP.BAG, _BAG,
+    module OpenAFP.Records.AFP.BBC, _BBC,
+    module OpenAFP.Records.AFP.BCA, _BCA,
+    module OpenAFP.Records.AFP.BCF, _BCF,
+    module OpenAFP.Records.AFP.BCP, _BCP,
+    module OpenAFP.Records.AFP.BDA, _BDA,
+    module OpenAFP.Records.AFP.BDD, _BDD,
+    module OpenAFP.Records.AFP.BDG, _BDG,
+    module OpenAFP.Records.AFP.BDI, _BDI,
+    module OpenAFP.Records.AFP.BDM, _BDM,
+    module OpenAFP.Records.AFP.BDT, _BDT,
+    module OpenAFP.Records.AFP.BDX, _BDX,
+    module OpenAFP.Records.AFP.BFG, _BFG,
+    module OpenAFP.Records.AFP.BFM, _BFM,
+    module OpenAFP.Records.AFP.BFN, _BFN,
+    module OpenAFP.Records.AFP.BGR, _BGR,
+    module OpenAFP.Records.AFP.BII, _BII,
+    module OpenAFP.Records.AFP.BIM, _BIM,
+    module OpenAFP.Records.AFP.BMM, _BMM,
+    module OpenAFP.Records.AFP.BMO, _BMO,
+    module OpenAFP.Records.AFP.BNG, _BNG,
+    module OpenAFP.Records.AFP.BOC, _BOC,
+    module OpenAFP.Records.AFP.BOG, _BOG,
+    module OpenAFP.Records.AFP.BPG, _BPG,
+    module OpenAFP.Records.AFP.BPM, _BPM,
+    module OpenAFP.Records.AFP.BPS, _BPS,
+    module OpenAFP.Records.AFP.BPT, _BPT,
+    module OpenAFP.Records.AFP.BR, _BR,
+    module OpenAFP.Records.AFP.BRG, _BRG,
+    module OpenAFP.Records.AFP.BSG, _BSG,
+    module OpenAFP.Records.AFP.CAT, _CAT,
+    module OpenAFP.Records.AFP.CDD, _CDD,
+    module OpenAFP.Records.AFP.CFC, _CFC,
+    module OpenAFP.Records.AFP.CFI, _CFI,
+    _CFI_Data,
+    module OpenAFP.Records.AFP.CPC, _CPC,
+    module OpenAFP.Records.AFP.CPD, _CPD,
+    module OpenAFP.Records.AFP.CPI, _CPI,
+    _CPI_Data,
+    module OpenAFP.Records.AFP.CTC, _CTC,
+    module OpenAFP.Records.AFP.DXD, _DXD,
+    module OpenAFP.Records.AFP.EAG, _EAG,
+    module OpenAFP.Records.AFP.EBC, _EBC,
+    module OpenAFP.Records.AFP.ECA, _ECA,
+    module OpenAFP.Records.AFP.ECF, _ECF,
+    module OpenAFP.Records.AFP.ECP, _ECP,
+    module OpenAFP.Records.AFP.EDG, _EDG,
+    module OpenAFP.Records.AFP.EDI, _EDI,
+    module OpenAFP.Records.AFP.EDM, _EDM,
+    module OpenAFP.Records.AFP.EDT, _EDT,
+    module OpenAFP.Records.AFP.EDX, _EDX,
+    module OpenAFP.Records.AFP.EFG, _EFG,
+    module OpenAFP.Records.AFP.EFM, _EFM,
+    module OpenAFP.Records.AFP.EFN, _EFN,
+    module OpenAFP.Records.AFP.EGR, _EGR,
+    module OpenAFP.Records.AFP.EII, _EII,
+    module OpenAFP.Records.AFP.EIM, _EIM,
+    module OpenAFP.Records.AFP.EMM, _EMM,
+    module OpenAFP.Records.AFP.EMO, _EMO,
+    module OpenAFP.Records.AFP.ENG, _ENG,
+    module OpenAFP.Records.AFP.EOC, _EOC,
+    module OpenAFP.Records.AFP.EOG, _EOG,
+    module OpenAFP.Records.AFP.EPG, _EPG,
+    module OpenAFP.Records.AFP.EPM, _EPM,
+    module OpenAFP.Records.AFP.EPS, _EPS,
+    module OpenAFP.Records.AFP.EPT, _EPT,
+    module OpenAFP.Records.AFP.ER, _ER,
+    module OpenAFP.Records.AFP.ERG, _ERG,
+    module OpenAFP.Records.AFP.ESG, _ESG,
+    module OpenAFP.Records.AFP.FGD, _FGD,
+    module OpenAFP.Records.AFP.FNC, _FNC,
+    module OpenAFP.Records.AFP.FND, _FND,
+    module OpenAFP.Records.AFP.FNG, _FNG,
+    module OpenAFP.Records.AFP.FNI, _FNI,
+    _FNI_Data,
+    module OpenAFP.Records.AFP.FNM, _FNM,
+    _FNM_Data,
+    module OpenAFP.Records.AFP.FNN, _FNN,
+    module OpenAFP.Records.AFP.FNO, _FNO,
+    module OpenAFP.Records.AFP.FNP, _FNP,
+    module OpenAFP.Records.AFP.GAD, _GAD,
+    module OpenAFP.Records.AFP.GDD, _GDD,
+    module OpenAFP.Records.AFP.ICP, _ICP,
+    module OpenAFP.Records.AFP.IDD, _IDD,
+    module OpenAFP.Records.AFP.IEL, _IEL,
+    module OpenAFP.Records.AFP.IID, _IID,
+    module OpenAFP.Records.AFP.IMM, _IMM,
+    module OpenAFP.Records.AFP.IOB, _IOB,
+    module OpenAFP.Records.AFP.IOC, _IOC,
+    module OpenAFP.Records.AFP.IPD, _IPD,
+    module OpenAFP.Records.AFP.IPG, _IPG,
+    module OpenAFP.Records.AFP.IPO, _IPO,
+    module OpenAFP.Records.AFP.IPS, _IPS,
+    module OpenAFP.Records.AFP.IRD, _IRD,
+    module OpenAFP.Records.AFP.LLE, _LLE,
+    module OpenAFP.Records.AFP.LNC, _LNC,
+    module OpenAFP.Records.AFP.LND, _LND,
+    module OpenAFP.Records.AFP.MBC, _MBC,
+    module OpenAFP.Records.AFP.MCA, _MCA,
+    module OpenAFP.Records.AFP.MCC, _MCC,
+    module OpenAFP.Records.AFP.MCD, _MCD,
+    module OpenAFP.Records.AFP.MCF, _MCF,
+    module OpenAFP.Records.AFP.MCF1, _MCF1,
+    _MCF1_Data,
+    module OpenAFP.Records.AFP.MDD, _MDD,
+    module OpenAFP.Records.AFP.MDR, _MDR,
+    module OpenAFP.Records.AFP.MFC, _MFC,
+    module OpenAFP.Records.AFP.MGO, _MGO,
+    module OpenAFP.Records.AFP.MIO, _MIO,
+    module OpenAFP.Records.AFP.MMC, _MMC,
+    module OpenAFP.Records.AFP.MMO, _MMO,
+    module OpenAFP.Records.AFP.MMT, _MMT,
+    module OpenAFP.Records.AFP.MPG, _MPG,
+    module OpenAFP.Records.AFP.MPO, _MPO,
+    module OpenAFP.Records.AFP.MPS, _MPS,
+    module OpenAFP.Records.AFP.MSU, _MSU,
+    module OpenAFP.Records.AFP.NOP, _NOP,
+    module OpenAFP.Records.AFP.OBD, _OBD,
+    module OpenAFP.Records.AFP.OBP, _OBP,
+    module OpenAFP.Records.AFP.OCD, _OCD,
+    module OpenAFP.Records.AFP.PFC, _PFC,
+    module OpenAFP.Records.AFP.PGD, _PGD,
+    module OpenAFP.Records.AFP.PGP, _PGP,
+    module OpenAFP.Records.AFP.PGP1, _PGP1,
+    module OpenAFP.Records.AFP.PMC, _PMC,
+    module OpenAFP.Records.AFP.PTD, _PTD,
+    module OpenAFP.Records.AFP.PTD1, _PTD1,
+    module OpenAFP.Records.AFP.PTX, _PTX,
+    module OpenAFP.Records.AFP.TLE, _TLE,
+) where
+import OpenAFP.Types
+import OpenAFP.Records.AFP.BAG
+import OpenAFP.Records.AFP.BBC
+import OpenAFP.Records.AFP.BCA
+import OpenAFP.Records.AFP.BCF
+import OpenAFP.Records.AFP.BCP
+import OpenAFP.Records.AFP.BDA
+import OpenAFP.Records.AFP.BDD
+import OpenAFP.Records.AFP.BDG
+import OpenAFP.Records.AFP.BDI
+import OpenAFP.Records.AFP.BDM
+import OpenAFP.Records.AFP.BDT
+import OpenAFP.Records.AFP.BDX
+import OpenAFP.Records.AFP.BFG
+import OpenAFP.Records.AFP.BFM
+import OpenAFP.Records.AFP.BFN
+import OpenAFP.Records.AFP.BGR
+import OpenAFP.Records.AFP.BII
+import OpenAFP.Records.AFP.BIM
+import OpenAFP.Records.AFP.BMM
+import OpenAFP.Records.AFP.BMO
+import OpenAFP.Records.AFP.BNG
+import OpenAFP.Records.AFP.BOC
+import OpenAFP.Records.AFP.BOG
+import OpenAFP.Records.AFP.BPG
+import OpenAFP.Records.AFP.BPM
+import OpenAFP.Records.AFP.BPS
+import OpenAFP.Records.AFP.BPT
+import OpenAFP.Records.AFP.BR
+import OpenAFP.Records.AFP.BRG
+import OpenAFP.Records.AFP.BSG
+import OpenAFP.Records.AFP.CAT
+import OpenAFP.Records.AFP.CDD
+import OpenAFP.Records.AFP.CFC
+import OpenAFP.Records.AFP.CFI
+import OpenAFP.Records.AFP.CPC
+import OpenAFP.Records.AFP.CPD
+import OpenAFP.Records.AFP.CPI
+import OpenAFP.Records.AFP.CTC
+import OpenAFP.Records.AFP.DXD
+import OpenAFP.Records.AFP.EAG
+import OpenAFP.Records.AFP.EBC
+import OpenAFP.Records.AFP.ECA
+import OpenAFP.Records.AFP.ECF
+import OpenAFP.Records.AFP.ECP
+import OpenAFP.Records.AFP.EDG
+import OpenAFP.Records.AFP.EDI
+import OpenAFP.Records.AFP.EDM
+import OpenAFP.Records.AFP.EDT
+import OpenAFP.Records.AFP.EDX
+import OpenAFP.Records.AFP.EFG
+import OpenAFP.Records.AFP.EFM
+import OpenAFP.Records.AFP.EFN
+import OpenAFP.Records.AFP.EGR
+import OpenAFP.Records.AFP.EII
+import OpenAFP.Records.AFP.EIM
+import OpenAFP.Records.AFP.EMM
+import OpenAFP.Records.AFP.EMO
+import OpenAFP.Records.AFP.ENG
+import OpenAFP.Records.AFP.EOC
+import OpenAFP.Records.AFP.EOG
+import OpenAFP.Records.AFP.EPG
+import OpenAFP.Records.AFP.EPM
+import OpenAFP.Records.AFP.EPS
+import OpenAFP.Records.AFP.EPT
+import OpenAFP.Records.AFP.ER
+import OpenAFP.Records.AFP.ERG
+import OpenAFP.Records.AFP.ESG
+import OpenAFP.Records.AFP.FGD
+import OpenAFP.Records.AFP.FNC
+import OpenAFP.Records.AFP.FND
+import OpenAFP.Records.AFP.FNG
+import OpenAFP.Records.AFP.FNI
+import OpenAFP.Records.AFP.FNM
+import OpenAFP.Records.AFP.FNN
+import OpenAFP.Records.AFP.FNO
+import OpenAFP.Records.AFP.FNP
+import OpenAFP.Records.AFP.GAD
+import OpenAFP.Records.AFP.GDD
+import OpenAFP.Records.AFP.ICP
+import OpenAFP.Records.AFP.IDD
+import OpenAFP.Records.AFP.IEL
+import OpenAFP.Records.AFP.IID
+import OpenAFP.Records.AFP.IMM
+import OpenAFP.Records.AFP.IOB
+import OpenAFP.Records.AFP.IOC
+import OpenAFP.Records.AFP.IPD
+import OpenAFP.Records.AFP.IPG
+import OpenAFP.Records.AFP.IPO
+import OpenAFP.Records.AFP.IPS
+import OpenAFP.Records.AFP.IRD
+import OpenAFP.Records.AFP.LLE
+import OpenAFP.Records.AFP.LNC
+import OpenAFP.Records.AFP.LND
+import OpenAFP.Records.AFP.MBC
+import OpenAFP.Records.AFP.MCA
+import OpenAFP.Records.AFP.MCC
+import OpenAFP.Records.AFP.MCD
+import OpenAFP.Records.AFP.MCF
+import OpenAFP.Records.AFP.MCF1
+import OpenAFP.Records.AFP.MDD
+import OpenAFP.Records.AFP.MDR
+import OpenAFP.Records.AFP.MFC
+import OpenAFP.Records.AFP.MGO
+import OpenAFP.Records.AFP.MIO
+import OpenAFP.Records.AFP.MMC
+import OpenAFP.Records.AFP.MMO
+import OpenAFP.Records.AFP.MMT
+import OpenAFP.Records.AFP.MPG
+import OpenAFP.Records.AFP.MPO
+import OpenAFP.Records.AFP.MPS
+import OpenAFP.Records.AFP.MSU
+import OpenAFP.Records.AFP.NOP
+import OpenAFP.Records.AFP.OBD
+import OpenAFP.Records.AFP.OBP
+import OpenAFP.Records.AFP.OCD
+import OpenAFP.Records.AFP.PFC
+import OpenAFP.Records.AFP.PGD
+import OpenAFP.Records.AFP.PGP
+import OpenAFP.Records.AFP.PGP1
+import OpenAFP.Records.AFP.PMC
+import OpenAFP.Records.AFP.PTD
+import OpenAFP.Records.AFP.PTD1
+import OpenAFP.Records.AFP.PTX
+import OpenAFP.Records.AFP.TLE
+
+_BAG  :: BAG
+_BAG  = BAG  0xD3A8C9 0 _NStr
+_BBC  :: BBC
+_BBC  = BBC  0xD3A8EB 0 _NStr
+_BCA  :: BCA
+_BCA  = BCA  0xD3A877 0 _NStr
+_BCF  :: BCF
+_BCF  = BCF  0xD3A88A 0 _NStr
+_BCP  :: BCP
+_BCP  = BCP  0xD3A887 0 _NStr
+_BDA  :: BDA
+_BDA  = BDA  0xD3EEEB 0 _NStr
+_BDD  :: BDD
+_BDD  = BDD  0xD3A6EB 0 _NStr
+_BDG  :: BDG
+_BDG  = BDG  0xD3A8C4 0 _NStr
+_BDI  :: BDI
+_BDI  = BDI  0xD3A8A7 0 _NStr
+_BDM  :: BDM
+_BDM  = BDM  0xD3A8CA 0 _NStr
+_BDT  :: BDT
+_BDT  = BDT  0xD3A8A8 0 _NStr
+_BDX  :: BDX
+_BDX  = BDX  0xD3A8E3 0 _NStr
+_BFG  :: BFG
+_BFG  = BFG  0xD3A8C5 0 _NStr
+_BFM  :: BFM
+_BFM  = BFM  0xD3A8CD 0 _NStr
+_BFN  :: BFN
+_BFN  = BFN  0xD3A889 0 _NStr
+_BGR  :: BGR
+_BGR  = BGR  0xD3A8BB 0 _NStr
+_BII  :: BII
+_BII  = BII  0xD3A87B 0 0
+_BIM  :: BIM
+_BIM  = BIM  0xD3A8FB 0 _NStr
+_BMM  :: BMM
+_BMM  = BMM  0xD3A8CC 0 _NStr
+_BMO  :: BMO
+_BMO  = BMO  0xD3A8DF 0 _NStr
+_BNG  :: BNG
+_BNG  = BNG  0xD3A8AD 0 _NStr
+_BOC  :: BOC
+_BOC  = BOC  0xD3A892 0 _NStr
+_BOG  :: BOG
+_BOG  = BOG  0xD3A8C7 0 _NStr
+_BPG  :: BPG
+_BPG  = BPG  0xD3A8AF 0 _NStr
+_BPM  :: BPM
+_BPM  = BPM  0xD3A8CB 0 _NStr
+_BPS  :: BPS
+_BPS  = BPS  0xD3A85F 0 _NStr
+_BPT  :: BPT
+_BPT  = BPT  0xD3A89B 0 _NStr
+_BR   :: BR
+_BR   = BR   0xD3A8CE 0 _NStr
+_BRG  :: BRG
+_BRG  = BRG  0xD3A8C6 0 _NStr
+_BSG  :: BSG
+_BSG  = BSG  0xD3A8D9 0 _NStr
+_CAT  :: CAT
+_CAT  = CAT  0xD3B077 0 _NStr
+_CDD  :: CDD
+_CDD  = CDD  0xD3A692 0 _NStr
+_CFC  :: CFC
+_CFC  = CFC  0xD3A78A 0 0 _NStr
+_CFI  :: CFI
+_CFI  = CFI  0xD38C8A 0 []
+_CFI_Data :: CFI_Data
+_CFI_Data = CFI_Data 0 0 0 0
+_CPC  :: CPC
+_CPC  = CPC  0xD3A787 0 0 0 0 0 0 _NStr
+_CPD  :: CPD
+_CPD  = CPD  0xD3A687 0 _NStr
+_CPI  :: CPI
+_CPI  = CPI  0xD38C87 0 []
+_CPI_Data :: CPI_Data
+_CPI_Data = CPI_Data 0 0 0
+_CTC  :: CTC
+_CTC  = CTC  0xD3A79B 0 _NStr
+_DXD  :: DXD
+_DXD  = DXD  0xD3A6E3 0 _NStr
+_EAG  :: EAG
+_EAG  = EAG  0xD3A9C9 0 _NStr
+_EBC  :: EBC
+_EBC  = EBC  0xD3A9EB 0 _NStr
+_ECA  :: ECA
+_ECA  = ECA  0xD3A977 0 _NStr
+_ECF  :: ECF
+_ECF  = ECF  0xD3A98A 0 _NStr
+_ECP  :: ECP
+_ECP  = ECP  0xD3A987 0 _NStr
+_EDG  :: EDG
+_EDG  = EDG  0xD3A9C4 0 _NStr
+_EDI  :: EDI
+_EDI  = EDI  0xD3A9A7 0 _NStr
+_EDM  :: EDM
+_EDM  = EDM  0xD3A9CA 0 _NStr
+_EDT  :: EDT
+_EDT  = EDT  0xD3A9A8 0 _NStr
+_EDX  :: EDX
+_EDX  = EDX  0xD3A9E3 0 _NStr
+_EFG  :: EFG
+_EFG  = EFG  0xD3A9C5 0 _NStr
+_EFM  :: EFM
+_EFM  = EFM  0xD3A9CD 0 _NStr
+_EFN  :: EFN
+_EFN  = EFN  0xD3A989 0 _NStr
+_EGR  :: EGR
+_EGR  = EGR  0xD3A9BB 0 _NStr
+_EII  :: EII
+_EII  = EII  0xD3A97B 0 0
+_EIM  :: EIM
+_EIM  = EIM  0xD3A9FB 0 _NStr
+_EMM  :: EMM
+_EMM  = EMM  0xD3A9CC 0 _NStr
+_EMO  :: EMO
+_EMO  = EMO  0xD3A9DF 0 _NStr
+_ENG  :: ENG
+_ENG  = ENG  0xD3A9AD 0 _NStr
+_EOC  :: EOC
+_EOC  = EOC  0xD3A992 0 _NStr
+_EOG  :: EOG
+_EOG  = EOG  0xD3A9C7 0 _NStr
+_EPG  :: EPG
+_EPG  = EPG  0xD3A9AF 0 _NStr
+_EPM  :: EPM
+_EPM  = EPM  0xD3A9CB 0 _NStr
+_EPS  :: EPS
+_EPS  = EPS  0xD3A95F 0 _NStr
+_EPT  :: EPT
+_EPT  = EPT  0xD3A99B 0 _NStr
+_ER   :: ER
+_ER   = ER   0xD3A9CE 0 _NStr
+_ERG  :: ERG
+_ERG  = ERG  0xD3A9C6 0 _NStr
+_ESG  :: ESG
+_ESG  = ESG  0xD3A9D9 0 _NStr
+_FGD  :: FGD
+_FGD  = FGD  0xD3A6C5 0 _NStr
+_FNC  :: FNC
+_FNC  = FNC  0xD3A789 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 _NStr
+_FND  :: FND
+_FND  = FND  0xD3A689 0 _NStr
+_FNG  :: FNG
+_FNG  = FNG  0xD3EE89 0 _NStr
+_FNI  :: FNI
+_FNI  = FNI  0xD38C89 0 []
+_FNI_Data :: FNI_Data
+_FNI_Data = FNI_Data 0 0 0 0 0 0 0 0 0 0 0
+_FNM  :: FNM
+_FNM  = FNM  0xD3A289 0 []
+_FNM_Data :: FNM_Data
+_FNM_Data = FNM_Data 0 0 0
+_FNN  :: FNN
+_FNN  = FNN  0xD3AB89 0 _NStr
+_FNO  :: FNO
+_FNO  = FNO  0xD3AE89 0 0 0 0 0 0 _NStr
+_FNP  :: FNP
+_FNP  = FNP  0xD3AC89 0 _NStr
+_GAD  :: GAD
+_GAD  = GAD  0xD3EEBB 0 _NStr
+_GDD  :: GDD
+_GDD  = GDD  0xD3A6BB 0 _NStr
+_ICP  :: ICP
+_ICP  = ICP  0xD3AC7B 0 0 0 0 0 0 0
+_IDD  :: IDD
+_IDD  = IDD  0xD3A6FB 0 _NStr
+_IEL  :: IEL
+_IEL  = IEL  0xD3B2A7 0 _NStr
+_IID  :: IID
+_IID  = IID  0xD3A67B 0 0 0 0 0 0 0 0 0 0 0 0 0
+_IMM  :: IMM
+_IMM  = IMM  0xD3ABCC 0 _NStr
+_IOB  :: IOB
+_IOB  = IOB  0xD3AFC3 0 _NStr
+_IOC  :: IOC
+_IOC  = IOC  0xD3A77B 0 0 0 0 0 0 0 0 0 0 0
+_IPD  :: IPD
+_IPD  = IPD  0xD3EEFB 0 _NStr
+_IPG  :: IPG
+_IPG  = IPG  0xD3AFAF 0 _NStr
+_IPO  :: IPO
+_IPO  = IPO  0xD3AFD8 0 _NStr
+_IPS  :: IPS
+_IPS  = IPS  0xD3AF5F 0 _NStr
+_IRD  :: IRD
+_IRD  = IRD  0xD3EE7B 0 _NStr
+_LLE  :: LLE
+_LLE  = LLE  0xD3B490 0 _NStr
+_LNC  :: LNC
+_LNC  = LNC  0xD3AAE7 0 _NStr
+_LND  :: LND
+_LND  = LND  0xD3A6E7 0 _NStr
+_MBC  :: MBC
+_MBC  = MBC  0xD3ABEB 0 _NStr
+_MCA  :: MCA
+_MCA  = MCA  0xD3AB77 0 _NStr
+_MCC  :: MCC
+_MCC  = MCC  0xD3A288 0 _NStr
+_MCD  :: MCD
+_MCD  = MCD  0xD3AB92 0 _NStr
+_MCF  :: MCF
+_MCF  = MCF  0xD3AB8A 0 []
+_MCF1 :: MCF1
+_MCF1 = MCF1 0xD3B18A 0 0 0 []
+_MCF1_Data :: MCF1_Data
+_MCF1_Data = MCF1_Data 0 0 0 0 0 0 0 0
+_MDD  :: MDD
+_MDD  = MDD  0xD3A688 0 _NStr
+_MDR  :: MDR
+_MDR  = MDR  0xD3ABC3 0 _NStr
+_MFC  :: MFC
+_MFC  = MFC  0xD3A088 0 _NStr
+_MGO  :: MGO
+_MGO  = MGO  0xD3ABBB 0 _NStr
+_MIO  :: MIO
+_MIO  = MIO  0xD3ABFB 0 _NStr
+_MMC  :: MMC
+_MMC  = MMC  0xD3A788 0 _NStr
+_MMO  :: MMO
+_MMO  = MMO  0xD3B1DF 0 _NStr
+_MMT  :: MMT
+_MMT  = MMT  0xD3AB88 0 _NStr
+_MPG  :: MPG
+_MPG  = MPG  0xD3ABAF 0 _NStr
+_MPO  :: MPO
+_MPO  = MPO  0xD3ABD8 0 _NStr
+_MPS  :: MPS
+_MPS  = MPS  0xD3B15F 0 _NStr
+_MSU  :: MSU
+_MSU  = MSU  0xD3ABEA 0 _NStr
+_NOP  :: NOP
+_NOP  = NOP  0xD3EEEE 0 _NStr
+_OBD  :: OBD
+_OBD  = OBD  0xD3A66B 0 _NStr
+_OBP  :: OBP
+_OBP  = OBP  0xD3AC6B 0 _NStr
+_OCD  :: OCD
+_OCD  = OCD  0xD3EE92 0 _NStr
+_PFC  :: PFC
+_PFC  = PFC  0xD3B288 0 _NStr
+_PGD  :: PGD
+_PGD  = PGD  0xD3A6AF 0 0 0 0 0 0 0 0 0 _NStr
+_PGP  :: PGP
+_PGP  = PGP  0xD3B1AF 0 _NStr
+_PGP1 :: PGP1
+_PGP1 = PGP1 0xD3ACAF 0 _NStr
+_PMC  :: PMC
+_PMC  = PMC  0xD3A7AF 0 _NStr
+_PTD  :: PTD
+_PTD  = PTD  0xD3B19B 0 _NStr
+_PTD1 :: PTD1
+_PTD1 = PTD1 0xD3A69B 0 _NStr
+_PTX  :: PTX
+_PTX  = PTX  0xD3EE9B 0 0 []
+_TLE  :: TLE
+_TLE  = TLE  0xD3A090 0 [] 0 0 0 0 0 0 _NStr
+
diff --git a/src/OpenAFP/Records/AFP/BAG.hs b/src/OpenAFP/Records/AFP/BAG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BAG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BAG where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data BAG = BAG {
+    bag_Type                         :: !N3
+    ,bag_                            :: !N3
+    ,bag                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BBC.hs b/src/OpenAFP/Records/AFP/BBC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BBC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BBC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BBC = BBC {
+    bbc_Type                         :: !N3
+    ,bbc_                            :: !N3
+    ,bbc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BCA.hs b/src/OpenAFP/Records/AFP/BCA.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BCA.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BCA where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BCA = BCA {
+    bca_Type                         :: !N3
+    ,bca_                            :: !N3
+    ,bca                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BCF.hs b/src/OpenAFP/Records/AFP/BCF.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BCF.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BCF where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BCF = BCF {
+    bcf_Type                         :: !N3
+    ,bcf_                            :: !N3
+    ,bcf                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BCP.hs b/src/OpenAFP/Records/AFP/BCP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BCP.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BCP where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BCP = BCP {
+    bcp_Type                         :: !N3
+    ,bcp_                            :: !N3
+    ,bcp                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BDA.hs b/src/OpenAFP/Records/AFP/BDA.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BDA.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BDA where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BDA = BDA {
+    bda_Type                         :: !N3
+    ,bda_                            :: !N3
+    ,bda                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BDD.hs b/src/OpenAFP/Records/AFP/BDD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BDD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BDD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BDD = BDD {
+    bdd_Type                         :: !N3
+    ,bdd_                            :: !N3
+    ,bdd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BDG.hs b/src/OpenAFP/Records/AFP/BDG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BDG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BDG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BDG = BDG {
+    bdg_Type                         :: !N3
+    ,bdg_                            :: !N3
+    ,bdg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BDI.hs b/src/OpenAFP/Records/AFP/BDI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BDI.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BDI where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BDI = BDI {
+    bdi_Type                         :: !N3
+    ,bdi_                            :: !N3
+    ,bdi                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BDM.hs b/src/OpenAFP/Records/AFP/BDM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BDM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BDM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BDM = BDM {
+    bdm_Type                         :: !N3
+    ,bdm_                            :: !N3
+    ,bdm                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BDT.hs b/src/OpenAFP/Records/AFP/BDT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BDT.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BDT where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BDT = BDT {
+    bdt_Type                         :: !N3
+    ,bdt_                            :: !N3
+    ,bdt                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BDX.hs b/src/OpenAFP/Records/AFP/BDX.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BDX.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BDX where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BDX = BDX {
+    bdx_Type                         :: !N3
+    ,bdx_                            :: !N3
+    ,bdx                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BFG.hs b/src/OpenAFP/Records/AFP/BFG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BFG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BFG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BFG = BFG {
+    bfg_Type                         :: !N3
+    ,bfg_                            :: !N3
+    ,bfg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BFM.hs b/src/OpenAFP/Records/AFP/BFM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BFM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BFM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BFM = BFM {
+    bfm_Type                         :: !N3
+    ,bfm_                            :: !N3
+    ,bfm                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BFN.hs b/src/OpenAFP/Records/AFP/BFN.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BFN.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BFN where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BFN = BFN {
+    bfn_Type                         :: !N3
+    ,bfn_                            :: !N3
+    ,bfn                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BGR.hs b/src/OpenAFP/Records/AFP/BGR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BGR.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BGR where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BGR = BGR {
+    bgr_Type                         :: !N3
+    ,bgr_                            :: !N3
+    ,bgr                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BII.hs b/src/OpenAFP/Records/AFP/BII.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BII.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BII where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BII = BII {
+    bii_Type                         :: !N3
+    ,bii_                            :: !N3
+    ,bii_ImageObjectName             :: !A8
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BIM.hs b/src/OpenAFP/Records/AFP/BIM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BIM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BIM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BIM = BIM {
+    bim_Type                         :: !N3
+    ,bim_                            :: !N3
+    ,bim                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BMM.hs b/src/OpenAFP/Records/AFP/BMM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BMM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BMM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BMM = BMM {
+    bmm_Type                         :: !N3
+    ,bmm_                            :: !N3
+    ,bmm                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BMO.hs b/src/OpenAFP/Records/AFP/BMO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BMO.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BMO where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BMO = BMO {
+    bmo_Type                         :: !N3
+    ,bmo_                            :: !N3
+    ,bmo                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BNG.hs b/src/OpenAFP/Records/AFP/BNG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BNG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BNG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BNG = BNG {
+    bng_Type                         :: !N3
+    ,bng_                            :: !N3
+    ,bng                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BOC.hs b/src/OpenAFP/Records/AFP/BOC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BOC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BOC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BOC = BOC {
+    boc_Type                         :: !N3
+    ,boc_                            :: !N3
+    ,boc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BOG.hs b/src/OpenAFP/Records/AFP/BOG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BOG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BOG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BOG = BOG {
+    bog_Type                         :: !N3
+    ,bog_                            :: !N3
+    ,bog                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BPG.hs b/src/OpenAFP/Records/AFP/BPG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BPG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BPG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BPG = BPG {
+    bpg_Type                         :: !N3
+    ,bpg_                            :: !N3
+    ,bpg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BPM.hs b/src/OpenAFP/Records/AFP/BPM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BPM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BPM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BPM = BPM {
+    bpm_Type                         :: !N3
+    ,bpm_                            :: !N3
+    ,bpm                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BPS.hs b/src/OpenAFP/Records/AFP/BPS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BPS.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BPS where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BPS = BPS {
+    bps_Type                         :: !N3
+    ,bps_                            :: !N3
+    ,bps                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BPT.hs b/src/OpenAFP/Records/AFP/BPT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BPT.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BPT where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BPT = BPT {
+    bpt_Type                         :: !N3
+    ,bpt_                            :: !N3
+    ,bpt                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BR.hs b/src/OpenAFP/Records/AFP/BR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BR.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BR where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BR = BR {
+    br_Type                          :: !N3
+    ,br_                             :: !N3
+    ,br                              :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BRG.hs b/src/OpenAFP/Records/AFP/BRG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BRG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BRG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BRG = BRG {
+    brg_Type                         :: !N3
+    ,brg_                            :: !N3
+    ,brg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/BSG.hs b/src/OpenAFP/Records/AFP/BSG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/BSG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.BSG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data BSG = BSG {
+    bsg_Type                         :: !N3
+    ,bsg_                            :: !N3
+    ,bsg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/CAT.hs b/src/OpenAFP/Records/AFP/CAT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/CAT.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.CAT where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data CAT = CAT {
+    cat_Type                         :: !N3
+    ,cat_                            :: !N3
+    ,cat                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/CDD.hs b/src/OpenAFP/Records/AFP/CDD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/CDD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.CDD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data CDD = CDD {
+    cdd_Type                         :: !N3
+    ,cdd_                            :: !N3
+    ,cdd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/CFC.hs b/src/OpenAFP/Records/AFP/CFC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/CFC.hs
@@ -0,0 +1,13 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.CFC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data CFC = CFC {
+    cfc_Type                         :: !N3
+    ,cfc_                            :: !N3
+    ,cfc_CFIRepeatingGroupLength     :: !N1
+    ,cfc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/CFI.hs b/src/OpenAFP/Records/AFP/CFI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/CFI.hs
@@ -0,0 +1,19 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.CFI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data CFI = CFI {
+    cfi_Type                         :: !N3
+    ,cfi_                            :: !N3
+    ,cfi_Data                        :: ![Record CFI_Data]
+} deriving (Show, Typeable)
+
+data CFI_Data = CFI_Data {
+     cfi_FontCharacterSetName        :: !A8
+    ,cfi_CodePageName                :: !A8
+    ,cfi_CodedFontName               :: !A8
+    ,cfi_Section                     :: !N1
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/CPC.hs b/src/OpenAFP/Records/AFP/CPC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/CPC.hs
@@ -0,0 +1,17 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.CPC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data CPC = CPC {
+    cpc_Type                         :: !N3
+    ,cpc_                            :: !N3
+    ,cpc_GCGID                       :: !A8
+    ,cpc_UseFlags                    :: !N1
+    ,cpc_CPIRepeatingGroupLength     :: !N1
+    ,cpc_SpaceCharacterSection       :: !N1
+    ,cpc_UseFlags2                   :: !N1
+    ,cpc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/CPD.hs b/src/OpenAFP/Records/AFP/CPD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/CPD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.CPD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data CPD = CPD {
+    cpd_Type                         :: !N3
+    ,cpd_                            :: !N3
+    ,cpd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/CPI.hs b/src/OpenAFP/Records/AFP/CPI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/CPI.hs
@@ -0,0 +1,18 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.CPI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data CPI = CPI {
+    cpi_Type                         :: !N3
+    ,cpi_                            :: !N3
+    ,cpi_Data                        :: ![Record CPI_Data]
+} deriving (Show, Typeable)
+
+data CPI_Data = CPI_Data {
+     cpi_GCGID                       :: !A8
+    ,cpi_Section                     :: !N1
+    ,cpi_CodePoint                   :: !N1
+} deriving (Show, Typeable)
+ 
diff --git a/src/OpenAFP/Records/AFP/CTC.hs b/src/OpenAFP/Records/AFP/CTC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/CTC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.CTC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data CTC = CTC {
+    ctc_Type                         :: !N3
+    ,ctc_                            :: !N3
+    ,ctc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/DXD.hs b/src/OpenAFP/Records/AFP/DXD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/DXD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.DXD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data DXD = DXD {
+    dxd_Type                         :: !N3
+    ,dxd_                            :: !N3
+    ,dxd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EAG.hs b/src/OpenAFP/Records/AFP/EAG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EAG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EAG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EAG = EAG {
+    eag_Type                         :: !N3
+    ,eag_                            :: !N3
+    ,eag                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EBC.hs b/src/OpenAFP/Records/AFP/EBC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EBC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EBC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EBC = EBC {
+    ebc_Type                         :: !N3
+    ,ebc_                            :: !N3
+    ,ebc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/ECA.hs b/src/OpenAFP/Records/AFP/ECA.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/ECA.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.ECA where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data ECA = ECA {
+    eca_Type                         :: !N3
+    ,eca_                            :: !N3
+    ,eca                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/ECF.hs b/src/OpenAFP/Records/AFP/ECF.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/ECF.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.ECF where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data ECF = ECF {
+    ecf_Type                         :: !N3
+    ,ecf_                            :: !N3
+    ,ecf                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/ECP.hs b/src/OpenAFP/Records/AFP/ECP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/ECP.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.ECP where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data ECP = ECP {
+    ecp_Type                         :: !N3
+    ,ecp_                            :: !N3
+    ,ecp                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EDG.hs b/src/OpenAFP/Records/AFP/EDG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EDG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EDG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EDG = EDG {
+    edg_Type                         :: !N3
+    ,edg_                            :: !N3
+    ,edg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EDI.hs b/src/OpenAFP/Records/AFP/EDI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EDI.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EDI where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EDI = EDI {
+    edi_Type                         :: !N3
+    ,edi_                            :: !N3
+    ,edi                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EDM.hs b/src/OpenAFP/Records/AFP/EDM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EDM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EDM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EDM = EDM {
+    edm_Type                         :: !N3
+    ,edm_                            :: !N3
+    ,edm                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EDT.hs b/src/OpenAFP/Records/AFP/EDT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EDT.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EDT where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EDT = EDT {
+    edt_Type                         :: !N3
+    ,edt_                            :: !N3
+    ,edt                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EDX.hs b/src/OpenAFP/Records/AFP/EDX.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EDX.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EDX where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EDX = EDX {
+    edx_Type                         :: !N3
+    ,edx_                            :: !N3
+    ,edx                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EFG.hs b/src/OpenAFP/Records/AFP/EFG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EFG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EFG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EFG = EFG {
+    efg_Type                         :: !N3
+    ,efg_                            :: !N3
+    ,efg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EFM.hs b/src/OpenAFP/Records/AFP/EFM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EFM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EFM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EFM = EFM {
+    efm_Type                         :: !N3
+    ,efm_                            :: !N3
+    ,efm                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EFN.hs b/src/OpenAFP/Records/AFP/EFN.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EFN.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EFN where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EFN = EFN {
+    efn_Type                         :: !N3
+    ,efn_                            :: !N3
+    ,efn                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EGR.hs b/src/OpenAFP/Records/AFP/EGR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EGR.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EGR where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EGR = EGR {
+    egr_Type                         :: !N3
+    ,egr_                            :: !N3
+    ,egr                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EII.hs b/src/OpenAFP/Records/AFP/EII.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EII.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EII where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EII = EII {
+    eii_Type                         :: !N3
+    ,eii_                            :: !N3
+    ,eii_ImageObjectName             :: !A8
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EIM.hs b/src/OpenAFP/Records/AFP/EIM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EIM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EIM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EIM = EIM {
+    eim_Type                         :: !N3
+    ,eim_                            :: !N3
+    ,eim                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EMM.hs b/src/OpenAFP/Records/AFP/EMM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EMM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EMM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EMM = EMM {
+    emm_Type                         :: !N3
+    ,emm_                            :: !N3
+    ,emm                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EMO.hs b/src/OpenAFP/Records/AFP/EMO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EMO.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EMO where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EMO = EMO {
+    emo_Type                         :: !N3
+    ,emo_                            :: !N3
+    ,emo                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/ENG.hs b/src/OpenAFP/Records/AFP/ENG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/ENG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.ENG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data ENG = ENG {
+    eng_Type                         :: !N3
+    ,eng_                            :: !N3
+    ,eng                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EOC.hs b/src/OpenAFP/Records/AFP/EOC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EOC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EOC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EOC = EOC {
+    eoc_Type                         :: !N3
+    ,eoc_                            :: !N3
+    ,eoc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EOG.hs b/src/OpenAFP/Records/AFP/EOG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EOG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EOG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EOG = EOG {
+    eog_Type                         :: !N3
+    ,eog_                            :: !N3
+    ,eog                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EPG.hs b/src/OpenAFP/Records/AFP/EPG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EPG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EPG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EPG = EPG {
+    epg_Type                         :: !N3
+    ,epg_                            :: !N3
+    ,epg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EPM.hs b/src/OpenAFP/Records/AFP/EPM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EPM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EPM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EPM = EPM {
+    epm_Type                         :: !N3
+    ,epm_                            :: !N3
+    ,epm                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EPS.hs b/src/OpenAFP/Records/AFP/EPS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EPS.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EPS where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EPS = EPS {
+    eps_Type                         :: !N3
+    ,eps_                            :: !N3
+    ,eps                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/EPT.hs b/src/OpenAFP/Records/AFP/EPT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/EPT.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.EPT where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data EPT = EPT {
+    ept_Type                         :: !N3
+    ,ept_                            :: !N3
+    ,ept                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/ER.hs b/src/OpenAFP/Records/AFP/ER.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/ER.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.ER where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data ER = ER {
+    er_Type                          :: !N3
+    ,er_                             :: !N3
+    ,er                              :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/ERG.hs b/src/OpenAFP/Records/AFP/ERG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/ERG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.ERG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data ERG = ERG {
+    erg_Type                         :: !N3
+    ,erg_                            :: !N3
+    ,erg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/ESG.hs b/src/OpenAFP/Records/AFP/ESG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/ESG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.ESG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data ESG = ESG {
+    esg_Type                         :: !N3
+    ,esg_                            :: !N3
+    ,esg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/FGD.hs b/src/OpenAFP/Records/AFP/FGD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/FGD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.FGD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data FGD = FGD {
+    fgd_Type                         :: !N3
+    ,fgd_                            :: !N3
+    ,fgd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/FNC.hs b/src/OpenAFP/Records/AFP/FNC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/FNC.hs
@@ -0,0 +1,30 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.FNC where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+--- XXX - not parsed completely - see FNC.pm
+ 
+data FNC = FNC {
+    fnc_Type                         :: !N3
+    ,fnc_                            :: !N3
+    ,fnc_Constant                    :: !A1
+    ,fnc_PatternTechnologyIdentifier :: !N1
+    ,fnc_FNCReserved1                :: !A1
+    ,fnc_UseFlags                    :: !N1
+    ,fnc_UnitXBase                   :: !N1
+    ,fnc_UnitYBase                   :: !N1
+    ,fnc_UnitXValue                  :: !N2
+    ,fnc_UnitYValue                  :: !N2
+    ,fnc_MaxWidth                    :: !N2
+    ,fnc_MaxHeight                   :: !N2
+    ,fnc_FNORepeatingGroupLength     :: !N1
+    ,fnc_FNIRepeatingGroupLength     :: !N1
+    ,fnc_PatternDataAlignmentCode    :: !N1
+    ,fnc_PatternDataCount1           :: !A3
+    ,fnc_FNPRepeatingGroupLength     :: !N1
+    ,fnc_FNMRepeatingGroupLength     :: !N1
+    ,fnc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/FND.hs b/src/OpenAFP/Records/AFP/FND.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/FND.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.FND where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data FND = FND {
+    fnd_Type                         :: !N3
+    ,fnd_                            :: !N3
+    ,fnd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/FNG.hs b/src/OpenAFP/Records/AFP/FNG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/FNG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.FNG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data FNG = FNG {
+    fng_Type                         :: !N3
+    ,fng_                            :: !N3
+    ,fng                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/FNI.hs b/src/OpenAFP/Records/AFP/FNI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/FNI.hs
@@ -0,0 +1,26 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.FNI where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data FNI = FNI {
+    fni_Type                         :: !N3
+    ,fni_                            :: !N3
+    ,fni_Data                        :: ![Record FNI_Data]
+} deriving (Show, Typeable)
+
+data FNI_Data = FNI_Data {
+     fni_GCGID                       :: !A8
+    ,fni_CharacterIncrement          :: !N2
+    ,fni_AscendHeight                :: !I2
+    ,fni_DescendDepth                :: !I2
+    ,fni_Reserved1                   :: !N2
+    ,fni_FNMCount                    :: !N2
+    ,fni_ASpace                      :: !I2
+    ,fni_BSpace                      :: !N2
+    ,fni_CSpace                      :: !I2
+    ,fni_Reserved2                   :: !N2
+    ,fni_BaseOffset                  :: !I2
+} deriving (Show, Typeable)
+ 
diff --git a/src/OpenAFP/Records/AFP/FNM.hs b/src/OpenAFP/Records/AFP/FNM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/FNM.hs
@@ -0,0 +1,18 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.FNM where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data FNM = FNM {
+    fnm_Type                         :: !N3
+    ,fnm_                            :: !N3
+    ,fnm_Data                        :: ![Record FNM_Data]
+} deriving (Show, Typeable)
+
+data FNM_Data = FNM_Data {
+     fnm_Width                       :: !N2
+    ,fnm_Height                      :: !N2
+    ,fnm_Offset                      :: !N4
+} deriving (Show, Typeable)
+ 
diff --git a/src/OpenAFP/Records/AFP/FNN.hs b/src/OpenAFP/Records/AFP/FNN.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/FNN.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.FNN where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data FNN = FNN {
+    fnn_Type                         :: !N3
+    ,fnn_                            :: !N3
+    ,fnn                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/FNO.hs b/src/OpenAFP/Records/AFP/FNO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/FNO.hs
@@ -0,0 +1,17 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.FNO where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data FNO = FNO {
+    fno_Type                         :: !N3
+    ,fno_                            :: !N3
+    ,fno_Reserved                    :: !N2
+    ,fno_CharacterRotation           :: !N2
+    ,fno_MaxBaseOffset               :: !N2
+    ,fno_MaxCharacterIncrement       :: !N2
+    ,fno_SpaceCharacterIncrement     :: !N2
+    ,fno                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/FNP.hs b/src/OpenAFP/Records/AFP/FNP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/FNP.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.FNP where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data FNP = FNP {
+    fnp_Type                         :: !N3
+    ,fnp_                            :: !N3
+    ,fnp                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/GAD.hs b/src/OpenAFP/Records/AFP/GAD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/GAD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.GAD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data GAD = GAD {
+    gad_Type                         :: !N3
+    ,gad_                            :: !N3
+    ,gad                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/GDD.hs b/src/OpenAFP/Records/AFP/GDD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/GDD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.GDD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data GDD = GDD {
+    gdd_Type                         :: !N3
+    ,gdd_                            :: !N3
+    ,gdd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/ICP.hs b/src/OpenAFP/Records/AFP/ICP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/ICP.hs
@@ -0,0 +1,17 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.ICP where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data ICP = ICP {
+    icp_Type                         :: !N3
+    ,icp_                            :: !N3
+    ,icp_XCellOffset                 :: !N2
+    ,icp_YCellOffset                 :: !N2
+    ,icp_XCellSize                   :: !N2
+    ,icp_YCellSize                   :: !N2
+    ,icp_XFillSize                   :: !N2
+    ,icp_YFillSize                   :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IDD.hs b/src/OpenAFP/Records/AFP/IDD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IDD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IDD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IDD = IDD {
+    idd_Type                         :: !N3
+    ,idd_                            :: !N3
+    ,idd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IEL.hs b/src/OpenAFP/Records/AFP/IEL.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IEL.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IEL where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IEL = IEL {
+    iel_Type                         :: !N3
+    ,iel_                            :: !N3
+    ,iel                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IID.hs b/src/OpenAFP/Records/AFP/IID.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IID.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IID where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IID = IID {
+    iid_Type                         :: !N3
+    ,iid_                            :: !N3
+    ,iid_ConstantData1               :: !A12
+    ,iid_XBase                       :: !N1
+    ,iid_YBase                       :: !N1
+    ,iid_XUnits                      :: !N2
+    ,iid_YUnits                      :: !N2
+    ,iid_XSize                       :: !N2
+    ,iid_YSize                       :: !N2
+    ,iid_ConstantData2               :: !A6
+    ,iid_XCellSizeDefault            :: !N2
+    ,iid_YCellSizeDefault            :: !N2
+    ,iid_ConstantData3               :: !A1
+    ,iid_Color                       :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IMM.hs b/src/OpenAFP/Records/AFP/IMM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IMM.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IMM where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IMM = IMM {
+    imm_Type                         :: !N3
+    ,imm_                            :: !N3
+    ,imm                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IOB.hs b/src/OpenAFP/Records/AFP/IOB.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IOB.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IOB where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IOB = IOB {
+    iob_Type                         :: !N3
+    ,iob_                            :: !N3
+    ,iob                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IOC.hs b/src/OpenAFP/Records/AFP/IOC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IOC.hs
@@ -0,0 +1,21 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IOC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IOC = IOC {
+    ioc_Type                         :: !N3
+    ,ioc_                            :: !N3
+    ,ioc_Reserved1                   :: !A1
+    ,ioc_XOffset                     :: !N2
+    ,ioc_Reserved2                   :: !A1
+    ,ioc_YOffset                     :: !N2
+    ,ioc_XOrientation                :: !N2
+    ,ioc_YOrientation                :: !N2
+    ,ioc_ConstantData1               :: !A8
+    ,ioc_XMap                        :: !N2
+    ,ioc_YMap                        :: !N2
+    ,ioc_ConstantData2               :: !A2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IPD.hs b/src/OpenAFP/Records/AFP/IPD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IPD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IPD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IPD = IPD {
+    ipd_Type                         :: !N3
+    ,ipd_                            :: !N3
+    ,ipd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IPG.hs b/src/OpenAFP/Records/AFP/IPG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IPG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IPG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IPG = IPG {
+    ipg_Type                         :: !N3
+    ,ipg_                            :: !N3
+    ,ipg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IPO.hs b/src/OpenAFP/Records/AFP/IPO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IPO.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IPO where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IPO = IPO {
+    ipo_Type                         :: !N3
+    ,ipo_                            :: !N3
+    ,ipo                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IPS.hs b/src/OpenAFP/Records/AFP/IPS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IPS.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IPS where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IPS = IPS {
+    ips_Type                         :: !N3
+    ,ips_                            :: !N3
+    ,ips                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/IRD.hs b/src/OpenAFP/Records/AFP/IRD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/IRD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.IRD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data IRD = IRD {
+    ird_Type                         :: !N3
+    ,ird_                            :: !N3
+    ,ird_ImageData                   :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/LLE.hs b/src/OpenAFP/Records/AFP/LLE.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/LLE.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.LLE where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data LLE = LLE {
+    lle_Type                         :: !N3
+    ,lle_                            :: !N3
+    ,lle                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/LNC.hs b/src/OpenAFP/Records/AFP/LNC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/LNC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.LNC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data LNC = LNC {
+    lnc_Type                         :: !N3
+    ,lnc_                            :: !N3
+    ,lnc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/LND.hs b/src/OpenAFP/Records/AFP/LND.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/LND.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.LND where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data LND = LND {
+    lnd_Type                         :: !N3
+    ,lnd_                            :: !N3
+    ,lnd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MBC.hs b/src/OpenAFP/Records/AFP/MBC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MBC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MBC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MBC = MBC {
+    mbc_Type                         :: !N3
+    ,mbc_                            :: !N3
+    ,mbc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MCA.hs b/src/OpenAFP/Records/AFP/MCA.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MCA.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MCA where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MCA = MCA {
+    mca_Type                         :: !N3
+    ,mca_                            :: !N3
+    ,mca                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MCC.hs b/src/OpenAFP/Records/AFP/MCC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MCC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MCC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MCC = MCC {
+    mcc_Type                         :: !N3
+    ,mcc_                            :: !N3
+    ,mcc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MCD.hs b/src/OpenAFP/Records/AFP/MCD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MCD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MCD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MCD = MCD {
+    mcd_Type                         :: !N3
+    ,mcd_                            :: !N3
+    ,mcd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MCF.hs b/src/OpenAFP/Records/AFP/MCF.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MCF.hs
@@ -0,0 +1,14 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MCF where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+newtype MCF_ = MCF_ (N0, Buffer2) deriving (Show, Typeable)
+
+data MCF = MCF {
+    mcf_Type                         :: !N3
+    ,mcf_                            :: !N3
+    ,mcf_Chunks                      :: ![MCF_]
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MCF1.hs b/src/OpenAFP/Records/AFP/MCF1.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MCF1.hs
@@ -0,0 +1,25 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MCF1 where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data MCF1_Data = MCF1_Data {
+     mcf1_CodedFontLocalId             :: !N1
+    ,mcf1_Reserved1                    :: !A1
+    ,mcf1_CodedFontResourceSectionId   :: !N1
+    ,mcf1_Reserved2                    :: !A1
+    ,mcf1_CodedFontName                :: !A8
+    ,mcf1_CodePageName                 :: !A8
+    ,mcf1_FontCharacterSetName         :: !A8
+    ,mcf1_CharacterRotation            :: !N2
+} deriving (Show, Typeable)
+
+data MCF1 = MCF1 {
+    mcf1_Type                        :: !N3
+    ,mcf1_                           :: !N3
+    ,mcf1_RepeatingGroupLength       :: !N1
+    ,mcf1__                          :: !A3
+    ,mcf1_Data                       :: ![Record MCF1_Data]
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MDD.hs b/src/OpenAFP/Records/AFP/MDD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MDD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MDD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MDD = MDD {
+    mdd_Type                         :: !N3
+    ,mdd_                            :: !N3
+    ,mdd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MDR.hs b/src/OpenAFP/Records/AFP/MDR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MDR.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MDR where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MDR = MDR {
+    mdr_Type                         :: !N3
+    ,mdr_                            :: !N3
+    ,mdr                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MFC.hs b/src/OpenAFP/Records/AFP/MFC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MFC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MFC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MFC = MFC {
+    mfc_Type                         :: !N3
+    ,mfc_                            :: !N3
+    ,mfc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MGO.hs b/src/OpenAFP/Records/AFP/MGO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MGO.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MGO where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MGO = MGO {
+    mgo_Type                         :: !N3
+    ,mgo_                            :: !N3
+    ,mgo                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MIO.hs b/src/OpenAFP/Records/AFP/MIO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MIO.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MIO where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MIO = MIO {
+    mio_Type                         :: !N3
+    ,mio_                            :: !N3
+    ,mio                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MMC.hs b/src/OpenAFP/Records/AFP/MMC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MMC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MMC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MMC = MMC {
+    mmc_Type                         :: !N3
+    ,mmc_                            :: !N3
+    ,mmc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MMO.hs b/src/OpenAFP/Records/AFP/MMO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MMO.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MMO where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MMO = MMO {
+    mmo_Type                         :: !N3
+    ,mmo_                            :: !N3
+    ,mmo                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MMT.hs b/src/OpenAFP/Records/AFP/MMT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MMT.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MMT where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MMT = MMT {
+    mmt_Type                         :: !N3
+    ,mmt_                            :: !N3
+    ,mmt                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MPG.hs b/src/OpenAFP/Records/AFP/MPG.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MPG.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MPG where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MPG = MPG {
+    mpg_Type                         :: !N3
+    ,mpg_                            :: !N3
+    ,mpg                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MPO.hs b/src/OpenAFP/Records/AFP/MPO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MPO.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MPO where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MPO = MPO {
+    mpo_Type                         :: !N3
+    ,mpo_                            :: !N3
+    ,mpo                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MPS.hs b/src/OpenAFP/Records/AFP/MPS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MPS.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MPS where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MPS = MPS {
+    mps_Type                         :: !N3
+    ,mps_                            :: !N3
+    ,mps                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/MSU.hs b/src/OpenAFP/Records/AFP/MSU.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/MSU.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.MSU where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data MSU = MSU {
+    msu_Type                         :: !N3
+    ,msu_                            :: !N3
+    ,msu                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/NOP.hs b/src/OpenAFP/Records/AFP/NOP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/NOP.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.NOP where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data NOP = NOP {
+    nop_Type                         :: !N3
+    ,nop_                            :: !N3
+    ,nop                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/OBD.hs b/src/OpenAFP/Records/AFP/OBD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/OBD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.OBD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data OBD = OBD {
+    obd_Type                         :: !N3
+    ,obd_                            :: !N3
+    ,obd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/OBP.hs b/src/OpenAFP/Records/AFP/OBP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/OBP.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.OBP where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data OBP = OBP {
+    obp_Type                         :: !N3
+    ,obp_                            :: !N3
+    ,obp                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/OCD.hs b/src/OpenAFP/Records/AFP/OCD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/OCD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.OCD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data OCD = OCD {
+    ocd_Type                         :: !N3
+    ,ocd_                            :: !N3
+    ,ocd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/PFC.hs b/src/OpenAFP/Records/AFP/PFC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/PFC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.PFC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data PFC = PFC {
+    pfc_Type                         :: !N3
+    ,pfc_                            :: !N3
+    ,pfc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/PGD.hs b/src/OpenAFP/Records/AFP/PGD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/PGD.hs
@@ -0,0 +1,20 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.PGD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data PGD = PGD {
+    pgd_Type                         :: !N3
+    ,pgd_                            :: !N3
+    ,pgd_XUnitBase                   :: !N1
+    ,pgd_YUnitBase                   :: !N1
+    ,pgd_XLUnitsperUnitBase          :: !N2
+    ,pgd_YLUnitsperUnitBase          :: !N2
+    ,pgd_Reserved1                   :: !N1
+    ,pgd_XPageSize                   :: !N2
+    ,pgd_Reserved2                   :: !N1
+    ,pgd_YPageSize                   :: !N2
+    ,pgd__                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/PGP.hs b/src/OpenAFP/Records/AFP/PGP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/PGP.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.PGP where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data PGP = PGP {
+    pgp_Type                         :: !N3
+    ,pgp_                            :: !N3
+    ,pgp                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/PGP1.hs b/src/OpenAFP/Records/AFP/PGP1.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/PGP1.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.PGP1 where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data PGP1 = PGP1 {
+    pgp1_Type                        :: !N3
+    ,pgp1_                           :: !N3
+    ,pgp1                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/PMC.hs b/src/OpenAFP/Records/AFP/PMC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/PMC.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.PMC where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data PMC = PMC {
+    pmc_Type                         :: !N3
+    ,pmc_                            :: !N3
+    ,pmc                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/PTD.hs b/src/OpenAFP/Records/AFP/PTD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/PTD.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.PTD where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data PTD = PTD {
+    ptd_Type                         :: !N3
+    ,ptd_                            :: !N3
+    ,ptd                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/PTD1.hs b/src/OpenAFP/Records/AFP/PTD1.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/PTD1.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.PTD1 where
+import OpenAFP.Types
+import OpenAFP.Internals
+ 
+data PTD1 = PTD1 {
+    ptd1_Type                        :: !N3
+    ,ptd1_                           :: !N3
+    ,ptd1                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/PTX.hs b/src/OpenAFP/Records/AFP/PTX.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/PTX.hs
@@ -0,0 +1,15 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.PTX where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+newtype PTX_ = PTX_ (N1, Buffer1) deriving (Show, Typeable)
+
+data PTX = PTX {
+    ptx_Type                         :: !N3
+    ,ptx_                            :: !N3
+    ,ptx_EscapeSequence              :: !N2
+    ,ptx_Chunks                      :: ![PTX_]
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/AFP/TLE.hs b/src/OpenAFP/Records/AFP/TLE.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/AFP/TLE.hs
@@ -0,0 +1,19 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+
+module OpenAFP.Records.AFP.TLE where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data TLE = TLE {
+    tle_Type                         :: !N3
+    ,tle_                            :: !N3
+    ,tle_Chunks                      :: ![T_]
+    ,tle_XUnitBase                   :: !N1
+    ,tle_YUnitBase                   :: !N1
+    ,tle_XLUnitsperUnitBase          :: !N2
+    ,tle_YLUnitsperUnitBase          :: !N2
+    ,tle_XPageSize                   :: !N3
+    ,tle_YPageSize                   :: !N3
+    ,tle__                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/MCF.hs b/src/OpenAFP/Records/MCF.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/MCF.hs
@@ -0,0 +1,9 @@
+module OpenAFP.Records.MCF (
+    module OpenAFP.Records.MCF.T, _MCF_T,
+) where
+import OpenAFP.Types
+import OpenAFP.Records.MCF.T
+
+_MCF_T :: MCF_T
+_MCF_T = MCF_T []
+
diff --git a/src/OpenAFP/Records/MCF/T.hs b/src/OpenAFP/Records/MCF/T.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/MCF/T.hs
@@ -0,0 +1,9 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.MCF.T where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data MCF_T = MCF_T {
+    mcf_t_Chunks                  :: ![T_]
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX.hs b/src/OpenAFP/Records/PTX.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX.hs
@@ -0,0 +1,81 @@
+module OpenAFP.Records.PTX (
+    module OpenAFP.Records.PTX.AMB, _PTX_AMB,
+    module OpenAFP.Records.PTX.AMI, _PTX_AMI,
+    module OpenAFP.Records.PTX.BLN, _PTX_BLN,
+    module OpenAFP.Records.PTX.BSU, _PTX_BSU,
+    module OpenAFP.Records.PTX.DBR, _PTX_DBR,
+    module OpenAFP.Records.PTX.DIR, _PTX_DIR,
+    module OpenAFP.Records.PTX.ESU, _PTX_ESU,
+    module OpenAFP.Records.PTX.NOP, _PTX_NOP,
+    module OpenAFP.Records.PTX.RMB, _PTX_RMB,
+    module OpenAFP.Records.PTX.RMI, _PTX_RMI,
+    module OpenAFP.Records.PTX.RPS, _PTX_RPS,
+    module OpenAFP.Records.PTX.SBI, _PTX_SBI,
+    module OpenAFP.Records.PTX.SCFL, _PTX_SCFL,
+    module OpenAFP.Records.PTX.SIA, _PTX_SIA,
+    module OpenAFP.Records.PTX.SIM, _PTX_SIM,
+    module OpenAFP.Records.PTX.STC, _PTX_STC,
+    module OpenAFP.Records.PTX.STO, _PTX_STO,
+    module OpenAFP.Records.PTX.SVI, _PTX_SVI,
+    module OpenAFP.Records.PTX.TRN, _PTX_TRN,
+) where
+import OpenAFP.Types
+import OpenAFP.Records.PTX.AMB
+import OpenAFP.Records.PTX.AMI
+import OpenAFP.Records.PTX.BLN
+import OpenAFP.Records.PTX.BSU
+import OpenAFP.Records.PTX.DBR
+import OpenAFP.Records.PTX.DIR
+import OpenAFP.Records.PTX.ESU
+import OpenAFP.Records.PTX.NOP
+import OpenAFP.Records.PTX.RMB
+import OpenAFP.Records.PTX.RMI
+import OpenAFP.Records.PTX.RPS
+import OpenAFP.Records.PTX.SBI
+import OpenAFP.Records.PTX.SCFL
+import OpenAFP.Records.PTX.SIA
+import OpenAFP.Records.PTX.SIM
+import OpenAFP.Records.PTX.STC
+import OpenAFP.Records.PTX.STO
+import OpenAFP.Records.PTX.SVI
+import OpenAFP.Records.PTX.TRN
+
+_PTX_AMB :: PTX_AMB
+_PTX_AMB = PTX_AMB 0xD2 0
+_PTX_AMI :: PTX_AMI
+_PTX_AMI = PTX_AMI 0xC6 0
+_PTX_BLN :: PTX_BLN
+_PTX_BLN = PTX_BLN 0xD8 _NStr
+_PTX_BSU :: PTX_BSU
+_PTX_BSU = PTX_BSU 0xF2 _NStr
+_PTX_DBR :: PTX_DBR
+_PTX_DBR = PTX_DBR 0xE6 _NStr
+_PTX_DIR :: PTX_DIR
+_PTX_DIR = PTX_DIR 0xE4 _NStr
+_PTX_ESU :: PTX_ESU
+_PTX_ESU = PTX_ESU 0xF4 _NStr
+_PTX_NOP :: PTX_NOP
+_PTX_NOP = PTX_NOP 0xF8 _NStr
+_PTX_RMB :: PTX_RMB
+_PTX_RMB = PTX_RMB 0xD4 0
+_PTX_RMI :: PTX_RMI
+_PTX_RMI = PTX_RMI 0xC8 0
+_PTX_RPS :: PTX_RPS
+_PTX_RPS = PTX_RPS 0xEE _NStr
+_PTX_SBI :: PTX_SBI
+_PTX_SBI = PTX_SBI 0xD0 0
+_PTX_SCFL :: PTX_SCFL
+_PTX_SCFL = PTX_SCFL 0xF0 0
+_PTX_SIA :: PTX_SIA
+_PTX_SIA = PTX_SIA 0xC2 0
+_PTX_SIM :: PTX_SIM
+_PTX_SIM = PTX_SIM 0xC0 0
+_PTX_STC :: PTX_STC
+_PTX_STC = PTX_STC 0x74 _NStr
+_PTX_STO :: PTX_STO
+_PTX_STO = PTX_STO 0xF6 0 0
+_PTX_SVI :: PTX_SVI
+_PTX_SVI = PTX_SVI 0xC4 0
+_PTX_TRN :: PTX_TRN
+_PTX_TRN = PTX_TRN 0xDA _NStr
+
diff --git a/src/OpenAFP/Records/PTX/AMB.hs b/src/OpenAFP/Records/PTX/AMB.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/AMB.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.AMB where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_AMB = PTX_AMB {
+    ptx_amb_Type                     :: !N1
+    ,ptx_amb                         :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/AMI.hs b/src/OpenAFP/Records/PTX/AMI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/AMI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.AMI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_AMI = PTX_AMI {
+    ptx_ami_Type                     :: !N1
+    ,ptx_ami                         :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/BLN.hs b/src/OpenAFP/Records/PTX/BLN.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/BLN.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.BLN where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_BLN = PTX_BLN {
+    ptx_bln_Type                     :: !N1
+    ,ptx_bln                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/BSU.hs b/src/OpenAFP/Records/PTX/BSU.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/BSU.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.BSU where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_BSU = PTX_BSU {
+    ptx_bsu_Type                     :: !N1
+    ,ptx_bsu                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/DBR.hs b/src/OpenAFP/Records/PTX/DBR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/DBR.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.DBR where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_DBR = PTX_DBR {
+    ptx_dbr_Type                     :: !N1
+    ,ptx_dbr                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/DIR.hs b/src/OpenAFP/Records/PTX/DIR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/DIR.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.DIR where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_DIR = PTX_DIR {
+    ptx_dir_Type                     :: !N1
+    ,ptx_dir                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/ESU.hs b/src/OpenAFP/Records/PTX/ESU.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/ESU.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.ESU where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_ESU = PTX_ESU {
+    ptx_esu_Type                     :: !N1
+    ,ptx_esu                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/NOP.hs b/src/OpenAFP/Records/PTX/NOP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/NOP.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.NOP where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_NOP = PTX_NOP {
+    ptx_nop_Type                     :: !N1
+    ,ptx_nop                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/RMB.hs b/src/OpenAFP/Records/PTX/RMB.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/RMB.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.RMB where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_RMB = PTX_RMB {
+    ptx_rmb_Type                     :: !N1
+    ,ptx_rmb                         :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/RMI.hs b/src/OpenAFP/Records/PTX/RMI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/RMI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.RMI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_RMI = PTX_RMI {
+    ptx_rmi_Type                     :: !N1
+    ,ptx_rmi                         :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/RPS.hs b/src/OpenAFP/Records/PTX/RPS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/RPS.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.RPS where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_RPS = PTX_RPS {
+    ptx_rps_Type                     :: !N1
+    ,ptx_rps                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/SBI.hs b/src/OpenAFP/Records/PTX/SBI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/SBI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.SBI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_SBI = PTX_SBI {
+    ptx_sbi_Type                     :: !N1
+    ,ptx_sbi                         :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/SCFL.hs b/src/OpenAFP/Records/PTX/SCFL.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/SCFL.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.SCFL where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_SCFL = PTX_SCFL {
+    ptx_scfl_Type                    :: !N1
+    ,ptx_scfl                        :: !N1
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/SIA.hs b/src/OpenAFP/Records/PTX/SIA.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/SIA.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.SIA where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_SIA = PTX_SIA {
+    ptx_sia_Type                     :: !N1
+    ,ptx_sia                         :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/SIM.hs b/src/OpenAFP/Records/PTX/SIM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/SIM.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.SIM where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_SIM = PTX_SIM {
+    ptx_sim_Type                     :: !N1
+    ,ptx_sim                         :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/STC.hs b/src/OpenAFP/Records/PTX/STC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/STC.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.STC where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_STC = PTX_STC {
+    ptx_stc_Type                     :: !N1
+    ,ptx_stc                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/STO.hs b/src/OpenAFP/Records/PTX/STO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/STO.hs
@@ -0,0 +1,11 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.STO where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_STO = PTX_STO {
+    ptx_sto_Type                     :: !N1
+    ,ptx_sto_Orientation             :: !N2
+    ,ptx_sto_WrapDirection           :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/SVI.hs b/src/OpenAFP/Records/PTX/SVI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/SVI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.SVI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_SVI = PTX_SVI {
+    ptx_svi_Type                     :: !N1
+    ,ptx_svi                         :: !N2
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/PTX/TRN.hs b/src/OpenAFP/Records/PTX/TRN.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/PTX/TRN.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.PTX.TRN where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data PTX_TRN = PTX_TRN {
+    ptx_trn_Type                     :: !N1
+    ,ptx_trn                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T.hs b/src/OpenAFP/Records/T.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T.hs
@@ -0,0 +1,233 @@
+module OpenAFP.Records.T (
+    module OpenAFP.Records.T.AD, _T_AD,
+    module OpenAFP.Records.T.AQ, _T_AQ,
+    module OpenAFP.Records.T.AV, _T_AV,
+    module OpenAFP.Records.T.C, _T_C,
+    module OpenAFP.Records.T.CF, _T_CF,
+    module OpenAFP.Records.T.CGCSGI, _T_CGCSGI,
+    module OpenAFP.Records.T.CR, _T_CR,
+    module OpenAFP.Records.T.CS, _T_CS,
+    module OpenAFP.Records.T.DP, _T_DP,
+    module OpenAFP.Records.T.EF, _T_EF,
+    module OpenAFP.Records.T.ERLI, _T_ERLI,
+    module OpenAFP.Records.T.ESI, _T_ESI,
+    module OpenAFP.Records.T.FCGCSGI, _T_FCGCSGI,
+    module OpenAFP.Records.T.FDS, _T_FDS,
+    module OpenAFP.Records.T.FF, _T_FF,
+    module OpenAFP.Records.T.FHSF, _T_FHSF,
+    module OpenAFP.Records.T.FO, _T_FO,
+    module OpenAFP.Records.T.FQN, _T_FQN,
+    module OpenAFP.Records.T.FRMT, _T_FRMT,
+    module OpenAFP.Records.T.II, _T_II,
+    module OpenAFP.Records.T.LDOPM, _T_LDOPM,
+    module OpenAFP.Records.T.LDTS, _T_LDTS,
+    module OpenAFP.Records.T.MA, _T_MA,
+    module OpenAFP.Records.T.MEC, _T_MEC,
+    module OpenAFP.Records.T.MF, _T_MF,
+    module OpenAFP.Records.T.MIS, _T_MIS,
+    module OpenAFP.Records.T.MMPN, _T_MMPN,
+    module OpenAFP.Records.T.MO, _T_MO,
+    module OpenAFP.Records.T.MOR, _T_MOR,
+    module OpenAFP.Records.T.OAMU, _T_OAMU,
+    module OpenAFP.Records.T.OAS, _T_OAS,
+    module OpenAFP.Records.T.OBE, _T_OBE,
+    module OpenAFP.Records.T.OBO, _T_OBO,
+    module OpenAFP.Records.T.OCH, _T_OCH,
+    module OpenAFP.Records.T.OCL, _T_OCL,
+    module OpenAFP.Records.T.OCO, _T_OCO,
+    module OpenAFP.Records.T.OFSS, _T_OFSS,
+    module OpenAFP.Records.T.OO, _T_OO,
+    module OpenAFP.Records.T.OOI, _T_OOI,
+    module OpenAFP.Records.T.OSFE, _T_OSFE,
+    module OpenAFP.Records.T.OSFO, _T_OSFO,
+    module OpenAFP.Records.T.PC, _T_PC,
+    module OpenAFP.Records.T.POCP, _T_POCP,
+    module OpenAFP.Records.T.PPI, _T_PPI,
+    module OpenAFP.Records.T.PSMR, _T_PSMR,
+    module OpenAFP.Records.T.PSRM, _T_PSRM,
+    module OpenAFP.Records.T.PV, _T_PV,
+    module OpenAFP.Records.T.RLI, _T_RLI,
+    module OpenAFP.Records.T.ROI, _T_ROI,
+    module OpenAFP.Records.T.ROT, _T_ROT,
+    module OpenAFP.Records.T.RSN, _T_RSN,
+    module OpenAFP.Records.T.RUA, _T_RUA,
+    module OpenAFP.Records.T.T1CRMT, _T_T1CRMT,
+    module OpenAFP.Records.T.T2FRMT, _T_T2FRMT,
+    module OpenAFP.Records.T.TO, _T_TO,
+    module OpenAFP.Records.T.TS, _T_TS,
+    module OpenAFP.Records.T.UDTS, _T_UDTS,
+) where
+import OpenAFP.Types
+import OpenAFP.Records.T.AD
+import OpenAFP.Records.T.AQ
+import OpenAFP.Records.T.AV
+import OpenAFP.Records.T.C
+import OpenAFP.Records.T.CF
+import OpenAFP.Records.T.CGCSGI
+import OpenAFP.Records.T.CR
+import OpenAFP.Records.T.CS
+import OpenAFP.Records.T.DP
+import OpenAFP.Records.T.EF
+import OpenAFP.Records.T.ERLI
+import OpenAFP.Records.T.ESI
+import OpenAFP.Records.T.FCGCSGI
+import OpenAFP.Records.T.FDS
+import OpenAFP.Records.T.FF
+import OpenAFP.Records.T.FHSF
+import OpenAFP.Records.T.FO
+import OpenAFP.Records.T.FQN
+import OpenAFP.Records.T.FRMT
+import OpenAFP.Records.T.II
+import OpenAFP.Records.T.LDOPM
+import OpenAFP.Records.T.LDTS
+import OpenAFP.Records.T.MA
+import OpenAFP.Records.T.MEC
+import OpenAFP.Records.T.MF
+import OpenAFP.Records.T.MIS
+import OpenAFP.Records.T.MMPN
+import OpenAFP.Records.T.MO
+import OpenAFP.Records.T.MOR
+import OpenAFP.Records.T.OAMU
+import OpenAFP.Records.T.OAS
+import OpenAFP.Records.T.OBE
+import OpenAFP.Records.T.OBO
+import OpenAFP.Records.T.OCH
+import OpenAFP.Records.T.OCL
+import OpenAFP.Records.T.OCO
+import OpenAFP.Records.T.OFSS
+import OpenAFP.Records.T.OO
+import OpenAFP.Records.T.OOI
+import OpenAFP.Records.T.OSFE
+import OpenAFP.Records.T.OSFO
+import OpenAFP.Records.T.PC
+import OpenAFP.Records.T.POCP
+import OpenAFP.Records.T.PPI
+import OpenAFP.Records.T.PSMR
+import OpenAFP.Records.T.PSRM
+import OpenAFP.Records.T.PV
+import OpenAFP.Records.T.RLI
+import OpenAFP.Records.T.ROI
+import OpenAFP.Records.T.ROT
+import OpenAFP.Records.T.RSN
+import OpenAFP.Records.T.RUA
+import OpenAFP.Records.T.T1CRMT
+import OpenAFP.Records.T.T2FRMT
+import OpenAFP.Records.T.TO
+import OpenAFP.Records.T.TS
+import OpenAFP.Records.T.UDTS
+
+_T_AD :: T_AD
+_T_AD = T_AD 0x4D _NStr
+_T_AQ :: T_AQ
+_T_AQ = T_AQ 0x80 _NStr
+_T_AV :: T_AV
+_T_AV = T_AV 0x36 _NStr
+_T_C  :: T_C
+_T_C  = T_C  0x65 _NStr
+_T_CF :: T_CF
+_T_CF = T_CF 0x75 _NStr
+_T_CGCSGI :: T_CGCSGI
+_T_CGCSGI = T_CGCSGI 0x01 _NStr
+_T_CR :: T_CR
+_T_CR = T_CR 0x26 _NStr
+_T_CS :: T_CS
+_T_CS = T_CS 0x4E _NStr
+_T_DP :: T_DP
+_T_DP = T_DP 0x43 _NStr
+_T_EF :: T_EF
+_T_EF = T_EF 0x6D _NStr
+_T_ERLI :: T_ERLI
+_T_ERLI = T_ERLI 0x23 _NStr
+_T_ESI :: T_ESI
+_T_ESI = T_ESI 0x50 _NStr
+_T_FCGCSGI :: T_FCGCSGI
+_T_FCGCSGI = T_FCGCSGI 0x20 _NStr
+_T_FDS :: T_FDS
+_T_FDS = T_FDS 0x1F _NStr
+_T_FF :: T_FF
+_T_FF = T_FF 0x78 _NStr
+_T_FHSF :: T_FHSF
+_T_FHSF = T_FHSF 0x5D _NStr
+_T_FO :: T_FO
+_T_FO = T_FO 0x85 _NStr
+_T_FQN :: T_FQN
+_T_FQN = T_FQN 0x02 0 0 0
+_T_FRMT :: T_FRMT
+_T_FRMT = T_FRMT 0x84 _NStr
+_T_II :: T_II
+_T_II = T_II 0x73 _NStr
+_T_LDOPM :: T_LDOPM
+_T_LDOPM = T_LDOPM 0x27 _NStr
+_T_LDTS :: T_LDTS
+_T_LDTS = T_LDTS 0x62 _NStr
+_T_MA :: T_MA
+_T_MA = T_MA 0x79 _NStr
+_T_MEC :: T_MEC
+_T_MEC = T_MEC 0x45 _NStr
+_T_MF :: T_MF
+_T_MF = T_MF 0x87 _NStr
+_T_MIS :: T_MIS
+_T_MIS = T_MIS 0x18 _NStr
+_T_MMPN :: T_MMPN
+_T_MMPN = T_MMPN 0x56 _NStr
+_T_MO :: T_MO
+_T_MO = T_MO 0x04 _NStr
+_T_MOR :: T_MOR
+_T_MOR = T_MOR 0x68 _NStr
+_T_OAMU :: T_OAMU
+_T_OAMU = T_OAMU 0x4B _NStr
+_T_OAS :: T_OAS
+_T_OAS = T_OAS 0x4C _NStr
+_T_OBE :: T_OBE
+_T_OBE = T_OBE 0x57 _NStr
+_T_OBO :: T_OBO
+_T_OBO = T_OBO 0x2D _NStr
+_T_OCH :: T_OCH
+_T_OCH = T_OCH 0x63 _NStr
+_T_OCL :: T_OCL
+_T_OCL = T_OCL 0x10 _NStr
+_T_OCO :: T_OCO
+_T_OCO = T_OCO 0x5E _NStr
+_T_OFSS :: T_OFSS
+_T_OFSS = T_OFSS 0x21 _NStr
+_T_OO :: T_OO
+_T_OO = T_OO 0x5A _NStr
+_T_OOI :: T_OOI
+_T_OOI = T_OOI 0x64 _NStr
+_T_OSFE :: T_OSFE
+_T_OSFE = T_OSFE 0x59 _NStr
+_T_OSFO :: T_OSFO
+_T_OSFO = T_OSFO 0x58 _NStr
+_T_PC :: T_PC
+_T_PC = T_PC 0x83 _NStr
+_T_POCP :: T_POCP
+_T_POCP = T_POCP 0x46 _NStr
+_T_PPI :: T_PPI
+_T_PPI = T_PPI 0x81 _NStr
+_T_PSMR :: T_PSMR
+_T_PSMR = T_PSMR 0x71 _NStr
+_T_PSRM :: T_PSRM
+_T_PSRM = T_PSRM 0x70 _NStr
+_T_PV :: T_PV
+_T_PV = T_PV 0x82 _NStr
+_T_RLI :: T_RLI
+_T_RLI = T_RLI 0x24 0 0
+_T_ROI :: T_ROI
+_T_ROI = T_ROI 0x6C _NStr
+_T_ROT :: T_ROT
+_T_ROT = T_ROT 0x22 _NStr
+_T_RSN :: T_RSN
+_T_RSN = T_RSN 0x25 _NStr
+_T_RUA :: T_RUA
+_T_RUA = T_RUA 0x47 _NStr
+_T_T1CRMT :: T_T1CRMT
+_T_T1CRMT = T_T1CRMT 0x63 _NStr
+_T_T2FRMT :: T_T2FRMT
+_T_T2FRMT = T_T2FRMT 0x63 _NStr
+_T_TO :: T_TO
+_T_TO = T_TO 0x1D _NStr
+_T_TS :: T_TS
+_T_TS = T_TS 0x74 _NStr
+_T_UDTS :: T_UDTS
+_T_UDTS = T_UDTS 0x72 _NStr
+
diff --git a/src/OpenAFP/Records/T/AD.hs b/src/OpenAFP/Records/T/AD.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/AD.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.AD where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_AD = T_AD {
+    t_ad_Type                        :: !N1
+    ,t_ad                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/AQ.hs b/src/OpenAFP/Records/T/AQ.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/AQ.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.AQ where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_AQ = T_AQ {
+    t_aq_Type                        :: !N1
+    ,t_aq                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/AV.hs b/src/OpenAFP/Records/T/AV.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/AV.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.AV where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_AV = T_AV {
+    t_av_Type                        :: !N1
+    ,t_av                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/C.hs b/src/OpenAFP/Records/T/C.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/C.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.C where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_C = T_C {
+    t_c_Type                         :: !N1
+    ,t_c                             :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/CF.hs b/src/OpenAFP/Records/T/CF.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/CF.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.CF where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_CF = T_CF {
+    t_cf_Type                        :: !N1
+    ,t_cf                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/CGCSGI.hs b/src/OpenAFP/Records/T/CGCSGI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/CGCSGI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.CGCSGI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_CGCSGI = T_CGCSGI {
+    t_cgcsgi_Type                    :: !N1
+    ,t_cgcsgi                        :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/CR.hs b/src/OpenAFP/Records/T/CR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/CR.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.CR where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_CR = T_CR {
+    t_cr_Type                        :: !N1
+    ,t_cr                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/CS.hs b/src/OpenAFP/Records/T/CS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/CS.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.CS where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_CS = T_CS {
+    t_cs_Type                        :: !N1
+    ,t_cs                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/DP.hs b/src/OpenAFP/Records/T/DP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/DP.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.DP where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_DP = T_DP {
+    t_dp_Type                        :: !N1
+    ,t_dp                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/EF.hs b/src/OpenAFP/Records/T/EF.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/EF.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.EF where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_EF = T_EF {
+    t_ef_Type                        :: !N1
+    ,t_ef                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/ERLI.hs b/src/OpenAFP/Records/T/ERLI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/ERLI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.ERLI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_ERLI = T_ERLI {
+    t_erli_Type                      :: !N1
+    ,t_erli                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/ESI.hs b/src/OpenAFP/Records/T/ESI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/ESI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.ESI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_ESI = T_ESI {
+    t_esi_Type                       :: !N1
+    ,t_esi                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/FCGCSGI.hs b/src/OpenAFP/Records/T/FCGCSGI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/FCGCSGI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.FCGCSGI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_FCGCSGI = T_FCGCSGI {
+    t_fcgcsgi_Type                   :: !N1
+    ,t_fcgcsgi                       :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/FDS.hs b/src/OpenAFP/Records/T/FDS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/FDS.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.FDS where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_FDS = T_FDS {
+    t_fds_Type                       :: !N1
+    ,t_fds                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/FF.hs b/src/OpenAFP/Records/T/FF.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/FF.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.FF where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_FF = T_FF {
+    t_ff_Type                        :: !N1
+    ,t_ff                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/FHSF.hs b/src/OpenAFP/Records/T/FHSF.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/FHSF.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.FHSF where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_FHSF = T_FHSF {
+    t_fhsf_Type                      :: !N1
+    ,t_fhsf                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/FO.hs b/src/OpenAFP/Records/T/FO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/FO.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.FO where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_FO = T_FO {
+    t_fo_Type                        :: !N1
+    ,t_fo                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/FQN.hs b/src/OpenAFP/Records/T/FQN.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/FQN.hs
@@ -0,0 +1,12 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.FQN where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_FQN = T_FQN {
+    t_fqn_Type                       :: !N1
+    ,t_fqn_SubType                   :: !N1
+    ,t_fqn_Format                    :: !N1
+    ,t_fqn                           :: !A8
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/FRMT.hs b/src/OpenAFP/Records/T/FRMT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/FRMT.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.FRMT where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_FRMT = T_FRMT {
+    t_frmt_Type                      :: !N1
+    ,t_frmt                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/II.hs b/src/OpenAFP/Records/T/II.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/II.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.II where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_II = T_II {
+    t_ii_Type                        :: !N1
+    ,t_ii                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/LDOPM.hs b/src/OpenAFP/Records/T/LDOPM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/LDOPM.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.LDOPM where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_LDOPM = T_LDOPM {
+    t_ldopm_Type                     :: !N1
+    ,t_ldopm                         :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/LDTS.hs b/src/OpenAFP/Records/T/LDTS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/LDTS.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.LDTS where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_LDTS = T_LDTS {
+    t_ldts_Type                      :: !N1
+    ,t_ldts                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/MA.hs b/src/OpenAFP/Records/T/MA.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/MA.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.MA where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_MA = T_MA {
+    t_ma_Type                        :: !N1
+    ,t_ma                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/MEC.hs b/src/OpenAFP/Records/T/MEC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/MEC.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.MEC where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_MEC = T_MEC {
+    t_mec_Type                       :: !N1
+    ,t_mec                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/MF.hs b/src/OpenAFP/Records/T/MF.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/MF.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.MF where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_MF = T_MF {
+    t_mf_Type                        :: !N1
+    ,t_mf                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/MIS.hs b/src/OpenAFP/Records/T/MIS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/MIS.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.MIS where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_MIS = T_MIS {
+    t_mis_Type                       :: !N1
+    ,t_mis                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/MMPN.hs b/src/OpenAFP/Records/T/MMPN.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/MMPN.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.MMPN where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_MMPN = T_MMPN {
+    t_mmpn_Type                      :: !N1
+    ,t_mmpn                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/MO.hs b/src/OpenAFP/Records/T/MO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/MO.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.MO where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_MO = T_MO {
+    t_mo_Type                        :: !N1
+    ,t_mo                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/MOR.hs b/src/OpenAFP/Records/T/MOR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/MOR.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.MOR where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_MOR = T_MOR {
+    t_mor_Type                       :: !N1
+    ,t_mor                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OAMU.hs b/src/OpenAFP/Records/T/OAMU.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OAMU.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OAMU where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OAMU = T_OAMU {
+    t_oamu_Type                      :: !N1
+    ,t_oamu                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OAS.hs b/src/OpenAFP/Records/T/OAS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OAS.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OAS where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OAS = T_OAS {
+    t_oas_Type                       :: !N1
+    ,t_oas                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OBE.hs b/src/OpenAFP/Records/T/OBE.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OBE.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OBE where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OBE = T_OBE {
+    t_obe_Type                       :: !N1
+    ,t_obe                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OBO.hs b/src/OpenAFP/Records/T/OBO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OBO.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OBO where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OBO = T_OBO {
+    t_obo_Type                       :: !N1
+    ,t_obo                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OCH.hs b/src/OpenAFP/Records/T/OCH.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OCH.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OCH where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OCH = T_OCH {
+    t_och_Type                       :: !N1
+    ,t_och                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OCL.hs b/src/OpenAFP/Records/T/OCL.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OCL.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OCL where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OCL = T_OCL {
+    t_ocl_Type                       :: !N1
+    ,t_ocl                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OCO.hs b/src/OpenAFP/Records/T/OCO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OCO.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OCO where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OCO = T_OCO {
+    t_oco_Type                       :: !N1
+    ,t_oco                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OFSS.hs b/src/OpenAFP/Records/T/OFSS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OFSS.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OFSS where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OFSS = T_OFSS {
+    t_ofss_Type                      :: !N1
+    ,t_ofss                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OO.hs b/src/OpenAFP/Records/T/OO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OO.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OO where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OO = T_OO {
+    t_oo_Type                        :: !N1
+    ,t_oo                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OOI.hs b/src/OpenAFP/Records/T/OOI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OOI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OOI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OOI = T_OOI {
+    t_ooi_Type                       :: !N1
+    ,t_ooi                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OSFE.hs b/src/OpenAFP/Records/T/OSFE.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OSFE.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OSFE where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OSFE = T_OSFE {
+    t_osfe_Type                      :: !N1
+    ,t_osfe                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/OSFO.hs b/src/OpenAFP/Records/T/OSFO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/OSFO.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.OSFO where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_OSFO = T_OSFO {
+    t_osfo_Type                      :: !N1
+    ,t_osfo                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/PC.hs b/src/OpenAFP/Records/T/PC.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/PC.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.PC where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_PC = T_PC {
+    t_pc_Type                        :: !N1
+    ,t_pc                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/POCP.hs b/src/OpenAFP/Records/T/POCP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/POCP.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.POCP where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_POCP = T_POCP {
+    t_pocp_Type                      :: !N1
+    ,t_pocp                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/PPI.hs b/src/OpenAFP/Records/T/PPI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/PPI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.PPI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_PPI = T_PPI {
+    t_ppi_Type                       :: !N1
+    ,t_ppi                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/PSMR.hs b/src/OpenAFP/Records/T/PSMR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/PSMR.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.PSMR where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_PSMR = T_PSMR {
+    t_psmr_Type                      :: !N1
+    ,t_psmr                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/PSRM.hs b/src/OpenAFP/Records/T/PSRM.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/PSRM.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.PSRM where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_PSRM = T_PSRM {
+    t_psrm_Type                      :: !N1
+    ,t_psrm                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/PV.hs b/src/OpenAFP/Records/T/PV.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/PV.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.PV where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_PV = T_PV {
+    t_pv_Type                        :: !N1
+    ,t_pv                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/RLI.hs b/src/OpenAFP/Records/T/RLI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/RLI.hs
@@ -0,0 +1,11 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.RLI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_RLI = T_RLI {
+    t_rli_Type                       :: !N1
+    ,t_rli_SubType                   :: !N1
+    ,t_rli                           :: !N1
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/ROI.hs b/src/OpenAFP/Records/T/ROI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/ROI.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.ROI where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_ROI = T_ROI {
+    t_roi_Type                       :: !N1
+    ,t_roi                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/ROT.hs b/src/OpenAFP/Records/T/ROT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/ROT.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.ROT where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_ROT = T_ROT {
+    t_rot_Type                       :: !N1
+    ,t_rot                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/RSN.hs b/src/OpenAFP/Records/T/RSN.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/RSN.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.RSN where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_RSN = T_RSN {
+    t_rsn_Type                       :: !N1
+    ,t_rsn                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/RUA.hs b/src/OpenAFP/Records/T/RUA.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/RUA.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.RUA where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_RUA = T_RUA {
+    t_rua_Type                       :: !N1
+    ,t_rua                           :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/T1CRMT.hs b/src/OpenAFP/Records/T/T1CRMT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/T1CRMT.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.T1CRMT where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_T1CRMT = T_T1CRMT {
+    t_t1crmt_Type                    :: !N1
+    ,t_t1crmt                        :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/T2FRMT.hs b/src/OpenAFP/Records/T/T2FRMT.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/T2FRMT.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.T2FRMT where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_T2FRMT = T_T2FRMT {
+    t_t2frmt_Type                    :: !N1
+    ,t_t2frmt                        :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/TO.hs b/src/OpenAFP/Records/T/TO.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/TO.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.TO where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_TO = T_TO {
+    t_to_Type                        :: !N1
+    ,t_to                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/TS.hs b/src/OpenAFP/Records/T/TS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/TS.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.TS where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_TS = T_TS {
+    t_ts_Type                        :: !N1
+    ,t_ts                            :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Records/T/UDTS.hs b/src/OpenAFP/Records/T/UDTS.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Records/T/UDTS.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS -fglasgow-exts -funbox-strict-fields #-}
+module OpenAFP.Records.T.UDTS where
+import OpenAFP.Types
+import OpenAFP.Internals
+
+data T_UDTS = T_UDTS {
+    t_udts_Type                      :: !N1
+    ,t_udts                          :: !NStr
+} deriving (Show, Typeable)
+
diff --git a/src/OpenAFP/Types.hs b/src/OpenAFP/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Types.hs
@@ -0,0 +1,64 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Types
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- This module imports and re-exports the fundamental types in the OpenAFP
+-- framework: Buffer, ChunkBuf and Record.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Types (
+    module OpenAFP.Types.Buffer,
+    module OpenAFP.Types.Chunk,
+    module OpenAFP.Types.Record,
+    module OpenAFP.Types.View,
+    T_(..), viewChunks, viewData, viewNumber,
+    viewString, viewNStr, viewField, viewRecord
+) where
+import OpenAFP.Types.Buffer
+import OpenAFP.Types.Chunk
+import OpenAFP.Types.Record
+import OpenAFP.Types.View
+import OpenAFP.Internals
+
+newtype T_ = T_ (N1, Buffer1) deriving (Show, Typeable)
+
+viewChunks cs = do
+    rs <- mapM viewChunk cs
+    return $ ViewChunks (typeOf cs, rs)
+
+viewChunk c = withChunk c recView
+
+withChunk :: (ChunkBuf a n b, MonadIO m) => a -> (forall r. (Rec r) => r -> m x) -> m x
+withChunk c = chunkApply (fst . chunkDecon $ c) c
+
+viewData ds = do
+    rs <- mapM recView ds
+    return $ ViewData (typeOf ds, rs)
+
+viewNumber n = return $ ViewNumber (typeOf n, fromEnum n)
+
+viewString a = return $ ViewString (typeOf a, reverse [ toAsc n | n <- [ 0..((sizeOf a)-1) ] ])
+    where toAsc n = ebc2asc ! fromIntegral ((a `shiftR` (8 * n)) .&. 0xFF)
+
+viewNStr nstr = do
+    let (pstr, len) = bufToPStrLen nstr
+    withForeignPtr (castForeignPtr pstr) $ \cstr -> do
+        ns <- peekArray (min len 80) cstr
+        return $ ViewNStr (typeOf nstr, ns)
+
+viewField l io = do
+    content <- io
+    return $ ViewField (l, content)
+
+viewRecord t io = do
+    fields <- sequence io
+    return $ ViewRecord (t, fields)
diff --git a/src/OpenAFP/Types/Buffer.hs b/src/OpenAFP/Types/Buffer.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Types/Buffer.hs
@@ -0,0 +1,71 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Types.Buffer
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- This module handles sized binary buffers.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Types.Buffer where
+import OpenAFP.Internals
+
+-- | The Buf class represents buffers, with the leading bytes
+--   representing its length.
+class (Show a, Typeable a) => Buf a where
+    bufFromPStrLen :: PStringLen -> a
+    bufToPStrLen :: a -> PStringLen
+
+-- | Buffer0, being a simple PStringLen, is of unlimited length.
+newtype Buffer0 = Buf0 PStringLen deriving (Show, Typeable)
+
+-- | Buffer1 uses one byte as length, hence is at most 254 bytes long.
+newtype Buffer1 = Buf1 PStringLen deriving (Show, Typeable)
+
+-- | Buffer2 uses two bytes; it can store up to 65535 bytes.
+newtype Buffer2 = Buf2 PStringLen deriving (Show, Typeable)
+
+instance Buf Buffer0 where
+    bufFromPStrLen = Buf0
+    bufToPStrLen (Buf0 b) = b
+instance Buf Buffer1 where
+    bufFromPStrLen = Buf1
+    bufToPStrLen (Buf1 b) = b
+instance Buf Buffer2 where
+    bufFromPStrLen = Buf2
+    bufToPStrLen (Buf2 b) = b
+
+instance Binary Buffer0 where
+    put bh buf = putBuf bh $ bufToPStrLen buf
+    get bh = do
+        pos     <- tellBin bh
+        size    <- sizeBin bh
+        pstrlen <- getBuf bh (size - pos)
+	return $ bufFromPStrLen pstrlen
+
+instance Binary Buffer1 where
+    put bh buf = do
+        put bh (fromIntegral (len + 1) :: N1)
+        putBuf bh $ bufToPStrLen buf
+        where len = snd $ bufToPStrLen buf
+    get bh = do
+        size <- get bh :: IO N1
+        pstrlen <- getBuf bh $ (fromEnum size) - 1
+	return $ bufFromPStrLen pstrlen
+
+instance Binary Buffer2 where
+    put bh buf = do
+        put bh (fromIntegral (len + 2) :: N2)
+        putBuf bh $ bufToPStrLen buf
+        where len = snd $ bufToPStrLen buf
+    get bh = do
+        size <- get bh :: IO N2
+        pstrlen <- getBuf bh $ (fromEnum size) - 2
+	return $ bufFromPStrLen pstrlen
diff --git a/src/OpenAFP/Types/Chunk.hs b/src/OpenAFP/Types/Chunk.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Types/Chunk.hs
@@ -0,0 +1,233 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Types.Chunk
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- This module handles pre-parsed "chunks" in AFP files.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Types.Chunk where
+import OpenAFP.Internals
+import OpenAFP.Types.Buffer
+import OpenAFP.Types.Record
+
+infixl 4 ~~
+infixl 4 <~~
+infixl 4 ~~>
+infixl 4 <==
+infixl 4 ==>
+infixl 4 <..
+infixl 4 ..>
+infixr 4 ===
+infixr 4 ...
+infixr 4 ....
+infixr 4 .....
+
+type NStr = Buffer0
+type AStr = NStr
+
+type ChunkWriter c = WriterT (ChunkQueue c)
+type WriterStateIO v a = (ChunkBuf c n b, MonadReader v m, MonadPlus m, MonadIO m, MonadError e m, Show e, Typeable e) => ChunkWriter c m a
+
+instance Storable NStr where
+    alignment _ = 8
+    sizeOf      = snd . bufToPStrLen
+
+nullForeignPtr = unsafePerformIO (newForeignPtr_ nullPtr)
+
+_NStr :: NStr
+_NStr = bufFromPStrLen (nullForeignPtr, 0)
+
+fromAStr :: AStr -> IOm String
+fromAStr nstr = liftIO $ do
+    let (pstr, len) = bufToPStrLen nstr
+    withForeignPtr (castForeignPtr pstr) $ \cstr -> do
+        ns <- peekArray len cstr
+        return $ map (ebc2asc !) ns
+
+toAStr :: String -> IOm AStr
+toAStr str = liftIO $ do
+    let len = length str
+    pstr <- mallocForeignPtrBytes len
+    withForeignPtr pstr $ \cstr -> do
+        pokeArray cstr $ map ((asc2ebc !) . ord) str
+        return $ bufFromPStrLen (castForeignPtr pstr, len)
+
+fromNStr :: NStr -> IOm [N1]
+fromNStr nstr = liftIO $ do
+    let (pstr, len) = bufToPStrLen nstr
+    withForeignPtr (castForeignPtr pstr) $ \cstr ->
+        peekArray len cstr
+
+toNStr :: [N1] -> IOm NStr
+toNStr list = liftIO $ do
+    let len = length list
+    pstr <- mallocForeignPtrBytes len
+    withForeignPtr pstr $ \cstr -> do
+        pokeArray cstr list
+        return $ bufFromPStrLen (castForeignPtr pstr, len)
+
+newtype ChunkType = MkChunkType String
+    deriving (Show, Eq, Typeable, Ord)
+
+chunkTypeOf :: Typeable a => a -> ChunkType
+chunkTypeOf = MkChunkType . show . typeOf
+
+-- | The ChunkBuf class represents non-parsed chunks, constructed from a
+--   (ChunkType, Buffer) tuple.
+class (Show c, Typeable c, Buf b, Num n, Enum n) => ChunkBuf c n b | c -> n, c -> b where
+    chunkApply :: (MonadIO m) => n -> c -> (forall a. (Rec a) => (a -> m x)) -> m x
+    chunkCon :: (n, b) -> c
+    chunkDecon :: c -> (n, b)
+    chunkType :: c -> ChunkType
+    chunkType c = chunkTypeLookup c . fst . chunkDecon $ c
+    chunkTypeLookup :: c -> n -> ChunkType
+    chunkToPStrLen :: c -> PStringLen
+    chunkMapFiltersM_ :: (MonadIO m) => c -> [(ChunkType, c -> m [c])] -> m ()
+    chunkMapFiltersM_ c possibleFilters
+        | null filters  = return ()
+        | otherwise     = mapM_ (\(_, f) -> do f c ; return ()) filters
+        where filters = filter (\(t, _) -> (t == chunkType c)) possibleFilters
+    chunkMapFiltersM :: (MonadIO m) => c -> [(ChunkType, c -> m [c])] -> m [c]
+    chunkMapFiltersM c possibleFilters
+        | null filters  = return [c]
+        | otherwise     = do
+            c' <- foldM applyF [c] filters
+            return c'
+        where
+            filters = filter (\(t, _) -> (t == chunkType c)) possibleFilters
+            applyF r (_, f) = do
+                r' <- mapM f r
+                return $ concat r'
+    chunksMapFiltersM :: (MonadIO m) => [c] -> [(ChunkType, c -> m [c])] -> m [c]
+    chunksMapFiltersM cs list = do
+        lol <- mapM (`chunkMapFiltersM` list) cs
+        return $ concat lol
+    chunksMapFiltersM_ :: (MonadIO m) => [c] -> [(ChunkType, c -> m [c])] -> m ()
+    chunksMapFiltersM_ cs list = mapM_ (`chunkMapFiltersM_` list) cs
+    chunkToRecord :: (Binary (Record r)) => c -> IO (Record r)
+    chunkToRecord c = do
+	let (pstr, len) = chunkToPStrLen c
+        bh <- openBinBuf (pstr, len)
+        -- XXX: Associate this with the reified chunkType
+        (Record r) <- get bh
+        addFinalizer r $ touchForeignPtr pstr
+        return $ Record r
+    chunkToPStrLen c = bufToPStrLen buf where (_, buf) = chunkDecon c
+    chunkFromRecord :: (Binary r, Storable r, Rec r) => r -> IO c
+    chunkFromRecord item = do
+        bh <- newBinBuf (sizeOf item)
+        put bh item
+        return $ chunkCon (toEnum . recType $ item, bufFromPStrLen $ bufOf bh)
+
+-- | The RecChunk class unifies a Rec (parent) with its contained
+--   chunk types (children).
+class (Rec r, ChunkBuf c n b) => RecChunk r c n b | r -> c where
+    readChunks :: r -> [c]
+    readChunks = error "readChunks not defined"
+    writeChunks :: (MonadIO m) => r -> m [c] -> m r
+    writeChunks = error "writeChunks not defined"
+
+-- | The RecData class unifies a Rec (parent) with its contained
+--   Rec data type (children).
+class (Rec a, Rec b) => RecData a b | a -> b, b -> a where
+    readData :: a -> [Record b]
+    readData = error "readData not defined"
+    writeData :: a -> [Record b] -> a
+    writeData = error "writeData not defined"
+
+-- | The ChunkLookup class unifies a Chunk (parent) with its lookup
+--   dispatch function.
+{-
+
+class ChunkLookup a b | a -> b where
+    chunkLookup :: (ChunkBuf a c) => b -> c -> a
+
+instance (ChunkLookup a b, ChunkBuf a c, Binary c) => Binary a where
+    put bh chunk = put bh $ snd $ chunkDecon chunk
+    get bh = do
+        buf     <- get bh
+        bh'     <- openBinBuf $ bufToPStrLen buf
+        buftype <- get bh'
+        return $ chunkLookup buftype buf
+-}
+
+
+instance (Rec a, Binary a) => Storable [a] where
+    alignment = undefined
+    sizeOf r = recSizeOf r
+    
+(~~) :: (ChunkBuf c n b, Typeable t) => c -> t -> Bool
+c ~~ t = (chunkTypeOf t == chunkType c)
+
+(<~~) :: (ChunkBuf c n b, Typeable t, Rec r) => t -> [c] -> IOm r
+t <~~ cs = do
+    Record r <- liftIO $ chunkToRecord $ fromJust $ find (~~ t) cs
+    return r
+
+(~~>) :: (ChunkBuf c n b, Typeable t, Rec r) => [c] -> t -> IOm r
+cs ~~> t = do
+    Record r <- liftIO $ chunkToRecord $ fromJust $ find (~~ t) cs
+    return r
+
+(==>) :: (ChunkBuf c n b, MonadIO m) => [c] -> [(ChunkType, c -> m [c])] -> m [c]
+cs ==> fs = chunksMapFiltersM cs fs
+
+(<==) :: (ChunkBuf c n b, MonadIO m) => [(ChunkType, c -> m [c])] -> [c] -> m [c]
+(<==) = flip (==>)
+
+(..>) :: (ChunkBuf c n b, MonadIO m) => [c] -> [(ChunkType, c -> m [c])] -> m ()
+cs ..> fs = chunksMapFiltersM_ cs fs
+
+(<..) :: (ChunkBuf c n b, MonadIO m) => [(ChunkType, c -> m [c])] -> [c] -> m ()
+(<..) = flip (..>)
+
+t === f = (chunkTypeOf t, processChunk t f)
+-- t ==== f = (chunkTypeOf t, processChunk t (lift . f))
+-- t ===== f = (chunkTypeOf t, processChunk t (lift . lift . f))
+
+processChunk :: (MonadIO m, Rec r, ChunkBuf c n b) =>
+    r -> (r -> ChunkWriter c m a) -> (c -> m [c])
+processChunk _ f c = do
+    -- grab a naked record
+    (Record r)          <- liftIO $ chunkToRecord c
+    -- pass it to the filter along with the push function
+    (_, ChunkQueue cs)  <- runWriterT (f r)
+    -- collect the pushed stuff
+    return cs
+
+t ... f = (chunkTypeOf t, inspectChunk t f)
+t .... f = (chunkTypeOf t, inspectChunk t (lift . f))
+t ..... f = (chunkTypeOf t, inspectChunk t (lift . lift . f))
+
+inspectChunk :: (MonadIO m, Rec a, ChunkBuf c n b) => a -> (a -> m t) -> (c -> m [c])
+inspectChunk _ f c = do
+    (Record r)  <- liftIO $ chunkToRecord c
+    f r
+    return [c]
+
+push :: (ChunkBuf c n b, MonadIO m, Rec a) => a -> ChunkWriter c m ()
+push r = do
+    chunk <- liftIO $ chunkFromRecord $ Record r
+    tell $ ChunkItem chunk
+    return ()
+
+filterChunks :: (MonadIO m, RecChunk r c n b, ChunkBuf c' n' b') =>
+    r -> [(ChunkType, c -> ChunkWriter c' m [c])] -> ChunkWriter c' m ()
+filterChunks r list = do
+    push =<< (writeChunks r $ list <== readChunks r)
+
+data ChunkQueue a = ChunkQueue [a] | ChunkItem a deriving (Show)
+
+instance Monoid (ChunkQueue a) where
+    mempty = ChunkQueue []
+    mappend (ChunkItem a) (ChunkQueue b) = ChunkQueue (a:b)
+    mappend (ChunkQueue a) (ChunkQueue b)     = ChunkQueue (a ++ b)
diff --git a/src/OpenAFP/Types/Record.hs b/src/OpenAFP/Types/Record.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Types/Record.hs
@@ -0,0 +1,69 @@
+{-# OPTIONS -O -fglasgow-exts #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Types.Record
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- This module handles parsed AFP records with named fields.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Types.Record where
+import OpenAFP.Internals
+import OpenAFP.Types.View
+
+newtype Record a = Record a
+    deriving (Show, Eq, Typeable)
+
+class (Show a, Typeable a) => Rec a where
+    recGet :: BinHandle -> IO a
+    recGet = error "recGet not defined"
+    recPut :: BinHandle -> a -> IO ()
+    recPut = error "recPut not defined"
+    recSizeOf :: a -> Int
+    recSizeOf = error "recSizeOf not defined"
+    recView :: a -> IO ViewRecord
+    recView x = error ("recView not defined for " ++ show x)
+    recType :: a -> Int
+    recType = error "recType not defined"
+
+-- (forall a. (Rec a) => (a -> m b))
+instance (Rec a) => Storable (Record a) where
+    alignment (Record r) = 8
+    sizeOf (Record r) = recSizeOf r
+    -- sizeOf (Record r) = sum $ recApply func r
+
+{-
+func :: (Storable x) => String -> x -> Int
+func x y = sizeOf y
+-}
+func x y = 0
+
+instance (Rec a) => Rec (Record a) where
+    recView (Record a) = recView a
+
+instance (Rec a) => Binary (Record a) where
+    get bh = do
+        b <- recGet bh
+        return $ Record b
+    put bh (Record a) = do
+        recPut bh a
+        return ()
+
+instance (Binary a, Rec a, Show a, Typeable a) => Rec [a] where
+    recSizeOf list = sum $ map recSizeOf list
+    recGet bh = get bh
+    recPut bh list = do
+        mapM_ (put bh) list
+
+instance Rec N1 where
+    recSizeOf _ = 1
+
+fromRecord (Record a) = a
+
diff --git a/src/OpenAFP/Types/View.hs b/src/OpenAFP/Types/View.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenAFP/Types/View.hs
@@ -0,0 +1,39 @@
+{-# OPTIONS -fglasgow-exts #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  OpenAFP.Types.View
+-- Copyright   :  (c) Audrey Tang 2004, 2006
+-- License     :  BSD-style
+-- 
+-- Maintainer  :  audreyt@audreyt.org
+-- Stability   :  experimental
+-- Portability :  non-portable (GHC-only)
+--
+-- Concrete data views on Chunks and Records.
+--
+-----------------------------------------------------------------------------
+
+module OpenAFP.Types.View where
+import OpenAFP.Types.Buffer
+import OpenAFP.Internals
+
+type ChunksType = TypeRep
+type RecordType = TypeRep
+type NumberType = TypeRep
+type NStrType   = TypeRep
+type StringType = TypeRep
+type DataType   = TypeRep
+type FieldLabel = String
+
+-- newtype ViewChunks = ViewChunks (ChunksType, [ViewRecord])
+newtype ViewRecord = ViewRecord (RecordType, [ViewField]) deriving (Show, Typeable)
+newtype ViewField  = ViewField  (FieldLabel, ViewContent) deriving (Show, Typeable)
+data ViewContent
+    = ViewNumber (NumberType, Int)
+    | ViewString (StringType, String)
+    | ViewNStr   (NStrType,   [N1])
+    | ViewChunks (ChunksType, [ViewRecord])
+    | ViewData   (DataType,   [ViewRecord])
+    deriving (Show, Typeable)
+
