diff --git a/bgmax.cabal b/bgmax.cabal
--- a/bgmax.cabal
+++ b/bgmax.cabal
@@ -1,5 +1,5 @@
 name:                bgmax
-version:             0.1.0.1
+version:             0.2.0.0
 synopsis:            Parse BgMax-files
 homepage:            http://github.com/jonpetterbergman/bgmax
 bug-reports:         http://github.com/jonpetterbergman/bgmax/issues
@@ -14,20 +14,28 @@
 cabal-version:       >=1.10
 extra-source-files:  changelog.md
 description:         
-  A low-level parser for 
-  <http://www.bgc.se/upload/Gemensamt/Trycksaker/Manualer/BG6040.pdf BgMax>
-  -files from <http://www.bgc.se Bankgirocentralen> (BGC).
+  A parser for 
+  <http://www.autogiro.se/globalassets/dokument/tekniska-manualer/bankgiroinbetalningar_tekniskmanual_sv.pdf BgMax>
+  -files from <http://www.autogiro.se BankGirot>.
   It is able to parse all of the 
-  <http://www.bgc.se/templates/Iframe____3125.aspx example files> from BGC.
+  <http://www.autogiro.se/tjanster/inbetalningar/bankgiro-inbetalningar/teknisk-information/ example files> from BGC.
+source-repository head
+  type:     git
+  location: http://github.com/jonpetterbergman/bgmax
 
+source-repository this
+  type:     git
+  location: http://github.com/jonpetterbergman/bgmax
+  tag:      v0.2.0.0
+
 library
-  exposed-modules:     Finance.BgMax.TK 
-                       Finance.BgMax.Parser
+  exposed-modules:     BankGiro.BgMax
   -- other-modules:       
   other-extensions:    OverloadedStrings
-  build-depends:       base >=4.7 && <4.8,
-                       time >=1.2 && <1.5,
-                       bytestring >=0.9 && <10.3,
-                       attoparsec >=0.10 && <0.13
+  build-depends:       
+                       base >= 4.9 && < 4.10,
+                       time >= 1.6 && < 1.7,
+                       bytestring >= 0.10.8.1 && < 0.11,
+                       attoparsec >= 0.13.1.0 && < 0.14
   hs-source-dirs:      src
   default-language:    Haskell2010
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,6 @@
+# Version 0.2.0.0
+  - Complete rewrite, more complete higher level parser
+	
 # Version 0.1.0.1
   - Cleaned up build-depends.
   - Moved to github.
diff --git a/src/BankGiro/BgMax.hs b/src/BankGiro/BgMax.hs
new file mode 100644
--- /dev/null
+++ b/src/BankGiro/BgMax.hs
@@ -0,0 +1,400 @@
+{-# LANGUAGE OverloadedStrings #-}
+module BankGiro.BgMax where
+
+import           Control.Applicative              ((<|>))
+import           Control.Monad                    (guard)
+import           Data.Attoparsec.ByteString       (Parser, eitherP, endOfInput,
+                                                   many', many1, option,
+                                                   parseOnly, (<?>))
+import qualified Data.Attoparsec.ByteString       as Atto
+import           Data.Attoparsec.ByteString.Char8 (IResult (..), anyChar,
+                                                   endOfLine, manyTill, parse,
+                                                   string, takeTill)
+import           Data.ByteString                  (ByteString)
+import qualified Data.ByteString                  as BS
+import           Data.ByteString.Char8            (snoc, unpack)
+import           Data.Fixed                       (Centi, Fixed (..))
+import           Data.Time                        (Day, LocalTime)
+import           Data.Time.Format                 (defaultTimeLocale,
+                                                   parseTimeM)
+
+data PaymentChannel =
+    ElectronicBank
+  | ElectronicLB
+  | Paper
+  | ElectronicAG
+  | PaymentChannelReserved Int deriving (Show,Eq)
+
+data Image =
+    NoImage
+  | Image
+  | ImageReserved Int deriving (Show,Eq)
+
+data Address =
+  Address {
+    street      :: Maybe ByteString
+  , zipCode     :: Maybe ByteString
+  , city        :: Maybe ByteString
+  , country     :: Maybe ByteString
+  , countryCode :: Maybe ByteString } deriving Show
+
+data Sender =
+  Sender {
+    senderBankGiro :: Integer
+  , senderName     :: Maybe (ByteString,ByteString)
+  , address        :: Address
+  , orgNo          :: Maybe Integer } deriving Show
+
+data Reference =
+    Blank
+  | BlankNoUB
+  | CorrectOCR Integer Centi
+  | IncorrectOCR ByteString
+  | CorrectUB ByteString Centi
+  | IncorrectUB ByteString
+  | ExtendedRef Int ByteString deriving Show
+
+mkReference :: Int -> ByteString -> Centi -> Reference
+mkReference 0 _  _ = Blank
+mkReference 1 _  _ = BlankNoUB
+mkReference 2 bs x = CorrectOCR (read $ unpack bs) x
+mkReference 3 bs _ = IncorrectOCR bs
+mkReference 4 bs x = CorrectUB bs x
+mkReference 5 bs _ = IncorrectUB bs
+mkReference n bs _ = ExtendedRef n bs
+
+data DeductionCode =
+    WholeNoRest
+  | PartialRest
+  | PartialFinal
+  | DeductionCodeReserved Int deriving Show
+
+mkDeductionCode :: Int -> DeductionCode
+mkDeductionCode 1 = WholeNoRest
+mkDeductionCode 2 = PartialRest
+mkDeductionCode 3 = PartialFinal
+mkDeductionCode n = DeductionCodeReserved n
+
+data EntryType =
+    Payment
+  | Deduction DeductionCode deriving Show
+
+data Entry =
+  Entry {
+    entryType      :: EntryType
+  , sender         :: Sender
+  , reference      :: [Reference]
+  , ammount        :: Centi
+  , paymentChannel :: PaymentChannel
+  , bgSerialNo     :: Integer
+  , image          :: Image
+  , info           :: [ByteString] } deriving Show
+
+data Currency = SEK deriving Show
+
+data DepositType = K | D | S deriving (Show,Read)
+
+data Section =
+  Section {
+    recipientBankGiro :: Integer
+  , recipientPostGiro :: Maybe Integer
+  , recipientAccount  :: Integer
+  , depositDay        :: Day
+  , depositNo         :: Integer
+  , depositAmmount    :: Centi
+  , sNoPayments       :: Integer
+  , depositType       :: Maybe DepositType
+  , currency          :: Currency
+  , entries           :: [Entry] } deriving Show
+
+data TestMark = T | P deriving Show
+
+data BgMax =
+  BgMax {
+    version           :: Int
+  , writeDay          :: LocalTime
+  , testMark          :: TestMark
+  , noPayments        :: Integer
+  , noDeductions      :: Integer
+  , noExtraReferences :: Integer
+  , noDeposits        :: Integer
+  , sections          :: [Section] } deriving Show
+
+mkPaymentChannel  :: Int -> PaymentChannel
+mkPaymentChannel 1 = ElectronicBank
+mkPaymentChannel 2 = ElectronicLB
+mkPaymentChannel 3 = Paper
+mkPaymentChannel 4 = ElectronicAG
+mkPaymentChannel n = PaymentChannelReserved n
+
+mkImage :: Int -> Image
+mkImage 0 = NoImage
+mkImage 1 = Image
+mkImage n = ImageReserved n
+
+
+assert :: Bool -> String -> Parser ()
+assert cond msg | cond = return ()
+                | otherwise = fail msg
+
+bgMax :: Parser BgMax
+bgMax =
+  do
+    (v,ts,tm) <- startPost
+    sects <- many1 section
+    (noPayments,noDeductions,noExtraReferences,noDeposits) <- endPost
+    return $ BgMax v ts tm noPayments noDeductions noExtraReferences noDeposits sects
+
+isEndOfLine :: Char -> Bool
+isEndOfLine '\n' = True
+isEndOfLine '\r' = True
+isEndOfLine _    = False
+
+dummyLine :: ByteString -> Parser ()
+dummyLine x = string x >> tillEol >> return ()
+
+tillEol :: Parser String
+tillEol = manyTill anyChar (endOfLine <|> endOfInput)
+
+takeTab :: ByteString -> Int -> Int -> Parser ByteString
+takeTab acc _      0 = return acc
+takeTab acc tabLen n | n > 0 =
+  do
+    c <- anyChar
+    takeTab (acc `snoc` c) tabLen (n - (if (c == '\t') then tabLen else 1))
+                     | otherwise = mempty
+
+myTake :: Int -> Parser ByteString
+myTake n = takeTab "" 6 n
+
+takeT :: Int -> Parser ByteString
+takeT n =
+  do
+    c <- myTake n
+    return c
+
+takeReadMaybe :: Read a => Int -> Parser (Maybe a)
+takeReadMaybe n =
+  do
+    c <- myTake n
+    case reads $ unpack c of
+      [(x,_)] -> return $ Just x
+      _       -> return Nothing
+
+takeRead :: Read a => Int -> Parser a
+takeRead n =
+  do
+    it <- takeReadMaybe n
+    maybe mempty return it
+
+pTestMark :: Parser TestMark
+pTestMark = (string "P" >> return P) <|> (string "T" >> return T)
+
+pCurrency :: Parser Currency
+pCurrency = string "SEK" >> return SEK
+
+timeStamp :: Parser LocalTime
+timeStamp =
+  do
+    str <- fmap unpack $ myTake 20
+    parseTimeM False defaultTimeLocale "%_Y%m%d%H%M%S%q" $ str ++ "000000"
+
+dateStamp :: Parser Day
+dateStamp =
+  do
+    str <- fmap unpack $ myTake 8
+    parseTimeM False defaultTimeLocale "%_Y%m%d" str
+
+
+startPost :: Parser (Int,LocalTime,TestMark)
+startPost =
+  (do
+     string "01BGMAX               "
+     v <- takeRead 2
+     ts <- timeStamp
+     tm <- pTestMark
+     tillEol
+     return (v,ts,tm)) <?> "startPost"
+
+endPost :: Parser (Integer,Integer,Integer,Integer)
+endPost =
+  (do
+     string "70"
+     noPayments <- takeRead 8
+     noDeductions <- takeRead 8
+     noExtraReferences <- takeRead 8
+     noDeposits <- takeRead 8
+     tillEol
+     return (noPayments,noDeductions,noExtraReferences,noDeposits)) <?> "endPost"
+
+openingPost :: Parser (Integer,Maybe Integer,Currency)
+openingPost =
+  (do
+     string "05"
+     bgNo <- takeRead 10
+     pgNo <- (fmap Just $ takeRead 10) <|> (myTake 10 >> return Nothing)
+     c <- pCurrency
+     tillEol
+     return (bgNo,pgNo,c)) <?> "openingPost"
+
+depositPost :: Parser (Integer,Day,Integer,Centi,Currency,Integer,Maybe DepositType)
+depositPost =
+  (do
+     string "15"
+     accNo <- takeRead 35
+     payDay <- dateStamp
+     depositNo <- takeRead 5
+     amm <- fmap MkFixed $ takeRead 18
+     c <- pCurrency
+     noPayments <- takeRead 8
+     depositType <- takeReadMaybe 1
+     tillEol
+     return (accNo,payDay,depositNo,amm,c,noPayments,depositType)) <?> "depositPost"
+
+section :: Parser Section
+section =
+  (do
+     (rBgNo,rPgNo,c) <- openingPost
+     ents <- many1 entry
+     (accNo,payDay,depositNo,amm,c',noPayments,depositType) <- depositPost
+     return $ Section rBgNo rPgNo accNo payDay depositNo amm noPayments depositType c ents) <?> "section"
+
+entry :: Parser Entry
+entry = deduction <|> payment
+
+maybeP :: Parser a -> Parser (Maybe a)
+maybeP p = option Nothing $ fmap Just p
+
+common :: Parser ([ByteString],
+                  Maybe (ByteString,ByteString),
+                  Address,
+                  Maybe Integer)
+common =
+  do
+    info <- many' informationPost
+    names <- maybeP namePost
+    (street,zipCode) <- fmap (maybe (Nothing,Nothing) $ \(a,b) -> (Just a,Just b)) $ maybeP addressPostOne
+    (city,country,countryCode) <- fmap (maybe (Nothing,Nothing,Nothing) $ \(a,b,c) -> (Just a,Just b,Just c)) $ maybeP addressPostTwo
+    orgNo <- maybeP orgNoPost
+    return (info,names,Address street zipCode city country countryCode,orgNo)
+
+payment :: Parser Entry
+payment =
+  do
+    (bg,ref,amm,refc,payc,bgcno,im) <- paymentPost
+    er <- many' (extraReferenceNumberPost bg 0 payc bgcno im <|>
+                 extraReferenceNumberPostNegative bg 0 payc bgcno im)
+    (info,names,addr,orgNo) <- common
+    return $ Entry Payment (Sender bg names addr orgNo) (mkReference refc ref amm:er) amm payc bgcno im info
+
+deduction :: Parser Entry
+deduction =
+  do
+    (bg,ref,amm,refc,payc,bgcno,im,dedc) <- deductionPost
+    er <- many' (extraReferenceNumberPost bg 0 payc bgcno im <|>
+                 extraReferenceNumberPostNegative bg 0 payc bgcno im)
+    (info,names,addr,orgNo) <- common
+    return $ Entry (Deduction dedc) (Sender bg names addr orgNo) (mkReference refc ref amm:er) amm payc bgcno im info
+
+paymentPost :: Parser (Integer,ByteString,Centi,Int,PaymentChannel,Integer,Image)
+paymentPost =
+  (do
+     string "20"
+     bgNo <- takeRead 10
+     ref <- myTake 25
+     amm <- fmap MkFixed $ takeRead 18
+     refc <- takeRead 1
+     payc <- fmap mkPaymentChannel $ takeRead 1
+     bgcNo <- takeRead 12
+     im <- fmap mkImage $ takeRead 1
+     tillEol
+     return (bgNo,ref,amm,refc,payc,bgcNo,im)) <?> "paymentPost"
+
+deductionPost :: Parser (Integer,ByteString,Centi,Int,PaymentChannel,Integer,Image,DeductionCode)
+deductionPost =
+  (do
+     string "21"
+     bgNo <- takeRead 10
+     ref <- myTake 25
+     amm <- fmap MkFixed $ takeRead 18
+     refc <- takeRead 1
+     payc <- fmap mkPaymentChannel $ takeRead 1
+     bgcNo <- takeRead 12
+     im <- fmap mkImage $ takeRead 1
+     dedc <- fmap mkDeductionCode $ takeRead 1
+     tillEol
+     return (bgNo,ref,amm,refc,payc,bgcNo,im,dedc)) <?> "deductionPost"
+
+referenceCommon :: Bool -> Integer -> Centi -> PaymentChannel -> Integer -> Image -> Parser Reference
+referenceCommon isNeg bgNo' amm' payc' bgcNo' im' =
+  do
+    bgNo <- takeRead 10
+    ref <- takeT 25
+    amm <- fmap MkFixed $ takeRead 18
+    refc <- takeRead 1
+    payc <- fmap mkPaymentChannel $ takeRead 1
+    bgcNo <- takeRead 12
+    im <- fmap mkImage $ takeRead 1
+    tillEol
+    assert (bgNo' == bgNo) "bgNo doesn't match"
+    assert (payc' == payc) "payc doesn't match"
+    assert (bgcNo' == bgcNo) "bgcNo doesn't match"
+    assert (im' == im) "im doesn't match"
+    return $ mkReference refc ref (if isNeg then 0 - amm else amm)
+
+extraReferenceNumberPost :: Integer -> Centi -> PaymentChannel -> Integer -> Image -> Parser Reference
+extraReferenceNumberPost bgNo amm payc bgcNo im =
+  (do
+     string "22"
+     referenceCommon False bgNo amm payc bgcNo im) <?> "extraReferenceNumberPost"
+
+extraReferenceNumberPostNegative :: Integer -> Centi -> PaymentChannel -> Integer -> Image -> Parser Reference
+extraReferenceNumberPostNegative bgNo amm payc bgcNo im =
+  (do
+     string "23"
+     referenceCommon True bgNo amm payc bgcNo im) <?> "extraReferenceNumberPostNegative"
+
+informationPost :: Parser ByteString
+informationPost =
+  (do
+     string "25"
+     info <- takeT 50
+     tillEol
+     return info) <?> "informationPost"
+
+namePost :: Parser (ByteString,ByteString)
+namePost =
+  (do
+     string "26"
+     name <- takeT  35
+     extraName <- takeT 35
+     tillEol
+     return (name,extraName)) <?> "namePost"
+
+addressPostOne :: Parser (ByteString,ByteString)
+addressPostOne =
+  (do
+     string "27"
+     street <- takeT 35
+     zipCode <- takeT 9
+     tillEol
+     return (street,zipCode)) <?> "addressPostOne"
+
+addressPostTwo :: Parser (ByteString,ByteString,ByteString)
+addressPostTwo =
+  (do
+   string "28"
+   city <- takeT 35
+   country <- takeT 35
+   countryCode <- takeT 2
+   tillEol
+   return (city,country,countryCode)) <?> "addressPostTwo"
+
+orgNoPost :: Parser Integer
+orgNoPost =
+  (do
+     string "29"
+     orgNo <- takeRead 12
+     tillEol
+     return orgNo) <?> "orgNoPost"
+
diff --git a/src/Finance/BgMax/Parser.hs b/src/Finance/BgMax/Parser.hs
deleted file mode 100644
--- a/src/Finance/BgMax/Parser.hs
+++ /dev/null
@@ -1,185 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{- |
-Module      :  $Header$
-Description :  Parser for the BgMax file format
-Copyright   :  (c) Petter Bergman
-License     :  BSD3
-
-Maintainer  :  jon.petter.bergman@gmail.com
-Stability   :  experimental
-Portability :  non-portable (OverloadedStrings)
-
-This module contains a Parser for the 
-<http://www.bgc.se/upload/Gemensamt/Trycksaker/Manualer/BG6040.pdf BgMax>
-format.
-
-The parser tries to be forgiving with input it doesn't understand.
--}
-module Finance.BgMax.Parser(parseBgMax) where
-import Finance.BgMax.TK
-import Data.ByteString.Char8(ByteString,dropWhile,reverse,readInt,readInteger,null,replicate)
-import Data.Time(LocalTime(..),Day,TimeOfDay(..),fromGregorian)
-import Data.Char(isSpace)
-import Data.Attoparsec.ByteString.Char8(Parser,take,endOfLine,sepBy,string,skipWhile,notInClass)
-import Prelude hiding (take,dropWhile,reverse,null,replicate)
-import Control.Applicative((<|>),(*>),(<*>),(<$>),(<*))
-import Data.Fixed(Pico)
-
-class N a where
-  readN :: ByteString -> Maybe (a,ByteString)
-
-instance N Int where
-  readN = readInt
-
-instance N Integer where
-  readN = readInteger
-  
-readFullN :: N a => ByteString -> Parser a
-readFullN bs = 
-  case readN bs of
-    Nothing -> fail $ "could not read as Int: " ++ show bs
-    Just (x,bs') | null bs' -> return x
-                 | otherwise -> fail $ "could not read all characters as Int: " ++ show bs'
-
-n' :: N a => ByteString -> Parser a
-n' = readFullN
-
-n :: N a => Int -> Parser a
-n c = take c >>= n'
-
-nhb' :: N a => ByteString -> Parser a
-nhb' = readFullN . dropWhile isSpace
-
-nhb :: N a => Int -> Parser a
-nhb c = take c >>= nhb'
-
-orBlank :: (Int -> Parser a) -> Int -> Parser (Maybe a)
-orBlank p c = (fmap Just $ p c) <|> (string (replicate c ' ') *> (return Nothing))
-
-avb' :: ByteString -> ByteString
-avb' = reverse . dropWhile isSpace . reverse
-
-avb :: Int -> Parser ByteString
-avb = fmap avb' . take
-
-ab' :: ByteString -> ByteString
-ab' = dropWhile isSpace
-
-ab :: Int -> Parser ByteString
-ab = fmap ab' . take
-
-pOrT :: Parser TestMark
-pOrT =
-  "T" *> return T <|>
-  "P" *> return P
-
-parseCurrency :: Parser Currency
-parseCurrency =
-  "EUR" *> return EUR <|>
-  "SEK" *> return SEK
-
-makeReference :: Int -> ByteString -> Parser Reference
-makeReference 0 _ = return Ref0
-makeReference 1 _ = return Ref1
-makeReference 2 bs = fmap Ref2 $ nhb' bs
-makeReference 3 bs = return $ Ref3 $ ab' bs
-makeReference 4 bs = return $ Ref4 $ avb' bs
-makeReference 5 bs = return $ Ref5 $ ab' bs
-makeReference i bs = return $ Ref i bs
-
-parseDepositType :: Parser DepositType
-parseDepositType = "K" *> return K <|>
-                   "D" *> return D <|>
-                   "S" *> return S
-
-parseDay :: Parser Day
-parseDay = fromGregorian <$> n 4 <*> n 2 <*> n 2
-
-parseMicroseconds :: Parser Pico
-parseMicroseconds =
-  do
-    second <- n 2
-    microsecond <- n 6
-    return $ (fromInteger second) + ((fromInteger microsecond) / 1000000)
-
-parseTimeOfDay :: Parser TimeOfDay
-parseTimeOfDay = TimeOfDay <$> n 2 <*> n 2 <*> parseMicroseconds
-
-localTime :: Parser LocalTime
-localTime = LocalTime <$> parseDay <*> parseTimeOfDay
-
-parseTransaction :: Parser Transaction
-parseTransaction = 
-  do
-    sBG <- n 10
-    ref' <- take 25
-    amm <- n 18
-    refCode <- n 1
-    chan <- n 1
-    bglNo <- n 12
-    imag <- n 1
-    ref <- makeReference refCode ref'
-    return $ Transaction sBG ref amm chan bglNo imag
-
-parsePost :: Parser a -> Parser b -> Parser b
-parsePost code make = code *> make <* skipWhile (== ' ')
-
-tk01 :: Parser Post
-tk01 = fmap TK01 $ parsePost "01" $ TK01_t <$> avb 20 <*> n 2 <*> localTime <*> pOrT
-
-tk05 :: Parser Post
-tk05 = fmap TK05 $ parsePost "05" $ TK05_t <$> n 10 <*> orBlank n 10 <*> parseCurrency
-
-tk20 :: Parser Post
-tk20 = fmap TK20 $ parsePost "20" $ TK20_t <$> parseTransaction
-
-tk21 :: Parser Post
-tk21 = fmap TK21 $ parsePost "21" $ TK21_t <$> parseTransaction <*> n 1
-
-tk22 :: Parser Post
-tk22 = fmap TK22 $ parsePost "22" $ TK22_t <$> parseTransaction
-
-tk23 :: Parser Post
-tk23 = fmap TK23 $ parsePost "23" $ TK23_t <$> parseTransaction
-
-tk25 :: Parser Post
-tk25 = fmap TK25 $ parsePost "25" $ TK25_t <$> ab 50
-
-tk26 :: Parser Post
-tk26 = fmap TK26 $ parsePost "26" $ TK26_t <$> avb 35 <*> avb 35
-
-tk27 :: Parser Post
-tk27 = fmap TK27 $ parsePost "27" $ TK27_t <$> avb 35 <*> avb 9
-
-tk28 :: Parser Post
-tk28 = fmap TK28 $ parsePost "28" $ TK28_t <$> avb 35 <*> avb 35 <*> avb 2
-
-tk29 :: Parser Post
-tk29 = fmap TK29 $ parsePost "29" $ TK29_t <$> n 12
-
-tk15 :: Parser Post
-tk15 = fmap TK15 $ parsePost "15" $ TK15_t <$> n 35 <*> parseDay <*> n 5 <*> n 18 <*> parseCurrency <*> n 8 <*> orBlank (const parseDepositType) 1
-
-tk70 :: Parser Post
-tk70 = fmap TK70 $ parsePost "70" $ TK70_t <$> n 8 <*> n 8 <*> n 8 <*> n 8
-
-tk :: Parser Post
-tk = (TK <$> n 2) <* skipWhile (notInClass "\n\r")
-
--- | Parser for BgMax posts.
-parseBgMax :: Parser [Post]
-parseBgMax = sepBy go endOfLine 
-  where go = tk01 <|> 
-             tk05 <|> 
-             tk20 <|> 
-             tk21 <|> 
-             tk22 <|> 
-             tk23 <|> 
-             tk25 <|>
-             tk26 <|>
-             tk27 <|>
-             tk28 <|>
-             tk29 <|>
-             tk15 <|> 
-             tk70 <|>
-             tk
diff --git a/src/Finance/BgMax/TK.hs b/src/Finance/BgMax/TK.hs
deleted file mode 100644
--- a/src/Finance/BgMax/TK.hs
+++ /dev/null
@@ -1,185 +0,0 @@
-{- |
-Module      :  $Header$
-Description :  Datatypes for the BgMax file format
-Copyright   :  (c) Petter Bergman
-License     :  BSD3
-
-Maintainer  :  jon.petter.bergman@gmail.com
-Stability   :  experimental
-Portability :  portable
-
-This module contain data definitions for the different types of "Posts" or 
-"Transaction Codes" that may occur in a BgMax file, as well as auxiliary
-data types. 
-
-The datatypes should map in a straightforward way to the 
-documentation from <http://www.bgc.se/upload/Gemensamt/Trycksaker/Manualer/BG6040.pdf Bankgirocentralen>.
--}
-module Finance.BgMax.TK where
-import Data.Time(LocalTime(..),Day)
-import Data.ByteString(ByteString)
-
--- | Testmark
-data TestMark = 
-    T -- ^ Test file  
-  | P -- ^ Production file 
-  deriving Show
-
--- | BankGirot currently only supports EUR and SEK
-data Currency = EUR | SEK deriving Show
-
--- | Reference.
---   The references correspond to the reference codes defined in
---   <http://www.bgc.se/upload/Gemensamt/Trycksaker/Manualer/BG6040.pdf the BgMax documentation>.
-data Reference = 
-  -- | No reference.
-    Ref0
-  -- | No reference. 
-  | Ref1 
-  -- | Reference is correct OCR-no.
-  | Ref2 Integer
-  -- | One or more references.
-  | Ref3 ByteString
-  -- | One reference.
-  | Ref4 ByteString
-  -- | Incorrect reference.
-  | Ref5 ByteString
-  -- | Reserved for future use.
-  | Ref Int ByteString 
-  deriving Show
-
--- | Deposit type.
---   Deposit type according to bank agreement.
-data DepositType = K | D | S deriving Show
-
--- | Transaction type reused in TK 20,21,22,23.
-data Transaction = 
-  Transaction {
-    senderBG :: Integer,
-    reference :: Reference,
-    ammount :: Integer,
-    -- | See the BGC documentation for the meaning of payment channel code.
-    paymentChannel :: Int,
-    bcgNo :: Integer,
-    -- | See the BGC documentation for the meaning of the image mark.
-    imageMark :: Int } 
-    deriving Show
-
--- | Start post.
-data TK01_t =
-  TK01_t {
-    layoutName :: ByteString,
-    layoutVersion :: Int,
-    timeStamp :: LocalTime,
-    testMark :: TestMark } 
-    deriving Show
-
--- | Opening post.
-data TK05_t =
-  TK05_t {
-    recipientBG :: Integer,
-    recipientPG :: Maybe Integer,
-    currency :: Currency } 
-    deriving Show
-
--- | Payment post.
-data TK20_t =
-  TK20_t {
-    payment :: Transaction } 
-    deriving Show
-
--- | Deduction post.
-data TK21_t =
-  TK21_t {
-    deduction :: Transaction,
-    -- | See the BGC documentation for the meaning of the deduction code.
-    deductionCode :: Int } 
-    deriving Show
-
--- | Extra reference post.
-data TK22_t =
-  TK22_t {
-    positiveReference :: Transaction } 
-    deriving Show
-
--- | Extra reference post (negative ammount).
-data TK23_t =
-  TK23_t {
-    negativeReference :: Transaction } 
-    deriving Show
-
--- | Information post.
-data TK25_t =
-  TK25_t {
-    information :: ByteString } 
-    deriving Show
-
--- | Name post.
-data TK26_t =
-  TK26_t {
-    name :: ByteString,
-    extraName :: ByteString } 
-    deriving Show
-
--- | Address 1 post.
-data TK27_t =
-  TK27_t {
-    address :: ByteString,
-    zipCode :: ByteString } 
-    deriving Show
-
--- | Address 2 post.
-data TK28_t =
-  TK28_t {
-    city :: ByteString,
-    country :: ByteString,
-    countryCode :: ByteString } 
-    deriving Show
-
--- | Organisation-number post.
-data TK29_t = 
-  TK29_t {
-    orgNo :: Integer } 
-    deriving Show
-
--- | Deposit post.
-data TK15_t =
-  TK15_t {
-    recipientAccount :: Integer,
-    paymentDate :: Day,
-    depositNo :: Int,
-    depositAmmount :: Integer,
-    depositCurrency :: Currency,
-    paymentDeductionCount :: Int,
-    depositType :: Maybe DepositType } 
-    deriving Show
-
--- | End post
-data TK70_t =
-  TK70_t {
-    paymentsCount :: Int,
-    deductionsCount :: Int,
-    extraReferenceCount :: Int,
-    depositCount :: Int } 
-    deriving Show
-
--- | Sum type for posts.
-data Post =
-    TK01 TK01_t
-  | TK05 TK05_t
-  | TK20 TK20_t
-  | TK21 TK21_t
-  | TK22 TK22_t
-  | TK23 TK23_t
-  | TK25 TK25_t
-  | TK26 TK26_t
-  | TK27 TK27_t
-  | TK28 TK28_t
-  | TK29 TK29_t
-  | TK15 TK15_t
-  | TK70 TK70_t
-  -- | The BGC documentation states that implementations should ignore posts 
-  --   they don't understand, they will be instead be recorded using this 
-  --   constructor.
-  | TK Int 
-  deriving Show
