diff --git a/core-telemetry.cabal b/core-telemetry.cabal
--- a/core-telemetry.cabal
+++ b/core-telemetry.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           core-telemetry
-version:        0.2.3.0
+version:        0.2.3.2
 synopsis:       Advanced telemetry
 description:    This is part of a library to help build command-line programs, both tools and
                 longer-running daemons.
@@ -52,10 +52,9 @@
       async
     , base >=4.11 && <5
     , bytestring
-    , chronologique
-    , core-data >=0.3.2.2
-    , core-program >=0.4.6.1
-    , core-text >=0.3.6.0
+    , core-data >=0.3.3
+    , core-program >=0.5.0
+    , core-text >=0.3.7
     , exceptions
     , http-streams
     , io-streams
diff --git a/lib/Core/Telemetry/Console.hs b/lib/Core/Telemetry/Console.hs
--- a/lib/Core/Telemetry/Console.hs
+++ b/lib/Core/Telemetry/Console.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GeneralisedNewtypeDeriving #-}
+{-# LANGUAGE ImportQualifiedPost #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 {- |
@@ -23,16 +24,16 @@
 
 import Control.Concurrent.STM (atomically)
 import Control.Concurrent.STM.TQueue (TQueue, writeTQueue)
+import Core.Data.Clock
 import Core.Data.Structures (fromMap)
 import Core.Encoding.Json
 import Core.Program.Arguments
 import Core.Program.Context
 import Core.Program.Logging
-import Core.System.External (getCurrentTimeNanoseconds)
 import Core.Text.Colour
 import Core.Text.Rope
 import Core.Text.Utilities
-import qualified Data.List as List
+import Data.List qualified as List
 
 {- |
 Output metrics to the terminal. This is mostly useful for debugging, but it
diff --git a/lib/Core/Telemetry/Honeycomb.hs b/lib/Core/Telemetry/Honeycomb.hs
--- a/lib/Core/Telemetry/Honeycomb.hs
+++ b/lib/Core/Telemetry/Honeycomb.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GeneralisedNewtypeDeriving #-}
+{-# LANGUAGE ImportQualifiedPost #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
@@ -34,30 +35,30 @@
     honeycombExporter,
 ) where
 
+import Control.Exception.Safe qualified as Safe (catch, finally, throw)
+import Core.Data.Clock (Time, unTime, getCurrentTimeNanoseconds)
 import Core.Data.Structures (Map, fromMap, insertKeyValue, intoMap, lookupKeyValue)
 import Core.Encoding.Json
 import Core.Program.Arguments
 import Core.Program.Context
 import Core.Program.Logging
-import Core.System
-import Core.System.Base (stdout)
-import Core.System.External (TimeStamp (unTimeStamp), getCurrentTimeNanoseconds)
+import Core.System.Base (SomeException, liftIO, stdout)
 import Core.Text.Bytes
 import Core.Text.Colour
 import Core.Text.Rope
 import Core.Text.Utilities
 import Data.ByteString (ByteString)
-import qualified Data.ByteString as B (ByteString)
-import qualified Data.ByteString.Char8 as C (append, null, putStrLn)
-import qualified Data.ByteString.Lazy as L (ByteString)
+import Data.ByteString qualified as B (ByteString)
+import Data.ByteString.Char8 qualified as C (append, null, putStrLn)
+import Data.ByteString.Lazy qualified as L (ByteString)
 import Data.Fixed
 import Data.IORef (IORef, newIORef, readIORef, writeIORef)
-import qualified Data.List as List
+import Data.List qualified as List
 import Network.Http.Client
 import System.Environment (lookupEnv)
 import System.Exit (ExitCode (..))
 import System.IO.Streams (InputStream)
-import qualified System.Posix.Process as Posix (exitImmediately)
+import System.Posix.Process qualified as Posix (exitImmediately)
 
 {- |
 Indicate which \"dataset\" spans and events will be posted into
@@ -221,7 +222,7 @@
 
 cleanupConnection :: IORef (Maybe Connection) -> IO ()
 cleanupConnection r = do
-    finally
+    Safe.finally
         ( do
             possible <- readIORef r
             case possible of
@@ -236,7 +237,7 @@
 postEventToHoneycombAPI r apikey dataset json = attempt False
   where
     attempt retrying = do
-        catch
+        Safe.catch
             ( do
                 c <- acquireConnection r
 
@@ -252,7 +253,7 @@
                     False -> do
                         putStrLn "Reattempting"
                         attempt True
-                    True -> throw e
+                    True -> Safe.throw e
             )
 
     q = buildRequest1 $ do
diff --git a/lib/Core/Telemetry/Identifiers.hs b/lib/Core/Telemetry/Identifiers.hs
--- a/lib/Core/Telemetry/Identifiers.hs
+++ b/lib/Core/Telemetry/Identifiers.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GeneralisedNewtypeDeriving #-}
+{-# LANGUAGE ImportQualifiedPost #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE RankNTypes #-}
@@ -34,11 +35,11 @@
 ) where
 
 import Control.Concurrent.MVar (modifyMVar_, readMVar)
+import Core.Data.Clock
 import Core.Program.Context
 import Core.Program.Logging
 import Core.System (unsafePerformIO)
 import Core.System.Base (liftIO)
-import Core.System.External (TimeStamp (unTimeStamp))
 import Core.Text.Rope
 import Core.Text.Utilities (breakPieces)
 import Data.Bits (shiftL, shiftR, (.&.), (.|.))
@@ -82,9 +83,9 @@
 
 @since 0.1.9
 -}
-createIdentifierTrace :: TimeStamp -> Word16 -> MAC -> Trace
+createIdentifierTrace :: Time -> Word16 -> MAC -> Trace
 createIdentifierTrace time rand address =
-    let p1 = packRope (toHexReversed64 (fromIntegral time))
+    let p1 = packRope (toHexReversed64 (fromIntegral (unTime time)))
         p2 = packRope (toHexNormal16 rand)
         p3 = packRope (convertMACToHex address)
      in Trace
@@ -211,14 +212,14 @@
 
 {- |
 Generate an identifier for a span. We only have 8 bytes to work with. We use
-the nanosecond prescision timestamp with the nibbles reversed, and then
+the nanosecond prescision Time with the nibbles reversed, and then
 overwrite the last two bytes with the supplied random value.
 
 @since 0.1.9
 -}
-createIdentifierSpan :: TimeStamp -> Word16 -> Span
+createIdentifierSpan :: Time -> Word16 -> Span
 createIdentifierSpan time rand =
-    let t = fromIntegral (unTimeStamp time) :: Word64
+    let t = fromIntegral (unTime time) :: Word64
         r = fromIntegral rand :: Word64
         w = (t .&. 0x0000ffffffffffff) .|. (shiftL r 48)
      in Span
diff --git a/lib/Core/Telemetry/Observability.hs b/lib/Core/Telemetry/Observability.hs
--- a/lib/Core/Telemetry/Observability.hs
+++ b/lib/Core/Telemetry/Observability.hs
@@ -170,9 +170,9 @@
 import Core.Encoding.Json
 import Core.Program.Arguments
 import Core.Program.Context
+import Core.Data.Clock
 import Core.Program.Logging
 import Core.System.Base (SomeException, liftIO)
-import Core.System.External (TimeStamp (unTimeStamp), getCurrentTimeNanoseconds)
 import Core.Telemetry.Identifiers
 import Core.Text.Rope
 import Core.Text.Utilities (oxford, quote)
@@ -442,7 +442,7 @@
         datum2 <- readMVar v2
         let datum2' =
                 datum2
-                    { durationFrom = Just (unTimeStamp finish - unTimeStamp start)
+                    { durationFrom = Just (unTime finish - unTime start)
                     }
 
         let tel = telemetryChannelFrom context
@@ -707,7 +707,7 @@
 are designed to be used live; traces and spans should be created in real time
 in your code.
 -}
-setStartTime :: TimeStamp -> Program τ ()
+setStartTime :: Time -> Program τ ()
 setStartTime time = do
     context <- getContext
 
