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.6.6
+version:            0.6.7
 license:            OtherLicense
 license-file:       LICENSE
 author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+0.6.7
+
+* Add solo approval
+
 0.6.6
 
 * Semigroup/Monoid for AircraftFlightMeta
diff --git a/src/Data/Aviation/Casr/Logbook/Html/Html.hs b/src/Data/Aviation/Casr/Logbook/Html/Html.hs
--- a/src/Data/Aviation/Casr/Logbook/Html/Html.hs
+++ b/src/Data/Aviation/Casr/Logbook/Html/Html.hs
@@ -51,6 +51,40 @@
 import Control.Lens
 import Control.Monad(when, (=<<), (>>=))
 import Data.Aviation.Casr.Logbook.Types
+    ( Location(Location),
+      Engine(..),
+      Time(Time),
+      TimeAmount(TimeAmount),
+      HasTime(daytime),
+      zerotimeamount,
+      Rating(Rating),
+      Aircraft(Aircraft),
+      FlightPoint(FlightPoint),
+      Aviator(Aviator),
+      HasAircraft(aircraftRegistration),
+      DayNight(DayNight),
+      HasFlightPoint(point, landingTime),
+      HasAviator(arn, surname, firstname),
+      FlightPath,
+      HasFlightPath(flightEnd, flightStart),
+      flightPathList,
+      Command(..),
+      SimulatorFlight(SimulatorFlight),
+      Briefing(Briefing),
+      Exam(Exam),
+      HasExam(examTime, examName),
+      HasSimulatorFlight(simulatortype, simulatorflightname),
+      HasBriefing(briefingTime, briefingName),
+      AircraftFlight(AircraftFlight),
+      HasAircraftFlight(flightpath, flightaircraft, aircraftflightname),
+      Entry(..),
+      Entries(..),
+      Logbook(Logbook),
+      HasLogbook(logbookaviator),
+      Instruction,
+      HasInstructionRating(instructionRating),
+      HasInstructionLesson(lesson, student, instructionLesson),
+      shortStringRating )
 import Data.Bool(not)
 import Data.Char(toUpper)
 import Data.Digit(DecDigit, charDecimal)
@@ -176,8 +210,8 @@
         do  span_ [class_ "key"] "Name: "
             span_ [class_ "value"] $
               do  fromString (toUpper <$> s)
-                  ", "
-                  fromString f
+                  when (not . null $ f) $
+                    toHtmlRaw (", " <> f)
 
 htmlAviatorARN ::
   [DecDigit]
@@ -279,6 +313,10 @@
       span_ [class_ "commandaviator"] $ htmlAviatorShort a
 htmlCommand _ (Dual a) =
   do  span_ [class_ "command dualunderinstruction"] "Dual Under-Instruction"
+      span_ [class_ "commandphrase"] " by "
+      span_ [class_ "commandaviator"] $ htmlAviatorShort a
+htmlCommand _ (ApprovedSolo a) =
+  do  span_ [class_ "command approvedsolo"] "Approved Solo"
       span_ [class_ "commandphrase"] " by "
       span_ [class_ "commandaviator"] $ htmlAviatorShort a
 
diff --git a/src/Data/Aviation/Casr/Logbook/Reports/FlightTimeReport.hs b/src/Data/Aviation/Casr/Logbook/Reports/FlightTimeReport.hs
--- a/src/Data/Aviation/Casr/Logbook/Reports/FlightTimeReport.hs
+++ b/src/Data/Aviation/Casr/Logbook/Reports/FlightTimeReport.hs
@@ -8,24 +8,28 @@
 ) where
 
 import Control.Category((.))
-import Control.Lens ( (^.), view, makeClassy )
+import Control.Lens ( preview, (^.), view, isn't, makeClassy )
 import Data.Aviation.Casr.Logbook.Types
-    ( Engine(Multi, Single),
-      TimeAmount,
+    ( TimeAmount,
+      AsEngine(_Multi, _Single),
       Aviator,
       HasAircraft(aircraftRegistration, aircraftType, aircraftEngine),
       HasDayNight(nightDayNight, dayDayNight),
       totalDayNight,
-      Command(InCommandInstructing, InCommand, Dual, ICUS),
-      HasAircraftFlight(instrumentflightTime, flightaircraft, command,
-                        daynight),
+      AsCommand(_InCommandInstructing, _InCommand, _Dual, _ICUS),
+      HasAircraftFlight(instrumentflightTime, daynight, flightaircraft,
+                        command),
       Entry(AircraftFlightEntry),
       Entries(Entries),
       Logbook(Logbook),
       HasInstructionRating(instructionRating),
+      AsInstructionRating(_GA3InstructionRating, _GA2InstructionRating,
+                          _GA1InstructionRating, _RASIInstructionRating,
+                          _RAInstructionRating),
       getUnderInstructionPic,
       isRAInstruction,
-      isGAInstruction )
+      isGAInstruction,
+      aeronauticalHours )
 import Data.Eq(Eq)
 import Data.Foldable(foldl')
 import Data.Int(Int)
@@ -82,8 +86,18 @@
       TimeAmount
   , _hoursGAInstructing ::
       TimeAmount
+  , _hoursGA1Instructing ::
+      TimeAmount
+  , _hoursGA2Instructing ::
+      TimeAmount
+  , _hoursGA3Instructing ::
+      TimeAmount
   , _hoursRAInstructing ::
       TimeAmount
+  , _hoursRAJuniorInstructing ::
+      TimeAmount
+  , _hoursRASeniorInstructing ::
+      TimeAmount
   , _hoursNight ::
       TimeAmount
   , _hoursNightICUS ::
@@ -101,7 +115,7 @@
 makeClassy ''FlightTimeReport
 
 instance Semigroup FlightTimeReport where
-  FlightTimeReport ft1 tl1 tli1 tld1 tlc1 tp1 rg1 se1 sei1 sed1 sec1 me1 mei1 med1 mec1 dy1 dyi1 dyd1 dyc1 ins1 insg1 insr1 nt1 nti1 ntd1 ntc1 wpc1 is1 <> FlightTimeReport ft2 tl2 tli2 tld2 tlc2 tp2 rg2 se2 sei2 sed2 sec2 me2 mei2 med2 mec2 dy2 dyi2 dyd2 dyc2 ins2 insg2 insr2 nt2 nti2 ntd2 ntc2 wpc2 is2 =
+  FlightTimeReport ft1 tl1 tli1 tld1 tlc1 tp1 rg1 se1 sei1 sed1 sec1 me1 mei1 med1 mec1 dy1 dyi1 dyd1 dyc1 ins1 insg1 insg1_1 insg1_2 insg1_3 insr1  insr1_j insr1_s nt1 nti1 ntd1 ntc1 wpc1 is1 <> FlightTimeReport ft2 tl2 tli2 tld2 tlc2 tp2 rg2 se2 sei2 sed2 sec2 me2 mei2 med2 mec2 dy2 dyi2 dyd2 dyc2 ins2 insg2 insg2_1 insg2_2 insg2_3 insr2 insr2_j insr2_s nt2 nti2 ntd2 ntc2 wpc2 is2 =
     FlightTimeReport
       (ft1 + ft2)
       (tl1 <> tl2)
@@ -124,7 +138,12 @@
       (dyc1 <> dyc2)
       (ins1 <> ins2)
       (insg1 <> insg2)
+      (insg1_1 <> insg2_1)
+      (insg1_2 <> insg2_2)
+      (insg1_3 <> insg2_3)
       (insr1 <> insr2)
+      (insr1_j <> insr2_j)
+      (insr1_s <> insr2_s)
       (nt1 <> nt2)
       (nti1 <> nti2)
       (ntd1 <> ntd2)
@@ -163,6 +182,11 @@
       mempty
       mempty
       mempty
+      mempty
+      mempty
+      mempty
+      mempty
+      mempty
   mappend =
     (<>)
 
@@ -170,81 +194,87 @@
   Entry a b c d
   -> FlightTimeReport
 singleFlightTimeReport (AircraftFlightEntry fl _) =
-  let hoursdaynight = totalDayNight (fl ^. daynight)
+  let hoursdaynight = totalDayNight (aeronauticalHours fl)
       icus x =
-        case fl ^. command of
-          ICUS _ ->
+        case preview (command . _ICUS) fl of
+          Just _ ->
             x
-          Dual _ ->
-            mempty
-          InCommand ->
-            mempty
-          InCommandInstructing _ ->
+          Nothing ->
             mempty
       dual x =
-        case fl ^. command of
-          ICUS _ ->
-            mempty
-          Dual _ ->
+        case preview (command . _Dual) fl of
+          Just _ ->
             x
-          InCommand ->
-            mempty
-          InCommandInstructing _ ->
+          Nothing ->
             mempty
       comd x =
-        case fl ^. command of
-          ICUS _ ->
-            mempty
-          Dual _ ->
-            mempty
-          InCommand ->
+        case preview (command . _InCommand) fl of
+          Just _ ->
             x
-          InCommandInstructing _ ->
+          Nothing ->
             mempty
       instr x =
-        case fl ^. command of
-          ICUS _ ->
-            mempty
-          Dual _ ->
-            mempty
-          InCommand ->
-            mempty
-          InCommandInstructing _ ->
+        case preview (command . _InCommandInstructing) fl of
+          Just _ ->
             x
+          Nothing ->
+            mempty
       instrRA x =
-        case fl ^. command of
-          ICUS _ ->
+        case preview (command . _InCommandInstructing) fl of
+          Just a ->
+            if isRAInstruction (view instructionRating a) then x else mempty
+          Nothing ->
             mempty
-          Dual _ ->
+      instrGA x =
+        case preview (command . _InCommandInstructing) fl of
+          Just a ->
+            if isGAInstruction (view instructionRating a) then x else mempty
+          Nothing ->
             mempty
-          InCommand ->
+      instrRAJunior x =
+        case preview (command . _InCommandInstructing) fl of
+          Just a ->
+            if isn't _RAInstructionRating (view instructionRating a) then mempty else x
+          Nothing ->
             mempty
-          InCommandInstructing a ->
-            if isRAInstruction (view instructionRating a) then x else mempty
-      instrGA x =
-        case fl ^. command of
-          ICUS _ ->
+      instrRASenior x =
+        case preview (command . _InCommandInstructing) fl of
+          Just a ->
+            if isn't _RASIInstructionRating (view instructionRating a) then mempty else x
+          Nothing ->
             mempty
-          Dual _ ->
+      instrGA1 x =
+        case preview (command . _InCommandInstructing) fl of
+          Just a ->
+            if isn't _GA1InstructionRating (view instructionRating a) then mempty else x
+          Nothing ->
             mempty
-          InCommand ->
+      instrGA2 x =
+        case preview (command . _InCommandInstructing) fl of
+          Just a ->
+            if isn't _GA2InstructionRating (view instructionRating a) then mempty else x
+          Nothing ->
             mempty
-          InCommandInstructing a ->
-            if isGAInstruction (view instructionRating a) then x else mempty
+      instrGA3 x =
+        case preview (command . _InCommandInstructing) fl of
+          Just a ->
+            if isn't _GA3InstructionRating (view instructionRating a) then mempty else x
+          Nothing ->
+            mempty
       hoursmap k =
         Map.singleton k (hoursdaynight, icus hoursdaynight, dual hoursdaynight, comd hoursdaynight)
       singleengine x =
-        case fl ^. flightaircraft . aircraftEngine of
-          Single ->
+        case preview (flightaircraft . aircraftEngine . _Single) fl of
+          Just _ ->
             x
-          Multi ->
+          Nothing ->
             mempty
       multiengine x =
-        case fl ^. flightaircraft . aircraftEngine of
-          Single ->
-            mempty
-          Multi ->
+        case preview (flightaircraft . aircraftEngine . _Multi) fl of
+          Just _ ->
             x
+          Nothing ->
+            mempty
       totalhoursday =
         fl ^. daynight . dayDayNight
       totalhoursnight =
@@ -277,7 +307,12 @@
         (comd hoursdaynight)
         (instr hoursdaynight)
         (instrGA hoursdaynight)
+        (instrGA1 hoursdaynight)
+        (instrGA2 hoursdaynight)
+        (instrGA3 hoursdaynight)
         (instrRA hoursdaynight)
+        (instrRAJunior hoursdaynight)
+        (instrRASenior hoursdaynight)
         totalhoursnight
         (icus totalhoursnight)
         (dual totalhoursnight)
diff --git a/src/Data/Aviation/Casr/Logbook/Reports/Html.hs b/src/Data/Aviation/Casr/Logbook/Reports/Html.hs
--- a/src/Data/Aviation/Casr/Logbook/Reports/Html.hs
+++ b/src/Data/Aviation/Casr/Logbook/Reports/Html.hs
@@ -29,23 +29,6 @@
   , htmlAviatorShort
   )
 import Data.Aviation.Casr.Logbook.Reports
-    ( TakeOffLanding90(TakeOffLanding90),
-      SimulatorTimeReport,
-      FlightTimeReport,
-      HasSimulatorTimeReport(hoursTotalSimulator,
-                             hoursInstrumentSimulator),
-      HasTakeOffLanding90(currency90, landing3, landing2, landing1,
-                          takeoff3, takeoff2, takeoff1),
-      HasFlightTimeReport(hoursInstrument, hoursWithPiC,
-                          hoursGAInstructing, hoursRAInstructing, hoursInstructing,
-                          hoursNightInCommand, hoursNightDual, hoursNightICUS, hoursNight,
-                          hoursDayInCommand, hoursDayDual, hoursDayICUS, hoursDay,
-                          hoursMultiEngineInCommand, hoursMultiEngineDual,
-                          hoursMultiEngineICUS, hoursMultiEngine, hoursSingleEngineInCommand,
-                          hoursSingleEngineDual, hoursSingleEngineICUS, hoursSingleEngine,
-                          hoursInAircraftRegistration, hoursInAircraftType,
-                          hoursTotalInCommand, hoursTotalDual, hoursTotalICUS, hoursTotal,
-                          flightsTotal) )
 import Data.Foldable(foldr)
 import Data.Function(flip, ($))
 import qualified Data.Map as Map(foldrWithKey)
@@ -195,6 +178,10 @@
                             do  span_ [class_ "key"] "in-command: "
                                 span_ [class_ "value"] .
                                   htmlTimeAmount $ r ^. hoursTotalInCommand
+                          li_ [] $
+                            do  span_ [class_ "key"] "providing instruction: "
+                                span_ [class_ "value"] .
+                                  htmlTimeAmount $ r ^. hoursInstructing
               li_ [] $
                 do  span_ [class_ "key"] "Hours in type: "
                     div_ [class_ "value"] .
@@ -304,18 +291,40 @@
                                 span_ [class_ "value"] .
                                   htmlTimeAmount $ r ^. hoursNightInCommand
               li_ [] $
-                do  span_ [class_ "key"] "Hours providing instruction: "
+                do  span_ [class_ "key"] "providing instruction: "
                     span_ [class_ "value"] .
                       htmlTimeAmount $ r ^. hoursInstructing
                     ul_ [] $
                       do  li_ [] $
-                            do  span_ [class_ "key"] " RA instruction: "
+                            do  span_ [class_ "key"] "providing RA instruction: "
                                 span_ [class_ "value"] .
                                   htmlTimeAmount $ r ^. hoursRAInstructing
+                                ul_ [] $
+                                  do  li_ [] $
+                                        do  span_ [class_ "key"] "providing RA Junior instruction: "
+                                            span_ [class_ "value"] .
+                                              htmlTimeAmount $ r ^. hoursRAJuniorInstructing
+                                      li_ [] $
+                                        do  span_ [class_ "key"] "providing RA Senior instruction: "
+                                            span_ [class_ "value"] .
+                                              htmlTimeAmount $ r ^. hoursRASeniorInstructing
                           li_ [] $
-                            do  span_ [class_ "key"] "GA instruction: "
+                            do  span_ [class_ "key"] "providing GA instruction: "
                                 span_ [class_ "value"] .
                                   htmlTimeAmount $ r ^. hoursGAInstructing
+                                ul_ [] $
+                                  do  li_ [] $
+                                        do  span_ [class_ "key"] "providing GA 1 instruction: "
+                                            span_ [class_ "value"] .
+                                              htmlTimeAmount $ r ^. hoursGA1Instructing
+                                      li_ [] $
+                                        do  span_ [class_ "key"] "providing GA 2 instruction: "
+                                            span_ [class_ "value"] .
+                                              htmlTimeAmount $ r ^. hoursGA2Instructing
+                                      li_ [] $
+                                        do  span_ [class_ "key"] "providing GA 3 instruction: "
+                                            span_ [class_ "value"] .
+                                              htmlTimeAmount $ r ^. hoursGA3Instructing
               li_ [] $
                 do  span_ [class_ "key"] "Hours with PiC: "
                     div_ [class_ "value"] .
diff --git a/src/Data/Aviation/Casr/Logbook/Types/AircraftFlight.hs b/src/Data/Aviation/Casr/Logbook/Types/AircraftFlight.hs
--- a/src/Data/Aviation/Casr/Logbook/Types/AircraftFlight.hs
+++ b/src/Data/Aviation/Casr/Logbook/Types/AircraftFlight.hs
@@ -12,17 +12,22 @@
 , noif_commandonlyflight
 , instructionflight
 , noif_instructionflight
+, aeronauticalHours
 ) where
 
 import Control.Category((.))
-import Control.Lens(makeClassy)
+import Control.Lens ( view, makeClassy )
 import Data.Aviation.Casr.Logbook.Types.Aircraft(Aircraft, HasAircraft(aircraft))
-import Data.Aviation.Casr.Logbook.Types.Command ( Command(..) )
-import Data.Aviation.Casr.Logbook.Types.DayNight(DayNight, HasDayNight(dayNight))
+import Data.Aviation.Casr.Logbook.Types.Command
+    ( Command(InCommandInstructing, InCommand, Dual, ICUS),
+      isAeronauticalHours )
+import Data.Aviation.Casr.Logbook.Types.DayNight
+    ( DayNight(DayNight), HasDayNight(dayNight) )
 import Data.Aviation.Casr.Logbook.Types.FlightPath(FlightPath, HasFlightPath(flightPath))
 import Data.Aviation.Casr.Logbook.Types.Instruction ( Instruction )
 import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
-import Data.Aviation.Casr.Logbook.Types.TimeAmount(TimeAmount, zerotimeamount)
+import Data.Aviation.Casr.Logbook.Types.TimeAmount
+    ( TimeAmount, zerotimeamount )
 import Data.Eq(Eq)
 import Data.Ord(Ord)
 import Data.String(String)
@@ -186,3 +191,13 @@
     p
     []
     zerotimeamount
+
+aeronauticalHours ::
+  AircraftFlight
+  -> DayNight
+aeronauticalHours fl =
+  if isAeronauticalHours (view command fl)
+    then
+      view dayNight fl
+    else
+      DayNight zerotimeamount zerotimeamount
diff --git a/src/Data/Aviation/Casr/Logbook/Types/Command.hs b/src/Data/Aviation/Casr/Logbook/Types/Command.hs
--- a/src/Data/Aviation/Casr/Logbook/Types/Command.hs
+++ b/src/Data/Aviation/Casr/Logbook/Types/Command.hs
@@ -5,11 +5,13 @@
   Command(..)
 , AsCommand(..)
 , getUnderInstructionPic
+, isAeronauticalHours
 ) where
 
 import Control.Lens(makeClassyPrisms)
 import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
 import Data.Aviation.Casr.Logbook.Types.Instruction ( Instruction )
+import Data.Bool ( Bool(..) )
 import Data.Eq(Eq)
 import Data.Maybe(Maybe(Just, Nothing))
 import Data.Ord(Ord)
@@ -20,6 +22,7 @@
   | Dual Aviator
   | InCommand
   | InCommandInstructing Instruction
+  | ApprovedSolo Aviator
   deriving (Eq, Ord, Show)
 
 makeClassyPrisms ''Command
@@ -35,3 +38,19 @@
   Nothing
 getUnderInstructionPic (InCommandInstructing _) =
   Nothing
+getUnderInstructionPic (ApprovedSolo _) =
+  Nothing
+
+isAeronauticalHours ::
+  Command
+  -> Bool
+isAeronauticalHours (ICUS _) =
+  True
+isAeronauticalHours (Dual _) =
+  True
+isAeronauticalHours InCommand =
+  True
+isAeronauticalHours (InCommandInstructing _) =
+  True
+isAeronauticalHours (ApprovedSolo _) =
+  False
