diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,32 @@
 For the latest version of this document, please see
 [https://github.com/DougBurke/hvega/blob/master/hvega/CHANGELOG.md](https://github.com/DougBurke/hvega/blob/master/hvega/CHANGELOG.md).
 
+## 0.10.0.0
+
+The Vega-Lite tests are now validated against version 4.13 of the
+Vega-Lite schema.
+
+### Breaking Changes
+
+The handling of time units (for both `TimeUnit` and `ScaleNice`) has
+changed. The contents of these types have been split into two parts: a
+"time unit" and the options that get applied to it (rather than having
+a single type that combines both functions). This does mean that
+setting time units has now become __more verbose__, but it has stopped
+some problem cases (and, in the case of `ScaleNice`, fixed a logical
+error on my part). The new time units are `BaseTimeUnit` and
+`NTimeUnit`, and contain the "basic" constructors for the time
+units. The `TimeUnit` and `ScaleNice` constructors now reference these
+types rather than include them in their definition, so that `PTimeUnit
+Month` has been changed to `PTimeUnit (TU Month)` and `SNice NMinute`
+has changed to `SNice (NTU NMinute)`.
+
+The `BaseTimeUnit' type has seen a number of additions: the `Week` and
+`DayOfYear` time units added in Vega-Lite 4.13.0, along with the
+associated composite units (such as `YearWeek`), and a number of
+composite types that were missing (such as `MonthDateHours`).  The
+`DateTime` type has added the `DTWeek` and `DTDayOfYear` constructors.
+
 ## 0.9.1.0
 
 The tutorial has been expanded to add a section describing the
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
 # hvega
 
-[![vega-lite version](https://img.shields.io/badge/Vega--Lite-v4.12-purple.svg)](https://vega.github.io/vega-lite/)
+[![vega-lite version](https://img.shields.io/badge/Vega--Lite-v4.13-purple.svg)](https://vega.github.io/vega-lite/)
 
 Create [Vega-Lite](https://vega.github.io/vega-lite/) visualizations in
-Haskell. It targets version 4.12 of the Vega-Lite specification. Note that
+Haskell. It targets version 4.13 of the Vega-Lite specification. Note that
 the module does not include a viewer for these visualizations (which are
 JSON files), but does provide several helper functions, such as
 [toHtmlFile](https://hackage.haskell.org/package/hvega/docs/Graphics-Vega-VegaLite.html#v:toHtmlFile),
diff --git a/hvega.cabal b/hvega.cabal
--- a/hvega.cabal
+++ b/hvega.cabal
@@ -1,5 +1,5 @@
 name:                hvega
-version:             0.9.1.0
+version:             0.10.0.0
 synopsis:            Create Vega-Lite visualizations (version 4) in Haskell.
 description:         This is based on the elm-vegalite package
                      (<http://package.elm-lang.org/packages/gicentre/elm-vegalite/latest>)
diff --git a/hvega.nix b/hvega.nix
--- a/hvega.nix
+++ b/hvega.nix
@@ -4,7 +4,7 @@
 }:
 mkDerivation {
   pname = "hvega";
-  version = "0.9.1.0";
+  version = "0.10.0.0";
   src = ./.;
   configureFlags = [ "-ftools" ];
   isLibrary = true;
diff --git a/src/Graphics/Vega/VegaLite.hs b/src/Graphics/Vega/VegaLite.hs
--- a/src/Graphics/Vega/VegaLite.hs
+++ b/src/Graphics/Vega/VegaLite.hs
@@ -14,7 +14,7 @@
 it has been updated to match later versions.  This module allows users
 to create a Vega-Lite specification, targeting __version 4__ of the
 <https://vega.github.io/schema/vega-lite/v4.json JSON schema>.
-Version 0.9 of @hvega@ supports version 4.12 of the Vega-Lite specification.
+Version 0.10 of @hvega@ supports version 4.13 of the Vega-Lite specification.
 
 Although this is based on the Elm module, there are differences, such
 as using type constructors rather than functions for many properties -
@@ -666,6 +666,7 @@
        , VL.ScaleDomain(..)
        , VL.ScaleRange(..)
        , VL.ScaleNice(..)
+       , VL.NTimeUnit(..)
 
          -- *** Color scaling
          --
@@ -850,11 +851,16 @@
        , VL.MonthName(..)
        , VL.DayName(..)
        , VL.TimeUnit(..)
+       , VL.BaseTimeUnit(..)
 
          -- * Update notes
          --
          -- $update
 
+         -- ** Version 0.10
+         --
+         -- $update01000
+
          -- ** Version 0.9
          --
          -- $update0910
@@ -1256,6 +1262,35 @@
 -- $update
 -- The following section describes how to update code that used
 -- an older version of @hvega@.
+
+-- $update01000
+-- The @0.10.0.0@ release updates @hvega@ to support version 4.13 of
+-- the Vega-Lite schema.
+--
+-- __Breaking Changes__
+--
+-- The handling of time units (for both 'VL.TimeUnit' and 'VL.ScaleNice') has
+-- changed. The contents of these types have been split into two parts:
+-- a \"time unit\" and the options that get applied to it (rather than having
+-- a single type that combines both functions). This does mean that setting
+-- time units has now become __more verbose__, but it has stopped some
+-- problem cases (and, in the case of 'VL.ScaleNice', fixed a logical error
+-- on my part). The new time units are 'VL.BaseTimeUnit' and 'VL.NTimeUnit',
+-- and contain the \"basic\" constructors for the time units. The
+-- 'VL.TimeUnit' and 'VL.ScaleNice' constructors now reference these
+-- types rather than include them in their definition, so that
+-- @PTimeUnit Month@ has been changed to
+-- @'VL.PTimeUnit' ('VL.TU' 'VL.Month')@
+-- and
+-- @SNice NMinute@ has changed to
+-- @'VL.SNice' ('VL.NTU' 'VL.NMinute')@.
+--
+-- The 'VL.BaseTimeUnit' type has seen a number of additions: the 'VL.Week' and
+-- 'VL.DayOfYear' time units added in Vega-Lite 4.13.0, along with the
+-- associated composite units (such as 'VL.YearWeek'), and a number of
+-- composite types that were missing (such as 'VL.MonthDateHours').
+-- The 'VL.DateTime' type has added the 'VL.DTWeek' and 'VL.DTDayOfYear'
+-- constructors.
 
 -- $update0910
 -- The tutorial has been expanded to add a section with pie charts.
diff --git a/src/Graphics/Vega/VegaLite/Core.hs b/src/Graphics/Vega/VegaLite/Core.hs
--- a/src/Graphics/Vega/VegaLite/Core.hs
+++ b/src/Graphics/Vega/VegaLite/Core.hs
@@ -1231,7 +1231,7 @@
       --   @
       --   'PAxis' [ 'AxDataCondition'
       --             ('FEqual' "value" ('Graphics.Vega.VegaLite.DateTime' ['Grahics.Vega.VegaLite.DTMonth' 'Graphics.Vega.VegaLite.Jan', 'Graphics.Vega.VegaLite.DTDate' 1])
-      --             & 'FilterOpTrans' ('MTimeUnit' 'Graphics.Vega.VegaLite.MonthDate'))
+      --             & 'FilterOpTrans' ('MTimeUnit' ('Graphics.Vega.VegaLite.TU' 'Graphics.Vega.VegaLite.MonthDate')))
       --             ('CAxGridDash' [] [2, 2])
       --         ]
       --   @
@@ -1882,7 +1882,7 @@
       --
       --   @
       --   'filter' ('FRange' "date" ('NumberRange' 2010 2017)
-      --           & 'FilterOpTrans' ('MTimeUnit' 'Graphics.Vega.VegaLite.Year')
+      --           & 'FilterOpTrans' ('MTimeUnit' ('Graphics.Vega.VegaLite.TU' 'Graphics.Vega.VegaLite.Year'))
       --           & 'FCompose'
       --           )
       --   @
@@ -4928,17 +4928,20 @@
 grouping by month:
 
 @
-trans = 'transform' . 'timeUnitAs' 'Graphics.Vega.VegaLite.Month' \"date\" \"monthly\"
+trans = 'transform' . 'timeUnitAs' ('Graphics.Vega.VegaLite.TU' 'Graphics.Vega.VegaLite.Month') \"date\" \"monthly\"
 
 enc = 'encoding'
-        . 'position' 'Graphics.Vega.VegaLite.X' [ 'PName' \"date\", 'PmType' 'Graphics.Vega.VegaLite.Temporal', 'PTimeUnit' 'Graphics.Vega.VegaLite.Day' ]
+        . 'position' 'Graphics.Vega.VegaLite.X' [ 'PName' \"date\", 'PmType' 'Graphics.Vega.VegaLite.Temporal', 'PTimeUnit' ('Graphics.Vega.VegaLite.TU' 'Graphics.Vega.VegaLite.Day') ]
         . 'position' 'Graphics.Vega.VegaLite.Y' [ 'PAggregate' 'Graphics.Vega.VegaLite.Sum', 'PmType' 'Graphics.Vega.VegaLite.Quantitative' ]
         . 'detail' [ 'DName' \"monthly\", 'DmType' 'Graphics.Vega.VegaLite.Temporal' ]
 @
+
 -}
 timeUnitAs ::
   TimeUnit
   -- ^ The width of each bin.
+  --
+  --   Prior to @0.10.0.0@ this was sent a single time unit.
   -> FieldName
   -- ^ The field to bin.
   -> FieldName
diff --git a/src/Graphics/Vega/VegaLite/Scale.hs b/src/Graphics/Vega/VegaLite/Scale.hs
--- a/src/Graphics/Vega/VegaLite/Scale.hs
+++ b/src/Graphics/Vega/VegaLite/Scale.hs
@@ -17,6 +17,7 @@
        ( ScaleDomain(..)
        , ScaleRange(..)
        , ScaleNice(..)
+       , NTimeUnit(..)
 
          -- not for external export
        , scaleDomainSpec
@@ -40,9 +41,7 @@
   )
 import Graphics.Vega.VegaLite.Time
   ( DateTime
-  , TimeUnit
   , dateTimeProperty
-  , timeUnitSpec
   )
 
 
@@ -112,43 +111,63 @@
 
 Describes the way a scale can be rounded to \"nice\" numbers. For full details see the
 <https://vega.github.io/vega-lite/docs/scale.html#continuous Vega-Lite documentation>.
+
+Prior to version @0.10.0.0@ the time units were included in the constructors
+for @ScaleNice@.
+
 -}
 data ScaleNice
-    = NMillisecond
-      -- ^ Nice time intervals that try to align with rounded milliseconds.
-    | NSecond
-      -- ^ Nice time intervals that try to align with whole or rounded seconds.
-    | NMinute
-      -- ^ Nice time intervals that try to align with whole or rounded minutes.
-    | NHour
-      -- ^ Nice time intervals that try to align with whole or rounded hours.
-    | NDay
-      -- ^ Nice time intervals that try to align with whole or rounded days.
-    | NWeek
+  = NTU NTimeUnit
+    -- ^ Time range.
+  | NInterval NTimeUnit Int
+    -- ^ \"Nice\" temporal interval values when scaling.
+  | IsNice Bool
+    -- ^ Enable or disable nice scaling.
+  | NTickCount Int
+    -- ^ Desired number of tick marks in a \"nice\" scaling.
+
+{-|
+
+The time intervals that can be rounded to \"nice\" numbers.
+
+Prior to @0.10.0.0@ these were part of 'ScaleNice'.
+
+-}
+
+data NTimeUnit
+  = NMillisecond
+    -- ^ Nice time intervals that try to align with rounded milliseconds.
+  | NSecond
+    -- ^ Nice time intervals that try to align with whole or rounded seconds.
+  | NMinute
+    -- ^ Nice time intervals that try to align with whole or rounded minutes.
+  | NHour
+    -- ^ Nice time intervals that try to align with whole or rounded hours.
+  | NDay
+    -- ^ Nice time intervals that try to align with whole or rounded days.
+  | NWeek
     -- ^ Nice time intervals that try to align with whole or rounded weeks.
-    | NMonth
-      -- ^ Nice time intervals that try to align with whole or rounded months.
-    | NYear
-      -- ^ Nice time intervals that try to align with whole or rounded years.
-    | NInterval TimeUnit Int
-      -- ^ \"Nice\" temporal interval values when scaling.
-    | IsNice Bool
-      -- ^ Enable or disable nice scaling.
-    | NTickCount Int
-      -- ^ Desired number of tick marks in a \"nice\" scaling.
+  | NMonth
+    -- ^ Nice time intervals that try to align with whole or rounded months.
+  | NYear
+    -- ^ Nice time intervals that try to align with whole or rounded years.
 
 
+nTimeUnitSpec :: NTimeUnit -> VLSpec
+nTimeUnitSpec NMillisecond = fromT "millisecond"
+nTimeUnitSpec NSecond = fromT "second"
+nTimeUnitSpec NMinute = fromT "minute"
+nTimeUnitSpec NHour = fromT "hour"
+nTimeUnitSpec NDay = fromT "day"
+nTimeUnitSpec NWeek = fromT "week"
+nTimeUnitSpec NMonth = fromT "month"
+nTimeUnitSpec NYear = fromT "year"
+
+
 scaleNiceSpec :: ScaleNice -> VLSpec
-scaleNiceSpec NMillisecond = fromT "millisecond"
-scaleNiceSpec NSecond = fromT "second"
-scaleNiceSpec NMinute = fromT "minute"
-scaleNiceSpec NHour = fromT "hour"
-scaleNiceSpec NDay = fromT "day"
-scaleNiceSpec NWeek = fromT "week"
-scaleNiceSpec NMonth = fromT "month"
-scaleNiceSpec NYear = fromT "year"
+scaleNiceSpec (NTU tu) = nTimeUnitSpec tu
 scaleNiceSpec (NInterval tu step) =
-  object ["interval" .= timeUnitSpec tu, "step" .= step]
+  object ["interval" .= nTimeUnitSpec tu, "step" .= step]
 scaleNiceSpec (IsNice b) = toJSON b
 scaleNiceSpec (NTickCount n) = toJSON n
 
diff --git a/src/Graphics/Vega/VegaLite/Time.hs b/src/Graphics/Vega/VegaLite/Time.hs
--- a/src/Graphics/Vega/VegaLite/Time.hs
+++ b/src/Graphics/Vega/VegaLite/Time.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 {-|
@@ -18,6 +19,7 @@
        , MonthName(..)
        , DayName(..)
        , TimeUnit(..)
+       , BaseTimeUnit(..)
 
        -- not for external export
        , dateTimeProperty
@@ -27,8 +29,12 @@
 
 import qualified Data.Text as T
 
-import Data.Aeson ((.=), object)
+import Data.Aeson ((.=), object, toJSON)
 
+#if !(MIN_VERSION_base(4, 12, 0))
+import Data.Monoid ((<>))
+#endif
+
 -- added in base 4.8.0.0 / ghc 7.10.1
 import Numeric.Natural (Natural)
 
@@ -58,13 +64,23 @@
       -- ^ The month number (1 to 12, inclusive).
       --
       --    @since 0.5.0.0
-    | DTDate Int
-      -- ^ Day of the month (1 to 31, inclusive).
+    | DTWeek Int
+      -- ^ The week number. Each week begins on Sunday, which means that days
+      --   before the first Sunday of the year are considered to be in week 0,
+      --   as the first Sunday of the year is the start of week 1.
+      --
+      --   @since 0.10.0.0
     | DTDay DayName
     | DTDayNum Int
       -- ^ The day number (1 represents Monday, 7 is Sunday).
       --
-      --    @since 0.5.0.0
+      --   @since 0.5.0.0
+    | DTDayOfYear Int
+      -- ^ The day of the year (1 to 366).
+      --
+      --   @since 0.10.0.0
+    | DTDate Int
+      -- ^ Day of the month (1 to 31, inclusive).
     | DTHours Int
       -- ^ Hour of the day, where 0 is midnight, 1 is 1am, and
       --   23 is 11pm.
@@ -105,18 +121,7 @@
     | Dec
 
 
-{-|
 
-Describes a unit of time. Useful for encoding and transformations. See the
-<https://vega.github.io/vega-lite/docs/timeunit.html Vega-Lite documentation>
-for further details.
-
-@
-'Graphics.Vega.VegaLite.encoding'
-    . 'Graphics.Vega.VegaLite.position' 'Graphics.Vega.VegaLite.X' [ 'Graphics.Vega.VegaLite.PName' "date", 'Graphics.Vega.VegaLite.PmType' 'Graphics.Vega.VegaLite.Temporal', 'Graphics.Vega.VegaLite.PTimeUnit' ('Utc' 'YearMonthDateHours') ]
-@
--}
-
 -- Vega-Lite 4.4.0 has
 --   LocalMultiTimeUnit which is yearquarter, yearquartermonth, ,secondsmilliseconds
 --   LocalSingleTimeUnit year, quarter, ..., milliseconds
@@ -136,16 +141,93 @@
 --   unit    - this is TimeUnit
 --   utc     - boolean
 --
--- So, could be something like "TU <time unit type> [options]"
--- where an empty array means it's a "TimeUnit", and the options are from
--- TimeUnitParams (apart from the unit field). Unfortunately this doesn't
--- capture the use case of supplying "maxbins" only (it may be that "step"
--- can also be used without any other value).
---
 
+{-|
+
+Describes a unit of time. Useful for encoding and transformations. See the
+<https://vega.github.io/vega-lite/docs/timeunit.html Vega-Lite documentation>
+for further details.
+
+@
+'Graphics.Vega.VegaLite.encoding'
+    . 'Graphics.Vega.VegaLite.position' 'Graphics.Vega.VegaLite.X' [ 'Graphics.Vega.VegaLite.PName' "date", 'Graphics.Vega.VegaLite.PmType' 'Graphics.Vega.VegaLite.Temporal', 'Graphics.Vega.VegaLite.PTimeUnit' ('Utc' 'YearMonthDateHours') ]
+@
+
+Prior to version @0.10.0.0@ the field was a combination of what is now
+'BaseTimeUnit' and the \"option\" fields (e.g. encode as UTC or the
+maximum nuber of bins).
+
+-}
+
+
 data TimeUnit
+  = TU BaseTimeUnit
+    -- ^ Encode a time as local time.
+  | Utc BaseTimeUnit
+    -- ^ Encode a time as UTC (coordinated universal time, independent of local time
+    --   zones or daylight saving).
+  | TUMaxBins Natural
+    -- ^ The maximum number of bins to use when discretising time values.
+    --   This can be useful as an algternative to explicitly providing the
+    --   time unit to bin by, as it will be inferred from the temporal
+    --   extent and the number of bins. As an example, @[TUMaxBins 366]@
+    --   will bin by day when applied to a dataset of hourly readings
+    --   for a full year.
+    --
+    --   @since 0.6.0.0
+  | TUStep Double BaseTimeUnit
+    -- ^ The number of steps between time-unit bins, in terms of the
+    --   least-significant unit provided. So @TUStep 14 YearMonthDate@
+    --   will bin temporal data into bi-weekly groups.
+    --
+    --   @since 0.6.0.0
+  | UtcStep Double BaseTimeUnit
+    -- ^ The number of steps between time-unit bins, in terms of the
+    --   least-significant unit provided for UTC times.
+    --   So @UtcStep 14 YearMonthDate]@
+    --   will bin temporal data into bi-weekly groups.
+    --
+    --   @since 0.10.0.0
+
+
+{-|
+
+Define the time unit, either as a base unit - such as 'Hours' - or
+as a composite type, for example 'WeeksDayHours'.
+
+@since 0.10.0.0
+
+-}
+
+data BaseTimeUnit
     = Year
       -- ^ Year.
+    | Quarter
+      -- ^ Quarter of the year.
+    | Month
+      -- ^ Month of the year.
+    | Week
+      -- ^ Sunday-based week number. Days before the first Sunday of the year
+      --   are considered to be in week 0, and the first Sunday of the year
+      --   is the start of week 1,
+      --
+      --   @since 0.10.0.0
+    | Date
+      -- ^ Day of the month (1 to 31).
+    | Day
+      -- ^ Day of the week.
+    | DayOfYear
+      -- ^ Day of the year (starting at 1).
+      --
+      --   @since 0.10.0.0
+    | Hours
+      -- ^ Hour of the day.
+    | Minutes
+      -- ^ Minutes of the hour.
+    | Seconds
+      -- ^ Seconds of the minute.
+    | Milliseconds
+      -- ^ Milliseconds.
     | YearQuarter
       -- ^ Year and quarter.
     | YearQuarterMonth
@@ -160,61 +242,137 @@
       -- ^ Year, month, day of month, hour of day, and minutes.
     | YearMonthDateHoursMinutesSeconds
       -- ^ Year, month, day of month, hour of day, minutes, and seconds.
-    | Quarter
-      -- ^ Quarter of the year.
+    | YearWeek
+      -- ^ Year and week.
+      --
+      --   @since 0.10.0
+    | YearWeekDay
+      -- ^ Year, week, and day.
+      --
+      --   @since 0.10.0
+    | YearWeekDayHours
+      -- ^ Year, week, day, and hour of day.
+      --
+      --   @since 0.10.0
+    | YearWeekDayHoursMinutes
+      -- ^ Year, week, day, hour of day, and minutes.
+      --
+      --   @since 0.10.0
+    | YearWeekDayHoursMinutesSeconds
+      -- ^ Year, week, day, hour of day, minutes, and seconds.
+      --
+      --   @since 0.10.0
+    | YearDayOfYear
+      -- ^ Year and day of year.
+      --
+      --   @since 0.10.0
     | QuarterMonth
       -- ^ Quarter of the year and month.
-    | Month
-      -- ^ Month of the year.
     | MonthDate
       -- ^ Month of the year and day of the month.
-    | Date
-      -- ^ Day of the month (1 to 31).
-    | Day
-      -- ^ Day of the week.
-    | Hours
-      -- ^ Hour of the day.
+    | MonthDateHours
+      -- ^ Month, day of the month, and hours.
+      --
+      --   @since 0.10.0.0
+    | MonthDateHoursMinutes
+      -- ^ Month, day of the month, hours, and minutes.
+      --
+      --   @since 0.10.0.0
+    | MonthDateHoursMinutesSeconds
+      -- ^ Month, day of the month, hours, minutes, and seconds.
+      --
+      --   @since 0.10.0.0
+    | WeekDay
+      -- ^ Week and day of month.
+      --
+      --   @since 0.10.0.0
+    | WeeksDayHours
+      -- ^ Week, day of month, and hours.
+      --
+      --   @since 0.10.0.0
+    | WeeksDayHoursMinutes
+      -- ^ Week, day of month, hours, and minutes.
+      --
+      --   @since 0.10.0.0
+    | WeeksDayHoursMinutesSeconds
+      -- ^ Week, day of month, hours, minutes, and seconds.
+      --
+      --   @since 0.10.0.0
+    | DayHours
+      -- ^ Day of the week and hours.
+      --
+      --   @since 0.10.0.0
+    | DayHoursMinutes
+      -- ^ Day of the week, hours, and minutes.
+      --
+      --   @since 0.10.0.0
+    | DayHoursMinutesSeconds
+      -- ^ Day of the week, hours, minutes, and seconds.
+      --
+      --   @since 0.10.0.0
     | HoursMinutes
       -- ^ Hour of the day and minutes.
     | HoursMinutesSeconds
       -- ^ Hour of the day, minutes, and seconds.
-    | Minutes
-      -- ^ Minutes of the hour.
     | MinutesSeconds
       -- ^ Minutes of the hour and seconds.
-    | Seconds
-      -- ^ Seconds of the minute.
     | SecondsMilliseconds
       -- ^ Seconds of the minute and milliseconds.
-    | Milliseconds
-      -- ^ Milliseconds.
-    | Utc TimeUnit
-      -- ^ Encode a time as UTC (coordinated universal time, independent of local time
-      --   zones or daylight saving).
-    | TUMaxBins Natural
-      -- ^ The maximum number of bins to use when discretising time values.
-      --   This can be useful as an algternative to explicitly providing the
-      --   time unit to bin by, as it will be inferred from the temporal
-      --   extent and the number of bins. As an example, @TUMaxBins 366@
-      --   will bin by day when applied to a dataset of hourly readings
-      --   for a full year.
-      --
-      --   @since 0.6.0.0
-    | TUStep Double TimeUnit
-      -- ^ The number of steps between time-unit bins, in terms of the
-      --   least-significant unit provided. So @TUStep 14 YearMonthDate@
-      --   wull bin temporal data into bi-weekly groups.
-      --
-      --   @since 0.6.0.0
 
 
+baseTimeUnitLabel :: BaseTimeUnit -> T.Text
+baseTimeUnitLabel Year = "year"
+baseTimeUnitLabel Quarter = "quarter"
+baseTimeUnitLabel Month = "month"
+baseTimeUnitLabel Week = "week"
+baseTimeUnitLabel Date = "date"
+baseTimeUnitLabel Day = "day"
+baseTimeUnitLabel DayOfYear = "dayofyear"
+baseTimeUnitLabel Hours = "hours"
+baseTimeUnitLabel Minutes = "minutes"
+baseTimeUnitLabel Seconds = "seconds"
+baseTimeUnitLabel Milliseconds = "milliseconds"
+
+baseTimeUnitLabel YearQuarter = "yearquarter"
+baseTimeUnitLabel YearQuarterMonth = "yearquartermonth"
+baseTimeUnitLabel YearMonth = "yearmonth"
+baseTimeUnitLabel YearMonthDate = "yearmonthdate"
+baseTimeUnitLabel YearMonthDateHours = "yearmonthdatehours"
+baseTimeUnitLabel YearMonthDateHoursMinutes = "yearmonthdatehoursminutes"
+baseTimeUnitLabel YearMonthDateHoursMinutesSeconds = "yearmonthdatehoursminutesseconds"
+baseTimeUnitLabel YearWeek = "yearweek"
+baseTimeUnitLabel YearWeekDay = "yearweekday"
+baseTimeUnitLabel YearWeekDayHours = "yearweekdayhours"
+baseTimeUnitLabel YearWeekDayHoursMinutes = "yearweekdayhoursminutes"
+baseTimeUnitLabel YearWeekDayHoursMinutesSeconds = "yearweekdayhoursminutesseconds"
+baseTimeUnitLabel YearDayOfYear = "yeardayofyear"
+baseTimeUnitLabel QuarterMonth = "quartermonth"
+baseTimeUnitLabel MonthDate = "monthdate"
+baseTimeUnitLabel MonthDateHours = "monthdatehours"
+baseTimeUnitLabel MonthDateHoursMinutes = "monthdatehoursminutes"
+baseTimeUnitLabel MonthDateHoursMinutesSeconds = "monthdatehoursminutesseconds"
+baseTimeUnitLabel WeekDay = "weekday"
+baseTimeUnitLabel WeeksDayHours = "weeksdayhours"
+baseTimeUnitLabel WeeksDayHoursMinutes = "weeksdayhoursminutes"
+baseTimeUnitLabel WeeksDayHoursMinutesSeconds = "weeksdayhoursminutesseconds"
+baseTimeUnitLabel DayHours = "dayhours"
+baseTimeUnitLabel DayHoursMinutes = "dayhoursminutes"
+baseTimeUnitLabel DayHoursMinutesSeconds = "dayhoursminutesseconds"
+baseTimeUnitLabel HoursMinutes = "hoursminutes"
+baseTimeUnitLabel HoursMinutesSeconds = "hoursminutesseconds"
+baseTimeUnitLabel MinutesSeconds = "minutesseconds"
+baseTimeUnitLabel SecondsMilliseconds = "secondsmilliseconds"
+
+
 dateTimeProperty :: DateTime -> LabelledSpec
 dateTimeProperty (DTYear y) = "year" .= y
 dateTimeProperty (DTQuarter q) = "quarter" .= q
 dateTimeProperty (DTMonth mon) = "month" .= monthNameLabel mon
 dateTimeProperty (DTMonthNum n) = "month" .= n
+dateTimeProperty (DTWeek w) = "week" .= w
 dateTimeProperty (DTDate dt) = "date" .= dt
 dateTimeProperty (DTDay day) = "day" .= dayLabel day
+dateTimeProperty (DTDayOfYear n) = "dayofyear" .= n
 dateTimeProperty (DTDayNum n) = "day" .= n
 dateTimeProperty (DTHours h) = "hours" .= h
 dateTimeProperty (DTMinutes m) = "minutes" .= m
@@ -247,51 +405,12 @@
 monthNameLabel Dec = "Dec"
 
 
--- Assume there's no "embedded" values the time unit used by
--- the "grouping" cases, such as Utc, are "singular" and not
--- themselves compound.
---
--- Ideally this would know when it could just return the label
--- and not a labelled spec, but for now leave it as is.
---
-timeHelper :: T.Text -> [LabelledSpec]
-timeHelper unit = ["unit" .= unit]
-
-timeUnitProperties :: TimeUnit -> [LabelledSpec]
-timeUnitProperties Year = timeHelper "year"
-timeUnitProperties YearQuarter = timeHelper "yearquarter"
-timeUnitProperties YearQuarterMonth = timeHelper "yearquartermonth"
-timeUnitProperties YearMonth = timeHelper "yearmonth"
-timeUnitProperties YearMonthDate = timeHelper "yearmonthdate"
-timeUnitProperties YearMonthDateHours = timeHelper "yearmonthdatehours"
-timeUnitProperties YearMonthDateHoursMinutes = timeHelper "yearmonthdatehoursminutes"
-timeUnitProperties YearMonthDateHoursMinutesSeconds = timeHelper "yearmonthdatehoursminutesseconds"
-timeUnitProperties Quarter = timeHelper "quarter"
-timeUnitProperties QuarterMonth = timeHelper "quartermonth"
-timeUnitProperties Month = timeHelper "month"
-timeUnitProperties MonthDate = timeHelper "monthdate"
-timeUnitProperties Date = timeHelper "date"
-timeUnitProperties Day = timeHelper "day"
-timeUnitProperties Hours = timeHelper "hours"
-timeUnitProperties HoursMinutes = timeHelper "hoursminutes"
-timeUnitProperties HoursMinutesSeconds = timeHelper "hoursminutesseconds"
-timeUnitProperties Minutes = timeHelper "minutes"
-timeUnitProperties MinutesSeconds = timeHelper "minutesseconds"
-timeUnitProperties Seconds = timeHelper "seconds"
-timeUnitProperties SecondsMilliseconds = timeHelper "secondsmilliseconds"
-timeUnitProperties Milliseconds = timeHelper "milliseconds"
-timeUnitProperties (Utc tu) = "utc" .= True : timeUnitProperties tu
-timeUnitProperties (TUStep x tu) = "step" .= x : timeUnitProperties tu
-timeUnitProperties (TUMaxBins n) = [ "maxbins" .= n ]
-
+fromT :: T.Text -> VLSpec
+fromT = toJSON
 
--- Special case this so that
---   {'unit': blah}              -> blah
---   {'unit': blah, 'utc': true} -> 'utc' <> blah  [would be nice but not done for now]
---
 timeUnitSpec :: TimeUnit -> VLSpec
-timeUnitSpec tu =
-  let props = timeUnitProperties tu
-  in case props of
-    [(k, v)] | k == "unit" -> v
-    _ -> object props
+timeUnitSpec (TU tu) = fromT (baseTimeUnitLabel tu)
+timeUnitSpec (Utc tu) = fromT ("utc" <> baseTimeUnitLabel tu)
+timeUnitSpec (TUStep x tu) = object ["step" .= x, "unit" .= baseTimeUnitLabel tu]
+timeUnitSpec (UtcStep x tu) = object ["step" .= x, "unit" .= ("utc" <> baseTimeUnitLabel tu)]
+timeUnitSpec (TUMaxBins n) = object ["maxbins" .= n]
diff --git a/tests/CompositeTests.hs b/tests/CompositeTests.hs
--- a/tests/CompositeTests.hs
+++ b/tests/CompositeTests.hs
@@ -145,7 +145,7 @@
 
         enc =
             encoding
-                . position X [ PName "Year", PmType Temporal, PTimeUnit Year ]
+                . position X [ PName "Year", PmType Temporal, PTimeUnit (TU Year) ]
                 . position Y
                     [ PName "Miles_per_Gallon"
                     , PmType Quantitative
diff --git a/tests/ConditionalTests.hs b/tests/ConditionalTests.hs
--- a/tests/ConditionalTests.hs
+++ b/tests/ConditionalTests.hs
@@ -163,10 +163,10 @@
         encoding
           . position X [ PName "Year"
                        , PmType Temporal
-                       , PTimeUnit Year
+                       , PTimeUnit (TU Year)
                        , PAxis [ AxDataCondition
                                  (FEqual "value" (DateTime [DTMonth Jan, DTDate 1])
-                                   & FilterOpTrans (MTimeUnit MonthDate))
+                                   & FilterOpTrans (MTimeUnit (TU MonthDate)))
                                  (CAxGridWidth 4 1)
                                ]
                        ]
diff --git a/tests/ConfigTests.hs b/tests/ConfigTests.hs
--- a/tests/ConfigTests.hs
+++ b/tests/ConfigTests.hs
@@ -91,7 +91,7 @@
 
         streamEnc =
             encoding
-                . position X [ PName "Year", PmType Temporal, PTimeUnit Year ]
+                . position X [ PName "Year", PmType Temporal, PTimeUnit (TU Year) ]
                 . yCount [ PStack StCenter, PAxis [] ]
                 . color mOrigin
 
@@ -129,7 +129,7 @@
 
         streamEnc =
             encoding
-                . position X [ PName "Year", PmType Temporal, PTimeUnit Year ]
+                . position X [ PName "Year", PmType Temporal, PTimeUnit (TU Year) ]
                 . yCount [ PStack StCenter, PAxis [] ]
                 . color mOrigin
 
diff --git a/tests/FilterTests.hs b/tests/FilterTests.hs
--- a/tests/FilterTests.hs
+++ b/tests/FilterTests.hs
@@ -48,7 +48,7 @@
 dateFilterNumbers :: Maybe Double -> Maybe Double -> VegaLite
 dateFilterNumbers mlo mhi =
   let yearRange = FRange "date" frange
-                  & FilterOpTrans (MTimeUnit Year)
+                  & FilterOpTrans (MTimeUnit (TU Year))
                   & FCompose
 
       frange = case (mlo, mhi) of
diff --git a/tests/Gallery/Advanced.hs b/tests/Gallery/Advanced.hs
--- a/tests/Gallery/Advanced.hs
+++ b/tests/Gallery/Advanced.hs
@@ -125,7 +125,7 @@
         trans =
             transform
                 . filter (FExpr "isValid(datum.IMDB_Rating)")
-                . timeUnitAs Year "Release_Date" "year"
+                . timeUnitAs (TU Year) "Release_Date" "year"
                 . window [ ( [ WAggregateOp Mean, WField "IMDB_Rating" ], "AverageYearRating" ) ]
                     [ WGroupBy [ "year" ], WFrame Nothing Nothing ]
                 . filter (FExpr "(datum.IMDB_Rating - datum.AverageYearRating) > 2.5")
@@ -662,11 +662,11 @@
       trans = transform . filter (FExpr "datum.symbol === 'GOOG'")
 
       encRaw = encoding
-                . position X [ PName "date", pTemporal, PTimeUnit Year ]
+                . position X [ PName "date", pTemporal, PTimeUnit (TU Year) ]
                 . position Y [ PName "price", pQuant ]
 
       encAv = encoding
-                . position X [ PName "date", pTemporal, PTimeUnit Year ]
+                . position X [ PName "date", pTemporal, PTimeUnit (TU Year) ]
                 . position Y [ PName "price", PAggregate Mean, pQuant ]
 
       specRaw = asSpec [ encRaw [], mark Point [ MOpacity 0.3 ] ]
diff --git a/tests/Gallery/Area.hs b/tests/Gallery/Area.hs
--- a/tests/Gallery/Area.hs
+++ b/tests/Gallery/Area.hs
@@ -36,7 +36,7 @@
 
         enc =
             encoding
-                . position X [ PName "date", PmType Temporal, PTimeUnit YearMonth, PAxis [ AxFormat "%Y" ] ]
+                . position X [ PName "date", PmType Temporal, PTimeUnit (TU YearMonth), PAxis [ AxFormat "%Y" ] ]
                 . position Y [ PName "count", PmType Quantitative, PAggregate Sum, PAxis [ AxTitle "Count" ] ]
     in
     toVegaLite
@@ -80,7 +80,7 @@
 
         enc =
             encoding
-                . position X [ PName "date", PmType Temporal, PTimeUnit YearMonth, PAxis [ AxFormat "%Y" ] ]
+                . position X [ PName "date", PmType Temporal, PTimeUnit (TU YearMonth), PAxis [ AxFormat "%Y" ] ]
                 . position Y [ PName "count", PmType Quantitative, PAggregate Sum ]
                 . color [ MName "series", MmType Nominal, MScale [ SScheme "category20b" [] ] ]
     in
@@ -100,7 +100,7 @@
 
         enc =
             encoding
-                . position X [ PName "date", PmType Temporal, PTimeUnit YearMonth, PAxis [ AxDomain False, AxFormat "%Y" ] ]
+                . position X [ PName "date", PmType Temporal, PTimeUnit (TU YearMonth), PAxis [ AxDomain False, AxFormat "%Y" ] ]
                 . position Y [ PName "count", PmType Quantitative, PAggregate Sum, PAxis [], PStack StNormalize ]
                 . color [ MName "series", MmType Nominal, MScale [ SScheme "category20b" [] ] ]
     in
@@ -122,7 +122,7 @@
 
         enc =
             encoding
-                . position X [ PName "date", PmType Temporal, PTimeUnit YearMonth, PAxis [ AxDomain False, AxFormat "%Y" ] ]
+                . position X [ PName "date", PmType Temporal, PTimeUnit (TU YearMonth), PAxis [ AxDomain False, AxFormat "%Y" ] ]
                 . position Y [ PName "count", PmType Quantitative, PAggregate Sum, PAxis [], PStack StCenter ]
                 . color [ MName "series", MmType Nominal, MScale [ SScheme "category20b" [] ] ]
     in
@@ -290,10 +290,10 @@
               ]
 
       xCondition = FEqual "value" (DateTime [DTMonthNum 1, DTDate 1])
-                   & FilterOpTrans (MTimeUnit MonthDate)
+                   & FilterOpTrans (MTimeUnit (TU MonthDate))
                    
       enc = encoding
-            . position X [ PTimeUnit YearMonthDate
+            . position X [ PTimeUnit (TU YearMonthDate)
                          , PName "date"
                          , PmType Ordinal
                          , PTitle "Time"
diff --git a/tests/Gallery/Bar.hs b/tests/Gallery/Bar.hs
--- a/tests/Gallery/Bar.hs
+++ b/tests/Gallery/Bar.hs
@@ -189,7 +189,7 @@
             encoding
                 . position X [ PName "date"
                              , PmType Ordinal
-                             , PTimeUnit Month
+                             , PTimeUnit (TU Month)
                              , PAxis [ AxTitle "Month of the year" ]
                              ]
                 . position Y [ PmType Quantitative, PAggregate Count ]
@@ -751,7 +751,7 @@
                 , encoding
                   . position X [ PName "date"
                                , PmType Temporal
-                               , PTimeUnit Month
+                               , PTimeUnit (TU Month)
                                , PAxis [ AxLabelAlign AlignLeft
                                        , AxLabelExpr "datum.label[0]"
                                        ]
diff --git a/tests/Gallery/Error.hs b/tests/Gallery/Error.hs
--- a/tests/Gallery/Error.hs
+++ b/tests/Gallery/Error.hs
@@ -111,7 +111,7 @@
             description "Line chart with confidence interval band."
 
         encTime =
-            encoding . position X [ PName "Year", PmType Temporal, PTimeUnit Year ]
+            encoding . position X [ PName "Year", PmType Temporal, PTimeUnit (TU Year) ]
 
         encBand =
             encoding
diff --git a/tests/Gallery/Facet.hs b/tests/Gallery/Facet.hs
--- a/tests/Gallery/Facet.hs
+++ b/tests/Gallery/Facet.hs
@@ -253,7 +253,7 @@
                 , configure (configuration (Axis [Grid False, Domain False]) [])
                 , facet [ RowBy [ FName "date"
                                 , FmType Nominal
-                                , FTimeUnit Hours
+                                , FTimeUnit (TU Hours)
                                 , FSort [ByFieldOp "order" Max] -- don't want an operation
                                 , FHeader [ HLabelAngle 0
                                           , HLabelPadding 2
diff --git a/tests/Gallery/Interaction.hs b/tests/Gallery/Interaction.hs
--- a/tests/Gallery/Interaction.hs
+++ b/tests/Gallery/Interaction.hs
@@ -148,7 +148,7 @@
 
         enc =
             encoding
-                . position X [ PName "date", PmType Temporal, PTimeUnit YearMonth ]
+                . position X [ PName "date", PmType Temporal, PTimeUnit (TU YearMonth) ]
                 . position Y [ PName "count", PmType Quantitative, PAggregate Sum ]
 
         specBackground =
@@ -290,7 +290,7 @@
 
         enc1 =
             encoding
-                . position X [ PName "date", PmType Ordinal, PTimeUnit Month ]
+                . position X [ PName "date", PmType Ordinal, PTimeUnit (TU Month) ]
                 . opacity
                     [ MSelectionCondition (SelectionName "myBrush")
                         [ MNumber 1 ]
@@ -395,11 +395,12 @@
             configure
                 . configuration (AxisY [ MinExtent 30 ])
 
+        timeUnit = TU YearMonthDate
         enc =
             encoding
-                . position X [ PName "date", PmType Temporal, PTimeUnit YearMonthDate ]
+                . position X [ PName "date", PmType Temporal, PTimeUnit timeUnit ]
                 . tooltips
-                    [ [ TName "date", TmType Temporal, TTimeUnit YearMonthDate ]
+                    [ [ TName "date", TmType Temporal, TTimeUnit timeUnit ]
                     , [ TName "temp_max", TmType Quantitative ]
                     , [ TName "temp_min", TmType Quantitative ]
                     ]
diff --git a/tests/Gallery/Label.hs b/tests/Gallery/Label.hs
--- a/tests/Gallery/Label.hs
+++ b/tests/Gallery/Label.hs
@@ -271,7 +271,7 @@
 
         encBar =
             encoding
-                . position X [ PName "date", PmType Ordinal, PTimeUnit Month ]
+                . position X [ PName "date", PmType Ordinal, PTimeUnit (TU Month) ]
                 . position Y [ PName "precipitation", PmType Quantitative, PAggregate Mean ]
 
         specBar =
@@ -342,8 +342,8 @@
 
         encRects =
             encoding
-                . position X [ PName "start", PmType Temporal, PTimeUnit Year, PAxis [] ]
-                . position X2 [ PName "end", PTimeUnit Year ]
+                . position X [ PName "start", PmType Temporal, PTimeUnit (TU Year), PAxis [] ]
+                . position X2 [ PName "end", PTimeUnit (TU Year) ]
                 . color [ MName "event", MmType Nominal ]
 
         specRects =
@@ -351,7 +351,7 @@
 
         encPopulation =
             encoding
-                . position X [ PName "year", PmType Temporal, PTimeUnit Year, PAxis [ AxNoTitle ] ]
+                . position X [ PName "year", PmType Temporal, PTimeUnit (TU Year), PAxis [ AxNoTitle ] ]
                 . position Y [ PName "population", PmType Quantitative ]
                 . color [ MString "#333" ]
 
diff --git a/tests/Gallery/Layer.hs b/tests/Gallery/Layer.hs
--- a/tests/Gallery/Layer.hs
+++ b/tests/Gallery/Layer.hs
@@ -55,7 +55,7 @@
                 . position X
                     [ PName "date"
                     , PmType Temporal
-                    , PTimeUnit YearMonthDate
+                    , PTimeUnit (TU YearMonthDate)
                     , PScale [ SDomain (DDateTimes [ [ DTMonth May, DTDate 31, DTYear 2009 ], [ DTMonth Jul, DTDate 1, DTYear 2009 ] ]) ]
                     , PAxis [ AxTitle "Date in 2009", AxFormat "%m/%d" ]
                     ]
@@ -68,7 +68,7 @@
 
         encBar =
             encoding
-                . position X [ PName "date", PmType Temporal, PTimeUnit YearMonthDate ]
+                . position X [ PName "date", PmType Temporal, PTimeUnit (TU YearMonthDate) ]
                 . position Y [ PName "open", PmType Quantitative ]
                 . position Y2 [ PName "close" ]
                 . size [ MNumber 5 ]
@@ -221,7 +221,7 @@
             description "Layered bar/line chart with dual axes"
 
         encTime =
-            encoding . position X [ PName "date", PmType Ordinal, PTimeUnit Month ]
+            encoding . position X [ PName "date", PmType Ordinal, PTimeUnit (TU Month) ]
 
         encBar =
             encoding
@@ -411,7 +411,7 @@
 layerTimeunitRect =
   let desc = "Drawing rect bin from the beginning of May to end of July"
 
-      xAxis = [ PTimeUnit Month
+      xAxis = [ PTimeUnit (TU Month)
               , PName "date"
               , PmType Temporal
               ]
@@ -437,7 +437,7 @@
              , mark Rect [MOpacity 0.5, MColor "grey"]
              , encoding
                . position X xAxis
-               . position X2 [PTimeUnit Month, PName "date_end"]
+               . position X2 [PTimeUnit (TU Month), PName "date_end"]
                $ []
              ]
   
diff --git a/tests/Gallery/Line.hs b/tests/Gallery/Line.hs
--- a/tests/Gallery/Line.hs
+++ b/tests/Gallery/Line.hs
@@ -359,10 +359,10 @@
       expr = "[timeFormat(datum.value, '%b'), timeFormat(datum.value, '%m') == '01' ? timeFormat(datum.value, '%Y') : '']"
 
       cond = FEqual "value" (Number 1)
-             & FilterOpTrans (MTimeUnit Month)
+             & FilterOpTrans (MTimeUnit (TU Month))
 
       yearRange = FRange "date" (NumberRange 2006 2007)
-                  & FilterOpTrans (MTimeUnit Year)
+                  & FilterOpTrans (MTimeUnit (TU Year))
                   & FCompose
 
   in toVegaLite [ description "Line chart with conditional axis ticks, labels, and grid."
diff --git a/tests/Gallery/Multi.hs b/tests/Gallery/Multi.hs
--- a/tests/Gallery/Multi.hs
+++ b/tests/Gallery/Multi.hs
@@ -262,7 +262,7 @@
                 . position X
                     [ PName "date"
                     , PmType Temporal
-                    , PTimeUnit MonthDate
+                    , PTimeUnit (TU MonthDate)
                     , PAxis [ AxTitle "Date", AxFormat "%b" ]
                     ]
                 . position Y
diff --git a/tests/Gallery/Repeat.hs b/tests/Gallery/Repeat.hs
--- a/tests/Gallery/Repeat.hs
+++ b/tests/Gallery/Repeat.hs
@@ -32,9 +32,9 @@
 
         enc1 =
             encoding
-                . position X [ PName "date", PmType Ordinal, PTimeUnit Month ]
+                . position X [ PName "date", PmType Ordinal, PTimeUnit (TU Month) ]
                 . position Y [ PRepeat Column, PmType Quantitative, PAggregate Mean ]
-                . detail [ DName "date", DmType Temporal, DTimeUnit Year ]
+                . detail [ DName "date", DmType Temporal, DTimeUnit (TU Year) ]
                 . color [ MName "location", MmType Nominal ]
                 . opacity [ MNumber 0.2 ]
 
@@ -43,7 +43,7 @@
 
         enc2 =
             encoding
-                . position X [ PName "date", PmType Ordinal, PTimeUnit Month ]
+                . position X [ PName "date", PmType Ordinal, PTimeUnit (TU Month) ]
                 . position Y [ PRepeat Column, PmType Quantitative, PAggregate Mean ]
                 . color [ MName "location", MmType Nominal ]
 
@@ -73,7 +73,7 @@
 
         enc1 =
             encoding
-                . position X [ PName "date", PTimeUnit Month, PmType Ordinal ]
+                . position X [ PName "date", PTimeUnit (TU Month), PmType Ordinal ]
                 . position Y [ PName "precipitation", PmType Quantitative, PAggregate Mean ]
 
         spec1 =
diff --git a/tests/Gallery/Table.hs b/tests/Gallery/Table.hs
--- a/tests/Gallery/Table.hs
+++ b/tests/Gallery/Table.hs
@@ -54,8 +54,8 @@
 
         enc =
             encoding
-                . position X [ PName "date", PmType Ordinal, PTimeUnit Date, PAxis [ AxTitle "Day", AxLabelAngle 0, AxFormat "%e" ] ]
-                . position Y [ PName "date", PmType Ordinal, PTimeUnit Month, PAxis [ AxTitle "Month" ] ]
+                . position X [ PName "date", PmType Ordinal, PTimeUnit (TU Date), PAxis [ AxTitle "Day", AxLabelAngle 0, AxFormat "%e" ] ]
+                . position Y [ PName "date", PmType Ordinal, PTimeUnit (TU Month), PAxis [ AxTitle "Month" ] ]
                 . color [ MName "temp", MmType Quantitative, MAggregate Max, MLegend [ LNoTitle ] ]
     in
     toVegaLite
@@ -117,8 +117,8 @@
 
         enc =
             encoding
-                . position X [ PName "time", PmType Ordinal, PTimeUnit Hours ]
-                . position Y [ PName "time", PmType Ordinal, PTimeUnit Day ]
+                . position X [ PName "time", PmType Ordinal, PTimeUnit (TU Hours) ]
+                . position Y [ PName "time", PmType Ordinal, PTimeUnit (TU Day) ]
                 . size [ MName "count", MmType Quantitative, MAggregate Sum ]
     in
     toVegaLite
diff --git a/tests/InteractionTests.hs b/tests/InteractionTests.hs
--- a/tests/InteractionTests.hs
+++ b/tests/InteractionTests.hs
@@ -300,7 +300,7 @@
                                  , encoding
                                    . text [ TName "date"
                                           , TmType Temporal
-                                          , TTimeUnit YearMonth
+                                          , TTimeUnit (TU YearMonth)
                                           ]
                                    . position Y [PNumber 310]
                                    $ []
diff --git a/tests/TimeTests.hs b/tests/TimeTests.hs
--- a/tests/TimeTests.hs
+++ b/tests/TimeTests.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
 
 --
 -- Based on the Elm VegaLite TimeTests.elm as of version 1.12.0
@@ -6,6 +7,9 @@
 
 module TimeTests (testSpecs) where
 
+import Data.Aeson (Value)
+import Data.Aeson.QQ.Simple (aesonQQ)
+
 import Graphics.Vega.VegaLite
 
 import Prelude hiding (filter)
@@ -28,19 +32,31 @@
             , ("timeMinutesSeconds", timeMinutesSeconds)
             , ("localTime", localTime)
             , ("utcTime", utcTime)
+            , ("monthAggregate", monthAggregate)
+            , ("withBar", withBar)
             , ("timeBand", timeBand)
+            , ("withBarOrdinal", withBarOrdinal)
+            , ("timeUnitTransform", timeUnitTransform)
+            , ("parseAsUTC", parseAsUTC)
+            , ("parseAsLocal", parseAsLocal)
+            , ("parseAsFormat", parseAsFormat)
+            , ("outputAsUTC", outputAsUTC)
+            , ("outputScaledAsUTC", outputScaledAsUTC)
+            , ("customizeStep", customizeStep)
+            , ("nestedTime1", nestedTime1)
+            , ("nestedTime2", nestedTime2)
             ]
 
 
-timeByUnit :: TimeUnit -> VegaLite
-timeByUnit tu =
+timeByUnit :: BaseTimeUnit -> VegaLite
+timeByUnit btu =
     let
         dataVals =
             dataFromUrl "https://gicentre.github.io/data/tests/timeTest.tsv" []
 
         enc =
             encoding
-                . position X [ PName "date", PmType Temporal, PTimeUnit tu ]
+                . position X [ PName "date", PmType Temporal, PTimeUnit (TU btu) ]
                 . position Y [ PName "temperature", PmType Quantitative
                              , PAggregate Mean, PScale [ SZero False ] ]
     in
@@ -132,7 +148,7 @@
         tu =
             case dType of
                 Local ->
-                    PTimeUnit YearMonthDateHours
+                    PTimeUnit (TU YearMonthDateHours)
 
                 UTC ->
                     PTimeUnit (Utc YearMonthDateHours)
@@ -169,19 +185,312 @@
 utcTime = parseTime UTC
 
 
+-- examples from the documentation
+--
+-- https://vega.github.io/vega-lite/docs/timeunit.html
+
+seattleTemps :: Data
+seattleTemps = dataFromUrl "https://vega.github.io/vega-lite/data/seattle-temps.csv" []
+
+seattleWeather :: Data
+seattleWeather = dataFromUrl "https://vega.github.io/vega-lite/data/seattle-weather.csv" []
+
+
+monthAggregate :: VegaLite
+monthAggregate =
+  let enc = encoding
+            . position X [ PName "date"
+                         , PTimeUnit (TU Month)
+                         , PmType Temporal
+                         ]
+            . position Y [ PName "temp"
+                         , PAggregate Mean
+                         , PmType Quantitative ]
+
+  in toVegaLite
+        [ seattleTemps
+        , mark Line [MInterpolate Monotone]
+        , enc []
+        ]
+
+
+withBar :: VegaLite
+withBar =
+  let enc = encoding
+            . position X [ PName "date"
+                         , PTimeUnit (TU Month)
+                         , PmType Temporal
+                         ]
+            . position Y [ PName "precipitation"
+                         , PAggregate Mean
+                         , PmType Quantitative ]
+
+  in toVegaLite
+        [ seattleWeather
+        , mark Bar []
+        , enc []
+        ]
+
+
+-- https://vega.github.io/vega-lite/docs/timeunit.html#time-units-band
+
 timeBand :: VegaLite
 timeBand =
-  let dvals = dataFromUrl "https://vega.github.io/vega-lite/data/seattle-temps.csv" []
-
-      enc = encoding
-            . position X [ PName "date", PTimeUnit Month
+  let enc = encoding
+            . position X [ PName "date", PTimeUnit (TU Month)
                          , PmType Temporal, PBand 0.5 ]
             . position Y [ PName "temp", PAggregate Mean
                          , PmType Quantitative ]
 
   in toVegaLite
         [ width 400
-        , dvals
+        , seattleTemps
         , enc []
         , mark Line [ MPoint (PMMarker [ MFill "black" ]) ]
         ]
+
+
+-- https://vega.github.io/vega-lite/docs/timeunit.html#time-unit-with-ordinal-fields
+
+withBarOrdinal :: VegaLite
+withBarOrdinal =
+  let enc = encoding
+            . position X [ PName "date"
+                         , PTimeUnit (TU Month)
+                         , PmType Ordinal
+                         ]
+            . position Y [ PName "precipitation"
+                         , PAggregate Mean
+                         , PmType Quantitative ]
+
+  in toVegaLite
+        [ seattleWeather
+        , mark Bar []
+        , enc []
+        ]
+
+
+-- https://vega.github.io/vega-lite/docs/timeunit.html#transform
+
+timeUnitTransform :: VegaLite
+timeUnitTransform =
+  let enc = encoding
+            . position X [ PName "month"
+                         , PmType Temporal
+                         , PAxis [AxFormat "%b"]
+                         ]
+            . position Y [ PName "temp_max"
+                         , PAggregate Max
+                         , PmType Quantitative ]
+
+  in toVegaLite
+        [ seattleWeather
+        , mark Line []
+        , transform (timeUnitAs (TU Month) "date" "month" [])
+        , enc []
+        ]
+
+
+-- https://vega.github.io/vega-lite/docs/timeunit.html#input
+
+parseAsUTC :: VegaLite
+parseAsUTC =
+  toVegaLite [ dataFromColumns []
+               . dataColumn "date" (Strings ["2011-10-10", "2011-10-12"])
+               $ []
+             , mark Point []
+             , encoding
+               . position Y [ PName "date"
+                            , PmType Ordinal
+                            , PTimeUnit (Utc Hours)
+                            , PAxis [AxTitle "time"]
+                            ]
+               $ []
+             ]
+
+
+parseAsLocal :: VegaLite
+parseAsLocal =
+  toVegaLite [ dataFromColumns []
+               . dataColumn "date" (Strings ["10 Oct 2011 22:48:00", "11 Oct 2022 23:00:00"])
+               $ []
+             , mark Point []
+             , encoding
+               . position Y [ PName "date"
+                            , PmType Ordinal
+                            , PTimeUnit (TU HoursMinutes)
+                            , PAxis [AxTitle "time"]
+                            ]
+               $ []
+             ]
+
+
+parseAsFormat :: VegaLite
+parseAsFormat =
+  toVegaLite [ dataFromColumns [Parse [("date", FoUtc "%d %b %Y %H:%M:%S")]]
+               . dataColumn "date" (Strings ["10 Oct 2011 22:48:00", "11 Oct 2022 23:00:00"])
+               $ []
+             , mark Point []
+             , encoding
+               . position Y [ PName "date"
+                            , PmType Ordinal
+                            , PTimeUnit (TU HoursMinutes)
+                            , PAxis [AxTitle "time"]
+                            ]
+               $ []
+             ]
+
+
+-- https://vega.github.io/vega-lite/docs/timeunit.html#output
+
+exampleData :: Data
+exampleData =
+  dataFromColumns []
+  . dataColumn "date" (Strings [ "Sun, 01 Jan 2012 23:00:00"
+                               , "Sun, 02 Jan 2012 00:00:00"
+                               , "Sun, 02 Jan 2012 01:00:00"
+                               , "Sun, 02 Jan 2012 02:00:00"
+                               , "Sun, 02 Jan 2012 03:00:00"
+                               ])
+
+  . dataColumn "price" (Numbers [150, 100, 170, 165, 200])
+  $ []
+
+
+outputAsUTC :: VegaLite
+outputAsUTC =
+  toVegaLite [ exampleData
+             , mark Line []
+             , encoding
+               . position X [ PName "date"
+                            , PmType Temporal
+                            , PTimeUnit (Utc YearMonthDateHoursMinutes)
+                            , PAxis [AxLabelAngle 15]
+                            ]
+               . position Y [ PName "price"
+                            , PmType Quantitative
+                            ]
+               $ []
+             ]
+
+
+outputScaledAsUTC :: VegaLite
+outputScaledAsUTC =
+  toVegaLite [ exampleData
+             , mark Line []
+             , encoding
+               . position X [ PName "date"
+                            , PmType Temporal
+                            , PTimeUnit (TU YearMonthDateHoursMinutes)
+                            , PScale [SType ScUtc]
+                            , PAxis [AxLabelAngle 15]
+                            ]
+               . position Y [ PName "price"
+                            , PmType Quantitative
+                            ]
+               $ []
+             ]
+
+
+-- https://vega.github.io/vega-lite/docs/timeunit.html#example-customizing-step
+
+customizeStep :: VegaLite
+customizeStep =
+  toVegaLite [ dataFromColumns []
+               . dataColumn "date" (Strings [ "Sun, 01 Jan 2012 00:00:00"
+                                            , "Sun, 01 Jan 2012 00:01:00"
+                                            , "Sun, 01 Jan 2012 00:02:00"
+                                            , "Sun, 01 Jan 2012 00:03:00"
+                                            , "Sun, 01 Jan 2012 00:04:00"
+                                            , "Sun, 01 Jan 2012 00:05:00"
+                                            , "Sun, 01 Jan 2012 00:06:00"
+                                            , "Sun, 01 Jan 2012 00:07:00"
+                                            , "Sun, 01 Jan 2012 00:08:00"
+                                            , "Sun, 01 Jan 2012 00:09:00"
+                                            , "Sun, 01 Jan 2012 00:10:00"
+                                            , "Sun, 01 Jan 2012 00:11:00"
+                                            , "Sun, 01 Jan 2012 00:12:00"
+                                            , "Sun, 01 Jan 2012 00:13:00"
+                                            , "Sun, 01 Jan 2012 00:14:00"
+                                            , "Sun, 01 Jan 2012 00:15:00"
+                                            ])
+               . dataColumn "distance" (Numbers [ 1
+                                                , 1
+                                                , 2
+                                                , 1
+                                                , 4
+                                                , 2
+                                                , 5
+                                                , 2
+                                                , 6
+                                                , 4
+                                                , 1
+                                                , 1
+                                                , 3
+                                                , 0
+                                                , 2
+                                                , 3
+                                                ])
+               $ []
+             , mark Bar []
+             , encoding
+               . position X [ PName "date"
+                            , PmType Temporal
+                            , PTimeUnit (TUStep 5 Minutes)
+                            ]
+               . position Y [ PName "distance"
+                            , PmType Quantitative
+                            , PAggregate Sum
+                            ]
+               $ []
+             ]
+
+
+embeddedData, flattenedData :: Value
+embeddedData = [aesonQQ|
+[
+   {"histo": {"date": "Sun, 02 Jan 2012 00:00:00", "price": 150}},
+   {"histo": {"date": "Sun, 02 Jan 2012 00:00:00", "price": 100}},
+   {"histo": {"date": "Sun, 02 Jan 2012 01:00:00", "price": 170}},
+   {"histo": {"date": "Sun, 02 Jan 2012 02:00:00", "price": 165}},
+   {"histo": {"date": "Sun, 02 Jan 2012 03:00:00", "price": 200}}
+]
+|]
+  
+flattenedData = [aesonQQ|
+[
+   {"date": "Sun, 02 Jan 2012 00:00:00", "price": 150},
+   {"date": "Sun, 02 Jan 2012 00:00:00", "price": 100},
+   {"date": "Sun, 02 Jan 2012 01:00:00", "price": 170},
+   {"date": "Sun, 02 Jan 2012 02:00:00", "price": 165},
+   {"date": "Sun, 02 Jan 2012 03:00:00", "price": 200}
+]
+|]
+  
+
+-- https://github.com/vega/vega-lite/issues/5662
+
+nestedTime :: Value -> FieldName -> FieldName -> VegaLite
+nestedTime jData xname yname =
+  let desc = "Google's stock price over time."
+      dvals = dataFromJson jData []
+      
+  in toVegaLite [ description desc
+                , dvals
+                , mark Line []
+                , encoding
+                  . position X [ PName xname
+                               , PmType Temporal
+                               , PTimeUnit (TU YearMonthDateHoursMinutes)
+                               , PScale [SType ScUtc]
+                               ]
+                  . position Y [ PName yname
+                               , PmType Quantitative
+                               ]
+                  $ []
+                ]
+
+  
+nestedTime1, nestedTime2 :: VegaLite
+nestedTime1 = nestedTime embeddedData "histo.date" "histo.price"
+nestedTime2 = nestedTime flattenedData "date" "price"
diff --git a/tests/TransformTests.hs b/tests/TransformTests.hs
--- a/tests/TransformTests.hs
+++ b/tests/TransformTests.hs
@@ -354,7 +354,7 @@
                 ]
 
 weatherByMonth :: VegaLite
-weatherByMonth = weather Month "month"
+weatherByMonth = weather (TU Month) "month"
 
 weatherByTwoMonths :: VegaLite
 weatherByTwoMonths = weather (TUStep 2 Month) "bimonth"
diff --git a/tests/WindowTransformTests.hs b/tests/WindowTransformTests.hs
--- a/tests/WindowTransformTests.hs
+++ b/tests/WindowTransformTests.hs
@@ -82,7 +82,7 @@
     let trans =
             transform
                 . filter (FExpr "datum.IMDB_Rating != null")
-                . timeUnitAs Year "Release_Date" "year"
+                . timeUnitAs (TU Year) "Release_Date" "year"
                 . window [ ( [ WAggregateOp Mean, WField "IMDB_Rating" ], "AverageYearRating" ) ]
                     [ WGroupBy [ "year" ], WFrame Nothing Nothing ]
                 . filter (FExpr "(datum.IMDB_Rating - datum.AverageYearRating) > 2.5")
@@ -186,13 +186,13 @@
         trans =
             transform
                 . filter (FExpr "datum.Miles_per_Gallon !== null")
-                . timeUnitAs Year "Year" "year"
+                . timeUnitAs (TU Year) "Year" "year"
                 . window [ ( [ WAggregateOp Mean, WField "Miles_per_Gallon" ], "Average_MPG" ) ]
                     [ WSort [ WAscending "year" ], WIgnorePeers False, WFrame Nothing (Just 0) ]
 
         circleEnc =
             encoding
-                . position X [ PName "Year", PmType Temporal, PTimeUnit Year ]
+                . position X [ PName "Year", PmType Temporal, PTimeUnit (TU Year) ]
                 . position Y [ PName "Miles_per_Gallon", PmType Quantitative ]
 
         circleSpec =
@@ -200,7 +200,7 @@
 
         lineEnc =
             encoding
-                . position X [ PName "Year", PmType Temporal, PTimeUnit Year ]
+                . position X [ PName "Year", PmType Temporal, PTimeUnit (TU Year) ]
                 . position Y [ PName "Average_MPG", PmType Quantitative, PAxis [ AxTitle "Miles per gallon" ] ]
 
         lineSpec =
@@ -259,7 +259,7 @@
         trans =
             transform
                 . filter (FExpr "datum.IMDB_Rating != null")
-                . timeUnitAs Year "Release_Date" "year"
+                . timeUnitAs (TU Year) "Release_Date" "year"
                 . joinAggregate [ opAs Mean "IMDB_Rating" "AverageYearRating" ]
                     [ WGroupBy [ "year" ] ]
                 . filter (FExpr "(datum.IMDB_Rating - datum.AverageYearRating) > 2.5")
diff --git a/tests/specs/time/customizeStep.vl b/tests/specs/time/customizeStep.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/customizeStep.vl
@@ -0,0 +1,87 @@
+{
+    "mark": "bar",
+    "data": {
+        "values": [
+            {
+                "distance": 1,
+                "date": "Sun, 01 Jan 2012 00:00:00"
+            },
+            {
+                "distance": 1,
+                "date": "Sun, 01 Jan 2012 00:01:00"
+            },
+            {
+                "distance": 2,
+                "date": "Sun, 01 Jan 2012 00:02:00"
+            },
+            {
+                "distance": 1,
+                "date": "Sun, 01 Jan 2012 00:03:00"
+            },
+            {
+                "distance": 4,
+                "date": "Sun, 01 Jan 2012 00:04:00"
+            },
+            {
+                "distance": 2,
+                "date": "Sun, 01 Jan 2012 00:05:00"
+            },
+            {
+                "distance": 5,
+                "date": "Sun, 01 Jan 2012 00:06:00"
+            },
+            {
+                "distance": 2,
+                "date": "Sun, 01 Jan 2012 00:07:00"
+            },
+            {
+                "distance": 6,
+                "date": "Sun, 01 Jan 2012 00:08:00"
+            },
+            {
+                "distance": 4,
+                "date": "Sun, 01 Jan 2012 00:09:00"
+            },
+            {
+                "distance": 1,
+                "date": "Sun, 01 Jan 2012 00:10:00"
+            },
+            {
+                "distance": 1,
+                "date": "Sun, 01 Jan 2012 00:11:00"
+            },
+            {
+                "distance": 3,
+                "date": "Sun, 01 Jan 2012 00:12:00"
+            },
+            {
+                "distance": 0,
+                "date": "Sun, 01 Jan 2012 00:13:00"
+            },
+            {
+                "distance": 2,
+                "date": "Sun, 01 Jan 2012 00:14:00"
+            },
+            {
+                "distance": 3,
+                "date": "Sun, 01 Jan 2012 00:15:00"
+            }
+        ]
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "x": {
+            "field": "date",
+            "timeUnit": {
+                "step": 5,
+                "unit": "minutes"
+            },
+            "type": "temporal"
+        },
+        "y": {
+            "field": "distance",
+            "aggregate": "sum",
+            "type": "quantitative"
+        }
+    }
+}
diff --git a/tests/specs/time/monthAggregate.vl b/tests/specs/time/monthAggregate.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/monthAggregate.vl
@@ -0,0 +1,22 @@
+{
+    "mark": {
+        "interpolate": "monotone",
+        "type": "line"
+    },
+    "data": {
+        "url": "https://vega.github.io/vega-lite/data/seattle-temps.csv"
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "x": {
+            "field": "date",
+            "timeUnit": "month",
+            "type": "temporal"
+        },
+        "y": {
+            "field": "temp",
+            "aggregate": "mean",
+            "type": "quantitative"
+        }
+    }
+}
diff --git a/tests/specs/time/nestedTime1.vl b/tests/specs/time/nestedTime1.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/nestedTime1.vl
@@ -0,0 +1,53 @@
+{
+    "mark": "line",
+    "data": {
+        "values": [
+            {
+                "histo": {
+                    "date": "Sun, 02 Jan 2012 00:00:00",
+                    "price": 150
+                }
+            },
+            {
+                "histo": {
+                    "date": "Sun, 02 Jan 2012 00:00:00",
+                    "price": 100
+                }
+            },
+            {
+                "histo": {
+                    "date": "Sun, 02 Jan 2012 01:00:00",
+                    "price": 170
+                }
+            },
+            {
+                "histo": {
+                    "date": "Sun, 02 Jan 2012 02:00:00",
+                    "price": 165
+                }
+            },
+            {
+                "histo": {
+                    "date": "Sun, 02 Jan 2012 03:00:00",
+                    "price": 200
+                }
+            }
+        ]
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "x": {
+            "field": "histo.date",
+            "scale": {
+                "type": "utc"
+            },
+            "timeUnit": "yearmonthdatehoursminutes",
+            "type": "temporal"
+        },
+        "y": {
+            "field": "histo.price",
+            "type": "quantitative"
+        }
+    },
+    "description": "Google's stock price over time."
+}
diff --git a/tests/specs/time/nestedTime2.vl b/tests/specs/time/nestedTime2.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/nestedTime2.vl
@@ -0,0 +1,43 @@
+{
+    "mark": "line",
+    "data": {
+        "values": [
+            {
+                "date": "Sun, 02 Jan 2012 00:00:00",
+                "price": 150
+            },
+            {
+                "date": "Sun, 02 Jan 2012 00:00:00",
+                "price": 100
+            },
+            {
+                "date": "Sun, 02 Jan 2012 01:00:00",
+                "price": 170
+            },
+            {
+                "date": "Sun, 02 Jan 2012 02:00:00",
+                "price": 165
+            },
+            {
+                "date": "Sun, 02 Jan 2012 03:00:00",
+                "price": 200
+            }
+        ]
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "x": {
+            "field": "date",
+            "scale": {
+                "type": "utc"
+            },
+            "timeUnit": "yearmonthdatehoursminutes",
+            "type": "temporal"
+        },
+        "y": {
+            "field": "price",
+            "type": "quantitative"
+        }
+    },
+    "description": "Google's stock price over time."
+}
diff --git a/tests/specs/time/outputAsUTC.vl b/tests/specs/time/outputAsUTC.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/outputAsUTC.vl
@@ -0,0 +1,42 @@
+{
+    "mark": "line",
+    "data": {
+        "values": [
+            {
+                "date": "Sun, 01 Jan 2012 23:00:00",
+                "price": 150
+            },
+            {
+                "date": "Sun, 02 Jan 2012 00:00:00",
+                "price": 100
+            },
+            {
+                "date": "Sun, 02 Jan 2012 01:00:00",
+                "price": 170
+            },
+            {
+                "date": "Sun, 02 Jan 2012 02:00:00",
+                "price": 165
+            },
+            {
+                "date": "Sun, 02 Jan 2012 03:00:00",
+                "price": 200
+            }
+        ]
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "x": {
+            "field": "date",
+            "timeUnit": "utcyearmonthdatehoursminutes",
+            "type": "temporal",
+            "axis": {
+                "labelAngle": 15
+            }
+        },
+        "y": {
+            "field": "price",
+            "type": "quantitative"
+        }
+    }
+}
diff --git a/tests/specs/time/outputScaledAsUTC.vl b/tests/specs/time/outputScaledAsUTC.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/outputScaledAsUTC.vl
@@ -0,0 +1,45 @@
+{
+    "mark": "line",
+    "data": {
+        "values": [
+            {
+                "date": "Sun, 01 Jan 2012 23:00:00",
+                "price": 150
+            },
+            {
+                "date": "Sun, 02 Jan 2012 00:00:00",
+                "price": 100
+            },
+            {
+                "date": "Sun, 02 Jan 2012 01:00:00",
+                "price": 170
+            },
+            {
+                "date": "Sun, 02 Jan 2012 02:00:00",
+                "price": 165
+            },
+            {
+                "date": "Sun, 02 Jan 2012 03:00:00",
+                "price": 200
+            }
+        ]
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "x": {
+            "field": "date",
+            "scale": {
+                "type": "utc"
+            },
+            "timeUnit": "yearmonthdatehoursminutes",
+            "type": "temporal",
+            "axis": {
+                "labelAngle": 15
+            }
+        },
+        "y": {
+            "field": "price",
+            "type": "quantitative"
+        }
+    }
+}
diff --git a/tests/specs/time/parseAsFormat.vl b/tests/specs/time/parseAsFormat.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/parseAsFormat.vl
@@ -0,0 +1,29 @@
+{
+    "mark": "point",
+    "data": {
+        "values": [
+            {
+                "date": "10 Oct 2011 22:48:00"
+            },
+            {
+                "date": "11 Oct 2022 23:00:00"
+            }
+        ],
+        "format": {
+            "parse": {
+                "date": "utc:'%d %b %Y %H:%M:%S'"
+            }
+        }
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "y": {
+            "field": "date",
+            "timeUnit": "hoursminutes",
+            "type": "ordinal",
+            "axis": {
+                "title": "time"
+            }
+        }
+    }
+}
diff --git a/tests/specs/time/parseAsLocal.vl b/tests/specs/time/parseAsLocal.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/parseAsLocal.vl
@@ -0,0 +1,24 @@
+{
+    "mark": "point",
+    "data": {
+        "values": [
+            {
+                "date": "10 Oct 2011 22:48:00"
+            },
+            {
+                "date": "11 Oct 2022 23:00:00"
+            }
+        ]
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "y": {
+            "field": "date",
+            "timeUnit": "hoursminutes",
+            "type": "ordinal",
+            "axis": {
+                "title": "time"
+            }
+        }
+    }
+}
diff --git a/tests/specs/time/parseAsUTC.vl b/tests/specs/time/parseAsUTC.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/parseAsUTC.vl
@@ -0,0 +1,24 @@
+{
+    "mark": "point",
+    "data": {
+        "values": [
+            {
+                "date": "2011-10-10"
+            },
+            {
+                "date": "2011-10-12"
+            }
+        ]
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "y": {
+            "field": "date",
+            "timeUnit": "utchours",
+            "type": "ordinal",
+            "axis": {
+                "title": "time"
+            }
+        }
+    }
+}
diff --git a/tests/specs/time/timeUnitTransform.vl b/tests/specs/time/timeUnitTransform.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/timeUnitTransform.vl
@@ -0,0 +1,28 @@
+{
+    "transform": [
+        {
+            "as": "month",
+            "field": "date",
+            "timeUnit": "month"
+        }
+    ],
+    "mark": "line",
+    "data": {
+        "url": "https://vega.github.io/vega-lite/data/seattle-weather.csv"
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "x": {
+            "field": "month",
+            "type": "temporal",
+            "axis": {
+                "format": "%b"
+            }
+        },
+        "y": {
+            "field": "temp_max",
+            "aggregate": "max",
+            "type": "quantitative"
+        }
+    }
+}
diff --git a/tests/specs/time/utcTime.vl b/tests/specs/time/utcTime.vl
--- a/tests/specs/time/utcTime.vl
+++ b/tests/specs/time/utcTime.vl
@@ -48,10 +48,7 @@
             "scale": {
                 "type": "utc"
             },
-            "timeUnit": {
-                "utc": true,
-                "unit": "yearmonthdatehours"
-            },
+            "timeUnit": "utcyearmonthdatehours",
             "type": "temporal",
             "axis": {
                 "format": "%d %b %H:%M"
diff --git a/tests/specs/time/withBar.vl b/tests/specs/time/withBar.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/withBar.vl
@@ -0,0 +1,19 @@
+{
+    "mark": "bar",
+    "data": {
+        "url": "https://vega.github.io/vega-lite/data/seattle-weather.csv"
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "x": {
+            "field": "date",
+            "timeUnit": "month",
+            "type": "temporal"
+        },
+        "y": {
+            "field": "precipitation",
+            "aggregate": "mean",
+            "type": "quantitative"
+        }
+    }
+}
diff --git a/tests/specs/time/withBarOrdinal.vl b/tests/specs/time/withBarOrdinal.vl
new file mode 100644
--- /dev/null
+++ b/tests/specs/time/withBarOrdinal.vl
@@ -0,0 +1,19 @@
+{
+    "mark": "bar",
+    "data": {
+        "url": "https://vega.github.io/vega-lite/data/seattle-weather.csv"
+    },
+    "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
+    "encoding": {
+        "x": {
+            "field": "date",
+            "timeUnit": "month",
+            "type": "ordinal"
+        },
+        "y": {
+            "field": "precipitation",
+            "aggregate": "mean",
+            "type": "quantitative"
+        }
+    }
+}
