diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+Copyright 2016 NICTA Pty Ltd
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions, the following disclaimer and the following SHA-512 checksum.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions, the following disclaimer and the following SHA-512
+checksum in the documentation and/or other materials provided with the
+distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+THIS SOFTWARE IS PROVIDED WITH A SHA-512 CHECKSUM.
+ecdfdf543fd166b13b76b11e0b010e00d693028771880ffd8f9252ae0b8ac42bddf8eb7a23c21c86a3b50039d642ad9eeb7e8a0e82f6a345f60feb4a54808362
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,44 @@
+#!/usr/bin/env runhaskell
+\begin{code}
+{-# OPTIONS_GHC -Wall #-}
+module Main (main) where
+
+import Data.List ( nub )
+import Data.Version ( showVersion )
+import Distribution.Package ( PackageName(PackageName), PackageId, InstalledPackageId, packageVersion, packageName )
+import Distribution.PackageDescription ( PackageDescription(), TestSuite(..) )
+import Distribution.Simple ( defaultMainWithHooks, UserHooks(..), simpleUserHooks )
+import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose )
+import Distribution.Simple.BuildPaths ( autogenModulesDir )
+import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), fromFlag )
+import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, LocalBuildInfo(), ComponentLocalBuildInfo(componentPackageDeps) )
+import Distribution.Verbosity ( Verbosity )
+import System.FilePath ( (</>) )
+
+main :: IO ()
+main = defaultMainWithHooks simpleUserHooks
+  { buildHook = \pkg lbi hooks flags -> do
+     generateBuildModule (fromFlag (buildVerbosity flags)) pkg lbi
+     buildHook simpleUserHooks pkg lbi hooks flags
+  }
+
+generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
+generateBuildModule verbosity pkg lbi = do
+  let dir = autogenModulesDir lbi
+  createDirectoryIfMissingVerbose verbosity True dir
+  withLibLBI pkg lbi $ \_ libcfg -> do
+    withTestLBI pkg lbi $ \suite suitecfg -> do
+      rewriteFile (dir </> "Build_" ++ testName suite ++ ".hs") $ unlines
+        [ "module Build_" ++ testName suite ++ " where"
+        , "deps :: [String]"
+        , "deps = " ++ (show $ formatdeps (testDeps libcfg suitecfg))
+        ]
+  where
+    formatdeps = map (formatone . snd)
+    formatone p = case packageName p of
+      PackageName n -> n ++ "-" ++ showVersion (packageVersion p)
+
+testDeps :: ComponentLocalBuildInfo -> ComponentLocalBuildInfo -> [(InstalledPackageId, PackageId)]
+testDeps xs ys = nub $ componentPackageDeps xs ++ componentPackageDeps ys
+
+\end{code}
diff --git a/changelog b/changelog
new file mode 100644
--- /dev/null
+++ b/changelog
@@ -0,0 +1,4 @@
+0.0.1
+
+* Initial release
+
diff --git a/javaclass.cabal b/javaclass.cabal
new file mode 100644
--- /dev/null
+++ b/javaclass.cabal
@@ -0,0 +1,95 @@
+name:               javaclass
+version:            0.0.1
+license:            OtherLicense
+license-file:       LICENSE
+author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
+maintainer:         Tony Morris
+copyright:          Copyright (C) 2016 NICTA Limited
+synopsis:           Java class files
+category:           Data
+description:
+  <<http://i.imgur.com/Ns5hntl.jpg>>
+  .
+  Java class files
+  https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html
+homepage:           https://github.com/NICTA/javaclass
+bug-reports:        https://github.com/NICTA/javaclass/issues
+cabal-version:      >= 1.10
+build-type:         Custom
+extra-source-files: changelog, todo.md
+
+source-repository   head
+  type:             git
+  location:         git@github.com:NICTA/javaclass.git
+
+flag                small_base
+  description:      Choose the new, split-up base package.
+
+library
+  default-language:
+                    Haskell2010
+
+  build-depends:
+                    base < 5 && >= 4.8
+                    , semigroups >= 0.8 && < 1.0
+                    , semigroupoids >= 4.2 && < 6
+                    , lens >= 4.3.3 && < 5
+                    , bytestring >= 0.10 && < 0.11
+                    , tickle >= 0.0.6 && < 0.1
+                    , tagged >= 0.8 && < 0.9
+                    , greplicate >= 0.0.2 && < 0.1
+                    
+  ghc-options:
+                    -Wall
+
+  default-extensions:
+  
+                    NoImplicitPrelude
+
+  hs-source-dirs:
+                    src
+
+  exposed-modules:
+                    Language.Java.Class
+                    Language.Java.Class.Attribute
+                    Language.Java.Class.Attributes
+                    Language.Java.Class.Cafebabe
+                    Language.Java.Class.ClassFile
+                    Language.Java.Class.ConstantPool
+                    Language.Java.Class.ConstantPoolInfo
+                    Language.Java.Class.FieldAccessFlags
+                    Language.Java.Class.Field
+                    Language.Java.Class.Fields
+                    Language.Java.Class.Interfaces
+                    Language.Java.Class.MethodAccessFlags
+                    Language.Java.Class.Method
+                    Language.Java.Class.Methods
+                    Language.Java.Class.SuperClass
+                    Language.Java.Class.ThisAccessFlags
+                    Language.Java.Class.ThisClass
+                    Language.Java.Class.Version
+
+test-suite doctests
+  type:
+                    exitcode-stdio-1.0
+
+  main-is:
+                    doctests.hs
+
+  default-language:
+                    Haskell2010
+
+  build-depends:
+                    base < 5 && >= 3
+                    , doctest >= 0.9.7
+                    , filepath >= 1.3
+                    , directory >= 1.1
+                    , QuickCheck >= 2.0
+                    , template-haskell >= 2.8
+
+  ghc-options:
+                    -Wall
+                    -threaded
+
+  hs-source-dirs:
+                    test
diff --git a/src/Language/Java/Class.hs b/src/Language/Java/Class.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE GADTs #-}
+
+module Language.Java.Class(
+  module C
+) where
+
+import Language.Java.Class.Attribute as C
+import Language.Java.Class.Attributes as C
+import Language.Java.Class.Cafebabe as C
+import Language.Java.Class.ClassFile as C
+import Language.Java.Class.ConstantPool as C
+import Language.Java.Class.ConstantPoolInfo as C
+import Language.Java.Class.FieldAccessFlags as C
+import Language.Java.Class.Field as C
+import Language.Java.Class.Fields as C
+import Language.Java.Class.Interfaces as C
+import Language.Java.Class.MethodAccessFlags as C
+import Language.Java.Class.Method as C
+import Language.Java.Class.Methods as C
+import Language.Java.Class.SuperClass as C
+import Language.Java.Class.ThisAccessFlags as C
+import Language.Java.Class.ThisClass as C
+import Language.Java.Class.Version as C
+
diff --git a/src/Language/Java/Class/Attribute.hs b/src/Language/Java/Class/Attribute.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/Attribute.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Language.Java.Class.Attribute(
+  Attribute(..)
+, AttributeError(..)
+, AsAttributeNameIndexUnexpectedEof(..)
+, attributeNameIndexUnexpectedEof
+, AsAttributeLengthUnexpectedEof(..)
+, attributeLengthUnexpectedEof
+, AsAttributeUnexpectedEof(..)
+, attribute
+) where
+
+import Control.Applicative(Applicative)
+import Control.Lens(AsEmpty, Cons, Optic', Choice, prism', ( # ))
+import Control.Monad(Monad(return))
+import Control.Replicate(replicateO)
+import Data.Eq(Eq)
+import Data.Functor.Identity(Identity)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, (!-), word32be, word16be, word8)
+import Data.Word(Word8, Word16, Word32)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7 4.7. Attributes>
+data Attribute a =
+  Attribute
+    Word16 -- attribute_name_index
+    Word32 -- attribute_length
+    (a Word8)
+
+deriving instance Eq (a Word8) => Eq (Attribute a)
+deriving instance Ord (a Word8) => Ord (Attribute a)
+deriving instance Show (a Word8) => Show (Attribute a)
+
+data AttributeError =
+  AttributeNameIndexUnexpectedEof
+  | AttributeLengthUnexpectedEof
+  | AttributeUnexpectedEof Word32
+  deriving (Eq, Ord, Show)
+
+class AsAttributeNameIndexUnexpectedEof p f s where
+  _AttributeNameIndexUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsAttributeNameIndexUnexpectedEof p f AttributeError where
+  _AttributeNameIndexUnexpectedEof =
+    prism'
+      (\() -> AttributeNameIndexUnexpectedEof)
+      (\e -> case e of
+               AttributeNameIndexUnexpectedEof -> Just ()
+               _ -> Nothing)
+       
+attributeNameIndexUnexpectedEof ::
+  AsAttributeNameIndexUnexpectedEof Tagged Identity t =>
+  t
+attributeNameIndexUnexpectedEof =
+  _AttributeNameIndexUnexpectedEof # ()
+
+class AsAttributeLengthUnexpectedEof p f s where
+  _AttributeLengthUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsAttributeLengthUnexpectedEof p f AttributeError where
+  _AttributeLengthUnexpectedEof =
+    prism'
+      (\() -> AttributeLengthUnexpectedEof)
+      (\e -> case e of
+               AttributeLengthUnexpectedEof -> Just ()
+               _ -> Nothing)
+       
+attributeLengthUnexpectedEof ::
+  AsAttributeLengthUnexpectedEof Tagged Identity t =>
+  t
+attributeLengthUnexpectedEof =
+  _AttributeLengthUnexpectedEof # ()
+
+class AsAttributeUnexpectedEof p f s where
+  _AttributeUnexpectedEof :: 
+    Optic' p f s Word32
+
+instance (Choice p, Applicative f) => AsAttributeUnexpectedEof p f AttributeError where
+  _AttributeUnexpectedEof =
+    prism'
+      AttributeUnexpectedEof
+      (\e -> case e of
+               AttributeUnexpectedEof w -> Just w
+               _ -> Nothing)
+       
+attribute ::
+  (AsEmpty (a Word8), Cons (a Word8) (a Word8) Word8 Word8,
+  AsAttributeNameIndexUnexpectedEof Tagged Identity e,
+  AsAttributeLengthUnexpectedEof Tagged Identity e,
+  AsAttributeUnexpectedEof Tagged Identity e) =>
+  Get e (Attribute a)
+attribute =
+  do n <- attributeNameIndexUnexpectedEof !- word16be
+     l <- attributeLengthUnexpectedEof !- word32be
+     a <- replicateO (\x -> _AttributeUnexpectedEof # x !- word8) l
+     return (Attribute n l a)
diff --git a/src/Language/Java/Class/Attributes.hs b/src/Language/Java/Class/Attributes.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/Attributes.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Language.Java.Class.Attributes(
+  Attributes(..)
+, AttributesError(..)
+, AsAttributesInfoUnexpectedEof(..)
+, attributesInfoUnexpectedEof
+, AsAttributesAttributeError(..)
+, attributes
+) where
+
+import Control.Applicative(Applicative)
+import Control.Category((.))
+import Control.Lens
+import Control.Monad(Monad(return))
+import Control.Replicate(replicateO)
+import Data.Eq(Eq)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, word16be, (!!-), (!-))
+import Data.Word(Word8, Word16)
+import Language.Java.Class.Attribute(AsAttributeNameIndexUnexpectedEof(_AttributeNameIndexUnexpectedEof), AsAttributeLengthUnexpectedEof(_AttributeLengthUnexpectedEof), AsAttributeUnexpectedEof(_AttributeUnexpectedEof), Attribute, AttributeError, attribute)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 4.1. The ClassFile Structure>
+data Attributes a s =
+  Attributes
+    Word16
+    (s (Attribute a))
+
+deriving instance Eq (s (Attribute a)) => Eq (Attributes a s)
+deriving instance Ord (s (Attribute a)) => Ord (Attributes a s)
+deriving instance Show (s (Attribute a)) => Show (Attributes a s)
+
+data AttributesError =
+  AttributesInfoUnexpectedEof
+  | AttributesAttributeError Word16 AttributeError
+  deriving (Eq, Ord, Show)
+
+class AsAttributesInfoUnexpectedEof p f s where
+  _AttributesInfoUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsAttributesInfoUnexpectedEof p f AttributesError where
+  _AttributesInfoUnexpectedEof =
+    prism'
+      (\() -> AttributesInfoUnexpectedEof)
+      (\e -> case e of
+               AttributesInfoUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+attributesInfoUnexpectedEof ::
+  AsAttributesInfoUnexpectedEof Tagged Identity t =>
+  t
+attributesInfoUnexpectedEof=
+  _AttributesInfoUnexpectedEof # ()
+
+class AsAttributesAttributeError p f s where
+  _AttributesAttributeError :: 
+    Optic' p f s (Word16, AttributeError)
+
+instance (Choice p, Applicative f) => AsAttributesAttributeError p f AttributesError where
+  _AttributesAttributeError =
+    prism'
+      (\(w, r) -> AttributesAttributeError w r)
+      (\e -> case e of
+               AttributesAttributeError w r -> Just (w, r)
+               _ -> Nothing)
+
+instance (p ~ (->), Applicative f) => AsAttributeNameIndexUnexpectedEof p f AttributesError where
+  _AttributeNameIndexUnexpectedEof =
+    _AttributesAttributeError . _2 . _AttributeNameIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeLengthUnexpectedEof p f AttributesError where
+  _AttributeLengthUnexpectedEof =
+    _AttributesAttributeError . _2 . _AttributeLengthUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeUnexpectedEof p f AttributesError where
+  _AttributeUnexpectedEof =
+    _AttributesAttributeError . _2 . _AttributeUnexpectedEof
+
+attributes ::
+  (AsEmpty (a Word8), AsEmpty (s (Attribute a1)),
+    Cons (a Word8) (a Word8) Word8 Word8,
+    Cons
+      (s (Attribute a1)) (s (Attribute a1)) (Attribute a) (Attribute a),
+    AsAttributesInfoUnexpectedEof Tagged Identity e,
+    AsAttributesAttributeError Tagged Identity e) =>
+  Get e (Attributes a1 s)
+attributes =
+  do c <- attributesInfoUnexpectedEof !- word16be
+     i <- (_AttributesAttributeError #) !!- replicateO (\n -> ((,) n) !!- attribute) c
+     return (Attributes c i)
diff --git a/src/Language/Java/Class/Cafebabe.hs b/src/Language/Java/Class/Cafebabe.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/Cafebabe.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Language.Java.Class.Cafebabe(
+  CafebabeError(..)
+, AsCafebabeUnexpectedEof(..)
+, cafebabeUnexpectedEof
+, AsCafebabeInvalidMagicNumber(..)
+, cafebabe
+) where
+
+import Control.Applicative(Applicative)
+import Control.Lens(Optic', Choice, prism', ( # ))
+import Control.Monad(return)
+import Data.Eq(Eq((==)))
+import Data.Functor.Identity(Identity)
+import Data.Maybe(Maybe(Nothing, Just))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, (!-), word32be, failGet)
+import Data.Word(Word32)
+import Prelude(Show)
+
+data CafebabeError =
+  CafebabeUnexpectedEof
+  | CafebabeInvalidMagicNumber Word32
+  deriving (Eq, Ord, Show)
+
+class AsCafebabeUnexpectedEof p f s where
+  _CafebabeUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsCafebabeUnexpectedEof p f CafebabeError where
+  _CafebabeUnexpectedEof =
+    prism'
+      (\() -> CafebabeUnexpectedEof)
+      (\e -> case e of
+               CafebabeUnexpectedEof -> Just ()
+               CafebabeInvalidMagicNumber _ -> Nothing)
+
+cafebabeUnexpectedEof ::
+  AsCafebabeUnexpectedEof Tagged Identity t =>
+  t
+cafebabeUnexpectedEof =
+  _CafebabeUnexpectedEof # ()
+
+class AsCafebabeInvalidMagicNumber p f s where
+  _CafebabeInvalidMagicNumber :: 
+    Optic' p f s Word32
+
+instance (Choice p, Applicative f) => AsCafebabeInvalidMagicNumber p f CafebabeError where
+  _CafebabeInvalidMagicNumber =
+    prism'
+      CafebabeInvalidMagicNumber
+      (\e -> case e of
+               CafebabeUnexpectedEof -> Nothing
+               CafebabeInvalidMagicNumber w -> Just w)
+    
+cafebabe ::
+  (AsCafebabeUnexpectedEof Tagged Identity e, AsCafebabeInvalidMagicNumber Tagged Identity e) =>
+  Get e ()
+cafebabe =
+  do c <- cafebabeUnexpectedEof !- word32be 
+     if c == 0xCAFEBABE
+       then
+         return ()
+       else
+         failGet (_CafebabeInvalidMagicNumber # c)         
diff --git a/src/Language/Java/Class/ClassFile.hs b/src/Language/Java/Class/ClassFile.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/ClassFile.hs
@@ -0,0 +1,501 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE KindSignatures #-}
+
+module Language.Java.Class.ClassFile(
+  ClassFile(..)
+, ClassFile'
+, ClassFileError(..)
+, AsClassFileCafebabeError(..)
+, AsClassFileVersionError(..)
+, AsClassFileConstantPoolError(..)
+, AsClassFileThisAccessFlagsError(..)
+, AsClassFileThisClassError(..)
+, AsClassFileSuperClassError(..)
+, AsClassFileInterfacesError(..)
+, AsClassFileFieldsError(..)
+, AsClassFileMethodsError(..)
+, AsClassFileAttributesError(..)
+, AsClassFileUnexpectedInputOnStream(..)
+, classFileUnexpectedInputOnStream
+, classFile
+) where
+
+import Control.Applicative
+import Control.Category((.))
+import Control.Lens(AsEmpty, Cons, Choice, Optic', prism', ( # ))
+import Control.Monad(return)
+import Data.Char(Char)
+import Data.Eq(Eq)
+import Data.Functor.Identity(Identity)
+import Data.Maybe(Maybe(Nothing, Just))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, isEmpty, failGet, (!!-))
+import Data.Word(Word8, Word16)
+import Language.Java.Class.Attribute(AsAttributeNameIndexUnexpectedEof(_AttributeNameIndexUnexpectedEof), AsAttributeLengthUnexpectedEof(_AttributeLengthUnexpectedEof), AsAttributeUnexpectedEof(_AttributeUnexpectedEof), Attribute)
+import Language.Java.Class.Attributes(AsAttributesInfoUnexpectedEof(_AttributesInfoUnexpectedEof), AsAttributesAttributeError(_AttributesAttributeError), Attributes, AttributesError, attributes)
+import Language.Java.Class.Method(AsMethodNameIndexUnexpectedEof(_MethodNameIndexUnexpectedEof), AsMethodDescriptorIndexUnexpectedEof(_MethodDescriptorIndexUnexpectedEof), AsMethodAttributeCountUnexpectedEof(_MethodAttributeCountUnexpectedEof), AsMethodAttributeUnexpectedEof(_MethodAttributeUnexpectedEof), AsMethodMethodAccessFlagsError(_MethodMethodAccessFlagsError), AsMethodErrorAttributeError(_MethodErrorAttributeError), Method)
+import Language.Java.Class.Methods(AsMethodsInfoUnexpectedEof(_MethodsInfoUnexpectedEof), AsMethodsMethodError(_MethodsMethodError), Methods, MethodsError, methods)
+import Language.Java.Class.Field(AsFieldFieldAccessFlagsError(_FieldFieldAccessFlagsError), AsFieldNameIndexUnexpectedEof(_FieldNameIndexUnexpectedEof), AsFieldDescriptorIndexUnexpectedEof(_FieldDescriptorIndexUnexpectedEof), AsFieldAttributeCountUnexpectedEof(_FieldAttributeCountUnexpectedEof), AsFieldAttributeError(_FieldAttributeError), AsFieldErrorAttributeError(_FieldErrorAttributeError), Field)
+import Language.Java.Class.Fields(AsFieldsFieldInfoUnexpectedEof(_FieldsFieldInfoUnexpectedEof), AsFieldsFieldError(_FieldsFieldError), Fields, FieldsError, fields)
+import Language.Java.Class.Interfaces(AsInterfacesCountUnexpectedEof(_InterfacesCountUnexpectedEof), AsInterfacesUnexpectedEof(_InterfacesUnexpectedEof), Interfaces, InterfacesError, interfaces)
+import Language.Java.Class.SuperClass(AsSuperClassUnexpectedEof(_SuperClassUnexpectedEof), SuperClass, SuperClassError, superClass)
+import Language.Java.Class.ThisClass(AsThisClassUnexpectedEof(_ThisClassUnexpectedEof), ThisClass, ThisClassError, thisClass)
+import Language.Java.Class.ThisAccessFlags(AsThisAccessFlagsUnexpectedEof(_ThisAccessFlagsUnexpectedEof), ThisAccessFlags, ThisAccessFlagsError, thisAccessFlags)
+import Language.Java.Class.ConstantPoolInfo(AsConstantPoolInfoTagUnexpectedEof(_ConstantPoolInfoTagUnexpectedEof), AsConstantPoolInfoUtf8LengthUnexpectedEof(_ConstantPoolInfoUtf8LengthUnexpectedEof), AsConstantPoolInfoUtf8UnexpectedEof(_ConstantPoolInfoUtf8UnexpectedEof), AsConstantPoolInvalidJavaString(_ConstantPoolInvalidJavaString), AsConstantPoolInfoConstantIntegerUnexpectedEof(_ConstantPoolInfoConstantIntegerUnexpectedEof), AsConstantPoolInfoConstantFloatUnexpectedEof(_ConstantPoolInfoConstantFloatUnexpectedEof), AsConstantPoolInfoConstantLongUnexpectedEof(_ConstantPoolInfoConstantLongUnexpectedEof), AsConstantPoolInfoConstantDoubleUnexpectedEof(_ConstantPoolInfoConstantDoubleUnexpectedEof), AsConstantPoolInfoConstantClassUnexpectedEof(_ConstantPoolInfoConstantClassUnexpectedEof), AsConstantPoolInfoConstantStringUnexpectedEof(_ConstantPoolInfoConstantStringUnexpectedEof), AsConstantPoolInfoFieldRef1UnexpectedEof(_ConstantPoolInfoFieldRef1UnexpectedEof), AsConstantPoolInfoFieldRef2UnexpectedEof(_ConstantPoolInfoFieldRef2UnexpectedEof), AsConstantPoolInfoMethodRef1UnexpectedEof(_ConstantPoolInfoMethodRef1UnexpectedEof), AsConstantPoolInfoMethodRef2UnexpectedEof(_ConstantPoolInfoMethodRef2UnexpectedEof), AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof(_ConstantPoolInfoInterfaceMethodRef1UnexpectedEof), AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof(_ConstantPoolInfoInterfaceMethodRef2UnexpectedEof), AsConstantPoolInfoNameAndType1UnexpectedEof(_ConstantPoolInfoNameAndType1UnexpectedEof), AsConstantPoolInfoNameAndType2UnexpectedEof(_ConstantPoolInfoNameAndType2UnexpectedEof), AsConstantPoolInfoInvalidConstantPoolTag(_ConstantPoolInfoInvalidConstantPoolTag), ConstantPoolInfo)
+import Language.Java.Class.MethodAccessFlags(AsMethodAccessFlagsUnexpectedEof(_MethodAccessFlagsUnexpectedEof))
+import Language.Java.Class.ConstantPool(AsConstantPoolCountUnexpectedEof(_ConstantPoolCountUnexpectedEof), AsConstantPoolConstantPoolInfoError(_ConstantPoolConstantPoolInfoError), ConstantPool, ConstantPoolError, constantPool)
+import Language.Java.Class.Cafebabe(AsCafebabeUnexpectedEof(_CafebabeUnexpectedEof), AsCafebabeInvalidMagicNumber(_CafebabeInvalidMagicNumber), CafebabeError, cafebabe)
+import Language.Java.Class.Version(AsVersionMinorUnexpectedEof(_VersionMinorUnexpectedEof), AsVersionMajorUnexpectedEof(_VersionMajorUnexpectedEof), Version, VersionError, version)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 4.1. The ClassFile Structure >
+data ClassFile p c i a f s m b t d u =
+  ClassFile
+    Version
+    (ConstantPool p c)
+    ThisAccessFlags
+    ThisClass
+    SuperClass
+    (Interfaces i)
+    (Fields a f s)
+    (Methods m b t)
+    (Attributes d u)
+
+deriving instance (Eq (ConstantPool p c), Eq (Interfaces i), Eq (Fields a f s), Eq (Methods m b t), Eq (Attributes d u)) => Eq (ClassFile p c i a f s m b t d u)
+deriving instance (Ord (ConstantPool p c), Ord (Interfaces i), Ord (Fields a f s), Ord (Methods m b t), Ord (Attributes d u)) => Ord (ClassFile p c i a f s m b t d u)
+deriving instance (Show (ConstantPool p c), Show (Interfaces i), Show (Fields a f s), Show (Methods m b t), Show (Attributes d u)) => Show (ClassFile p c i a f s m b t d u)
+
+type ClassFile' x =
+  ClassFile x x x x x x x x x x x
+    
+data ClassFileError c =
+  ClassFileCafebabeError CafebabeError
+  | ClassFileVersionError VersionError
+  | ClassFileConstantPoolError (ConstantPoolError c)
+  | ClassFileThisAccessFlagsError ThisAccessFlagsError
+  | ClassFileThisClassError ThisClassError
+  | ClassFileSuperClassError SuperClassError
+  | ClassFileInterfacesError InterfacesError
+  | ClassFileFieldsError FieldsError
+  | ClassFileMethodsError MethodsError
+  | ClassFileAttributesError AttributesError
+  | ClassFileUnexpectedInputOnStream
+
+deriving instance Eq (ConstantPoolError c) => Eq (ClassFileError c)
+deriving instance Ord (ConstantPoolError c) => Ord (ClassFileError c)
+deriving instance Show (ConstantPoolError c) => Show (ClassFileError c)
+
+class AsClassFileCafebabeError p f s where
+  _ClassFileCafebabeError :: 
+    Optic' p f s CafebabeError
+
+instance (Choice p, Applicative f) => AsClassFileCafebabeError p f (ClassFileError c) where
+  _ClassFileCafebabeError =
+    prism'
+      ClassFileCafebabeError
+      (\e -> case e of
+               ClassFileCafebabeError r -> Just r
+               _ -> Nothing)
+
+instance (Choice p, Applicative f) => AsCafebabeUnexpectedEof p f (ClassFileError c) where
+  _CafebabeUnexpectedEof =
+    _ClassFileCafebabeError . _CafebabeUnexpectedEof
+
+instance (Choice p, Applicative f) => AsCafebabeInvalidMagicNumber p f (ClassFileError c) where
+  _CafebabeInvalidMagicNumber =
+    _ClassFileCafebabeError . _CafebabeInvalidMagicNumber
+
+class AsClassFileVersionError p f s where
+  _ClassFileVersionError :: 
+    Optic' p f s VersionError
+
+instance (Choice p, Applicative f) => AsClassFileVersionError p f (ClassFileError c) where
+  _ClassFileVersionError =
+    prism'
+      ClassFileVersionError
+      (\e -> case e of
+               ClassFileVersionError r -> Just r
+               _ -> Nothing)
+
+instance (Choice p, Applicative f) => AsVersionMinorUnexpectedEof p f (ClassFileError c) where
+  _VersionMinorUnexpectedEof =
+    _ClassFileVersionError . _VersionMinorUnexpectedEof
+
+instance (Choice p, Applicative f) => AsVersionMajorUnexpectedEof p f (ClassFileError c) where
+  _VersionMajorUnexpectedEof =
+    _ClassFileVersionError . _VersionMajorUnexpectedEof
+
+class AsClassFileConstantPoolError p f s where
+  _ClassFileConstantPoolError :: 
+    Optic' p f (s c) (ConstantPoolError c)
+
+instance (Choice p, Applicative f) => AsClassFileConstantPoolError p f ClassFileError where
+  _ClassFileConstantPoolError =
+    prism'
+      ClassFileConstantPoolError
+      (\e -> case e of
+               ClassFileConstantPoolError r -> Just r
+               _ -> Nothing)
+
+instance (Choice p, Applicative f) => AsConstantPoolCountUnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolCountUnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolCountUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolConstantPoolInfoError p f ClassFileError where
+  _ConstantPoolConstantPoolInfoError =
+    _ClassFileConstantPoolError . _ConstantPoolConstantPoolInfoError
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoTagUnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoTagUnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoTagUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoUtf8LengthUnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoUtf8LengthUnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoUtf8LengthUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoUtf8UnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoUtf8UnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoUtf8UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInvalidJavaString p f ClassFileError where
+  _ConstantPoolInvalidJavaString =
+    _ClassFileConstantPoolError . _ConstantPoolInvalidJavaString
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantIntegerUnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoConstantIntegerUnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoConstantIntegerUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantFloatUnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoConstantFloatUnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoConstantFloatUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantLongUnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoConstantLongUnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoConstantLongUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantDoubleUnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoConstantDoubleUnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoConstantDoubleUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantClassUnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoConstantClassUnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoConstantClassUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantStringUnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoConstantStringUnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoConstantStringUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoFieldRef1UnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoFieldRef1UnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoFieldRef1UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoFieldRef2UnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoFieldRef2UnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoFieldRef2UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoMethodRef1UnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoMethodRef1UnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoMethodRef1UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoMethodRef2UnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoMethodRef2UnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoMethodRef2UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoInterfaceMethodRef1UnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoInterfaceMethodRef1UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoInterfaceMethodRef2UnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoInterfaceMethodRef2UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoNameAndType1UnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoNameAndType1UnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoNameAndType1UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoNameAndType2UnexpectedEof p f (ClassFileError c) where
+  _ConstantPoolInfoNameAndType2UnexpectedEof =
+    _ClassFileConstantPoolError . _ConstantPoolInfoNameAndType2UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoInvalidConstantPoolTag p f (ClassFileError c) where
+  _ConstantPoolInfoInvalidConstantPoolTag =
+    _ClassFileConstantPoolError . _ConstantPoolInfoInvalidConstantPoolTag
+
+class AsClassFileThisAccessFlagsError p f s where
+  _ClassFileThisAccessFlagsError :: 
+    Optic' p f s ThisAccessFlagsError
+
+instance (Choice p, Applicative f) => AsClassFileThisAccessFlagsError p f (ClassFileError c) where
+  _ClassFileThisAccessFlagsError =
+    prism'
+      ClassFileThisAccessFlagsError
+      (\e -> case e of
+               ClassFileThisAccessFlagsError r -> Just r
+               _ -> Nothing)
+
+instance (Choice p, Applicative f) => AsThisAccessFlagsUnexpectedEof p f (ClassFileError c) where
+  _ThisAccessFlagsUnexpectedEof =
+    _ClassFileThisAccessFlagsError . _ThisAccessFlagsUnexpectedEof
+
+class AsClassFileThisClassError p f s where
+  _ClassFileThisClassError :: 
+    Optic' p f s ThisClassError
+
+instance (Choice p, Applicative f) => AsClassFileThisClassError p f (ClassFileError c) where
+  _ClassFileThisClassError =
+    prism'
+      ClassFileThisClassError
+      (\e -> case e of
+               ClassFileThisClassError r -> Just r
+               _ -> Nothing)
+
+instance (Choice p, Applicative f) => AsThisClassUnexpectedEof p f (ClassFileError c) where
+  _ThisClassUnexpectedEof =
+    _ClassFileThisClassError . _ThisClassUnexpectedEof
+
+class AsClassFileSuperClassError p f s where
+  _ClassFileSuperClassError :: 
+    Optic' p f s SuperClassError
+
+instance (Choice p, Applicative f) => AsClassFileSuperClassError p f (ClassFileError c) where
+  _ClassFileSuperClassError =
+    prism'
+      ClassFileSuperClassError
+      (\e -> case e of
+               ClassFileSuperClassError r -> Just r
+               _ -> Nothing)
+
+instance (Choice p, Applicative f) => AsSuperClassUnexpectedEof p f (ClassFileError c) where
+  _SuperClassUnexpectedEof =
+    _ClassFileSuperClassError . _SuperClassUnexpectedEof
+
+class AsClassFileInterfacesError p f s where
+  _ClassFileInterfacesError :: 
+    Optic' p f s InterfacesError
+
+instance (Choice p, Applicative f) => AsClassFileInterfacesError p f (ClassFileError c) where
+  _ClassFileInterfacesError =
+    prism'
+      ClassFileInterfacesError
+      (\e -> case e of
+               ClassFileInterfacesError r -> Just r
+               _ -> Nothing)
+
+instance (Choice p, Applicative f) => AsInterfacesCountUnexpectedEof p f (ClassFileError c) where
+  _InterfacesCountUnexpectedEof =
+    _ClassFileInterfacesError . _InterfacesCountUnexpectedEof
+
+instance (Choice p, Applicative f) => AsInterfacesUnexpectedEof p f (ClassFileError c) where
+  _InterfacesUnexpectedEof =
+    _ClassFileInterfacesError . _InterfacesUnexpectedEof
+
+class AsClassFileFieldsError p f s where
+  _ClassFileFieldsError :: 
+    Optic' p f s FieldsError
+
+instance (Choice p, Applicative f) => AsClassFileFieldsError p f (ClassFileError c) where
+  _ClassFileFieldsError =
+    prism'
+      ClassFileFieldsError
+      (\e -> case e of
+               ClassFileFieldsError r -> Just r
+               _ -> Nothing)
+
+instance (Choice p, Applicative f) => AsFieldsFieldInfoUnexpectedEof p f (ClassFileError c) where
+  _FieldsFieldInfoUnexpectedEof =
+    _ClassFileFieldsError . _FieldsFieldInfoUnexpectedEof
+
+instance (Choice p, Applicative f) => AsFieldsFieldError p f (ClassFileError c) where
+  _FieldsFieldError =
+    _ClassFileFieldsError . _FieldsFieldError
+
+instance (p ~ (->), Applicative f) => AsFieldFieldAccessFlagsError p f (ClassFileError c) where
+  _FieldFieldAccessFlagsError =
+    _ClassFileFieldsError . _FieldFieldAccessFlagsError
+
+instance (p ~ (->), Applicative f) => AsFieldNameIndexUnexpectedEof p f (ClassFileError c) where
+  _FieldNameIndexUnexpectedEof =
+    _ClassFileFieldsError . _FieldNameIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsFieldDescriptorIndexUnexpectedEof p f (ClassFileError c) where
+  _FieldDescriptorIndexUnexpectedEof =
+    _ClassFileFieldsError . _FieldDescriptorIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsFieldAttributeCountUnexpectedEof p f (ClassFileError c) where
+  _FieldAttributeCountUnexpectedEof =
+    _ClassFileFieldsError . _FieldAttributeCountUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsFieldErrorAttributeError p f (ClassFileError c) where
+  _FieldErrorAttributeError =
+    _ClassFileFieldsError . _FieldErrorAttributeError
+
+instance (p ~ (->), Applicative f) => AsFieldAttributeError p f (ClassFileError c) where
+  _FieldAttributeError =
+    _ClassFileFieldsError . _FieldAttributeError
+
+class AsClassFileMethodsError p f s where
+  _ClassFileMethodsError :: 
+    Optic' p f s MethodsError
+
+instance (Choice p, Applicative f) => AsClassFileMethodsError p f (ClassFileError c) where
+  _ClassFileMethodsError =
+    prism'
+      ClassFileMethodsError
+      (\e -> case e of
+               ClassFileMethodsError r -> Just r
+               _ -> Nothing)
+
+instance (Choice p, Applicative f) => AsMethodsInfoUnexpectedEof p f (ClassFileError c) where
+  _MethodsInfoUnexpectedEof =
+    _ClassFileMethodsError . _MethodsInfoUnexpectedEof
+  
+instance (Choice p, Applicative f) => AsMethodsMethodError p f (ClassFileError c) where
+  _MethodsMethodError =
+    _ClassFileMethodsError . _MethodsMethodError
+
+instance (p ~ (->), Applicative f) => AsMethodNameIndexUnexpectedEof p f (ClassFileError c) where
+  _MethodNameIndexUnexpectedEof =
+    _ClassFileMethodsError . _MethodNameIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsMethodDescriptorIndexUnexpectedEof p f (ClassFileError c) where
+  _MethodDescriptorIndexUnexpectedEof =
+    _ClassFileMethodsError . _MethodDescriptorIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsMethodAttributeCountUnexpectedEof p f (ClassFileError c) where
+  _MethodAttributeCountUnexpectedEof =
+    _ClassFileMethodsError . _MethodAttributeCountUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsMethodAttributeUnexpectedEof p f (ClassFileError c) where
+  _MethodAttributeUnexpectedEof =
+    _ClassFileMethodsError . _MethodAttributeUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsMethodErrorAttributeError p f (ClassFileError c) where
+  _MethodErrorAttributeError =
+    _ClassFileMethodsError . _MethodErrorAttributeError
+
+instance (p ~ (->), Applicative f) => AsMethodMethodAccessFlagsError p f (ClassFileError c) where
+  _MethodMethodAccessFlagsError =
+    _ClassFileMethodsError . _MethodMethodAccessFlagsError
+
+instance (p ~ (->), Applicative f) => AsMethodAccessFlagsUnexpectedEof p f (ClassFileError c) where
+  _MethodAccessFlagsUnexpectedEof =
+    _ClassFileMethodsError . _MethodAccessFlagsUnexpectedEof
+
+class AsClassFileAttributesError p f s where
+  _ClassFileAttributesError :: 
+    Optic' p f s AttributesError
+
+instance (Choice p, Applicative f) => AsClassFileAttributesError p f (ClassFileError c) where
+  _ClassFileAttributesError =
+    prism'
+      ClassFileAttributesError
+      (\e -> case e of
+               ClassFileAttributesError r -> Just r
+               _ -> Nothing)
+
+instance (p ~ (->), Applicative f) => AsAttributesInfoUnexpectedEof p f (ClassFileError c) where
+  _AttributesInfoUnexpectedEof =
+    _ClassFileAttributesError . _AttributesInfoUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributesAttributeError p f (ClassFileError c) where
+  _AttributesAttributeError =
+    _ClassFileAttributesError . _AttributesAttributeError
+
+instance (p ~ (->), Applicative f) => AsAttributeNameIndexUnexpectedEof p f (ClassFileError c) where
+  _AttributeNameIndexUnexpectedEof =
+    _ClassFileAttributesError . _AttributeNameIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeLengthUnexpectedEof p f (ClassFileError c) where
+  _AttributeLengthUnexpectedEof =
+    _ClassFileAttributesError . _AttributeLengthUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeUnexpectedEof p f (ClassFileError c) where
+  _AttributeUnexpectedEof =
+    _ClassFileAttributesError . _AttributeUnexpectedEof
+
+class AsClassFileUnexpectedInputOnStream p f s where
+  _ClassFileUnexpectedInputOnStream :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsClassFileUnexpectedInputOnStream p f (ClassFileError c) where
+  _ClassFileUnexpectedInputOnStream =
+    prism'
+      (\() -> ClassFileUnexpectedInputOnStream)
+      (\e -> case e of
+               ClassFileUnexpectedInputOnStream -> Just ()
+               _ -> Nothing)
+
+classFileUnexpectedInputOnStream ::
+  AsClassFileUnexpectedInputOnStream Tagged Identity t =>
+  t
+classFileUnexpectedInputOnStream =
+  _ClassFileUnexpectedInputOnStream # ()
+
+classFile ::
+  (AsEmpty (c Word8), AsEmpty (t Char),
+    AsEmpty (f (Attribute a1)), AsEmpty (a Word8),
+    AsEmpty (m (Attribute a2)), AsEmpty (a3 Word8), AsEmpty (a4 Word8),
+    AsEmpty (c1 (ConstantPoolInfo p)), AsEmpty (i Word16),
+    AsEmpty (s1 (Field a5 f1)), AsEmpty (t1 (Method m1 b)),
+    AsEmpty (u (Attribute d)), Cons (c Word8) (c Word8) Word8 Word8,
+    Cons (t Char) (t Char) Char Char,
+    Cons
+      (f (Attribute a1)) (f (Attribute a1)) (Attribute a) (Attribute a),
+    Cons (a Word8) (a Word8) Word8 Word8,
+    Cons
+      (m (Attribute a2))
+      (m (Attribute a2))
+      (Attribute a3)
+      (Attribute a3),
+    Cons (a3 Word8) (a3 Word8) Word8 Word8,
+    Cons (a4 Word8) (a4 Word8) Word8 Word8,
+    Cons
+      (c1 (ConstantPoolInfo p))
+      (c1 (ConstantPoolInfo p))
+      (ConstantPoolInfo t)
+      (ConstantPoolInfo t),
+    Cons (i Word16) (i Word16) Word16 Word16,
+    Cons
+      (s1 (Field a5 f1)) (s1 (Field a5 f1)) (Field a1 f) (Field a1 f),
+    Cons
+      (t1 (Method m1 b)) (t1 (Method m1 b)) (Method m a2) (Method m a2),
+    Cons
+      (u (Attribute d)) (u (Attribute d)) (Attribute a4) (Attribute a4),
+    AsClassFileCafebabeError Tagged Identity (s c),
+    AsClassFileVersionError Tagged Identity (s c),
+    AsClassFileConstantPoolError Tagged Identity s,
+    AsClassFileThisAccessFlagsError Tagged Identity (s c),
+    AsClassFileThisClassError Tagged Identity (s c),
+    AsClassFileSuperClassError Tagged Identity (s c),
+    AsClassFileInterfacesError Tagged Identity (s c),
+    AsClassFileFieldsError Tagged Identity (s c),
+    AsClassFileMethodsError Tagged Identity (s c),
+    AsClassFileAttributesError Tagged Identity (s c),
+    AsClassFileUnexpectedInputOnStream Tagged Identity (s c)) =>
+  Get (s c) (ClassFile p c1 i a5 f1 s1 m1 b t1 d u)
+classFile =
+  do (_ClassFileCafebabeError #) !!- cafebabe
+     v <- (_ClassFileVersionError #) !!- version
+     p <- (_ClassFileConstantPoolError #) !!- constantPool
+     a <- (_ClassFileThisAccessFlagsError #) !!- thisAccessFlags
+     t <- (_ClassFileThisClassError #) !!- thisClass
+     s <- (_ClassFileSuperClassError #) !!- superClass
+     i <- (_ClassFileInterfacesError #) !!- interfaces
+     f <- (_ClassFileFieldsError #) !!- fields
+     m <- (_ClassFileMethodsError #) !!- methods
+     b <- (_ClassFileAttributesError #) !!- attributes
+     e <- isEmpty
+     if e
+       then
+         return (ClassFile v p a t s i f m b)
+       else
+         failGet classFileUnexpectedInputOnStream
diff --git a/src/Language/Java/Class/ConstantPool.hs b/src/Language/Java/Class/ConstantPool.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/ConstantPool.hs
@@ -0,0 +1,230 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Language.Java.Class.ConstantPool(
+  ConstantPool(..)
+, AsConstantPool(..)
+, ConstantPoolError(..)
+, AsConstantPoolCountUnexpectedEof(..)
+, constantPoolCountUnexpectedEof
+, AsConstantPoolConstantPoolInfoError(..)
+, constantPool
+, constantPool'
+) where
+
+import Control.Applicative(Applicative, liftA2)
+import Control.Category((.), id)
+import Control.Lens(Choice, Optic', Cons, AsEmpty, Profunctor, prism', iso, isn't, ( # ))
+import Control.Lens.Internal.Prism
+import Control.Monad(Monad(return))
+import Control.Replicate(replicateN)
+import Data.Bool(bool, (&&))
+import Data.Char(Char)
+import Data.Eq(Eq)
+import Data.Functor((<$>), Functor)
+import Data.Functor.Identity(Identity)
+import Data.Int(Int64)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, word16be, (!-), (!!-))
+import Data.Word(Word8, Word16)
+import Language.Java.Class.ConstantPoolInfo(AsConstantPoolInfoTagUnexpectedEof(_ConstantPoolInfoTagUnexpectedEof), AsConstantPoolInfoUtf8LengthUnexpectedEof(_ConstantPoolInfoUtf8LengthUnexpectedEof), AsConstantPoolInfoUtf8UnexpectedEof(_ConstantPoolInfoUtf8UnexpectedEof), AsConstantPoolInvalidJavaString(_ConstantPoolInvalidJavaString), AsConstantPoolInfoConstantIntegerUnexpectedEof(_ConstantPoolInfoConstantIntegerUnexpectedEof), AsConstantPoolInfoConstantFloatUnexpectedEof(_ConstantPoolInfoConstantFloatUnexpectedEof), AsConstantPoolInfoConstantLongUnexpectedEof(_ConstantPoolInfoConstantLongUnexpectedEof), AsConstantPoolInfoConstantDoubleUnexpectedEof(_ConstantPoolInfoConstantDoubleUnexpectedEof), AsConstantPoolInfoConstantClassUnexpectedEof(_ConstantPoolInfoConstantClassUnexpectedEof), AsConstantPoolInfoConstantStringUnexpectedEof(_ConstantPoolInfoConstantStringUnexpectedEof), AsConstantPoolInfoFieldRef1UnexpectedEof(_ConstantPoolInfoFieldRef1UnexpectedEof), AsConstantPoolInfoFieldRef2UnexpectedEof(_ConstantPoolInfoFieldRef2UnexpectedEof), AsConstantPoolInfoMethodRef1UnexpectedEof(_ConstantPoolInfoMethodRef1UnexpectedEof), AsConstantPoolInfoMethodRef2UnexpectedEof(_ConstantPoolInfoMethodRef2UnexpectedEof), AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof(_ConstantPoolInfoInterfaceMethodRef1UnexpectedEof), AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof(_ConstantPoolInfoInterfaceMethodRef2UnexpectedEof), AsConstantPoolInfoNameAndType1UnexpectedEof(_ConstantPoolInfoNameAndType1UnexpectedEof), AsConstantPoolInfoNameAndType2UnexpectedEof(_ConstantPoolInfoNameAndType2UnexpectedEof), AsConstantPoolInfoInvalidConstantPoolTag(_ConstantPoolInfoInvalidConstantPoolTag), ConstantPoolInfo, ConstantPoolInfoError, constantPoolInfo, _ConstantDouble, _ConstantLong, AsUtf8, AsConstantLong, AsConstantFloat, AsConstantInteger, AsConstantString, AsInterfaceMethodRef, AsMethodRef, AsFieldRef, AsConstantClass, AsNameAndType, AsConstantDouble)
+import Prelude(Show, Num((-)), Double, subtract)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4 4.4. The Constant Pool>
+data ConstantPool p c =
+  ConstantPool
+    Word16
+    (c (ConstantPoolInfo p))
+
+deriving instance Eq (c (ConstantPoolInfo p)) => Eq (ConstantPool p c)
+deriving instance Ord (c (ConstantPoolInfo p)) => Ord (ConstantPool p c)
+deriving instance Show (c (ConstantPoolInfo p)) => Show (ConstantPool p c)
+
+class AsConstantPool p f s where
+  _ConstantPool ::
+    Optic' p f (s p' c) (Word16, c (ConstantPoolInfo p'))
+
+instance (Profunctor p, Functor f) => AsConstantPool p f ConstantPool where
+  _ConstantPool =
+    iso
+      (\(ConstantPool w i) -> (w, i))
+      (\(w, i) -> ConstantPool w i)
+
+data ConstantPoolError c =
+  ConstantPoolCountUnexpectedEof
+  | ConstantPoolConstantPoolInfoError (ConstantPoolInfoError c)
+
+deriving instance Eq (ConstantPoolInfoError c) => Eq (ConstantPoolError c)
+deriving instance Ord (ConstantPoolInfoError c) => Ord (ConstantPoolError c)
+deriving instance Show (ConstantPoolInfoError c) => Show (ConstantPoolError c)
+
+class AsConstantPoolCountUnexpectedEof p f s where
+  _ConstantPoolCountUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolCountUnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolCountUnexpectedEof =
+    prism'
+      (\() -> ConstantPoolCountUnexpectedEof)
+      (\e -> case e of
+               ConstantPoolCountUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolCountUnexpectedEof ::
+  AsConstantPoolCountUnexpectedEof Tagged Identity t =>
+  t
+constantPoolCountUnexpectedEof =
+  _ConstantPoolCountUnexpectedEof # ()
+
+class AsConstantPoolConstantPoolInfoError p f s where
+  _ConstantPoolConstantPoolInfoError :: 
+    Optic' p f (s c) (ConstantPoolInfoError c)
+
+instance (Choice p, Applicative f) => AsConstantPoolConstantPoolInfoError p f ConstantPoolError where
+  _ConstantPoolConstantPoolInfoError =
+    prism'
+      ConstantPoolConstantPoolInfoError
+      (\e -> case e of
+               ConstantPoolConstantPoolInfoError r -> Just r
+               _ -> Nothing)
+
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoTagUnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoTagUnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoTagUnexpectedEof
+
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoUtf8LengthUnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoUtf8LengthUnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoUtf8LengthUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoUtf8UnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoUtf8UnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoUtf8UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInvalidJavaString p f ConstantPoolError where
+  _ConstantPoolInvalidJavaString =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInvalidJavaString
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantIntegerUnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoConstantIntegerUnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantIntegerUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantFloatUnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoConstantFloatUnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantFloatUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantLongUnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoConstantLongUnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantLongUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantDoubleUnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoConstantDoubleUnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantDoubleUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantClassUnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoConstantClassUnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantClassUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantStringUnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoConstantStringUnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantStringUnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoFieldRef1UnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoFieldRef1UnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoFieldRef1UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoFieldRef2UnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoFieldRef2UnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoFieldRef2UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoMethodRef1UnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoMethodRef1UnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoMethodRef1UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoMethodRef2UnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoMethodRef2UnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoMethodRef2UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoInterfaceMethodRef1UnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoInterfaceMethodRef1UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoInterfaceMethodRef2UnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoInterfaceMethodRef2UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoNameAndType1UnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoNameAndType1UnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoNameAndType1UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoNameAndType2UnexpectedEof p f (ConstantPoolError c) where
+  _ConstantPoolInfoNameAndType2UnexpectedEof =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoNameAndType2UnexpectedEof
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoInvalidConstantPoolTag p f (ConstantPoolError c) where
+  _ConstantPoolInfoInvalidConstantPoolTag =
+    _ConstantPoolConstantPoolInfoError . _ConstantPoolInfoInvalidConstantPoolTag
+
+constantPool ::
+  (AsEmpty (c Word8), AsEmpty (q Char),
+    AsEmpty (c1 (ConstantPoolInfo p')),
+    Cons
+      (c Word8)
+      (c Word8)
+      Word8
+      Word8,
+    Cons (q Char) (q Char) Char Char,
+    Cons
+      (c1 (ConstantPoolInfo p'))
+      (c1 (ConstantPoolInfo p'))
+      (s1 q)
+      (s1 q),
+    AsUtf8 Tagged Identity s1,
+    AsNameAndType Tagged Identity (s1 q),
+    AsConstantDouble Tagged Identity (s1 q),
+    AsConstantDouble
+      (Market Double Double) Identity (s1 q),
+    AsConstantLong Tagged Identity (s1 q),
+    AsConstantLong
+      (Market Int64 Int64)
+      Identity
+      (s1 q),
+    AsConstantFloat Tagged Identity (s1 q),
+    AsConstantInteger Tagged Identity (s1 q),
+    AsConstantString Tagged Identity (s1 q),
+    AsInterfaceMethodRef Tagged Identity (s1 q),
+    AsMethodRef Tagged Identity (s1 q),
+    AsFieldRef Tagged Identity (s1 q),
+    AsConstantClass Tagged Identity (s1 q),
+    AsConstantPoolConstantPoolInfoError Tagged Identity s,
+    AsConstantPoolCountUnexpectedEof Tagged Identity (s c),
+    AsConstantPool Tagged Identity s2) =>
+  Get (s c) (s2 p' c1)
+constantPool =
+  constantPool' constantPoolInfo
+
+constantPool' ::
+  (AsEmpty (c1 (ConstantPoolInfo p')),
+  Cons (c1 (ConstantPoolInfo p')) (c1 (ConstantPoolInfo p')) a a,
+  AsConstantDouble (Market Double Double) Identity a,
+  AsConstantLong (Market Int64 Int64) Identity a,
+  AsConstantPoolConstantPoolInfoError Tagged Identity s,
+  AsConstantPoolCountUnexpectedEof Tagged Identity (s c),
+  AsConstantPool Tagged Identity s1) =>
+  Get (ConstantPoolInfoError c) a
+  -> Get (s c) (s1 p' c1)
+constantPool' cpi =
+  let jump =
+        bool (subtract 1) id . liftA2 (&&) (isn't _ConstantLong) (isn't _ConstantDouble)
+  in do constant_pool_count <- constantPoolCountUnexpectedEof !- word16be
+        pool <- (_ConstantPoolConstantPoolInfoError #) !!- replicateN (\n -> (\i -> (jump i n, i)) <$> cpi) (constant_pool_count - 1)
+        return (_ConstantPool # (constant_pool_count, pool))
diff --git a/src/Language/Java/Class/ConstantPoolInfo.hs b/src/Language/Java/Class/ConstantPoolInfo.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/ConstantPoolInfo.hs
@@ -0,0 +1,764 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Language.Java.Class.ConstantPoolInfo (
+  ConstantPoolInfo(..)
+, AsConstantClass(..)
+, AsFieldRef(..)
+, AsMethodRef(..)
+, AsInterfaceMethodRef(..)
+, AsConstantString(..)
+, AsConstantInteger(..)
+, AsConstantFloat(..)
+, AsConstantLong(..)
+, AsConstantDouble(..)
+, AsNameAndType(..)
+, AsUtf8(..)
+, ConstantPoolInfoError(..)
+, AsConstantPoolInfoTagUnexpectedEof(..)
+, constantPoolInfoTagUnexpectedEof
+, AsConstantPoolInfoUtf8LengthUnexpectedEof(..)
+, constantPoolInfoUtf8LengthUnexpectedEof
+, AsConstantPoolInfoUtf8UnexpectedEof(..)
+, AsConstantPoolInvalidJavaString(..)
+, AsConstantPoolInfoConstantIntegerUnexpectedEof(..)
+, constantPoolInfoConstantIntegerUnexpectedEof
+, AsConstantPoolInfoConstantFloatUnexpectedEof(..)
+, constantPoolInfoConstantFloatUnexpectedEof
+, AsConstantPoolInfoConstantLongUnexpectedEof(..)
+, constantPoolInfoConstantLongUnexpectedEof
+, AsConstantPoolInfoConstantDoubleUnexpectedEof(..)
+, constantPoolInfoConstantDoubleUnexpectedEof
+, AsConstantPoolInfoConstantClassUnexpectedEof(..)
+, constantPoolInfoConstantClassUnexpectedEof
+, AsConstantPoolInfoConstantStringUnexpectedEof(..)
+, constantPoolInfoConstantStringUnexpectedEof
+, AsConstantPoolInfoFieldRef1UnexpectedEof(..)
+, constantPoolInfoFieldRef1UnexpectedEof
+, AsConstantPoolInfoFieldRef2UnexpectedEof(..)
+, constantPoolInfoFieldRef2UnexpectedEof
+, AsConstantPoolInfoMethodRef1UnexpectedEof(..)
+, constantPoolInfoMethodRef1UnexpectedEof
+, AsConstantPoolInfoMethodRef2UnexpectedEof(..)
+, constantPoolInfoMethodRef2UnexpectedEof
+, AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof(..)
+, constantPoolInfoInterfaceMethodRef1UnexpectedEof
+, AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof(..)
+, constantPoolInfoInterfaceMethodRef2UnexpectedEof
+, AsConstantPoolInfoNameAndType1UnexpectedEof(..)
+, constantPoolInfoNameAndType1UnexpectedEof
+, AsConstantPoolInfoNameAndType2UnexpectedEof(..)
+, constantPoolInfoNameAndType2UnexpectedEof
+, AsConstantPoolInfoInvalidConstantPoolTag(..)
+, constantPoolInfo
+, constantPoolInfo'
+) where
+
+import Control.Applicative(Applicative)
+import Control.Category((.))
+import Control.Lens(Optic', Choice, Cons, AsEmpty(_Empty), uncons, prism', (<|), ( # ))
+import Control.Monad(Monad(return, (>>=)))
+import Control.Replicate(replicateO)
+import Data.Bifunctor(bimap)
+import Data.Bits(Bits, shift, (.&.))
+import Data.Bool(bool, (&&))
+import Data.Char(Char, chr)
+import Data.Eq(Eq((==)))
+import Data.Functor.Identity(Identity)
+import Data.Int(Int32, Int64)
+import Data.Maybe(Maybe(Just, Nothing), fromMaybe)
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle((!-), Get, failGet, word8, word16be, int32be, float32be, int64be, float64be)
+import Data.Tuple(curry, uncurry)
+import Data.Word(Word8, Word16)
+import Prelude(Show, Num((+)), Integral, fromIntegral, Float, Double)
+
+-- |
+--
+-- < Table 4.3. Constant pool tags>
+data ConstantPoolInfo p =
+  ConstantClass Word16
+  | FieldRef Word16 Word16
+  | MethodRef Word16 Word16
+  | InterfaceMethodRef Word16 Word16
+  | ConstantString Word16
+  | ConstantInteger Int32
+  | ConstantFloat Float
+  | ConstantLong Int64
+  | ConstantDouble Double
+  | NameAndType Word16 Word16
+  | Utf8 Word16 (p Char)
+
+deriving instance Eq (p Char) => Eq (ConstantPoolInfo p)
+deriving instance Ord (p Char) => Ord (ConstantPoolInfo p)
+deriving instance Show (p Char) => Show (ConstantPoolInfo p)
+
+class AsConstantClass p f s where
+  _ConstantClass ::
+    Optic' p f s Word16
+
+instance (Choice p', Applicative f) => AsConstantClass p' f (ConstantPoolInfo p) where
+  _ConstantClass =
+    prism'
+      ConstantClass
+      (\p -> case p of
+               ConstantClass w -> Just w
+               _ -> Nothing)
+
+class AsFieldRef p f s where
+  _FieldRef ::
+    Optic' p f s (Word16, Word16)
+
+instance (Choice p', Applicative f) => AsFieldRef p' f (ConstantPoolInfo p) where
+  _FieldRef =
+    prism'
+      (uncurry FieldRef)
+      (\p -> case p of
+               FieldRef w1 w2 -> Just (w1, w2)
+               _ -> Nothing)
+
+class AsMethodRef p f s where
+  _MethodRef ::
+    Optic' p f s (Word16, Word16)
+
+instance (Choice p', Applicative f) => AsMethodRef p' f (ConstantPoolInfo p) where
+  _MethodRef =
+    prism'
+      (uncurry MethodRef)
+      (\p -> case p of
+               MethodRef w1 w2 -> Just (w1, w2)
+               _ -> Nothing)
+
+class AsInterfaceMethodRef p f s where
+  _InterfaceMethodRef ::
+    Optic' p f s (Word16, Word16)
+
+instance (Choice p', Applicative f) => AsInterfaceMethodRef p' f (ConstantPoolInfo p) where
+  _InterfaceMethodRef =
+    prism'
+      (uncurry InterfaceMethodRef)
+      (\p -> case p of
+               InterfaceMethodRef w1 w2 -> Just (w1, w2)
+               _ -> Nothing)
+
+class AsConstantString p f s where
+  _ConstantString ::
+    Optic' p f s Word16
+
+instance (Choice p', Applicative f) => AsConstantString p' f (ConstantPoolInfo p) where
+  _ConstantString =
+    prism'
+      ConstantString
+      (\p -> case p of
+               ConstantString w -> Just w
+               _ -> Nothing)
+
+class AsConstantInteger p f s where
+  _ConstantInteger ::
+    Optic' p f s Int32
+
+instance (Choice p', Applicative f) => AsConstantInteger p' f (ConstantPoolInfo p) where
+  _ConstantInteger =
+    prism'
+      ConstantInteger
+      (\p -> case p of
+               ConstantInteger w -> Just w
+               _ -> Nothing)
+
+class AsConstantFloat p f s where
+  _ConstantFloat ::
+    Optic' p f s Float
+
+instance (Choice p', Applicative f) => AsConstantFloat p' f (ConstantPoolInfo p) where
+  _ConstantFloat =
+    prism'
+      ConstantFloat
+      (\p -> case p of
+               ConstantFloat w -> Just w
+               _ -> Nothing)
+
+class AsConstantLong p f s where
+  _ConstantLong ::
+    Optic' p f s Int64
+
+instance (Choice p', Applicative f) => AsConstantLong p' f (ConstantPoolInfo p) where
+  _ConstantLong =
+    prism'
+      ConstantLong
+      (\p -> case p of
+               ConstantLong w -> Just w
+               _ -> Nothing)
+
+class AsConstantDouble p f s where
+  _ConstantDouble ::
+    Optic' p f s Double
+
+instance (Choice p', Applicative f) => AsConstantDouble p' f (ConstantPoolInfo p) where
+  _ConstantDouble =
+    prism'
+      ConstantDouble
+      (\p -> case p of
+               ConstantDouble w -> Just w
+               _ -> Nothing)
+
+class AsNameAndType p f s where
+  _NameAndType ::
+    Optic' p f s (Word16, Word16)
+
+instance (Choice p', Applicative f) => AsNameAndType p' f (ConstantPoolInfo p) where
+  _NameAndType =
+    prism'
+      (uncurry NameAndType)
+      (\p -> case p of
+               NameAndType w1 w2 -> Just (w1, w2)
+               _ -> Nothing)
+
+class AsUtf8 p f s where
+  _Utf8 ::
+    Optic' p f (s q) (Word16, q Char)
+
+instance (Choice p', Applicative f) => AsUtf8 p' f ConstantPoolInfo where
+  _Utf8 =
+    prism'
+      (uncurry Utf8)
+      (\p -> case p of
+               Utf8 w1 w2 -> Just (w1, w2)
+               _ -> Nothing)
+
+data ConstantPoolInfoError c =
+  ConstantPoolInfoTagUnexpectedEof
+  | ConstantPoolInfoUtf8LengthUnexpectedEof
+  | ConstantPoolInfoUtf8UnexpectedEof Word16
+  | ConstantPoolInvalidJavaString (c Word8)
+  | ConstantPoolInfoConstantIntegerUnexpectedEof
+  | ConstantPoolInfoConstantFloatUnexpectedEof
+  | ConstantPoolInfoConstantLongUnexpectedEof
+  | ConstantPoolInfoConstantDoubleUnexpectedEof
+  | ConstantPoolInfoConstantClassUnexpectedEof
+  | ConstantPoolInfoConstantStringUnexpectedEof
+  | ConstantPoolInfoFieldRef1UnexpectedEof
+  | ConstantPoolInfoFieldRef2UnexpectedEof
+  | ConstantPoolInfoMethodRef1UnexpectedEof
+  | ConstantPoolInfoMethodRef2UnexpectedEof
+  | ConstantPoolInfoInterfaceMethodRef1UnexpectedEof
+  | ConstantPoolInfoInterfaceMethodRef2UnexpectedEof
+  | ConstantPoolInfoNameAndType1UnexpectedEof
+  | ConstantPoolInfoNameAndType2UnexpectedEof
+  | ConstantPoolInfoInvalidConstantPoolTag Word8
+
+deriving instance Eq (c Word8) => Eq (ConstantPoolInfoError c)
+deriving instance Ord (c Word8) => Ord (ConstantPoolInfoError c)
+deriving instance Show (c Word8) => Show (ConstantPoolInfoError c)
+
+class AsConstantPoolInfoTagUnexpectedEof p f s where
+  _ConstantPoolInfoTagUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoTagUnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoTagUnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoTagUnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoTagUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoTagUnexpectedEof ::
+  AsConstantPoolInfoTagUnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoTagUnexpectedEof =
+  _ConstantPoolInfoTagUnexpectedEof # ()
+
+class AsConstantPoolInfoUtf8LengthUnexpectedEof p f s where
+  _ConstantPoolInfoUtf8LengthUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoUtf8LengthUnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoUtf8LengthUnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoUtf8LengthUnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoUtf8LengthUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoUtf8LengthUnexpectedEof ::
+  AsConstantPoolInfoUtf8LengthUnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoUtf8LengthUnexpectedEof =
+  _ConstantPoolInfoUtf8LengthUnexpectedEof # ()
+
+class AsConstantPoolInfoUtf8UnexpectedEof p f s where
+  _ConstantPoolInfoUtf8UnexpectedEof :: 
+    Optic' p f s Word16
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoUtf8UnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoUtf8UnexpectedEof =
+    prism'
+      ConstantPoolInfoUtf8UnexpectedEof
+      (\e -> case e of
+               ConstantPoolInfoUtf8UnexpectedEof w -> Just w
+               _ -> Nothing)
+
+class AsConstantPoolInvalidJavaString p f s where
+  _ConstantPoolInvalidJavaString :: 
+    Optic' p f (s c) (c Word8)
+
+instance (Choice p, Applicative f) => AsConstantPoolInvalidJavaString p f ConstantPoolInfoError where
+  _ConstantPoolInvalidJavaString =
+    prism'
+      ConstantPoolInvalidJavaString
+      (\e -> case e of
+               ConstantPoolInvalidJavaString w -> Just w
+               _ -> Nothing)
+
+class AsConstantPoolInfoConstantIntegerUnexpectedEof p f s where
+  _ConstantPoolInfoConstantIntegerUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantIntegerUnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoConstantIntegerUnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoConstantIntegerUnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoConstantIntegerUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoConstantIntegerUnexpectedEof ::
+  AsConstantPoolInfoConstantIntegerUnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoConstantIntegerUnexpectedEof =
+  _ConstantPoolInfoConstantIntegerUnexpectedEof # ()
+
+class AsConstantPoolInfoConstantFloatUnexpectedEof p f s where
+  _ConstantPoolInfoConstantFloatUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantFloatUnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoConstantFloatUnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoConstantFloatUnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoConstantFloatUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoConstantFloatUnexpectedEof ::
+  AsConstantPoolInfoConstantFloatUnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoConstantFloatUnexpectedEof =
+  _ConstantPoolInfoConstantFloatUnexpectedEof # ()
+
+class AsConstantPoolInfoConstantLongUnexpectedEof p f s where
+  _ConstantPoolInfoConstantLongUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantLongUnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoConstantLongUnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoConstantLongUnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoConstantLongUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoConstantLongUnexpectedEof ::
+  AsConstantPoolInfoConstantLongUnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoConstantLongUnexpectedEof =
+  _ConstantPoolInfoConstantLongUnexpectedEof # ()
+
+class AsConstantPoolInfoConstantDoubleUnexpectedEof p f s where
+  _ConstantPoolInfoConstantDoubleUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantDoubleUnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoConstantDoubleUnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoConstantDoubleUnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoConstantDoubleUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoConstantDoubleUnexpectedEof ::
+  AsConstantPoolInfoConstantDoubleUnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoConstantDoubleUnexpectedEof =
+  _ConstantPoolInfoConstantDoubleUnexpectedEof # ()
+
+class AsConstantPoolInfoConstantClassUnexpectedEof p f s where
+  _ConstantPoolInfoConstantClassUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantClassUnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoConstantClassUnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoConstantClassUnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoConstantClassUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoConstantClassUnexpectedEof ::
+  AsConstantPoolInfoConstantClassUnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoConstantClassUnexpectedEof =
+  _ConstantPoolInfoConstantClassUnexpectedEof # ()
+
+class AsConstantPoolInfoConstantStringUnexpectedEof p f s where
+  _ConstantPoolInfoConstantStringUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoConstantStringUnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoConstantStringUnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoConstantStringUnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoConstantStringUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoConstantStringUnexpectedEof ::
+  AsConstantPoolInfoConstantStringUnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoConstantStringUnexpectedEof =
+  _ConstantPoolInfoConstantStringUnexpectedEof # ()
+
+class AsConstantPoolInfoFieldRef1UnexpectedEof p f s where
+  _ConstantPoolInfoFieldRef1UnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoFieldRef1UnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoFieldRef1UnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoFieldRef1UnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoFieldRef1UnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoFieldRef1UnexpectedEof ::
+  AsConstantPoolInfoFieldRef1UnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoFieldRef1UnexpectedEof =
+  _ConstantPoolInfoFieldRef1UnexpectedEof # ()
+
+class AsConstantPoolInfoFieldRef2UnexpectedEof p f s where
+  _ConstantPoolInfoFieldRef2UnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoFieldRef2UnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoFieldRef2UnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoFieldRef2UnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoFieldRef2UnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoFieldRef2UnexpectedEof ::
+  AsConstantPoolInfoFieldRef2UnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoFieldRef2UnexpectedEof =
+  _ConstantPoolInfoFieldRef2UnexpectedEof # ()
+
+class AsConstantPoolInfoMethodRef1UnexpectedEof p f s where
+  _ConstantPoolInfoMethodRef1UnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoMethodRef1UnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoMethodRef1UnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoMethodRef1UnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoMethodRef1UnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoMethodRef1UnexpectedEof ::
+  AsConstantPoolInfoMethodRef1UnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoMethodRef1UnexpectedEof =
+  _ConstantPoolInfoMethodRef1UnexpectedEof # ()
+
+class AsConstantPoolInfoMethodRef2UnexpectedEof p f s where
+  _ConstantPoolInfoMethodRef2UnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoMethodRef2UnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoMethodRef2UnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoMethodRef2UnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoMethodRef2UnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoMethodRef2UnexpectedEof ::
+  AsConstantPoolInfoMethodRef2UnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoMethodRef2UnexpectedEof =
+  _ConstantPoolInfoMethodRef2UnexpectedEof # ()
+
+class AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof p f s where
+  _ConstantPoolInfoInterfaceMethodRef1UnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoInterfaceMethodRef1UnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoInterfaceMethodRef1UnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoInterfaceMethodRef1UnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoInterfaceMethodRef1UnexpectedEof ::
+  AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoInterfaceMethodRef1UnexpectedEof =
+  _ConstantPoolInfoInterfaceMethodRef1UnexpectedEof # ()
+
+class AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof p f s where
+  _ConstantPoolInfoInterfaceMethodRef2UnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoInterfaceMethodRef2UnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoInterfaceMethodRef2UnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoInterfaceMethodRef2UnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoInterfaceMethodRef2UnexpectedEof ::
+  AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoInterfaceMethodRef2UnexpectedEof =
+  _ConstantPoolInfoInterfaceMethodRef2UnexpectedEof # ()
+
+class AsConstantPoolInfoNameAndType1UnexpectedEof p f s where
+  _ConstantPoolInfoNameAndType1UnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoNameAndType1UnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoNameAndType1UnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoNameAndType1UnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoNameAndType1UnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoNameAndType1UnexpectedEof ::
+  AsConstantPoolInfoNameAndType1UnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoNameAndType1UnexpectedEof =
+  _ConstantPoolInfoNameAndType1UnexpectedEof # ()
+
+class AsConstantPoolInfoNameAndType2UnexpectedEof p f s where
+  _ConstantPoolInfoNameAndType2UnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoNameAndType2UnexpectedEof p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoNameAndType2UnexpectedEof =
+    prism'
+      (\() -> ConstantPoolInfoNameAndType2UnexpectedEof)
+      (\e -> case e of
+               ConstantPoolInfoNameAndType2UnexpectedEof -> Just ()
+               _ -> Nothing)
+
+constantPoolInfoNameAndType2UnexpectedEof ::
+  AsConstantPoolInfoNameAndType2UnexpectedEof Tagged Identity t =>
+  t
+constantPoolInfoNameAndType2UnexpectedEof =
+  _ConstantPoolInfoNameAndType2UnexpectedEof # ()
+
+class AsConstantPoolInfoInvalidConstantPoolTag p f s where
+  _ConstantPoolInfoInvalidConstantPoolTag :: 
+    Optic' p f s Word8
+
+instance (Choice p, Applicative f) => AsConstantPoolInfoInvalidConstantPoolTag p f (ConstantPoolInfoError c) where
+  _ConstantPoolInfoInvalidConstantPoolTag =
+    prism'
+      ConstantPoolInfoInvalidConstantPoolTag
+      (\e -> case e of
+               ConstantPoolInfoInvalidConstantPoolTag w -> Just w
+               _ -> Nothing)
+
+getJavaString ::
+  (Integral a, Monad m, AsEmpty b, AsEmpty (m b), Cons s s a a,
+  Cons b b Char Char, Bits a) =>
+  s
+  -> m b
+getJavaString q =
+  let empty :: AsEmpty t => t
+      empty = _Empty # ()
+  in case uncons q of
+       Nothing ->
+         return empty
+       Just (x, rest) ->
+         bool
+           (case uncons rest of
+             Nothing ->
+               empty
+             Just (y, rest2) ->
+               bool
+                 (case uncons rest2 of
+                   Nothing ->
+                     empty
+                   Just (z, rest3) ->
+                     bool
+                       empty
+                       (let i = ((fromIntegral x .&. 0x0F) `shift` 12 + (fromIntegral y .&. 0x3F) `shift` 6 + (fromIntegral z .&. 0x3F))
+                        in getJavaString rest3 >>= return . (chr i <|))
+                       ((x .&. 0xF0) == 0xE0 && ((y .&. 0xC0) == 0x80) && ((z .&. 0xC0) == 0x80)))
+                 (let i = (fromIntegral x .&. 0x1F) `shift` 6 + (fromIntegral y .&. 0x3F)
+                  in getJavaString rest2 >>= return . (chr i <|))
+                 ((x .&. 0xE0) == 0xC0 && ((y .&. 0xC0) == 0x80)))
+           (getJavaString rest >>= return . (chr (fromIntegral x) <|))
+           ((x .&. 0x80) == 0)
+
+constantPoolInfo ::
+  (AsEmpty (c Word8), AsEmpty (q Char),
+  Cons
+    (c Word8)
+    (c Word8)
+    Word8
+    Word8,
+  Cons (q Char) (q Char) Char Char,
+  AsConstantPoolInfoInvalidConstantPoolTag
+    Tagged Identity (s c),
+  AsConstantPoolInfoNameAndType2UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoNameAndType1UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoMethodRef2UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoMethodRef1UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoFieldRef2UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoFieldRef1UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantStringUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantClassUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantDoubleUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantLongUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantFloatUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantIntegerUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInvalidJavaString Tagged Identity s,
+  AsConstantPoolInfoUtf8UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoUtf8LengthUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoTagUnexpectedEof
+    Tagged Identity (s c),
+  AsUtf8 Tagged Identity s1,
+  AsNameAndType Tagged Identity (s1 q),
+  AsConstantDouble Tagged Identity (s1 q),
+  AsConstantLong Tagged Identity (s1 q),
+  AsConstantFloat Tagged Identity (s1 q),
+  AsConstantInteger Tagged Identity (s1 q),
+  AsConstantString Tagged Identity (s1 q),
+  AsInterfaceMethodRef Tagged Identity (s1 q),
+  AsMethodRef Tagged Identity (s1 q),
+  AsFieldRef Tagged Identity (s1 q),
+  AsConstantClass Tagged Identity (s1 q)) =>
+  Get (s c) (s1 q)
+constantPoolInfo =
+  constantPoolInfo' (\_ -> Nothing)
+
+constantPoolInfo' ::
+  (AsEmpty (c Word8), AsEmpty (q Char),
+  Cons
+    (c Word8)
+    (c Word8)
+    Word8
+    Word8,
+  Cons (q Char) (q Char) Char Char,
+  AsConstantPoolInfoInvalidConstantPoolTag
+    Tagged Identity (s c),
+  AsConstantPoolInfoNameAndType2UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoNameAndType1UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoMethodRef2UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoMethodRef1UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoFieldRef2UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoFieldRef1UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantStringUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantClassUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantDoubleUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantLongUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantFloatUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoConstantIntegerUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInvalidJavaString Tagged Identity s,
+  AsConstantPoolInfoUtf8UnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoUtf8LengthUnexpectedEof
+    Tagged Identity (s c),
+  AsConstantPoolInfoTagUnexpectedEof
+    Tagged Identity (s c),
+  AsUtf8 Tagged Identity s1,
+  AsNameAndType Tagged Identity (s1 q),
+  AsConstantDouble Tagged Identity (s1 q),
+  AsConstantLong Tagged Identity (s1 q),
+  AsConstantFloat Tagged Identity (s1 q),
+  AsConstantInteger Tagged Identity (s1 q),
+  AsConstantString Tagged Identity (s1 q),
+  AsInterfaceMethodRef Tagged Identity (s1 q),
+  AsMethodRef Tagged Identity (s1 q),
+  AsFieldRef Tagged Identity (s1 q),
+  AsConstantClass Tagged Identity (s1 q)) =>
+  (Word8 -> Maybe (Get (s c) (s1 q))) 
+  -> Get (s c) (s1 q)
+constantPoolInfo' f =
+  let eset = bimap . return
+      two16 t e1 e2 =
+        do c <- e1 !- word16be
+           n <- e2 !- word16be
+           return (t c n)        
+  in do t <- constantPoolInfoTagUnexpectedEof !- word8
+        case t of 
+          1 ->
+            do l <- constantPoolInfoUtf8LengthUnexpectedEof !- word16be
+               b <- replicateO (\n -> _ConstantPoolInfoUtf8UnexpectedEof # n !- word8) l
+               case getJavaString b of
+                 Nothing -> failGet (_ConstantPoolInvalidJavaString # b)
+                 Just s -> return (_Utf8 # (l, s))
+          3 ->
+            eset constantPoolInfoConstantIntegerUnexpectedEof (_ConstantInteger #) int32be
+          4 ->
+            eset constantPoolInfoConstantFloatUnexpectedEof (_ConstantFloat #) float32be
+          5 ->
+            eset constantPoolInfoConstantLongUnexpectedEof (_ConstantLong #) int64be
+          6 ->
+            eset constantPoolInfoConstantDoubleUnexpectedEof (_ConstantDouble #) float64be
+          7 ->
+            eset constantPoolInfoConstantClassUnexpectedEof (_ConstantClass #) word16be
+          8 ->
+            eset constantPoolInfoConstantStringUnexpectedEof (_ConstantString #) word16be
+          9 ->
+            two16 (curry (_FieldRef #)) constantPoolInfoFieldRef1UnexpectedEof constantPoolInfoFieldRef2UnexpectedEof
+          10 ->
+            two16 (curry (_MethodRef #)) constantPoolInfoMethodRef1UnexpectedEof constantPoolInfoMethodRef2UnexpectedEof
+          11 ->
+            two16 (curry (_InterfaceMethodRef #)) constantPoolInfoInterfaceMethodRef1UnexpectedEof constantPoolInfoMethodRef2UnexpectedEof
+          12 ->
+            two16 (curry (_NameAndType #)) constantPoolInfoNameAndType1UnexpectedEof constantPoolInfoNameAndType2UnexpectedEof
+          _ ->
+            fromMaybe (failGet (_ConstantPoolInfoInvalidConstantPoolTag # t)) (f t) 
diff --git a/src/Language/Java/Class/Field.hs b/src/Language/Java/Class/Field.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/Field.hs
@@ -0,0 +1,207 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Language.Java.Class.Field(
+  Field(..)
+, FieldErrorAttributeError(..)
+, AsFieldErrorAttributeError(..)
+, FieldError(..)
+, AsFieldFieldAccessFlagsError(..)
+, AsFieldNameIndexUnexpectedEof(..)
+, fieldNameIndexUnexpectedEof
+, AsFieldDescriptorIndexUnexpectedEof(..)
+, fieldDescriptorIndexUnexpectedEof
+, AsFieldAttributeCountUnexpectedEof(..)
+, fieldAttributeCountUnexpectedEof
+, AsFieldAttributeError(..)
+, field
+) where
+
+import Control.Applicative(Applicative)
+import Control.Category((.), id)
+import Control.Lens(AsEmpty, Cons, Optic', Choice, Profunctor, prism', ( # ), _2, iso)
+import Control.Monad(Monad(return))
+import Control.Replicate(replicateO)
+import Data.Eq(Eq)
+import Data.Functor(Functor)
+import Data.Functor.Identity(Identity)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, (!!-), (!-), word16be)
+import Data.Word(Word8, Word16)
+import Language.Java.Class.Attribute(AsAttributeNameIndexUnexpectedEof(_AttributeNameIndexUnexpectedEof), AsAttributeLengthUnexpectedEof(_AttributeLengthUnexpectedEof), AsAttributeUnexpectedEof(_AttributeUnexpectedEof), Attribute, AttributeError, attribute)
+import Language.Java.Class.FieldAccessFlags
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.5 4.5. Fields>
+data Field a f =
+  Field
+    FieldAccessFlags
+    Word16 -- name_index
+    Word16 -- descriptor_index
+    Word16 -- attribute_count
+    (f (Attribute a))
+
+deriving instance Eq (f (Attribute a)) => Eq (Field a f)
+deriving instance Ord (f (Attribute a)) => Ord (Field a f)
+deriving instance Show (f (Attribute a)) => Show (Field a f)
+
+newtype FieldErrorAttributeError =
+  FieldErrorAttributeError
+    AttributeError
+  deriving (Eq, Ord, Show)
+
+class AsFieldErrorAttributeError p f s where
+  _FieldErrorAttributeError ::
+    Optic' p f s FieldErrorAttributeError
+
+instance AsFieldErrorAttributeError p f FieldErrorAttributeError where
+  _FieldErrorAttributeError =
+    id
+
+instance (Profunctor p, Functor f) => AsFieldErrorAttributeError p f AttributeError where
+  _FieldErrorAttributeError =
+    iso
+      FieldErrorAttributeError
+      (\(FieldErrorAttributeError e) -> e)
+
+instance AsAttributeUnexpectedEof p f FieldErrorAttributeError where
+  _AttributeUnexpectedEof =
+    _FieldErrorAttributeError . _AttributeUnexpectedEof
+
+instance AsAttributeLengthUnexpectedEof p f FieldErrorAttributeError where  
+  _AttributeLengthUnexpectedEof =
+    _FieldErrorAttributeError . _AttributeLengthUnexpectedEof
+
+instance AsAttributeNameIndexUnexpectedEof p f FieldErrorAttributeError where    
+  _AttributeNameIndexUnexpectedEof =
+    _FieldErrorAttributeError . _AttributeNameIndexUnexpectedEof
+
+data FieldError =
+  FieldFieldAccessFlagsError FieldAccessFlagsError 
+  | FieldNameIndexUnexpectedEof
+  | FieldDescriptorIndexUnexpectedEof
+  | FieldAttributeCountUnexpectedEof
+  | FieldAttributeError Word16 FieldErrorAttributeError
+  deriving (Eq, Ord, Show)
+
+class AsFieldFieldAccessFlagsError p f s where
+  _FieldFieldAccessFlagsError :: 
+    Optic' p f s FieldAccessFlagsError
+
+instance (Choice p, Applicative f) => AsFieldFieldAccessFlagsError p f FieldError where
+  _FieldFieldAccessFlagsError =
+    prism'
+      FieldFieldAccessFlagsError
+      (\e -> case e of
+               FieldFieldAccessFlagsError r -> Just r
+               _ -> Nothing)
+       
+class AsFieldNameIndexUnexpectedEof p f s where
+  _FieldNameIndexUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsFieldNameIndexUnexpectedEof p f FieldError where
+  _FieldNameIndexUnexpectedEof =
+    prism'
+      (\() -> FieldNameIndexUnexpectedEof)
+      (\e -> case e of
+               FieldNameIndexUnexpectedEof -> Just ()
+               _ -> Nothing)   
+       
+fieldNameIndexUnexpectedEof ::
+  AsFieldNameIndexUnexpectedEof Tagged Identity t =>
+  t
+fieldNameIndexUnexpectedEof =
+  _FieldNameIndexUnexpectedEof # ()
+        
+class AsFieldDescriptorIndexUnexpectedEof p f s where
+  _FieldDescriptorIndexUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsFieldDescriptorIndexUnexpectedEof p f FieldError where
+  _FieldDescriptorIndexUnexpectedEof =
+    prism'
+      (\() -> FieldDescriptorIndexUnexpectedEof)
+      (\e -> case e of
+               FieldDescriptorIndexUnexpectedEof -> Just ()
+               _ -> Nothing)   
+    
+fieldDescriptorIndexUnexpectedEof ::
+  AsFieldDescriptorIndexUnexpectedEof Tagged Identity t =>
+  t
+fieldDescriptorIndexUnexpectedEof =
+  _FieldDescriptorIndexUnexpectedEof # ()
+        
+class AsFieldAttributeCountUnexpectedEof p f s where
+  _FieldAttributeCountUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsFieldAttributeCountUnexpectedEof p f FieldError where
+  _FieldAttributeCountUnexpectedEof =
+    prism'
+      (\() -> FieldAttributeCountUnexpectedEof)
+      (\e -> case e of
+               FieldAttributeCountUnexpectedEof -> Just ()
+               _ -> Nothing)   
+
+fieldAttributeCountUnexpectedEof ::
+  AsFieldAttributeCountUnexpectedEof Tagged Identity t =>
+  t
+fieldAttributeCountUnexpectedEof =
+  _FieldAttributeCountUnexpectedEof # ()
+        
+class AsFieldAttributeError p f s where
+  _FieldAttributeError :: 
+    Optic' p f s (Word16, FieldErrorAttributeError)
+
+instance (Choice p, Applicative f) => AsFieldAttributeError p f FieldError where
+  _FieldAttributeError =
+    prism'
+      (\(w, r) -> FieldAttributeError w r)
+      (\e -> case e of
+               FieldAttributeError w r -> Just (w, r)
+               _ -> Nothing)
+
+instance (p ~ (->), Applicative f) => AsFieldErrorAttributeError p f FieldError where
+  _FieldErrorAttributeError =
+    _FieldAttributeError . _2 . _FieldErrorAttributeError
+
+instance (p ~ (->), Applicative f) => AsAttributeNameIndexUnexpectedEof p f FieldError where
+  _AttributeNameIndexUnexpectedEof =
+    _FieldAttributeError . _2 . _AttributeNameIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeLengthUnexpectedEof p f FieldError where
+  _AttributeLengthUnexpectedEof =
+    _FieldAttributeError . _2 . _AttributeLengthUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeUnexpectedEof p f FieldError where
+  _AttributeUnexpectedEof =
+    _FieldAttributeError . _2 . _AttributeUnexpectedEof
+
+field ::
+  (AsEmpty (a Word8), AsEmpty (f (Attribute a1)),
+    Cons (a Word8) (a Word8) Word8 Word8,
+    Cons
+      (f (Attribute a1)) (f (Attribute a1)) (Attribute a) (Attribute a),
+    AsFieldFieldAccessFlagsError Tagged Identity e,
+    AsFieldNameIndexUnexpectedEof Tagged Identity e,
+    AsFieldDescriptorIndexUnexpectedEof Tagged Identity e,
+    AsFieldAttributeCountUnexpectedEof Tagged Identity e,
+    AsFieldAttributeError Tagged Identity e) =>
+  Get e (Field a1 f)
+field =
+  do f <- (_FieldFieldAccessFlagsError #) !!- fieldAccessFlags
+     n <- fieldNameIndexUnexpectedEof !- word16be
+     d <- fieldDescriptorIndexUnexpectedEof !- word16be
+     c <- fieldAttributeCountUnexpectedEof !- word16be
+     a <- replicateO (\x -> (\w -> _FieldAttributeError # (x, w)) !!- attribute) c
+     return (Field f n d c a)
diff --git a/src/Language/Java/Class/FieldAccessFlags.hs b/src/Language/Java/Class/FieldAccessFlags.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/FieldAccessFlags.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Language.Java.Class.FieldAccessFlags(
+  FieldAccessFlags(..)
+, FieldAccessFlagsError(..)
+, AsFieldAccessFlagsUnexpectedEof(..)
+, fieldAccessFlagsUnexpectedEof
+, fieldAccessFlags
+) where
+
+import Control.Lens(Optic', Profunctor, iso, ( # ))
+import Control.Monad(return)
+import Data.Eq(Eq)
+import Data.Functor(Functor)
+import Data.Functor.Identity(Identity)
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, (!-), word16be)
+import Data.Word(Word16)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.5 4.5. Fields>
+newtype FieldAccessFlags =
+  FieldAccessFlags
+    Word16
+  deriving (Eq, Ord, Show)
+
+data FieldAccessFlagsError =
+  FieldAccessFlagsUnexpectedEof
+  deriving (Eq, Ord, Show)
+
+class AsFieldAccessFlagsUnexpectedEof p f s where
+  _FieldAccessFlagsUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Profunctor p, Functor f) => AsFieldAccessFlagsUnexpectedEof p f FieldAccessFlagsError where
+  _FieldAccessFlagsUnexpectedEof =
+    iso
+      (\_ -> ())
+      (\() -> FieldAccessFlagsUnexpectedEof)
+
+fieldAccessFlagsUnexpectedEof ::
+  AsFieldAccessFlagsUnexpectedEof Tagged Identity t =>
+  t
+fieldAccessFlagsUnexpectedEof =
+  _FieldAccessFlagsUnexpectedEof # ()
+
+fieldAccessFlags ::
+  AsFieldAccessFlagsUnexpectedEof Tagged Identity e =>
+  Get e FieldAccessFlags
+fieldAccessFlags =
+  do af <- fieldAccessFlagsUnexpectedEof !- word16be
+     return (FieldAccessFlags af)
diff --git a/src/Language/Java/Class/Fields.hs b/src/Language/Java/Class/Fields.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/Fields.hs
@@ -0,0 +1,130 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Language.Java.Class.Fields(
+  Fields(..)
+, FieldsError(..)
+, AsFieldsFieldInfoUnexpectedEof(..)
+, fieldsFieldInfoUnexpectedEof
+, AsFieldsFieldError(..)
+, fields
+) where
+
+import Control.Applicative(Applicative)
+import Control.Category((.))
+import Control.Lens(Cons, AsEmpty, Optic', Choice, prism', ( # ), _2)
+import Control.Monad(Monad(return))
+import Control.Replicate(replicateO)
+import Data.Eq(Eq)
+import Data.Functor.Identity(Identity)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, (!!-), (!-), word16be)
+import Data.Word(Word8, Word16)
+import Language.Java.Class.Attribute(AsAttributeNameIndexUnexpectedEof(_AttributeNameIndexUnexpectedEof), AsAttributeLengthUnexpectedEof(_AttributeLengthUnexpectedEof), AsAttributeUnexpectedEof(_AttributeUnexpectedEof), Attribute)
+import Language.Java.Class.Field(AsFieldErrorAttributeError(_FieldErrorAttributeError), AsFieldFieldAccessFlagsError(_FieldFieldAccessFlagsError), AsFieldNameIndexUnexpectedEof(_FieldNameIndexUnexpectedEof), AsFieldDescriptorIndexUnexpectedEof(_FieldDescriptorIndexUnexpectedEof), AsFieldAttributeCountUnexpectedEof(_FieldAttributeCountUnexpectedEof), AsFieldAttributeError(_FieldAttributeError), Field, FieldError, field)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 4.1. The ClassFile Structure>
+data Fields a f s =
+  Fields
+    Word16
+    (s (Field a f))
+
+deriving instance Eq (s (Field a f)) => Eq (Fields a f s)
+deriving instance Ord (s (Field a f)) => Ord (Fields a f s)
+deriving instance Show (s (Field a f)) => Show (Fields a f s)
+
+data FieldsError =
+  FieldsFieldInfoUnexpectedEof
+  | FieldsFieldError Word16 FieldError
+  deriving (Eq, Ord, Show)
+
+class AsFieldsFieldInfoUnexpectedEof p f s where
+  _FieldsFieldInfoUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsFieldsFieldInfoUnexpectedEof p f FieldsError where
+  _FieldsFieldInfoUnexpectedEof =
+    prism'
+      (\() -> FieldsFieldInfoUnexpectedEof)
+      (\e -> case e of
+               FieldsFieldInfoUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+fieldsFieldInfoUnexpectedEof ::
+  AsFieldsFieldInfoUnexpectedEof Tagged Identity t =>
+  t
+fieldsFieldInfoUnexpectedEof=
+  _FieldsFieldInfoUnexpectedEof # ()
+
+class AsFieldsFieldError p f s where
+  _FieldsFieldError :: 
+    Optic' p f s (Word16, FieldError)
+
+instance (Choice p, Applicative f) => AsFieldsFieldError p f FieldsError where
+  _FieldsFieldError =
+   prism'
+      (\(w, r) -> FieldsFieldError w r)
+      (\e -> case e of
+               FieldsFieldError w r -> Just (w, r)
+               _ -> Nothing)
+
+instance (p ~ (->), Applicative f) => AsFieldFieldAccessFlagsError p f FieldsError where
+  _FieldFieldAccessFlagsError =
+    _FieldsFieldError . _2 . _FieldFieldAccessFlagsError
+
+instance (p ~ (->), Applicative f) => AsFieldNameIndexUnexpectedEof p f FieldsError where
+  _FieldNameIndexUnexpectedEof =
+    _FieldsFieldError . _2 . _FieldNameIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsFieldDescriptorIndexUnexpectedEof p f FieldsError where
+  _FieldDescriptorIndexUnexpectedEof =
+    _FieldsFieldError . _2 . _FieldDescriptorIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsFieldAttributeCountUnexpectedEof p f FieldsError where
+  _FieldAttributeCountUnexpectedEof =
+    _FieldsFieldError . _2 . _FieldAttributeCountUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsFieldAttributeError p f FieldsError where
+  _FieldAttributeError =
+    _FieldsFieldError . _2 . _FieldAttributeError
+
+instance (p ~ (->), Applicative f) => AsFieldErrorAttributeError p f FieldsError where
+  _FieldErrorAttributeError =
+    _FieldsFieldError . _2 . _FieldErrorAttributeError
+
+instance (p ~ (->), Applicative f) => AsAttributeNameIndexUnexpectedEof p f FieldsError where
+  _AttributeNameIndexUnexpectedEof =
+    _FieldsFieldError . _2 . _AttributeNameIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeLengthUnexpectedEof p f FieldsError where
+  _AttributeLengthUnexpectedEof =
+    _FieldsFieldError . _2 . _AttributeLengthUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeUnexpectedEof p f FieldsError where
+  _AttributeUnexpectedEof =
+    _FieldsFieldError . _2 . _AttributeUnexpectedEof
+
+fields ::
+  (AsEmpty (f (Attribute a1)), AsEmpty (a Word8),
+    AsEmpty (s (Field a2 f1)),
+    Cons
+      (f (Attribute a1)) (f (Attribute a1)) (Attribute a) (Attribute a),
+    Cons (a Word8) (a Word8) Word8 Word8,
+    Cons (s (Field a2 f1)) (s (Field a2 f1)) (Field a1 f) (Field a1 f),
+    AsFieldsFieldInfoUnexpectedEof Tagged Identity e,
+    AsFieldsFieldError Tagged Identity e) =>
+  Get e (Fields a2 f1 s)
+fields =
+  do c <- fieldsFieldInfoUnexpectedEof !- word16be
+     i <- (_FieldsFieldError #) !!- replicateO (\n -> ((,) n) !!- field) c
+     return (Fields c i)
diff --git a/src/Language/Java/Class/Interfaces.hs b/src/Language/Java/Class/Interfaces.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/Interfaces.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Language.Java.Class.Interfaces(
+  Interfaces(..)
+, InterfacesError(..)
+, AsInterfacesCountUnexpectedEof(..)
+, interfacesCountUnexpectedEof
+, AsInterfacesUnexpectedEof(..)
+, interfaces
+) where
+
+import Control.Applicative(Applicative)
+import Control.Lens(Optic', Choice, AsEmpty, Cons, prism', ( # ))
+import Control.Monad(Monad(return))
+import Control.Replicate(replicateO)
+import Data.Eq(Eq)
+import Data.Functor.Identity(Identity)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, (!-), word16be)
+import Data.Word(Word16)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 4.1. The ClassFile Structure>
+data Interfaces i =
+  Interfaces
+    Word16
+    (i Word16)
+
+deriving instance Eq (i Word16) => Eq (Interfaces i)
+deriving instance Ord (i Word16) => Ord (Interfaces i)
+deriving instance Show (i Word16) => Show (Interfaces i)
+
+data InterfacesError =
+  InterfacesCountUnexpectedEof
+  | InterfacesUnexpectedEof Word16
+  deriving (Eq, Ord, Show)
+
+class AsInterfacesCountUnexpectedEof p f s where
+  _InterfacesCountUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsInterfacesCountUnexpectedEof p f InterfacesError where
+  _InterfacesCountUnexpectedEof =
+    prism'
+      (\() -> InterfacesCountUnexpectedEof)
+      (\e -> case e of
+               InterfacesCountUnexpectedEof -> Just ()
+               _ -> Nothing)
+       
+interfacesCountUnexpectedEof ::
+  AsInterfacesCountUnexpectedEof Tagged Identity t =>
+  t
+interfacesCountUnexpectedEof =
+  _InterfacesCountUnexpectedEof # ()
+
+class AsInterfacesUnexpectedEof p f s where
+  _InterfacesUnexpectedEof :: 
+    Optic' p f s Word16
+
+instance (Choice p, Applicative f) => AsInterfacesUnexpectedEof p f InterfacesError where
+  _InterfacesUnexpectedEof =
+   prism'
+      InterfacesUnexpectedEof
+      (\e -> case e of
+               InterfacesUnexpectedEof w -> Just w
+               _ -> Nothing)
+
+interfaces ::
+  (AsEmpty (i Word16), Cons (i Word16) (i Word16) Word16 Word16,
+  AsInterfacesCountUnexpectedEof Tagged Identity e,
+  AsInterfacesUnexpectedEof Tagged Identity e) =>
+  Get e (Interfaces i)
+interfaces =
+  do c <- interfacesCountUnexpectedEof !- word16be
+     i <- replicateO (\n -> _InterfacesUnexpectedEof # n !- word16be) c
+     return (Interfaces c i)
diff --git a/src/Language/Java/Class/Method.hs b/src/Language/Java/Class/Method.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/Method.hs
@@ -0,0 +1,211 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Language.Java.Class.Method(
+  Method(..)
+, MethodErrorAttributeError(..)
+, AsMethodErrorAttributeError(..)
+, MethodError(..)
+, AsMethodNameIndexUnexpectedEof(..)
+, methodNameIndexUnexpectedEof
+, AsMethodDescriptorIndexUnexpectedEof(..)
+, methodDescriptorIndexUnexpectedEof
+, AsMethodAttributeCountUnexpectedEof(..)
+, methodAttributeCountUnexpectedEof
+, AsMethodAttributeUnexpectedEof(..)
+, AsMethodMethodAccessFlagsError(..)
+, method
+) where
+
+import Control.Applicative(Applicative)
+import Control.Category((.), id)
+import Control.Lens(AsEmpty, Cons, Choice, Optic', Profunctor, prism', ( # ), _2, iso)
+import Control.Monad(Monad(return))
+import Control.Replicate(replicateO)
+import Data.Eq(Eq)
+import Data.Functor(Functor)
+import Data.Functor.Identity(Identity)
+import Data.Maybe(Maybe(Nothing, Just))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, (!!-), (!-), word16be)
+import Data.Word(Word8, Word16)
+import Language.Java.Class.Attribute(AsAttributeNameIndexUnexpectedEof(_AttributeNameIndexUnexpectedEof), AsAttributeLengthUnexpectedEof(_AttributeLengthUnexpectedEof), AsAttributeUnexpectedEof(_AttributeUnexpectedEof), Attribute, AttributeError, attribute)
+import Language.Java.Class.MethodAccessFlags(AsMethodAccessFlagsUnexpectedEof(_MethodAccessFlagsUnexpectedEof), MethodAccessFlags, MethodAccessFlagsError, methodAccessFlags)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.6 4.6. Methods>
+data Method m a =
+  Method
+    MethodAccessFlags
+    Word16 -- name_index
+    Word16 -- descriptor_index
+    Word16 -- attribute_count
+    (m (Attribute a))
+  
+deriving instance Eq (m (Attribute a)) => Eq (Method m a)
+deriving instance Ord (m (Attribute a)) => Ord (Method m a)
+deriving instance Show (m (Attribute a)) => Show (Method m a)
+
+newtype MethodErrorAttributeError =
+  MethodErrorAttributeError
+    AttributeError
+  deriving (Eq, Ord, Show)
+
+class AsMethodErrorAttributeError p f s where
+  _MethodErrorAttributeError ::
+    Optic' p f s MethodErrorAttributeError
+
+instance AsMethodErrorAttributeError p f MethodErrorAttributeError where
+  _MethodErrorAttributeError =
+    id
+
+instance (Profunctor p, Functor f) => AsMethodErrorAttributeError p f AttributeError where
+  _MethodErrorAttributeError =
+    iso
+      MethodErrorAttributeError
+      (\(MethodErrorAttributeError e) -> e)
+
+instance AsAttributeUnexpectedEof p f MethodErrorAttributeError where
+  _AttributeUnexpectedEof =
+    _MethodErrorAttributeError . _AttributeUnexpectedEof
+
+instance AsAttributeLengthUnexpectedEof p f MethodErrorAttributeError where  
+  _AttributeLengthUnexpectedEof =
+    _MethodErrorAttributeError . _AttributeLengthUnexpectedEof
+
+instance AsAttributeNameIndexUnexpectedEof p f MethodErrorAttributeError where    
+  _AttributeNameIndexUnexpectedEof =
+    _MethodErrorAttributeError . _AttributeNameIndexUnexpectedEof
+
+data MethodError =
+  MethodNameIndexUnexpectedEof
+  | MethodDescriptorIndexUnexpectedEof
+  | MethodAttributeCountUnexpectedEof
+  | MethodAttributeUnexpectedEof Word16 MethodErrorAttributeError
+  | MethodMethodAccessFlagsError MethodAccessFlagsError
+  deriving (Eq, Ord, Show)
+
+class AsMethodNameIndexUnexpectedEof p f s where
+  _MethodNameIndexUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsMethodNameIndexUnexpectedEof p f MethodError where
+  _MethodNameIndexUnexpectedEof =
+    prism'
+      (\() -> MethodNameIndexUnexpectedEof)
+      (\e -> case e of
+               MethodNameIndexUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+methodNameIndexUnexpectedEof ::
+  AsMethodNameIndexUnexpectedEof Tagged Identity t =>
+  t
+methodNameIndexUnexpectedEof=
+  _MethodNameIndexUnexpectedEof # ()
+
+class AsMethodDescriptorIndexUnexpectedEof p f s where
+  _MethodDescriptorIndexUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsMethodDescriptorIndexUnexpectedEof p f MethodError where
+  _MethodDescriptorIndexUnexpectedEof =
+    prism'
+      (\() -> MethodDescriptorIndexUnexpectedEof)
+      (\e -> case e of
+               MethodDescriptorIndexUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+methodDescriptorIndexUnexpectedEof ::
+  AsMethodDescriptorIndexUnexpectedEof Tagged Identity t =>
+  t
+methodDescriptorIndexUnexpectedEof=
+  _MethodDescriptorIndexUnexpectedEof # ()
+
+class AsMethodAttributeCountUnexpectedEof p f s where
+  _MethodAttributeCountUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsMethodAttributeCountUnexpectedEof p f MethodError where
+  _MethodAttributeCountUnexpectedEof =
+    prism'
+      (\() -> MethodAttributeCountUnexpectedEof)
+      (\e -> case e of
+               MethodAttributeCountUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+methodAttributeCountUnexpectedEof ::
+  AsMethodAttributeCountUnexpectedEof Tagged Identity t =>
+  t
+methodAttributeCountUnexpectedEof=
+  _MethodAttributeCountUnexpectedEof # ()
+
+class AsMethodAttributeUnexpectedEof p f s where
+  _MethodAttributeUnexpectedEof :: 
+    Optic' p f s (Word16, MethodErrorAttributeError)
+
+instance (Choice p, Applicative f) => AsMethodAttributeUnexpectedEof p f MethodError where
+  _MethodAttributeUnexpectedEof =
+    prism'
+      (\(w, r) -> MethodAttributeUnexpectedEof w r)
+      (\e -> case e of
+               MethodAttributeUnexpectedEof w r -> Just (w, r)
+               _ -> Nothing)
+
+instance (p ~ (->), Applicative f) => AsMethodErrorAttributeError p f MethodError where
+  _MethodErrorAttributeError =
+    _MethodAttributeUnexpectedEof . _2 . _MethodErrorAttributeError
+
+instance (p ~ (->), Applicative f) => AsAttributeNameIndexUnexpectedEof p f MethodError where
+  _AttributeNameIndexUnexpectedEof =
+    _MethodAttributeUnexpectedEof . _2 . _AttributeNameIndexUnexpectedEof
+    
+instance (p ~ (->), Applicative f) => AsAttributeLengthUnexpectedEof p f MethodError where
+  _AttributeLengthUnexpectedEof =
+    _MethodAttributeUnexpectedEof . _2 . _AttributeLengthUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeUnexpectedEof p f MethodError where
+  _AttributeUnexpectedEof =
+    _MethodAttributeUnexpectedEof . _2 . _AttributeUnexpectedEof
+
+class AsMethodMethodAccessFlagsError p f s where
+  _MethodMethodAccessFlagsError :: 
+    Optic' p f s MethodAccessFlagsError
+
+instance (Choice p, Applicative f) => AsMethodMethodAccessFlagsError p f MethodError where
+  _MethodMethodAccessFlagsError =
+    prism'
+      MethodMethodAccessFlagsError
+      (\e -> case e of
+               MethodMethodAccessFlagsError r -> Just r
+               _ -> Nothing)
+      
+instance (Choice p, Applicative f) => AsMethodAccessFlagsUnexpectedEof p f MethodError where
+  _MethodAccessFlagsUnexpectedEof =
+    _MethodMethodAccessFlagsError . _MethodAccessFlagsUnexpectedEof
+
+method ::
+  (AsEmpty (a Word8), AsEmpty (m (Attribute a1)),
+  Cons (a Word8) (a Word8) Word8 Word8,
+  Cons
+    (m (Attribute a1)) (m (Attribute a1)) (Attribute a) (Attribute a),
+  AsMethodMethodAccessFlagsError Tagged Identity e,
+  AsMethodAttributeUnexpectedEof Tagged Identity e,
+  AsMethodAttributeCountUnexpectedEof Tagged Identity e,
+  AsMethodDescriptorIndexUnexpectedEof Tagged Identity e,
+  AsMethodNameIndexUnexpectedEof Tagged Identity e) =>
+  Get e (Method m a1)
+method =
+  do f <- (_MethodMethodAccessFlagsError #) !!- methodAccessFlags
+     n <- methodNameIndexUnexpectedEof !- word16be
+     d <- methodDescriptorIndexUnexpectedEof !- word16be
+     c <- methodAttributeCountUnexpectedEof !- word16be
+     a <- (_MethodAttributeUnexpectedEof #) !!- replicateO (\x -> ((,) x) !!- attribute) c
+     return (Method f n d c a)
diff --git a/src/Language/Java/Class/MethodAccessFlags.hs b/src/Language/Java/Class/MethodAccessFlags.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/MethodAccessFlags.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Language.Java.Class.MethodAccessFlags(
+  MethodAccessFlags(..)
+, MethodAccessFlagsError(..)
+, AsMethodAccessFlagsUnexpectedEof(..)
+, methodAccessFlagsUnexpectedEof
+, methodAccessFlags
+) where
+
+import Control.Lens(Optic', Profunctor, iso, ( # ))
+import Control.Monad(return)
+import Data.Eq(Eq)
+import Data.Functor(Functor)
+import Data.Functor.Identity(Identity)
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, (!-), word16be)
+import Data.Word(Word16)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.6 4.6. Methods>
+newtype MethodAccessFlags =
+  MethodAccessFlags
+    Word16
+  deriving (Eq, Ord, Show)
+
+data MethodAccessFlagsError =
+  MethodAccessFlagsUnexpectedEof
+  deriving (Eq, Ord, Show)
+
+class AsMethodAccessFlagsUnexpectedEof p f s where
+  _MethodAccessFlagsUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Profunctor p, Functor f) => AsMethodAccessFlagsUnexpectedEof p f MethodAccessFlagsError where
+  _MethodAccessFlagsUnexpectedEof =
+    iso
+      (\_ -> ())
+      (\() -> MethodAccessFlagsUnexpectedEof)
+
+methodAccessFlagsUnexpectedEof ::
+  AsMethodAccessFlagsUnexpectedEof Tagged Identity t =>
+  t
+methodAccessFlagsUnexpectedEof =
+  _MethodAccessFlagsUnexpectedEof # ()
+
+methodAccessFlags ::
+  AsMethodAccessFlagsUnexpectedEof Tagged Identity e =>
+  Get e MethodAccessFlags
+methodAccessFlags =
+  do af <- methodAccessFlagsUnexpectedEof !- word16be
+     return (MethodAccessFlags af)
diff --git a/src/Language/Java/Class/Methods.hs b/src/Language/Java/Class/Methods.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/Methods.hs
@@ -0,0 +1,136 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Language.Java.Class.Methods(
+  Methods(..)
+, MethodsError(..)
+, AsMethodsInfoUnexpectedEof(..)
+, methodsInfoUnexpectedEof
+, AsMethodsMethodError(..)
+, methods
+) where
+
+import Control.Applicative(Applicative)
+import Control.Category((.))
+import Control.Lens(AsEmpty, Cons, Optic', Choice, prism', ( # ), _2)
+import Control.Monad(Monad(return))
+import Control.Replicate(replicateO)
+import Data.Eq(Eq)
+import Data.Functor.Identity(Identity)
+import Data.Maybe(Maybe(Nothing, Just))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, (!!-), (!-), word16be)
+import Data.Word(Word8, Word16)
+import Language.Java.Class.Attribute(AsAttributeNameIndexUnexpectedEof(_AttributeNameIndexUnexpectedEof), AsAttributeLengthUnexpectedEof(_AttributeLengthUnexpectedEof), AsAttributeUnexpectedEof(_AttributeUnexpectedEof), Attribute)
+import Language.Java.Class.Method(AsMethodErrorAttributeError(_MethodErrorAttributeError), AsMethodNameIndexUnexpectedEof(_MethodNameIndexUnexpectedEof), AsMethodDescriptorIndexUnexpectedEof(_MethodDescriptorIndexUnexpectedEof), AsMethodAttributeCountUnexpectedEof(_MethodAttributeCountUnexpectedEof), AsMethodAttributeUnexpectedEof(_MethodAttributeUnexpectedEof), AsMethodMethodAccessFlagsError(_MethodMethodAccessFlagsError), Method, MethodError, method)
+import Language.Java.Class.MethodAccessFlags(AsMethodAccessFlagsUnexpectedEof(_MethodAccessFlagsUnexpectedEof))
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 4.1. The ClassFile Structure>
+data Methods m a s =
+  Methods
+    Word16
+    (s (Method m a))
+
+deriving instance Eq (s (Method m a)) => Eq (Methods m a s)
+deriving instance Ord (s (Method m a)) => Ord (Methods m a s)
+deriving instance Show (s (Method m a)) => Show (Methods m a s)
+
+data MethodsError =
+  MethodsInfoUnexpectedEof
+  | MethodsMethodError Word16 MethodError
+  deriving (Eq, Ord, Show)
+
+class AsMethodsInfoUnexpectedEof p f s where
+  _MethodsInfoUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsMethodsInfoUnexpectedEof p f MethodsError where
+  _MethodsInfoUnexpectedEof =
+    prism'
+      (\() -> MethodsInfoUnexpectedEof)
+      (\e -> case e of
+               MethodsInfoUnexpectedEof -> Just ()
+               _ -> Nothing)
+
+methodsInfoUnexpectedEof ::
+  AsMethodsInfoUnexpectedEof Tagged Identity t =>
+  t
+methodsInfoUnexpectedEof=
+  _MethodsInfoUnexpectedEof # ()
+
+class AsMethodsMethodError p f s where
+  _MethodsMethodError :: 
+    Optic' p f s (Word16, MethodError)
+
+instance (Choice p, Applicative f) => AsMethodsMethodError p f MethodsError where
+  _MethodsMethodError =
+    prism'
+      (\(w, r) -> MethodsMethodError w r)
+      (\e -> case e of
+               MethodsMethodError w r -> Just (w, r)
+               _ -> Nothing)
+
+instance (p ~ (->), Applicative f) => AsMethodNameIndexUnexpectedEof p f MethodsError where
+  _MethodNameIndexUnexpectedEof =
+    _MethodsMethodError . _2 . _MethodNameIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsMethodDescriptorIndexUnexpectedEof p f MethodsError where
+  _MethodDescriptorIndexUnexpectedEof =
+    _MethodsMethodError . _2 . _MethodDescriptorIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsMethodAttributeCountUnexpectedEof p f MethodsError where
+  _MethodAttributeCountUnexpectedEof =
+    _MethodsMethodError . _2 . _MethodAttributeCountUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsMethodAttributeUnexpectedEof p f MethodsError where
+  _MethodAttributeUnexpectedEof =
+    _MethodsMethodError . _2 . _MethodAttributeUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeNameIndexUnexpectedEof p f MethodsError where
+  _AttributeNameIndexUnexpectedEof =
+    _MethodsMethodError . _2 . _AttributeNameIndexUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsAttributeLengthUnexpectedEof p f MethodsError where
+  _AttributeLengthUnexpectedEof =
+    _MethodsMethodError . _2 . _AttributeLengthUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsMethodErrorAttributeError p f MethodsError where
+  _MethodErrorAttributeError =
+    _MethodsMethodError . _2 . _MethodErrorAttributeError
+
+instance (p ~ (->), Applicative f) => AsAttributeUnexpectedEof p f MethodsError where
+  _AttributeUnexpectedEof =
+    _MethodsMethodError . _2 . _AttributeUnexpectedEof
+
+instance (p ~ (->), Applicative f) => AsMethodMethodAccessFlagsError p f MethodsError where
+  _MethodMethodAccessFlagsError =
+    _MethodsMethodError . _2 . _MethodMethodAccessFlagsError
+
+instance (p ~ (->), Applicative f) => AsMethodAccessFlagsUnexpectedEof p f MethodsError where
+  _MethodAccessFlagsUnexpectedEof =
+    _MethodsMethodError . _2 . _MethodAccessFlagsUnexpectedEof
+
+methods ::
+  (AsEmpty (m (Attribute a1)), AsEmpty (a Word8),
+    AsEmpty (s (Method m1 a2)),
+    Cons
+      (m (Attribute a1)) (m (Attribute a1)) (Attribute a) (Attribute a),
+    Cons (a Word8) (a Word8) Word8 Word8,
+    Cons
+      (s (Method m1 a2)) (s (Method m1 a2)) (Method m a1) (Method m a1),
+    AsMethodsInfoUnexpectedEof Tagged Identity e,
+    AsMethodsMethodError Tagged Identity e) =>
+  Get e (Methods m1 a2 s)
+methods =
+  do c <- methodsInfoUnexpectedEof !- word16be
+     i <- (_MethodsMethodError #) !!- replicateO (\n -> ((,) n) !!- method) c
+     return (Methods c i)
diff --git a/src/Language/Java/Class/SuperClass.hs b/src/Language/Java/Class/SuperClass.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/SuperClass.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Language.Java.Class.SuperClass(
+  SuperClass(..)
+, SuperClassError(..)
+, AsSuperClassUnexpectedEof(..)
+, superClassUnexpectedEof
+, superClass
+) where
+
+import Control.Lens(Optic', Profunctor, iso, ( # ))
+import Control.Monad(Monad(return))
+import Data.Eq(Eq)
+import Data.Functor(Functor)
+import Data.Functor.Identity(Identity)
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle((!-), Get, word16be)
+import Data.Word(Word16)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 4.1. The ClassFile Structure>
+newtype SuperClass =
+  SuperClass Word16
+  deriving (Eq, Ord, Show)
+
+data SuperClassError =
+  SuperClassUnexpectedEof
+  deriving (Eq, Ord, Show)
+
+class AsSuperClassUnexpectedEof p f s where
+  _SuperClassUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Profunctor p, Functor f) => AsSuperClassUnexpectedEof p f SuperClassError where
+  _SuperClassUnexpectedEof =
+    iso
+      (\_ -> ())
+      (\() -> SuperClassUnexpectedEof)
+
+superClassUnexpectedEof ::
+  AsSuperClassUnexpectedEof Tagged Identity t =>
+  t
+superClassUnexpectedEof =
+  _SuperClassUnexpectedEof # ()
+
+superClass ::
+  AsSuperClassUnexpectedEof Tagged Identity e =>
+  Get e SuperClass
+superClass =
+  do af <- superClassUnexpectedEof !- word16be
+     return (SuperClass af)
diff --git a/src/Language/Java/Class/ThisAccessFlags.hs b/src/Language/Java/Class/ThisAccessFlags.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/ThisAccessFlags.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Language.Java.Class.ThisAccessFlags(
+  ThisAccessFlags(..)
+, ThisAccessFlagsError(..)
+, AsThisAccessFlagsUnexpectedEof(..)
+, thisAccessFlagsUnexpectedEof
+, thisAccessFlags
+) where
+
+import Control.Lens(Optic', Profunctor, iso, ( # ))
+import Control.Monad(return)
+import Data.Eq(Eq)
+import Data.Functor(Functor)
+import Data.Functor.Identity(Identity)
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, word16be, (!-))
+import Data.Word(Word16)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 4.1. The ClassFile Structure>
+newtype ThisAccessFlags =
+  ThisAccessFlags Word16
+  deriving (Eq, Ord, Show)
+
+data ThisAccessFlagsError =
+  ThisAccessFlagsUnexpectedEof
+  deriving (Eq, Ord, Show)
+
+class AsThisAccessFlagsUnexpectedEof p f s where
+  _ThisAccessFlagsUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Profunctor p, Functor f) => AsThisAccessFlagsUnexpectedEof p f ThisAccessFlagsError where
+  _ThisAccessFlagsUnexpectedEof =
+    iso
+      (\_ -> ())
+      (\() -> ThisAccessFlagsUnexpectedEof)
+
+thisAccessFlagsUnexpectedEof ::
+  AsThisAccessFlagsUnexpectedEof Tagged Identity t =>
+  t
+thisAccessFlagsUnexpectedEof =
+  _ThisAccessFlagsUnexpectedEof # ()
+
+thisAccessFlags ::
+  AsThisAccessFlagsUnexpectedEof Tagged Identity e =>
+  Get e ThisAccessFlags
+thisAccessFlags =
+  do af <- thisAccessFlagsUnexpectedEof !- word16be
+     return (ThisAccessFlags af)
diff --git a/src/Language/Java/Class/ThisClass.hs b/src/Language/Java/Class/ThisClass.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/ThisClass.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Language.Java.Class.ThisClass(
+  ThisClass(..)
+, ThisClassError(..)
+, AsThisClassUnexpectedEof(..)
+, thisClassUnexpectedEof
+, thisClass
+) where
+
+import Control.Lens(Optic', Profunctor, iso, ( # ))
+import Control.Monad(return)
+import Data.Eq(Eq)
+import Data.Functor(Functor)
+import Data.Functor.Identity(Identity)
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, word16be, (!-))
+import Data.Word(Word16)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 4.1. The ClassFile Structure>
+newtype ThisClass =
+  ThisClass Word16
+  deriving (Eq, Ord, Show)
+
+data ThisClassError =
+  ThisClassUnexpectedEof
+  deriving (Eq, Ord, Show)
+
+class AsThisClassUnexpectedEof p f s where
+  _ThisClassUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Profunctor p, Functor f) => AsThisClassUnexpectedEof p f ThisClassError where
+  _ThisClassUnexpectedEof =
+    iso
+      (\_ -> ())
+      (\() -> ThisClassUnexpectedEof)
+
+thisClassUnexpectedEof ::
+  AsThisClassUnexpectedEof Tagged Identity t =>
+  t
+thisClassUnexpectedEof =
+  _ThisClassUnexpectedEof # ()
+
+thisClass ::
+  AsThisClassUnexpectedEof Tagged Identity e =>
+  Get e ThisClass
+thisClass =
+  do af <- thisClassUnexpectedEof !- word16be
+     return (ThisClass af)
diff --git a/src/Language/Java/Class/Version.hs b/src/Language/Java/Class/Version.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Java/Class/Version.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Language.Java.Class.Version(
+  Version(..)
+, VersionError(..)
+, AsVersionMinorUnexpectedEof(..)
+, versionMinorUnexpectedEof
+, AsVersionMajorUnexpectedEof(..)
+, versionMajorUnexpectedEof
+, version
+) where
+
+import Control.Applicative(Applicative)
+import Control.Lens(Choice, Optic', prism', ( # ))
+import Control.Monad(return)
+import Data.Eq(Eq)
+import Data.Functor.Identity(Identity)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord)
+import Data.Tagged(Tagged)
+import Data.Tickle(Get, word16be, (!-))
+import Data.Word(Word16)
+import Prelude(Show)
+
+-- |
+--
+-- <https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 4.1. The ClassFile Structure>
+data Version =
+  Version
+    Word16
+    Word16
+  deriving (Eq, Ord, Show)
+
+data VersionError =
+  VersionMinorUnexpectedEof
+  | VersionMajorUnexpectedEof
+  deriving (Eq, Ord, Show)
+
+class AsVersionMinorUnexpectedEof p f s where
+  _VersionMinorUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsVersionMinorUnexpectedEof p f VersionError where
+  _VersionMinorUnexpectedEof =
+    prism'
+      (\() -> VersionMinorUnexpectedEof)
+      (\e -> case e of
+               VersionMinorUnexpectedEof -> Just ()
+               VersionMajorUnexpectedEof -> Nothing)
+
+versionMinorUnexpectedEof ::
+  AsVersionMinorUnexpectedEof Tagged Identity t =>
+  t
+versionMinorUnexpectedEof =
+  _VersionMinorUnexpectedEof # ()
+
+class AsVersionMajorUnexpectedEof p f s where
+  _VersionMajorUnexpectedEof :: 
+    Optic' p f s ()
+
+instance (Choice p, Applicative f) => AsVersionMajorUnexpectedEof p f VersionError where
+  _VersionMajorUnexpectedEof =
+    prism'
+      (\() -> VersionMajorUnexpectedEof)
+      (\e -> case e of
+               VersionMinorUnexpectedEof -> Nothing
+               VersionMajorUnexpectedEof -> Just ())
+
+versionMajorUnexpectedEof ::
+  AsVersionMajorUnexpectedEof Tagged Identity t =>
+  t
+versionMajorUnexpectedEof =
+  _VersionMajorUnexpectedEof # ()
+
+version ::
+  (AsVersionMinorUnexpectedEof Tagged Identity e, AsVersionMajorUnexpectedEof Tagged Identity e) => 
+  Get e Version
+version =
+  do mn <- versionMinorUnexpectedEof !- word16be
+     mj <- versionMajorUnexpectedEof !- word16be
+     return (Version mn mj)
diff --git a/test/doctests.hs b/test/doctests.hs
new file mode 100644
--- /dev/null
+++ b/test/doctests.hs
@@ -0,0 +1,32 @@
+module Main where
+
+import Build_doctests (deps)
+import Control.Applicative
+import Control.Monad
+import Data.List
+import System.Directory
+import System.FilePath
+import Test.DocTest
+
+main ::
+  IO ()
+main =
+  getSources >>= \sources -> doctest $
+      "-isrc"
+    : "-idist/build/autogen"
+    : "-optP-include"
+    : "-optPdist/build/autogen/cabal_macros.h"
+    : "-hide-all-packages"
+    : map ("-package="++) deps ++ sources
+
+getSources :: IO [FilePath]
+getSources = filter (isSuffixOf ".hs") <$> go "src"
+  where
+    go dir = do
+      (dirs, files) <- getFilesAndDirectories dir
+      (files ++) . concat <$> mapM go dirs
+
+getFilesAndDirectories :: FilePath -> IO ([FilePath], [FilePath])
+getFilesAndDirectories dir = do
+  c <- map (dir </>) . filter (`notElem` ["..", "."]) <$> getDirectoryContents dir
+  (,) <$> filterM doesDirectoryExist c <*> filterM doesFileExist c
diff --git a/todo.md b/todo.md
new file mode 100644
--- /dev/null
+++ b/todo.md
@@ -0,0 +1,1 @@
+* `ClassFile` function to support both 1.5 and 1.7. 
