diff --git a/CodeGenTest.hs b/CodeGenTest.hs
new file mode 100644
index 0000000000000000000000000000000000000000..3eb9dade69ea25a633819f9c6c7b6637d2eaf786
--- /dev/null
+++ b/CodeGenTest.hs
@@ -0,0 +1,53 @@
+
+import LysKom.Internal.CodeGen (f)
+import Language.Haskell.TH (runQ, runIO, pprint)
+import LysKom.ProtocolA (documentParser)
+import Text.ParserCombinators.Parsec (parseFromFile)
+import Data.Either (rights)
+import Data.List
+import LysKom.ProtocolA.Data (ProtocolAItem (..))
+import LysKom.ProtocolA.Types 
+    ( LysType ( ENUMERATION_OF
+              , ENUMERATION
+              , SELECTION
+              ))
+
+proc :: ProtocolAItem -> Int
+proc (Comment _)        = 0
+proc (DerivedType _ _)  = 1
+proc (Request _ _ _ _)  = 3
+proc (Async _ _ _)      = 5
+proc (ProtoEdition _)   = 0
+proc (ProtoVer _)       = 0
+proc (LysKomDVersion _) = 0
+proc (TypeAlias _ _)    = 2
+proc (RequestAlias _ _) = 4
+proc (AsyncAlias _ _)   = 6
+proc (Other _)          = 9
+
+selection2Enum :: LysType -> LysType
+selection2Enum (SELECTION xs) = ENUMERATION [ (n ++ "E", i) | (i, n, _) <- xs ]
+ 
+
+isSelect :: String -> ProtocolAItem -> Bool
+isSelect m (DerivedType n d) = n == m
+isSelect _ _                 = False
+
+enumOf2Enum :: [ProtocolAItem] -> ProtocolAItem -> ProtocolAItem
+enumOf2Enum lst (DerivedType n (ENUMERATION_OF t)) 
+    = let (DerivedType m selection) = head $ filter (isSelect t) lst
+      in  DerivedType n . selection2Enum $ selection 
+enumOf2Enum lst a = a
+
+
+main :: IO ()
+main = do
+    d <- parseFromFile documentParser "/usr/share/doc/lyskom/protocol-a-full.txt"
+    let dat = sortOn proc $ head $ rights [d]
+    let dat' = map (enumOf2Enum dat) dat
+    
+    -- runQ (return $ concat $ map f dat) >>= putStrLn.pprint
+    -- {-# LANGUAGE DuplicateRecordFields #-}
+    ((mconcat <$>) $ mapM runQ $ map f dat') >>= putStrLn.pprint
+
+
diff --git a/LysKom.hs b/LysKom.hs
index 26b39b7e72cc8003dea774a89f15d6e9febf8900..f61a6fc1aa7d060d50b4e4bf5ab78565ce870b17 100644
--- a/LysKom.hs
+++ b/LysKom.hs
@@ -16,7 +16,7 @@ import Control.Concurrent.Async
 import Control.Monad.IO.Class
 import Control.Monad.State.Strict
 
-import LineFormat
+import LysKom.LineFormat
 
 import Data.Attoparsec.ByteString
 import Data.Attoparsec.ByteString.Char8 hiding (char8)
diff --git a/Test2.hs b/LysKom/Internal/CodeGen.hs
similarity index 98%
rename from Test2.hs
rename to LysKom/Internal/CodeGen.hs
index 154dba2a843c3087d003aab5a495b9419bc9e093..d9c5877df6cef6d4d667f953c0c381fda782ac0e 100644
--- a/Test2.hs
+++ b/LysKom/Internal/CodeGen.hs
@@ -1,12 +1,12 @@
 {-# LANGUAGE TemplateHaskell #-}
 
-module Test2 where
+module LysKom.Internal.CodeGen where
 
 import Language.Haskell.TH
 import Language.Haskell.TH.Syntax
-import Text.Parsers.ProtocolA (documentParser)
-import Text.Parsers.ProtocolA.Data (ProtocolAItem (..))
-import Text.Parsers.ProtocolA.Types
+import LysKom.ProtocolA (documentParser)
+import LysKom.ProtocolA.Data (ProtocolAItem (..))
+import LysKom.ProtocolA.Types
 import Text.ParserCombinators.Parsec (parseFromFile)
 
 import Data.Either (rights)
@@ -15,7 +15,7 @@ import Data.Maybe (maybe)
 
 import Control.Concurrent.Async (Async)
 
-import LineFormat
+import LysKom.LineFormat
 import Data.Int
 
 -- typename "sparse-block" ⇒ "SparseBlock"
diff --git a/LineFormat.lhs b/LysKom/LineFormat.lhs
similarity index 98%
rename from LineFormat.lhs
rename to LysKom/LineFormat.lhs
index de6fda67b5578793de8f197c20cce628dcd09181..9975e4ce7b437c0f30266a8b650e0e099402a9d5 100644
--- a/LineFormat.lhs
+++ b/LysKom/LineFormat.lhs
@@ -7,7 +7,7 @@
 -- Direct string s for \emph{both} ByteString.Builder and Attoparsec
 {-# LANGUAGE OverloadedStrings #-}
 
-module LineFormat where
+module LysKom.LineFormat where
 
 import Data.ByteString.Builder
 import qualified Data.ByteString.Lazy as BS
diff --git a/Text/Parsers/ProtocolA.lhs b/LysKom/ProtocolA.lhs
similarity index 93%
rename from Text/Parsers/ProtocolA.lhs
rename to LysKom/ProtocolA.lhs
index 2fb3cdc820e9edd7a2f4f10f0c7436d9e5dd5fec..203c72916e9220e2c1448135d3de448ea9163e9e 100644
--- a/Text/Parsers/ProtocolA.lhs
+++ b/LysKom/ProtocolA.lhs
@@ -1,15 +1,15 @@
 \begin{code}
-module Text.Parsers.ProtocolA where
+module LysKom.ProtocolA where
 
 \end{code}
 
 \begin{comment}
 \begin{code}
 import Text.ParserCombinators.Parsec
-import Text.Parsers.Helpers
-import Text.Parsers.ProtocolA.Types
-import Text.Parsers.ProtocolA.Data (ProtocolAItem(..))
-import Text.Parsers.ProtocolA.Requests
+import LysKom.ProtocolA.Helpers
+import LysKom.ProtocolA.Types
+import LysKom.ProtocolA.Data (ProtocolAItem(..))
+import LysKom.ProtocolA.Requests
 \end{code}
 \end{comment}
 
diff --git a/Text/Parsers/ProtocolA/Data.lhs b/LysKom/ProtocolA/Data.lhs
similarity index 91%
rename from Text/Parsers/ProtocolA/Data.lhs
rename to LysKom/ProtocolA/Data.lhs
index 7715eeb7d8226a0bd7a95edfc996e3f2360cf981..dfe8976074b840a4475b41ca94b1d603c9c66e3d 100644
--- a/Text/Parsers/ProtocolA/Data.lhs
+++ b/LysKom/ProtocolA/Data.lhs
@@ -1,10 +1,10 @@
 \begin{code}
-module Text.Parsers.ProtocolA.Data where
+module LysKom.ProtocolA.Data where
 \end{code}
 
 \begin{comment}
 \begin{code}
-import Text.Parsers.ProtocolA.Types (LysType(..))
+import LysKom.ProtocolA.Types (LysType(..))
 \end{code}
 \end{comment}
 
diff --git a/Text/Parsers/Helpers.lhs b/LysKom/ProtocolA/Helpers.lhs
similarity index 97%
rename from Text/Parsers/Helpers.lhs
rename to LysKom/ProtocolA/Helpers.lhs
index 3d32ce8fb811889c2f756083a9f76bc665fff9a8..820ff72522f1a57855425f97d01be017c5e092f2 100644
--- a/Text/Parsers/Helpers.lhs
+++ b/LysKom/ProtocolA/Helpers.lhs
@@ -1,6 +1,6 @@
 \begin{comment}
 \begin{code}
-module Text.Parsers.Helpers where
+module LysKom.ProtocolA.Helpers where
 
 import Text.ParserCombinators.Parsec
 \end{code}
diff --git a/Text/Parsers/ProtocolA/Requests.lhs b/LysKom/ProtocolA/Requests.lhs
similarity index 89%
rename from Text/Parsers/ProtocolA/Requests.lhs
rename to LysKom/ProtocolA/Requests.lhs
index 06a7fcebe29221e8a0cc65c9720a3051baa82b08..c11b37c7ee2257561f33434c369422267842f560 100644
--- a/Text/Parsers/ProtocolA/Requests.lhs
+++ b/LysKom/ProtocolA/Requests.lhs
@@ -2,15 +2,15 @@
 \label{item:rpc}
 
 \begin{code}
-module Text.Parsers.ProtocolA.Requests where
+module LysKom.ProtocolA.Requests where
 \end{code}
 
 \begin{comment}
 \begin{code}
 import Text.ParserCombinators.Parsec
-import Text.Parsers.Helpers
-import Text.Parsers.ProtocolA.Types
-import Text.Parsers.ProtocolA.Data (ProtocolAItem(Async,Request))
+import LysKom.ProtocolA.Helpers
+import LysKom.ProtocolA.Types
+import LysKom.ProtocolA.Data (ProtocolAItem(Async,Request))
 \end{code}
 \end{comment}
 
diff --git a/Text/Parsers/ProtocolA/Types.lhs b/LysKom/ProtocolA/Types.lhs
similarity index 98%
rename from Text/Parsers/ProtocolA/Types.lhs
rename to LysKom/ProtocolA/Types.lhs
index fb3872314004f91a16b21303f40b24121add4079..810226053f4fcadcdcbe6b9ec9867ac39cf252f7 100644
--- a/Text/Parsers/ProtocolA/Types.lhs
+++ b/LysKom/ProtocolA/Types.lhs
@@ -1,13 +1,13 @@
 \section{Types}
 
 \begin{code}
-module Text.Parsers.ProtocolA.Types where
+module LysKom.ProtocolA.Types where
 \end{code}
 
 \begin{comment}
 \begin{code}
 import Text.ParserCombinators.Parsec
-import Text.Parsers.Helpers
+import LysKom.ProtocolA.Helpers
 import Data.Functor ((<&>), ($>))
 \end{code}
 \end{comment}
diff --git a/LysKom/Types.hs b/LysKom/Types.hs
new file mode 100644
index 0000000000000000000000000000000000000000..f525a30d471af07ab6d30f8ca6abbe4ed47423b5
--- /dev/null
+++ b/LysKom/Types.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Output where
+
+import LineFormat
+import LysKom
+
+import GHC.Base
+import GHC.Int (Int8, Int16, Int32)
+import GHC.Show
+import GHC.Types (Bool, Float)
+import Data.List (intersperse)
+import Data.ByteString.Builder (char7, intDec)
+import Data.ByteString.Char8 (pack)
+import Data.Functor ((<$>))
+import Data.Either
+
+import Data.Attoparsec.ByteString (choice)
+import Data.Attoparsec.ByteString.Char8 (char, string)
+
+--------------------------------------------------
+
+import Test2 (f)
+import Language.Haskell.TH (runQ, runIO)
+import Text.Parsers.ProtocolA (documentParser)
+import Text.ParserCombinators.Parsec (parseFromFile)
+
+$(do d <- runIO $ parseFromFile documentParser "/usr/share/doc/lyskom/protocol-a-full.txt"
+     let dat = head $ rights [d]
+     (mconcat <$>) $ Prelude.mapM runQ $ map f dat)
diff --git a/doc/main.tex b/doc/main.tex
index 173bd887cb0db6cda4868d837eb297c35e3d1112..539150c6bb809283e4995e1d7896b74d79ae1b0e 100644
--- a/doc/main.tex
+++ b/doc/main.tex
@@ -61,10 +61,10 @@ variant of ASN.1 (Abstract Syntax Notation One) which was used is slightly non-s
 See appendix~\ref{app:ast} for sample output for all parsers defined in this
 chapter.
 
-\input{lhs/Text/Parsers/ProtocolA/Data.lhs}
-\input{lhs/Text/Parsers/ProtocolA.lhs}
-\input{lhs/Text/Parsers/ProtocolA/Types.lhs}
-\input{lhs/Text/Parsers/ProtocolA/Requests.lhs}
+\input{lhs/LysKom/ProtocolA/Data.lhs}
+\input{lhs/LysKom/ProtocolA.lhs}
+\input{lhs/LysKom/ProtocolA/Types.lhs}
+\input{lhs/LysKom/ProtocolA/Requests.lhs}
 
 \chapter {From AST to Haskell}
 \label{cha:asthaskell}
@@ -95,7 +95,7 @@ Haskell code from it. Now we start actually looking towards actual data!
 We need some extra functions for making everything else go together.
 This includes extra parsers, a main method, and code for other things.
 
-\input{lhs/Text/Parsers/Helpers.lhs}
+\input{lhs/LysKom/ProtocolA/Helpers.lhs}
 
 \chapter {AST examples}
 \label{app:ast}