diff --git a/casr-logbook.cabal b/casr-logbook.cabal
--- a/casr-logbook.cabal
+++ b/casr-logbook.cabal
@@ -1,5 +1,5 @@
 name:               casr-logbook
-version:            0.0.6
+version:            0.0.7
 license:            OtherLicense
 license-file:       LICENSE
 author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
@@ -58,6 +58,7 @@
                     Data.Aviation.Casr.Logbook.Images
                     Data.Aviation.Casr.Logbook.ImageType
                     Data.Aviation.Casr.Logbook.Printer.Markdown
+                    Data.Aviation.Casr.Logbook.Printer.Html
                     Data.Aviation.Casr.Logbook.Name
                     Data.Aviation.Casr.Logbook.PiC
                     Data.Aviation.Casr.Logbook.PoB
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+0.0.7
+
+* HTML output printer.
+
 0.0.6
 
 * Fix bug in bambuser video type.
diff --git a/src/Data/Aviation/Casr/Logbook.hs b/src/Data/Aviation/Casr/Logbook.hs
--- a/src/Data/Aviation/Casr/Logbook.hs
+++ b/src/Data/Aviation/Casr/Logbook.hs
@@ -1,4 +1,6 @@
-module Data.Aviation.Casr.Logbook(
+{-# LANGUAGE OverloadedStrings #-}
+
+module Data.Aviation.Casr.Logbook (
   module L
 ) where
 
@@ -16,6 +18,7 @@
 import Data.Aviation.Casr.Logbook.Image as L
 import Data.Aviation.Casr.Logbook.Images as L
 import Data.Aviation.Casr.Logbook.ImageType as L
+import Data.Aviation.Casr.Logbook.Printer.Html as L
 import Data.Aviation.Casr.Logbook.Printer.Markdown as L
 import Data.Aviation.Casr.Logbook.Name as L
 import Data.Aviation.Casr.Logbook.PiC as L
diff --git a/src/Data/Aviation/Casr/Logbook/ARN.hs b/src/Data/Aviation/Casr/Logbook/ARN.hs
--- a/src/Data/Aviation/Casr/Logbook/ARN.hs
+++ b/src/Data/Aviation/Casr/Logbook/ARN.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.String
 
 newtype ARN =
@@ -16,4 +17,8 @@
     
 instance Markdown ARN where
   markdown (ARN s) =
-    "* Aviation Reference Number: **`" ++ s ++ "`**\n"
+    "* Aviation Reference Number: **`" ++ markdown s ++ "`**\n"
+
+instance Html ARN where
+  html (ARN s) =
+    "<span class=\"heading arnheading\">ARN: </span><span class=\"arninfo\">" ++ html s ++ "</span>"
diff --git a/src/Data/Aviation/Casr/Logbook/Aircraft.hs b/src/Data/Aviation/Casr/Logbook/Aircraft.hs
--- a/src/Data/Aviation/Casr/Logbook/Aircraft.hs
+++ b/src/Data/Aviation/Casr/Logbook/Aircraft.hs
@@ -4,6 +4,7 @@
 
 import Data.Aviation.Casr.Logbook.Engine
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 
 data Aircraft =
   Aircraft
@@ -18,10 +19,51 @@
       [
         "* Aircraft"
       , "\n  * Type: **"
-      , t
+      , markdown t
       , "**\n  * Registration: **`"
-      , r
+      , markdown r
       , "`**\n  * Engine: **`"
       , markdown e
       , "`**\n"
+      ]
+
+instance Html Aircraft where
+  html (Aircraft t r e) =
+    concat
+      [
+        "<span class=\"heading aircraftheading\">"
+      , "Aircraft"
+      , "</span>"
+      , ": "
+      , "<div class=\"info aircraftinfo\">"
+      , "<ul>"
+      , "<li>"
+      , "<span class=\"heading aircrafttypeheading\">"
+      , "Type"
+      , "</span>"
+      , ": "
+      , "<span class=\"info aircrafttypeinfo\">"
+      , html t
+      , "</span>"
+      , "</li>"
+      , "<li>"
+      , "<span class=\"heading aircraftregistrationheading\">"
+      , "Registration"
+      , "</span>"
+      , ": "
+      , "<span class=\"info aircraftregistrationinfo\">"
+      , html r
+      , "</span>"
+      , "</li>"
+      , "<li>"
+      , "<span class=\"heading aircraftengineheading\">"
+      , "Engine"
+      , "</span>"
+      , ": "
+      , "<span class=\"info aircraftengineinfo\">"
+      , html e
+      , "</span>"
+      , "</li>"
+      , "</ul>"
+      , "</div>"
       ]
diff --git a/src/Data/Aviation/Casr/Logbook/DOB.hs b/src/Data/Aviation/Casr/Logbook/DOB.hs
--- a/src/Data/Aviation/Casr/Logbook/DOB.hs
+++ b/src/Data/Aviation/Casr/Logbook/DOB.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.String
 
 newtype DOB =
@@ -16,4 +17,8 @@
 
 instance Markdown DOB where
   markdown (DOB s) =
-    "* Date of Birth: **`" ++ s ++ "`**\n"
+    "* Date of Birth: **`" ++ markdown s ++ "`**\n"
+
+instance Html DOB where
+  html (DOB s) =
+    "<span class=\"heading dobheading\">Date of Birth: </span><span class=\"dobinfo\">" ++ html s ++ "</span>"
diff --git a/src/Data/Aviation/Casr/Logbook/Date.hs b/src/Data/Aviation/Casr/Logbook/Date.hs
--- a/src/Data/Aviation/Casr/Logbook/Date.hs
+++ b/src/Data/Aviation/Casr/Logbook/Date.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.String
     
 newtype Date =
@@ -17,3 +18,16 @@
 instance Markdown Date where
   markdown (Date s) =
     "* Date: **`" ++ s ++ "`**\n"
+
+instance Html Date where
+  html (Date s) =
+    concat
+      [
+        "<span class=\"heading dateheading\">"
+      , "Date"
+      , "</span>"
+      , ": "
+      , "<span class=\"info dateinfo\">"
+      , html s
+      , "</span>"
+      ]
diff --git a/src/Data/Aviation/Casr/Logbook/DayNight.hs b/src/Data/Aviation/Casr/Logbook/DayNight.hs
--- a/src/Data/Aviation/Casr/Logbook/DayNight.hs
+++ b/src/Data/Aviation/Casr/Logbook/DayNight.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 
 data DayNight =
   Day
@@ -20,4 +21,20 @@
           Night -> "Night"
           DayNight -> "Day & Night"
       , "**\n"
+      ]
+    
+instance Html DayNight where
+  html x =
+    concat
+      [
+        "<span class=\"heading daynightheading\">"
+      , "Day/Night"
+      , "</span>"
+      , ": "
+      , "<span class=\"info daynightinfo\">"
+      , case x of
+          Day -> "Day"
+          Night -> "Night"
+          DayNight -> "Day &amp; Night"
+      , "</span>"
       ]
diff --git a/src/Data/Aviation/Casr/Logbook/Engine.hs b/src/Data/Aviation/Casr/Logbook/Engine.hs
--- a/src/Data/Aviation/Casr/Logbook/Engine.hs
+++ b/src/Data/Aviation/Casr/Logbook/Engine.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 
 data Engine =
   Single
@@ -13,4 +14,10 @@
   markdown Single =
     "single"
   markdown Multi =
+    "multi"
+
+instance Html Engine where
+  html Single =
+    "single"
+  html Multi =
     "multi"
diff --git a/src/Data/Aviation/Casr/Logbook/FlightLog.hs b/src/Data/Aviation/Casr/Logbook/FlightLog.hs
--- a/src/Data/Aviation/Casr/Logbook/FlightLog.hs
+++ b/src/Data/Aviation/Casr/Logbook/FlightLog.hs
@@ -7,6 +7,7 @@
 import Data.Aviation.Casr.Logbook.FlightLogEntries
 import Data.Aviation.Casr.Logbook.Name
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.Totals
 
 data FlightLog =
@@ -18,13 +19,13 @@
   deriving (Eq, Ord, Show)
     
 instance Markdown FlightLog where
-  markdown (FlightLog (Name name) dob arn entries) =
+  markdown (FlightLog (Name name') dob arn entries) =
     concat
       [
         "# Pilot Personal Log Book\n"
       , "### Civil Aviation Safety Regulation 1998 (61.345) [*austlii.edu.au*](http://www.austlii.edu.au/au/legis/cth/consol_reg/casr1998333/s61.345.html)\n\n"
       , "* "
-      , name
+      , markdown name'
       , "\n"
       , markdown dob
       , markdown arn
@@ -32,4 +33,54 @@
       , markdown (totals entries)
       , "\n----\n\n"
       , markdown entries
+      ]
+    
+instance Html FlightLog where
+  html (FlightLog name@(Name name') dob arn@(ARN arn') entries) =
+    concat
+      [
+        "<!DOCTYPE HTML>"
+      , "<html lang=\"en\">"
+      , "<head>"
+      , "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"
+      , "<title>Pilot Personal Log Book &mdash; "
+      , html name'
+      , " ("
+      , html arn'
+      , ")"
+      , "</title>"
+      , "<link href=\"https://fonts.googleapis.com/css?family=Inconsolata:400,700\" rel=\"stylesheet\" type=\"text/css\">"
+      , "<link rel=\"stylesheet\" type=\"text/css\" href=\"casr-logbook.css\">"
+      , "<link rel=\"alternate\" type=\"application/atom+xml\" href=\"/atom.xml\" title=\"Atom feed\">"
+      , "<script type=\"text/javascript\" src=\"http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>"
+      , "<script type=\"text/javascript\" src=\"https://raw.github.com/Mathapedia/LaTeX2HTML5/master/latex2html5.min.js\"></script>"
+      , "</head>"
+      , "<body class=\"casr-logbook\">"    
+      , "<div class=\"title\">"
+      , "<h1>Pilot Personal Log Book</h1>"
+      , "</div>"
+      , "<div class=\"subtitle\">"
+      , "<h2>Civil Aviation Safety Regulation 1998 (61.345) <span class=\"austlii\"><a href=\"http://www.austlii.edu.au/au/legis/cth/consol_reg/casr1998333/s61.345.html\">austlii.edu.au</a></span></h2>"
+      , "</div>" 
+      , "<div class=\"personal\">"     
+      , "<ul>"
+      , "<li>"
+      , html name
+      , "</li>"
+      , "<li>"
+      , html dob
+      , "</li>"
+      , "<li>"
+      , html arn
+      , "</li>"
+      , "</ul>"            
+      , "</div>"
+      , "<hr>"
+      , html (totals entries)
+      , "<hr>"
+      , "<div class=\"flightlogentries\">"
+      , html entries
+      , "</div> "
+      , "</body>"
+      , "</html>"
       ]
diff --git a/src/Data/Aviation/Casr/Logbook/FlightLogEntries.hs b/src/Data/Aviation/Casr/Logbook/FlightLogEntries.hs
--- a/src/Data/Aviation/Casr/Logbook/FlightLogEntries.hs
+++ b/src/Data/Aviation/Casr/Logbook/FlightLogEntries.hs
@@ -4,6 +4,7 @@
 
 import Data.Aviation.Casr.Logbook.FlightLogEntry
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.List
 
 newtype FlightLogEntries =
@@ -20,3 +21,13 @@
 instance Markdown FlightLogEntries where
   markdown (FlightLogEntries g) =
     intercalate "\n\n----\n\n" (fmap markdown g)
+
+instance Html FlightLogEntries where
+  html (FlightLogEntries g) =
+    (\h -> concat
+             [
+               "<div class=\"flightlogentry\">"
+              , html h
+              , "</div>"
+              , "<hr>"
+              ]) =<< g
diff --git a/src/Data/Aviation/Casr/Logbook/FlightLogEntry.hs b/src/Data/Aviation/Casr/Logbook/FlightLogEntry.hs
--- a/src/Data/Aviation/Casr/Logbook/FlightLogEntry.hs
+++ b/src/Data/Aviation/Casr/Logbook/FlightLogEntry.hs
@@ -8,10 +8,10 @@
 import Data.Aviation.Casr.Logbook.FlightPath
 import Data.Aviation.Casr.Logbook.Hours
 import Data.Aviation.Casr.Logbook.Images
-import Data.Aviation.Casr.Logbook.Name
 import Data.Aviation.Casr.Logbook.PiC
 import Data.Aviation.Casr.Logbook.PoB
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.Sequence
 import Data.Aviation.Casr.Logbook.TrackLogs
 import Data.Aviation.Casr.Logbook.Videos
@@ -25,7 +25,6 @@
 -}
 data FlightLogEntry =
   FlightLogEntry
-    Name
     Sequence
     Date 
     Aircraft
@@ -41,11 +40,10 @@
   deriving (Eq, Ord, Show)
     
 instance Markdown FlightLogEntry where
-  markdown (FlightLogEntry name sequ date aircraft hours pob flightpath daynight pic tracklogs visualisations images videos) =
+  markdown (FlightLogEntry sequ date aircraft hours pob flightpath daynight pic tracklogs visualisations images videos) =
     concat
       [
-        markdown name
-      , markdown date
+        markdown date
       , markdown sequ
       , markdown aircraft
       , markdown hours
@@ -58,3 +56,59 @@
       , markdown visualisations
       , markdown images
       ]
+
+instance Html FlightLogEntry where
+  html (FlightLogEntry sequ date aircraft hours pob flightpath daynight pic tracklogs visualisations images videos) =
+    let onethen x c r = concat $
+                 case r of
+                   [] ->
+                     []
+                   _ ->
+                     [
+                       "<"
+                     , x
+                     , " class=\""
+                     , c
+                     , "\">"
+                     , r 
+                     , "</"
+                     , x
+                     , ">"
+                     ]
+        li = onethen "li"
+        div' = onethen "div"             
+    in  concat
+          [
+            "<div class=\"flightlogsequence\">"
+          , "<h3 class=\"sequence\">"
+          , html sequ
+          , "</h3>"
+          , "</div>"
+          , "<ul>"
+          , "<li class=\"date\">"
+          , html date
+          , "</li>"
+          , "<li class=\"aircraft\">"
+          , html aircraft
+          , "</li>"
+          , "<li class=\"hours\">"
+          , html hours
+          , "</li>"
+          , "<li class=\"pob\">"
+          , html pob
+          , "</li>"
+          , "<li class=\"flightpath\">"
+          , html flightpath
+          , "</li>"
+          , "<li class=\"daynight\">"
+          , html daynight
+          , "</li>"
+          , "<li class=\"pic\">"
+          , html pic
+          , "</li>"
+          , li "tracklogs" (html tracklogs)
+          , li "videos" (html videos) 
+          , li "visualisations" (html visualisations) 
+          , "</ul>"
+          , div' "images" (html images) 
+          ]
diff --git a/src/Data/Aviation/Casr/Logbook/FlightPath.hs b/src/Data/Aviation/Casr/Logbook/FlightPath.hs
--- a/src/Data/Aviation/Casr/Logbook/FlightPath.hs
+++ b/src/Data/Aviation/Casr/Logbook/FlightPath.hs
@@ -1,9 +1,12 @@
 module Data.Aviation.Casr.Logbook.FlightPath (
   FlightPath(..)
+, pathlist
 , directPath
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
+import Data.List
 
 data FlightPath =
   FlightPath
@@ -22,14 +25,30 @@
     []
     to
 
+pathlist ::
+  FlightPath
+  -> [String]
+pathlist (FlightPath s x e) =
+  s : (x ++ [e])
+
 instance Markdown FlightPath where
-  markdown (FlightPath s x e) =
+  markdown p =
     concat
       [
-        "* Path: **"
-      , s
-      , x >>= (" - " ++)
-      , " - "
-      , e
+        "* Flight path: **"
+      , intercalate " - " (map markdown (pathlist p))
       , "**\n"
+      ]
+
+instance Html FlightPath where
+  html p =
+    concat
+      [
+        "<span class=\"heading flightpathheading\">"
+      , "Flight path"
+      , "</span>"
+      , ": "
+      , "<span class=\"info flightpathinfo\">"
+      , intercalate " &amp; " (map html (pathlist p))
+      , "</span>"
       ]
diff --git a/src/Data/Aviation/Casr/Logbook/Hours.hs b/src/Data/Aviation/Casr/Logbook/Hours.hs
--- a/src/Data/Aviation/Casr/Logbook/Hours.hs
+++ b/src/Data/Aviation/Casr/Logbook/Hours.hs
@@ -6,6 +6,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 
 -- abstract
 data Hours =
@@ -35,8 +36,23 @@
 
 instance Markdown Hours where
   markdown (Hours t p) =
-    "* Hours: **`" ++ show t ++ "." ++ show p ++ "`**\n"
+    "* Hours: **`" ++ markdown t ++ "." ++ markdown p ++ "`**\n"
 
+instance Html Hours where
+  html (Hours t p) =
+    concat
+      [
+        "<span class=\"heading hoursheading\">"
+      , "Hours"
+      , "</span>"
+      , ": "
+      , "<span class=\"info hoursinfo\">"
+      , html t
+      , "."
+      , html p
+      , "</span>"
+      ]
+      
 fractionalHours ::
   Fractional a =>
   Hours
diff --git a/src/Data/Aviation/Casr/Logbook/Image.hs b/src/Data/Aviation/Casr/Logbook/Image.hs
--- a/src/Data/Aviation/Casr/Logbook/Image.hs
+++ b/src/Data/Aviation/Casr/Logbook/Image.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.ImageType
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.Printer.Markdown
 import Data.Maybe
 
@@ -25,5 +26,20 @@
           , uri
           , "\" width=\"120\" alt=\""
           , n
-          , "\"/></a>"
+          , "\"></a>"
+          ]
+
+instance Html Image where
+  html (Image uri name itype) =
+    let t = html itype
+        n = fromMaybe ("Image (" ++ t ++ ")") name
+    in  concat
+          [
+            "<a href=\""
+          , uri
+          , "\"><img src=\""
+          , uri
+          , "\" width=\"120\" alt=\""
+          , n
+          , "\"></a>"
           ]
diff --git a/src/Data/Aviation/Casr/Logbook/ImageType.hs b/src/Data/Aviation/Casr/Logbook/ImageType.hs
--- a/src/Data/Aviation/Casr/Logbook/ImageType.hs
+++ b/src/Data/Aviation/Casr/Logbook/ImageType.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 
 data ImageType =
   Png
@@ -13,4 +14,10 @@
   markdown Png =
     "png"
   markdown Jpg =
+    "jpg"
+
+instance Html ImageType where
+  html Png =
+    "png"
+  html Jpg =
     "jpg"
diff --git a/src/Data/Aviation/Casr/Logbook/Images.hs b/src/Data/Aviation/Casr/Logbook/Images.hs
--- a/src/Data/Aviation/Casr/Logbook/Images.hs
+++ b/src/Data/Aviation/Casr/Logbook/Images.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Image
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.Printer.Markdown
 
 newtype Images =
@@ -23,3 +24,11 @@
         []        
       _ ->
         "\n<div style=\"text-align: justify\">\n" ++ (i >>= \j -> markdown j ++ "\n") ++ "</div>"
+
+instance Html Images where
+  html (Images i) =
+    case i of
+      [] ->
+        []        
+      _ ->
+        "<div style=\"text-align: justify\">" ++ (i >>= html) ++ "</div>"
diff --git a/src/Data/Aviation/Casr/Logbook/Name.hs b/src/Data/Aviation/Casr/Logbook/Name.hs
--- a/src/Data/Aviation/Casr/Logbook/Name.hs
+++ b/src/Data/Aviation/Casr/Logbook/Name.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.String
 
 newtype Name =
@@ -16,4 +17,8 @@
 
 instance Markdown Name where
   markdown (Name s) =
-    "### " ++ s ++ "\n"
+    "### " ++ markdown s ++ "\n"
+
+instance Html Name where
+  html (Name s) =
+    "<span class=\"heading nameheading\">Name: </span><span class=\"nameinfo\">" ++ html s ++ "</span>"
diff --git a/src/Data/Aviation/Casr/Logbook/PiC.hs b/src/Data/Aviation/Casr/Logbook/PiC.hs
--- a/src/Data/Aviation/Casr/Logbook/PiC.hs
+++ b/src/Data/Aviation/Casr/Logbook/PiC.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.String
 
 newtype PiC =
@@ -16,4 +17,18 @@
     
 instance Markdown PiC where
   markdown (PiC s) =
-    "* Pilot in Command: **" ++ s ++ "**\n"
+    "* Pilot in Command: **" ++ markdown s ++ "**\n"
+
+instance Html PiC where
+  html (PiC s) =
+    concat
+      [
+        "<span class=\"heading picheading\">"
+      , "Pilot in Command"
+      , "</span>"
+      , ": "
+      , "<span class=\"info picinfo\">"
+      , html s
+      , "</span>"
+      ]
+    
diff --git a/src/Data/Aviation/Casr/Logbook/PoB.hs b/src/Data/Aviation/Casr/Logbook/PoB.hs
--- a/src/Data/Aviation/Casr/Logbook/PoB.hs
+++ b/src/Data/Aviation/Casr/Logbook/PoB.hs
@@ -5,6 +5,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 
 data PoB =
   PoB Int
@@ -29,6 +30,23 @@
           0 -> "unmanned"
           1 -> "solo"
           2 -> "dual"
-          _ -> show n
+          _ -> markdown n
       , "`**\n"
+      ]
+
+instance Html PoB where  
+  html (PoB n) =
+    concat
+      [
+        "<span class=\"heading pobheading\">"
+      , "PoB"
+      , "</span>"
+      , ": "
+      , "<span class=\"info pobinfo\">"
+      , case n of
+          0 -> "unmanned"
+          1 -> "solo"
+          2 -> "dual"
+          _ -> html n
+      , "</span>"
       ]
diff --git a/src/Data/Aviation/Casr/Logbook/Printer/Html.hs b/src/Data/Aviation/Casr/Logbook/Printer/Html.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aviation/Casr/Logbook/Printer/Html.hs
@@ -0,0 +1,40 @@
+module Data.Aviation.Casr.Logbook.Printer.Html (
+  Html(..)
+, printHtml
+, writeHtmlFile
+) where
+
+class Html s where
+  html ::
+    s
+    -> String
+
+instance Html Char where
+  html '&' =
+    "&amp;"
+  html c =
+    [c]
+    
+instance Html Int where
+  html =
+    show
+    
+instance Html a => Html [a] where
+  html =
+    (=<<) html
+
+printHtml ::
+  Html s =>
+  s
+  -> IO ()
+printHtml =
+  putStrLn . html
+
+writeHtmlFile ::
+  Html s =>
+  FilePath
+  -> s
+  -> IO ()
+writeHtmlFile p =
+  writeFile p . html
+  
diff --git a/src/Data/Aviation/Casr/Logbook/Printer/Markdown.hs b/src/Data/Aviation/Casr/Logbook/Printer/Markdown.hs
--- a/src/Data/Aviation/Casr/Logbook/Printer/Markdown.hs
+++ b/src/Data/Aviation/Casr/Logbook/Printer/Markdown.hs
@@ -9,6 +9,18 @@
     s
     -> String
 
+instance Markdown Char where
+  markdown =
+    pure
+
+instance Markdown Int where
+  markdown =
+    show
+
+instance Markdown a => Markdown [a] where
+  markdown =
+    (=<<) markdown
+
 printMarkdown ::
   Markdown s =>
   s
diff --git a/src/Data/Aviation/Casr/Logbook/Sequence.hs b/src/Data/Aviation/Casr/Logbook/Sequence.hs
--- a/src/Data/Aviation/Casr/Logbook/Sequence.hs
+++ b/src/Data/Aviation/Casr/Logbook/Sequence.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.String
 
 newtype Sequence =
@@ -16,4 +17,17 @@
 
 instance Markdown Sequence where
   markdown (Sequence s) =
-    "* Sequence: **" ++ s ++ "**\n"
+    "* Sequence: **" ++ markdown s ++ "**\n"
+
+instance Html Sequence where
+  html (Sequence s) =
+    concat
+      [
+        "<span class=\"heading sequenceheading\">"
+      , "Sequence"
+      , "</span>"
+      , ": "
+      , "<span class=\"info sequenceinfo\">"
+      , html s
+      , "</span>"
+      ]
diff --git a/src/Data/Aviation/Casr/Logbook/Totals.hs b/src/Data/Aviation/Casr/Logbook/Totals.hs
--- a/src/Data/Aviation/Casr/Logbook/Totals.hs
+++ b/src/Data/Aviation/Casr/Logbook/Totals.hs
@@ -15,6 +15,7 @@
 import Data.Aviation.Casr.Logbook.PoB
 import Data.Aviation.Casr.Logbook.PiC
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Foldable(foldl')
 import Data.Map(Map)
 import qualified Data.Map as Map
@@ -76,6 +77,79 @@
           , displayMap "Hours with PiC" pic            
           ]
 
+instance Html Totals where
+  html (Totals total dualhours solohours intype inreg singleengine multiengine day night daynight pic) =
+    let displayHours (Hours f p) =
+          show f ++ "." ++ show p
+        displayPoint x h q =
+          concat
+            [
+              "<li class=\"summarypoint\">"
+            , "<span class=\"heading summarypointheading summarypointheading"
+            , q
+            , "\">"
+            , x            
+            , "</span>: <span class=\"summarypoint summarypoint"
+            , q
+            , "\">"            
+            , displayHours h
+            , "</span></li>"
+            ]
+        displayMap x m q =
+          concat
+            [
+              "<li class=\"summarypoint summarypoint"
+            , q
+            , "\">"
+            , "<span class=\"heading summarypointheading summarypointheading"
+            , q
+            , "\">"
+            , x            
+            , "</span>: <div class=\"summarypoint summarypoint"
+            , q
+            , "\"><ul>"
+            , Map.foldrWithKey (\k h s -> concat [
+                                                   "<li class=\"subsummarypoint subsummarypoint"
+                                                 , q
+                                                 , "\">"
+                                                 , "<span class=\"heading subsummarypointheading subsummarypointheading"
+                                                 , q
+                                                 , "\">"
+                                                 , k
+                                                 , "</span>: <span class=\"subsummarypointhours subsummarypointhours"
+                                                 , q
+                                                 , "\">"
+                                                 , displayHours h
+                                                 , "</span> <span class=\"subsummarypointpercentage subsummarypointpercentage"
+                                                 , q
+                                                 , "\">("
+                                                 , printf "%.2f" (fractionalHours h / fractionalHours total * 100 :: Double)
+                                                 , "%)</span>"
+                                                 , "</li>"
+                                                 , s
+                                                 ]) "" m
+            , "</ul></div></li>"
+            ]        
+    in  concat
+          [
+            "<div class=\"totals\">"
+          , "<h5>Summary</h5>"
+          , "<ul>"
+          , displayPoint "Total Hours" total "totalhours"
+          , displayPoint "Dual Hours" dualhours "dualhours"
+          , displayPoint "Solo Hours" solohours "solohours"
+          , displayMap "Hours in type" intype "hoursintype"
+          , displayMap "Hours in registration" inreg "hoursinregistration"
+          , displayPoint "Single-engine Hours" singleengine "singleenginehours"
+          , displayPoint "Multi-engine Hours" multiengine "multienginehours"
+          , displayPoint "Day Hours" day "dayhours"
+          , displayPoint "Night Hours" night "nighthours"
+          , displayPoint "Day &amp; Night Hours" daynight "daynighthours"
+          , displayMap "Hours with PiC" pic "pichours"           
+          , "</ul>"
+          , "</div>"
+          ]
+
 zeroTotals ::
   Totals
 zeroTotals =
@@ -95,7 +169,7 @@
 singleTotals ::
  FlightLogEntry
  -> Totals
-singleTotals (FlightLogEntry _ _ _ (Aircraft atype areg aeng) hours (PoB pob) _ dn (PiC pic) _ _ _ _) =
+singleTotals (FlightLogEntry _ _ (Aircraft atype areg aeng) hours (PoB pob) _ dn (PiC pic) _ _ _ _) =
   Totals
     hours
     (
diff --git a/src/Data/Aviation/Casr/Logbook/TrackLog.hs b/src/Data/Aviation/Casr/Logbook/TrackLog.hs
--- a/src/Data/Aviation/Casr/Logbook/TrackLog.hs
+++ b/src/Data/Aviation/Casr/Logbook/TrackLog.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.TrackLogType
 import Data.Maybe
 
@@ -17,37 +18,88 @@
   markdown (TrackLog uri name ttype) =
     let t = markdown ttype        
         n = fmap (\z -> "**" ++ z ++ "**") name
-    in  case ttype of 
-          ImageLog _ ->
-            concat
-              [
-                "  * "
-              , case n of
-                  Nothing ->
-                    "*" ++ t ++ "*"
-                  Just n' ->
-                    n'
-              , "\n\n    "
-              , "<a href=\""
-              , uri
-              , "\"><img src=\""
-              , uri
-              , "\" width=\"360\" alt=\""
-              , fromMaybe t name
-              , "\"/></a>"
-              ]
-          _ ->
-            concat
-              [
-                "  * "
-              , case n of
-                  Nothing ->
-                    ""
-                  Just n' ->
-                    n' ++ ": "
-              , "["
-              , t
-              , "]("
-              , uri
-              , ")"
-              ]
+    in  concat $ 
+          case ttype of 
+            ImageLog _ ->              
+                [
+                  "  * "
+                , case n of
+                    Nothing ->
+                      "*" ++ t ++ "*"
+                    Just n' ->
+                      n'
+                , "\n\n    "
+                , "<a href=\""
+                , uri
+                , "\"><img src=\""
+                , uri
+                , "\" width=\"360\" alt=\""
+                , fromMaybe t name
+                , "\"></a>"
+                ]
+            _ ->              
+                [
+                  "  * "
+                , case n of
+                    Nothing ->
+                      ""
+                    Just n' ->
+                      n' ++ ": "
+                , "["
+                , t
+                , "]("
+                , uri
+                , ")"
+                ]
+
+instance Html TrackLog where
+  html (TrackLog uri name ttype) =
+    let t = html ttype   
+        n = fmap html name
+    in  concat [
+            "<div class=\"tracklog\">"
+          , concat $ 
+              case ttype of 
+                ImageLog _ ->
+                  [
+                    fromMaybe (concat
+                          [
+                            "<a href=\""
+                          , uri
+                          , "\">"
+                          , "<span class=\"tracklogtype\">"
+                          , t
+                          , "</span>"
+                          , "</a>"
+                          ]) n
+                  , "<p>"
+                  , "<a href=\""
+                  , uri
+                  , "\">"
+                  , "<span class=\"tracklogimage\">"
+                  , "<img src=\""
+                  , uri
+                  , "\" width=\"360\" alt=\""
+                  , fromMaybe t n
+                  , "\">"
+                  , "</span>"
+                  , "</a>"
+                  , "</p>"
+                  ]
+                _ ->
+                  [
+                    case n of
+                      Nothing ->
+                        ""
+                      Just n' ->
+                        n' ++ ": "
+                  , "<a href=\""
+                  , uri
+                  , "\">"
+                  , "<span class=\"tracklogtype\">"
+                  , t
+                  , "</span>"
+                  , "</a>"
+                  ]
+             , "</div>"
+          ]
diff --git a/src/Data/Aviation/Casr/Logbook/TrackLogType.hs b/src/Data/Aviation/Casr/Logbook/TrackLogType.hs
--- a/src/Data/Aviation/Casr/Logbook/TrackLogType.hs
+++ b/src/Data/Aviation/Casr/Logbook/TrackLogType.hs
@@ -4,6 +4,7 @@
 
 import Data.Aviation.Casr.Logbook.ImageType
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 
 data TrackLogType =
   Gpx
@@ -21,3 +22,13 @@
     "kmz"
   markdown (ImageLog i) =
     markdown i
+
+instance Html TrackLogType where
+  html Gpx =
+    "gpx"
+  html Kml =
+    "kml"
+  html Kmz =
+    "kmz"
+  html (ImageLog i) =
+    html i
diff --git a/src/Data/Aviation/Casr/Logbook/TrackLogs.hs b/src/Data/Aviation/Casr/Logbook/TrackLogs.hs
--- a/src/Data/Aviation/Casr/Logbook/TrackLogs.hs
+++ b/src/Data/Aviation/Casr/Logbook/TrackLogs.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.TrackLog
 
 newtype TrackLogs =
@@ -23,3 +24,25 @@
         ""
       _ ->
         "* **Track**\n" ++ (t >>= \u -> markdown u ++ "\n")
+
+instance Html TrackLogs where
+  html (TrackLogs t) =
+    case t of
+      [] ->
+        ""
+      _ ->
+        concat
+          [
+            "<span class=\"heading tracklogheading\">"
+          , "Track"
+          , "</span>"
+          , "<ul>"
+          , t >>= \u -> concat
+                          [
+                            "<li>"
+                          , html u
+                          , "</li>"
+                          ]
+          , "</ul>"
+          ]
+        
diff --git a/src/Data/Aviation/Casr/Logbook/Video.hs b/src/Data/Aviation/Casr/Logbook/Video.hs
--- a/src/Data/Aviation/Casr/Logbook/Video.hs
+++ b/src/Data/Aviation/Casr/Logbook/Video.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.VideoType
 import Data.Maybe
 
@@ -24,6 +25,79 @@
           , ":** ["
           , t
           , "]("
+          , "https://www.youtube.com/watch?v="
           , uri
           , ")"
+          ]
+
+instance Html Video where
+  html (Video uri name vtype) =
+    let t = html vtype
+        n = fromMaybe ("Video (" ++ t ++ ")") name
+    in  concat
+          [
+            "<div>"
+          , case vtype of
+              YouTube ->
+                concat
+                  [
+                    "<a href=\"https://www.youtube.com/watch?v="
+                  , uri
+                  , "\">"
+                  , "<span class=\"videoname\">"
+                  , html n
+                  , "</span>"
+                  , "</a>"
+                  ]
+              Bambuser ->
+                concat
+                  [
+                    "<a href=\"https://bambuser.com/v/"
+                  , uri
+                  , "\">"
+                  , "<span class=\"videoname\">"
+                  , html n
+                  , "</span>"
+                  , "</a>"
+                  ]
+              Vimeo ->
+                concat
+                  [
+                    "<a href=\"https://vimeo.com/"
+                  , uri
+                  , "\">"
+                  , "<span class=\"videoname\">"
+                  , html n
+                  , "</span>"
+                  , "</a>"
+                   ]
+          , "</div>"
+          , "<p>"
+          , case vtype of
+              YouTube ->
+                concat
+                  [  
+                    "<iframe width=\"560\" height=\"315\" allowfullscreen=\"allowfullscreen\" src=\"http://www.youtube.com/embed/"
+                  , uri
+                  , "?autohide=1&amp;cc_load_policy=1&amp;color=white&amp;controls=1&amp;disablekb=0&amp;fs=1&amp;iv_load_policy=0&amp;loop=0&amp;modestbranding=1&amp;rel=0&amp;showinfo=0\">"
+                  , "</iframe>"                                  
+                  ]
+              Bambuser ->
+                concat
+                  [                 
+                    "<iframe width=\"560\" height=\"315\" allowfullscreen=\"allowfullscreen\" src=\"https://embed.bambuser.com/broadcast/"
+                  , uri
+                  , "?chat=1&amp;mute=0"
+                  , "\">"
+                  , "</iframe>"                   
+                  ]
+              Vimeo ->
+                concat
+                  [ 
+                    "<iframe width=\"560\" height=\"315\" allowfullscreen=\"allowfullscreen\" src=\"https://player.vimeo.com/video/"
+                  , uri
+                  , "\">"
+                  , "</iframe>"                                  
+                  ]
+            , "</p>"
           ]
diff --git a/src/Data/Aviation/Casr/Logbook/VideoType.hs b/src/Data/Aviation/Casr/Logbook/VideoType.hs
--- a/src/Data/Aviation/Casr/Logbook/VideoType.hs
+++ b/src/Data/Aviation/Casr/Logbook/VideoType.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 
 data VideoType =
   YouTube
@@ -16,4 +17,12 @@
   markdown Vimeo =
     "vimeo"
   markdown Bambuser =
+    "bambuser"
+
+instance Html VideoType where
+  html YouTube =
+    "youtube"
+  html Vimeo =
+    "vimeo"
+  html Bambuser =
     "bambuser"
diff --git a/src/Data/Aviation/Casr/Logbook/Videos.hs b/src/Data/Aviation/Casr/Logbook/Videos.hs
--- a/src/Data/Aviation/Casr/Logbook/Videos.hs
+++ b/src/Data/Aviation/Casr/Logbook/Videos.hs
@@ -3,6 +3,7 @@
 ) where
 
 import Data.Aviation.Casr.Logbook.Printer.Markdown
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.Video
 
 newtype Videos =
@@ -23,3 +24,25 @@
         ""
       _ ->
         "* **Videos**\n" ++ (v >>= \w -> "  * " ++ markdown w ++ "\n")
+
+instance Html Videos where
+  html (Videos v) =
+    case v of
+      [] ->
+        ""
+      _ ->
+        concat
+          [
+            "<span class=\"heading videoheading\">"
+          , "Video"
+          , "</span>"
+          , "<ul>"
+          , v >>= \u -> concat
+                          [
+                            "<li>"
+                          , html u
+                          , "</li>"
+                          ]
+          , "</ul>"
+          ]
+        
diff --git a/src/Data/Aviation/Casr/Logbook/Visualisation.hs b/src/Data/Aviation/Casr/Logbook/Visualisation.hs
--- a/src/Data/Aviation/Casr/Logbook/Visualisation.hs
+++ b/src/Data/Aviation/Casr/Logbook/Visualisation.hs
@@ -2,8 +2,10 @@
   Visualisation(..)
 ) where
 
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.Printer.Markdown
 import Data.Aviation.Casr.Logbook.VisualisationType
+import Data.Maybe
 
 data Visualisation =
   Visualisation
@@ -26,4 +28,29 @@
           , "]("
           , uri
           , ")"
+          ]
+
+instance Html Visualisation where
+  html (Visualisation uri name vtype) =
+    let t = html vtype
+        n = fromMaybe t name
+    in  concat
+          [
+            "<a href=\""
+          , uri
+          , "\">"
+          , "<span class=\"visualisationheading\">"
+          , html n
+          , "</span>"
+          , "</a>"
+          , "<p>"
+          , case vtype of
+              Doarama e ->
+                concat
+                  [
+                    "<iframe src=\"http://www.doarama.com/embed?k="
+                  , e
+                  , "\" width=\"560\" height=\"315\" allowfullscreen=\"allowfullscreen\">"
+                  , "</iframe>"
+                  ]
           ]
diff --git a/src/Data/Aviation/Casr/Logbook/VisualisationType.hs b/src/Data/Aviation/Casr/Logbook/VisualisationType.hs
--- a/src/Data/Aviation/Casr/Logbook/VisualisationType.hs
+++ b/src/Data/Aviation/Casr/Logbook/VisualisationType.hs
@@ -2,12 +2,18 @@
   VisualisationType(..)
 ) where
 
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.Printer.Markdown
 
 data VisualisationType =
   Doarama
+    String -- http://oembed.frdnspnzr.de/
   deriving (Eq, Ord, Show)
 
 instance Markdown VisualisationType where
-  markdown Doarama =
+  markdown (Doarama _) =
+    "doarama"
+
+instance Html VisualisationType where
+  html (Doarama _) =
     "doarama"
diff --git a/src/Data/Aviation/Casr/Logbook/Visualisations.hs b/src/Data/Aviation/Casr/Logbook/Visualisations.hs
--- a/src/Data/Aviation/Casr/Logbook/Visualisations.hs
+++ b/src/Data/Aviation/Casr/Logbook/Visualisations.hs
@@ -2,6 +2,7 @@
   Visualisations(..)
 ) where
 
+import Data.Aviation.Casr.Logbook.Printer.Html
 import Data.Aviation.Casr.Logbook.Printer.Markdown
 import Data.Aviation.Casr.Logbook.Visualisation
 
@@ -23,3 +24,25 @@
         ""
       _ ->
         "* **Visualisations**\n" ++ (v >>= \w -> "  * " ++ markdown w ++ "\n")
+
+instance Html Visualisations where
+  html (Visualisations v) =
+    case v of
+      [] ->
+        ""
+      _ ->
+        concat
+          [
+            "<span class=\"heading visualisationheading\">"
+          , "Visualisation"
+          , "</span>"
+          , "<ul>"
+          , v >>= \u -> concat
+                          [
+                            "<li>"
+                          , html u
+                          , "</li>"
+                          ]
+          , "</ul>"
+          ]
+        
