diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+Copyright 2016 Tony Morris
+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/casr-logbook-types.cabal b/casr-logbook-types.cabal
new file mode 100644
--- /dev/null
+++ b/casr-logbook-types.cabal
@@ -0,0 +1,94 @@
+name:               casr-logbook-types
+version:            0.0.1
+license:            OtherLicense
+license-file:       LICENSE
+author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
+maintainer:         Tony Morris
+copyright:          Copyright (C) 2016 Tony Morris
+synopsis:           CASR 61.345 Pilot Personal Logbook
+category:           Aviation
+description:        
+  <<https://i.imgur.com/p6LT40r.png>>
+  .
+  CASR 61.345 Pilot Personal Logbook
+  .
+  <<https://i.imgur.com/Lfhcmtg.png>>
+
+homepage:           https://github.com/tonymorris/casr-logbook-types
+bug-reports:        https://github.com/tonymorris/casr-logbook-types/issues
+cabal-version:      >= 1.10
+build-type:         Custom
+extra-source-files: changelog
+
+source-repository   head
+  type:             git
+  location:         git@github.com:tonymorris/casr-logbook-types.git
+
+flag                small_base
+  description:      Choose the new, split-up base package.
+
+library
+  default-language:
+                    Haskell2010
+
+  build-depends:
+                    base < 5 && >= 4.8
+                    , containers < 0.6 && >= 0.4
+                    , digit < 3 && >= 0.2.8
+                    , time < 2 && >= 1.5
+                    , lens < 5 && >= 4
+                    
+  ghc-options:
+                    -Wall
+
+  default-extensions:
+                    NoImplicitPrelude
+
+  hs-source-dirs:
+                    src
+
+  exposed-modules:
+                    Data.Aviation.Casr.Logbook.Types
+                    Data.Aviation.Casr.Logbook.Types.Rating
+                    Data.Aviation.Casr.Logbook.Types.Aviator
+                    Data.Aviation.Casr.Logbook.Types.Engine
+                    Data.Aviation.Casr.Logbook.Types.Aircraft
+                    Data.Aviation.Casr.Logbook.Types.TimeAmount
+                    Data.Aviation.Casr.Logbook.Types.DayNight
+                    Data.Aviation.Casr.Logbook.Types.Location
+                    Data.Aviation.Casr.Logbook.Types.Command
+                    Data.Aviation.Casr.Logbook.Types.Time
+                    Data.Aviation.Casr.Logbook.Types.FlightPoint
+                    Data.Aviation.Casr.Logbook.Types.FlightPath
+                    Data.Aviation.Casr.Logbook.Types.AircraftFlight
+                    Data.Aviation.Casr.Logbook.Types.SimulatorFlight
+                    Data.Aviation.Casr.Logbook.Types.Exam
+                    Data.Aviation.Casr.Logbook.Types.Briefing
+                    Data.Aviation.Casr.Logbook.Types.Entry
+                    Data.Aviation.Casr.Logbook.Types.Entries
+                    Data.Aviation.Casr.Logbook.Types.Logbook
+
+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/changelog b/changelog
new file mode 100644
--- /dev/null
+++ b/changelog
@@ -0,0 +1,5 @@
+0.0.1
+
+* Initial release
+* Initial data structures for a CASR 61.345 Pilot Personal Logbook.
+* Moved from https://hackage.haskell.org/package/casr-logbook
diff --git a/src/Data/Aviation/Casr/Logbook/Types.hs b/src/Data/Aviation/Casr/Logbook/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types.hs
@@ -0,0 +1,22 @@
+module Data.Aviation.Casr.Logbook.Types (
+  module L
+) where
+
+import Data.Aviation.Casr.Logbook.Types.Logbook as L
+import Data.Aviation.Casr.Logbook.Types.Rating as L
+import Data.Aviation.Casr.Logbook.Types.Aviator as L
+import Data.Aviation.Casr.Logbook.Types.Engine as L
+import Data.Aviation.Casr.Logbook.Types.Aircraft as L
+import Data.Aviation.Casr.Logbook.Types.TimeAmount as L
+import Data.Aviation.Casr.Logbook.Types.DayNight as L
+import Data.Aviation.Casr.Logbook.Types.Location as L
+import Data.Aviation.Casr.Logbook.Types.Command as L
+import Data.Aviation.Casr.Logbook.Types.Time as L
+import Data.Aviation.Casr.Logbook.Types.FlightPoint as L
+import Data.Aviation.Casr.Logbook.Types.FlightPath as L
+import Data.Aviation.Casr.Logbook.Types.AircraftFlight as L
+import Data.Aviation.Casr.Logbook.Types.SimulatorFlight as L
+import Data.Aviation.Casr.Logbook.Types.Exam as L
+import Data.Aviation.Casr.Logbook.Types.Briefing as L
+import Data.Aviation.Casr.Logbook.Types.Entry as L
+import Data.Aviation.Casr.Logbook.Types.Entries as L
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Aircraft.hs b/src/Data/Aviation/Casr/Logbook/Types/Aircraft.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Aircraft.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.Aircraft(
+  Aircraft(..)
+, HasAircraft(..)
+, singleaircraft
+, multiaircraft
+) where
+
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.Engine(Engine(Single, Multi))
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Data.String(String)
+import Prelude(Show)
+
+data Aircraft =
+  Aircraft {
+    _aircraftType :: String
+  , _aircraftRegistration :: String
+  , _aircraftEngine :: Engine
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''Aircraft
+
+singleaircraft ::
+  String
+  -> String
+  -> Aircraft
+singleaircraft t r =
+  Aircraft
+    t
+    r
+    Single
+
+multiaircraft ::
+  String
+  -> String
+  -> Aircraft
+multiaircraft t r =
+  Aircraft
+    t
+    r
+    Multi
diff --git a/src/Data/Aviation/Casr/Logbook/Types/AircraftFlight.hs b/src/Data/Aviation/Casr/Logbook/Types/AircraftFlight.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/AircraftFlight.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.AircraftFlight(
+  AircraftFlight(..)
+, HasAircraftFlight(..)
+, icusonlyflight
+, noif_icusonlyflight
+, dualonlyflight
+, noif_dualonlyflight
+, commandonlyflight
+, noif_commandonlyflight
+) where
+
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.Aircraft(Aircraft)
+import Data.Aviation.Casr.Logbook.Types.Command(Command(ICUS, Dual, InCommand))
+import Data.Aviation.Casr.Logbook.Types.DayNight(DayNight)
+import Data.Aviation.Casr.Logbook.Types.FlightPath(FlightPath)
+import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
+import Data.Aviation.Casr.Logbook.Types.TimeAmount(TimeAmount, zerotimeamount)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Data.String(String)
+import Prelude(Show)
+
+data AircraftFlight =
+  AircraftFlight {
+    _aircraftflightname :: String
+  , _flightaircraft :: Aircraft
+  , _command :: Command
+  , _daynight :: DayNight
+  , _flightpath :: FlightPath
+  , _flightothercrew :: [Aviator]
+  , _instrumentflightTime :: TimeAmount
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''AircraftFlight
+
+icusonlyflight ::
+  String
+  -> Aircraft
+  -> Aviator
+  -> DayNight
+  -> FlightPath
+  -> TimeAmount
+  -> AircraftFlight
+icusonlyflight n a v t p i =
+  AircraftFlight
+    n
+    a
+    (ICUS v)
+    t
+    p
+    []
+    i
+
+noif_icusonlyflight ::
+  String
+  -> Aircraft
+  -> Aviator
+  -> DayNight
+  -> FlightPath
+  -> AircraftFlight
+noif_icusonlyflight n a v t p =
+  icusonlyflight
+    n
+    a
+    v
+    t
+    p
+    zerotimeamount
+
+dualonlyflight ::
+  String
+  -> Aircraft
+  -> Aviator
+  -> DayNight
+  -> FlightPath
+  -> TimeAmount
+  -> AircraftFlight
+dualonlyflight n a v t p i =
+  AircraftFlight
+    n
+    a
+    (Dual v)
+    t
+    p
+    []
+    i
+
+noif_dualonlyflight ::
+  String
+  -> Aircraft
+  -> Aviator
+  -> DayNight
+  -> FlightPath
+  -> AircraftFlight
+noif_dualonlyflight n a v t p =
+  dualonlyflight
+    n
+    a
+    v
+    t
+    p
+    zerotimeamount
+
+commandonlyflight ::
+  String
+  -> Aircraft
+  -> DayNight
+  -> FlightPath
+  -> TimeAmount
+  -> AircraftFlight
+commandonlyflight n a t p i =
+  AircraftFlight
+    n
+    a
+    InCommand
+    t
+    p
+    []
+    i
+
+noif_commandonlyflight ::
+  String
+  -> Aircraft
+  -> DayNight
+  -> FlightPath
+  -> AircraftFlight
+noif_commandonlyflight n a t p =
+  commandonlyflight
+    n
+    a
+    t
+    p
+    zerotimeamount
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Aviator.hs b/src/Data/Aviation/Casr/Logbook/Types/Aviator.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Aviator.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.Aviator(
+  Aviator(..)
+, HasAviator(..)
+, aviatorwithname
+, nodobaviator
+, dobaviator
+) where
+
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.Rating(Rating)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Data.Digit(Digit)
+import Data.Maybe(Maybe(Nothing, Just))
+import Data.String(String)
+import Data.Time(Day)
+import Prelude(Show)
+
+data Aviator =
+  Aviator {
+    _surname :: String
+  , _firstname :: String
+  , _arn :: [Digit]
+  , _dob :: Maybe Day
+  , _ratings :: [Rating]
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''Aviator
+
+aviatorwithname ::
+  String
+  -> String
+  -> Aviator
+aviatorwithname s f =
+  Aviator
+    s
+    f
+    []
+    Nothing
+    []
+
+nodobaviator ::
+  String
+  -> String
+  -> [Digit]
+  -> [Rating]
+  -> Aviator
+nodobaviator s f r =
+  Aviator
+    s 
+    f
+    r
+    Nothing
+
+dobaviator ::
+  String
+  -> String
+  -> [Digit]
+  -> Day
+  -> [Rating]
+  -> Aviator
+dobaviator s f r b =
+  Aviator
+    s 
+    f
+    r
+    (Just b)
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Briefing.hs b/src/Data/Aviation/Casr/Logbook/Types/Briefing.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Briefing.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.Briefing(
+  Briefing(..)
+, HasBriefing(..)
+) where
+  
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
+import Data.Aviation.Casr.Logbook.Types.Location(Location)
+import Data.Aviation.Casr.Logbook.Types.Time(Time)
+import Data.Aviation.Casr.Logbook.Types.TimeAmount(TimeAmount)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Data.String(String)
+import Prelude(Show)
+
+data Briefing =
+  Briefing {
+    _briefingName :: String
+  , _briefingLocation :: Location
+  , _briefingTime :: Time
+  , _briefer :: Aviator
+  , _briefingTimeAmount :: TimeAmount
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''Briefing
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Command.hs b/src/Data/Aviation/Casr/Logbook/Types/Command.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Command.hs
@@ -0,0 +1,33 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.Command(
+  Command(..)
+, AsCommand(..)
+, getInstructingPic
+) where
+
+import Control.Lens(makeClassyPrisms)
+import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
+import Data.Eq(Eq)
+import Data.Maybe(Maybe(Just, Nothing))
+import Data.Ord(Ord)
+import Prelude(Show)
+
+data Command =
+  ICUS Aviator
+  | Dual Aviator
+  | InCommand
+  deriving (Eq, Ord, Show)
+
+makeClassyPrisms ''Command
+
+getInstructingPic ::
+  Command
+  -> Maybe Aviator
+getInstructingPic (ICUS a) =
+  Just a
+getInstructingPic (Dual a) =
+  Just a
+getInstructingPic InCommand =
+  Nothing
diff --git a/src/Data/Aviation/Casr/Logbook/Types/DayNight.hs b/src/Data/Aviation/Casr/Logbook/Types/DayNight.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/DayNight.hs
@@ -0,0 +1,47 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.DayNight(
+  DayNight(..)
+, HasDayNight(..)
+, day
+, night
+, totalDayNight
+) where
+
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.TimeAmount(TimeAmount(TimeAmount), zerotimeamount)
+import Data.Digit(Digit)
+import Data.Eq(Eq)
+import Data.Int(Int)
+import Data.Monoid(mappend)
+import Data.Ord(Ord)
+import Prelude(Show)
+
+data DayNight =
+  DayNight {
+    _dayDayNight :: TimeAmount
+  , _nightDayNight :: TimeAmount
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''DayNight
+
+day ::
+  Int
+  -> Digit
+  -> DayNight
+day h p =
+  DayNight (TimeAmount h p) zerotimeamount
+
+night ::
+  Int
+  -> Digit
+  -> DayNight
+night h p =
+  DayNight zerotimeamount (TimeAmount h p)
+
+totalDayNight ::
+  DayNight
+  -> TimeAmount
+totalDayNight (DayNight d n) =
+  d `mappend` n
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Engine.hs b/src/Data/Aviation/Casr/Logbook/Types/Engine.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Engine.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.Engine(
+  Engine(..)
+, AsEngine(..)
+) where
+
+import Control.Lens(makeClassyPrisms)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Prelude(Show)
+
+data Engine =
+  Single
+  | Multi
+  deriving (Eq, Ord, Show)
+
+makeClassyPrisms ''Engine
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Entries.hs b/src/Data/Aviation/Casr/Logbook/Types/Entries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Entries.hs
@@ -0,0 +1,35 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Data.Aviation.Casr.Logbook.Types.Entries(
+  Entries(..)
+, emptyentries
+, singleentry
+) where
+
+import Control.Lens(makeWrapped)
+import Data.Aviation.Casr.Logbook.Types.Entry(Entry)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Prelude(Show)
+  
+newtype Entries ae se ee be =
+  Entries
+    [Entry ae se ee be]
+  deriving (Eq, Ord, Show)
+
+makeWrapped ''Entries
+
+emptyentries ::
+  Entries ae se ee be
+emptyentries =
+  Entries []
+
+singleentry ::
+  Entry ae se ee be
+  -> Entries ae se ee be
+singleentry e =
+  Entries [e]
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Entry.hs b/src/Data/Aviation/Casr/Logbook/Types/Entry.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Entry.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE FlexibleInstances #-}
+
+module Data.Aviation.Casr.Logbook.Types.Entry(
+  Entry(..)
+, AsEntry(..)
+) where
+
+import Control.Lens(makeClassyPrisms)
+import Data.Aviation.Casr.Logbook.Types.AircraftFlight(AircraftFlight)
+import Data.Aviation.Casr.Logbook.Types.SimulatorFlight(SimulatorFlight)
+import Data.Aviation.Casr.Logbook.Types.Exam(Exam)
+import Data.Aviation.Casr.Logbook.Types.Briefing(Briefing)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Prelude(Show)
+
+data Entry ae se ee be =
+  AircraftFlightEntry AircraftFlight ae
+  | SimulatorFlightEntry SimulatorFlight se
+  | ExamEntry Exam ee
+  | BriefingEntry Briefing be
+  deriving (Eq, Ord, Show)
+
+makeClassyPrisms ''Entry
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Exam.hs b/src/Data/Aviation/Casr/Logbook/Types/Exam.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Exam.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.Exam(
+  Exam(..)
+, HasExam(..)
+, dayonlyexam
+) where
+
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
+import Data.Aviation.Casr.Logbook.Types.Time(Time, dayonly)
+import Data.Aviation.Casr.Logbook.Types.Location(Location)
+import Data.Eq(Eq)
+import Data.Int(Int)
+import Data.Ord(Ord)
+import Data.String(String)
+import Data.Time(Day)
+import Prelude(Show)
+
+data Exam =
+  Exam {
+    _examName :: String
+  , _examLocation :: Location
+  , _examTime :: Time
+  , _examDelegate :: Aviator
+  , _examResult :: Int
+  , _examResultMaximum :: Int
+  } deriving (Eq, Ord, Show)  
+
+makeClassy ''Exam
+
+dayonlyexam ::
+  String
+  -> Location
+  -> Day
+  -> Aviator
+  -> Int
+  -> Int
+  -> Exam
+dayonlyexam n l d =
+  Exam
+    n
+    l
+    (dayonly d)
diff --git a/src/Data/Aviation/Casr/Logbook/Types/FlightPath.hs b/src/Data/Aviation/Casr/Logbook/Types/FlightPath.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/FlightPath.hs
@@ -0,0 +1,61 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.FlightPath(
+  FlightPath(..)
+, HasFlightPath(..)
+, directflightpath
+, directcircuit
+, pointsatdate
+, flightPathList
+) where
+
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.FlightPoint(FlightPoint, pointatdate)
+import Data.Eq(Eq)
+import Data.Functor((<$>))
+import Data.List((++))
+import Data.Ord(Ord)
+import Data.String(String)
+import Data.Time(Day)
+import Prelude(Show)
+
+data FlightPath =
+  FlightPath {
+    _flightStart :: FlightPoint
+  , _flightIntermediate :: [FlightPoint]
+  , _flightEnd :: FlightPoint
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''FlightPath
+
+directflightpath ::
+  FlightPoint
+  -> FlightPoint
+  -> FlightPath
+directflightpath x y =
+  FlightPath x [] y
+
+directcircuit ::
+  FlightPoint
+  -> FlightPath
+directcircuit x =
+  directflightpath x x
+
+pointsatdate ::
+  String
+  -> [String]
+  -> String
+  -> Day
+  -> FlightPath
+pointsatdate x i y d =
+  FlightPath
+    (pointatdate x d)
+    ((\s -> pointatdate s d) <$> i)
+    (pointatdate y d)
+
+flightPathList ::
+  FlightPath
+  -> [FlightPoint]
+flightPathList (FlightPath s x e) =
+  s : x ++ [e]
diff --git a/src/Data/Aviation/Casr/Logbook/Types/FlightPoint.hs b/src/Data/Aviation/Casr/Logbook/Types/FlightPoint.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/FlightPoint.hs
@@ -0,0 +1,48 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.FlightPoint(
+  FlightPoint(..)
+, HasFlightPoint(..)
+, pointatdate
+, runwayatdate
+) where
+
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.Time(Time, dayonly)
+import Data.Eq(Eq)
+import Data.Maybe(Maybe(Nothing, Just))
+import Data.Ord(Ord)
+import Data.String(String)
+import Data.Time(Day)
+import Prelude(Show)
+
+data FlightPoint =
+  FlightPoint {
+    _point :: String
+  , _runway :: Maybe String
+  , _landingTime :: Time
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''FlightPoint
+
+pointatdate ::
+  String
+  -> Day
+  -> FlightPoint
+pointatdate a d =
+  FlightPoint
+    a
+    Nothing
+    (dayonly d)
+
+runwayatdate ::
+  String
+  -> String
+  -> Day
+  -> FlightPoint
+runwayatdate a r d =
+  FlightPoint
+    a
+    (Just r)
+    (dayonly d)
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Location.hs b/src/Data/Aviation/Casr/Logbook/Types/Location.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Location.hs
@@ -0,0 +1,22 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.Location(
+  Location(..)
+, HasLocation(..)
+) where
+
+import Control.Lens(makeClassy)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Data.String(String)
+import Prelude(Show, Double)
+
+data Location =
+  Location {
+    _locationname :: String
+  , _locationlatitude :: Double
+  , _locationlongitude :: Double
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''Location
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Logbook.hs b/src/Data/Aviation/Casr/Logbook/Types/Logbook.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Logbook.hs
@@ -0,0 +1,54 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE FlexibleInstances #-}
+
+module Data.Aviation.Casr.Logbook.Types.Logbook(
+  Logbook(..)
+, HasLogbook(..)
+, aviatorlogbook
+, emptylogbook
+, singleentrylogbook
+) where
+
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
+import Data.Aviation.Casr.Logbook.Types.Entries(Entries(Entries), emptyentries, singleentry)
+import Data.Aviation.Casr.Logbook.Types.Entry(Entry)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Prelude(Show)
+
+data Logbook ae se ee be =
+  Logbook {
+    _logbookaviator :: Aviator
+  , _logbookentries :: (Entries ae se ee be)
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''Logbook
+
+aviatorlogbook ::
+  Aviator
+  -> [Entry ae se ee be]
+  -> Logbook ae se ee be
+aviatorlogbook a e =
+  Logbook
+    a
+    (Entries e)
+
+emptylogbook ::
+  Aviator
+  -> Logbook ae se ee be
+emptylogbook a =
+  Logbook
+    a
+    emptyentries
+
+singleentrylogbook ::
+  Aviator
+  -> Entry ae se ee be
+  -> Logbook ae se ee be
+singleentrylogbook a e =
+  Logbook
+    a
+    (singleentry e)
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Rating.hs b/src/Data/Aviation/Casr/Logbook/Types/Rating.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Rating.hs
@@ -0,0 +1,42 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.Rating(
+  Rating(..)
+, HasRating(..)
+, nodayrating
+, dayrating
+) where
+
+import Control.Lens(makeClassy)
+import Data.Eq(Eq)
+import Data.Maybe(Maybe(Nothing, Just))
+import Data.Ord(Ord)
+import Data.String(String)
+import Data.Time(Day)
+import Prelude(Show)
+
+data Rating =
+  Rating {
+    _ratingName :: String
+  , _ratingAchieved :: Maybe Day
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''Rating
+
+nodayrating ::
+  String
+  -> Rating
+nodayrating r =
+  Rating
+    r
+    Nothing
+
+dayrating ::
+  String
+  -> Day
+  -> Rating
+dayrating r d =
+  Rating
+    r
+    (Just d)
diff --git a/src/Data/Aviation/Casr/Logbook/Types/SimulatorFlight.hs b/src/Data/Aviation/Casr/Logbook/Types/SimulatorFlight.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/SimulatorFlight.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.SimulatorFlight(
+  SimulatorFlight(..)
+, HasSimulatorFlight(..)
+, dayonlysimulator
+) where
+
+import Control.Lens(makeClassy)
+import Data.Aviation.Casr.Logbook.Types.Time(Time, dayonly)
+import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
+import Data.Aviation.Casr.Logbook.Types.TimeAmount(TimeAmount)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Data.String(String)
+import Data.Time(Day)
+import Prelude(Show)
+
+data SimulatorFlight =
+  SimulatorFlight {
+    _simulatorflightname :: String
+  , _simulatorflighttime :: Time
+  , _simulatortype :: String
+  , _simulatorothercrew :: [Aviator]
+  , _simulatorTime :: TimeAmount
+  , _instrumentsimulatorTime :: TimeAmount
+  } deriving (Eq, Ord, Show)   
+
+makeClassy ''SimulatorFlight
+
+dayonlysimulator ::
+  String
+  -> Day
+  -> String
+  -> [Aviator]
+  -> TimeAmount
+  -> TimeAmount
+  -> SimulatorFlight
+dayonlysimulator n d =
+  SimulatorFlight
+    n
+    (dayonly d)
+    
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Time.hs b/src/Data/Aviation/Casr/Logbook/Types/Time.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/Time.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.Time(
+  Time(..)
+, HasTime(..)
+, dayonly
+, dayandtime
+) where
+
+import Control.Lens(makeClassy)
+import Data.Eq(Eq)
+import Data.Ord(Ord)
+import Data.Maybe(Maybe(Nothing, Just))
+import Data.Time(Day, TimeOfDay)
+import Prelude(Show)
+
+data Time =
+  Time {
+    _daytime :: Day
+  , _timeofday :: Maybe TimeOfDay
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''Time
+
+dayonly ::
+  Day
+  -> Time
+dayonly d =
+  Time d Nothing
+
+dayandtime ::
+  Day
+  -> TimeOfDay
+  -> Time
+dayandtime d t =
+  Time d (Just t)
diff --git a/src/Data/Aviation/Casr/Logbook/Types/TimeAmount.hs b/src/Data/Aviation/Casr/Logbook/Types/TimeAmount.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Types/TimeAmount.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Data.Aviation.Casr.Logbook.Types.TimeAmount(
+  TimeAmount(..)
+, HasTimeAmount(..)
+, parttimeamount
+, zerotimeamount
+, addtimeamount
+, timeAmountBy10
+) where
+
+import Control.Lens(makeClassy, ( # ))
+import Data.Eq(Eq)
+import Data.Digit(Digit, x0, digit, (/+/))
+import Data.Int(Int)
+import Data.Monoid(Monoid(mempty, mappend))
+import Data.Ord(Ord)
+import Prelude(Show, Num((+), (*)))
+
+data TimeAmount =
+  TimeAmount {
+    _hours :: Int
+  , _tenthofhour :: Digit
+  } deriving (Eq, Ord, Show)
+
+makeClassy ''TimeAmount
+
+parttimeamount ::
+  Digit
+  -> TimeAmount
+parttimeamount =
+  TimeAmount 0
+
+zerotimeamount ::
+  TimeAmount
+zerotimeamount =
+  TimeAmount 0 x0
+
+addtimeamount ::
+  TimeAmount 
+  -> TimeAmount
+  -> TimeAmount
+TimeAmount f1 p1 `addtimeamount` TimeAmount f2 p2 =
+  let (h, q) = p1 /+/ p2
+  in  TimeAmount (f1 + f2 + digit # h) q 
+
+timeAmountBy10 ::
+  TimeAmount
+  -> Int
+timeAmountBy10 (TimeAmount a b) =
+  a * 10 + digit # b
+
+instance Monoid TimeAmount where
+  mempty =
+    zerotimeamount
+  mappend =
+    addtimeamount
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
