diff --git a/library/Rattletrap/Attribute/Loadout.hs b/library/Rattletrap/Attribute/Loadout.hs
--- a/library/Rattletrap/Attribute/Loadout.hs
+++ b/library/Rattletrap/Attribute/Loadout.hs
@@ -11,10 +11,14 @@
   , loadoutAttributeDecal :: Word32
   , loadoutAttributeWheels :: Word32
   , loadoutAttributeRocketTrail :: Word32
+  -- ^ Now known as "rocket boost".
   , loadoutAttributeAntenna :: Word32
   , loadoutAttributeTopper :: Word32
   , loadoutAttributeUnknown1 :: Word32
   , loadoutAttributeUnknown2 :: Maybe Word32
+  , loadoutAttributeEngineAudio :: Maybe Word32
+  , loadoutAttributeTrail :: Maybe Word32
+  , loadoutAttributeGoalExplosion :: Maybe Word32
   } deriving (Eq, Ord, Show)
 
 getLoadoutAttribute :: BinaryBit.BitGet LoadoutAttribute
@@ -26,16 +30,34 @@
   rocketTrail <- getWord32Bits
   antenna <- getWord32Bits
   topper <- getWord32Bits
-  g <- getWord32Bits
-  h <-
-    if version > Word8 10
-      then do
-        h <- getWord32Bits
-        pure (Just h)
-      else pure Nothing
+  unknown1 <- getWord32Bits
+  unknown2 <- getOptional (version > Word8 10) getWord32Bits
+  engineAudio <- getOptional (version >= Word8 16) getWord32Bits
+  trail <- getOptional (version >= Word8 16) getWord32Bits
+  goalExplosion <- getOptional (version >= Word8 16) getWord32Bits
   pure
-    (LoadoutAttribute version body decal wheels rocketTrail antenna topper g h)
+    (LoadoutAttribute
+       version
+       body
+       decal
+       wheels
+       rocketTrail
+       antenna
+       topper
+       unknown1
+       unknown2
+       engineAudio
+       trail
+       goalExplosion)
 
+getOptional :: Bool -> BinaryBit.BitGet a -> BinaryBit.BitGet (Maybe a)
+getOptional p f =
+  if p
+    then do
+      x <- f
+      pure (Just x)
+    else pure Nothing
+
 putLoadoutAttribute :: LoadoutAttribute -> BinaryBit.BitPut ()
 putLoadoutAttribute loadoutAttribute = do
   putWord8Bits (loadoutAttributeVersion loadoutAttribute)
@@ -46,6 +68,13 @@
   putWord32Bits (loadoutAttributeAntenna loadoutAttribute)
   putWord32Bits (loadoutAttributeTopper loadoutAttribute)
   putWord32Bits (loadoutAttributeUnknown1 loadoutAttribute)
-  case loadoutAttributeUnknown2 loadoutAttribute of
+  putOptional (loadoutAttributeUnknown2 loadoutAttribute) putWord32Bits
+  putOptional (loadoutAttributeEngineAudio loadoutAttribute) putWord32Bits
+  putOptional (loadoutAttributeTrail loadoutAttribute) putWord32Bits
+  putOptional (loadoutAttributeGoalExplosion loadoutAttribute) putWord32Bits
+
+putOptional :: Maybe a -> (a -> BinaryBit.BitPut ()) -> BinaryBit.BitPut ()
+putOptional m f =
+  case m of
+    Just x -> f x
     Nothing -> pure ()
-    Just x -> putWord32Bits x
diff --git a/library/Rattletrap/Header.hs b/library/Rattletrap/Header.hs
--- a/library/Rattletrap/Header.hs
+++ b/library/Rattletrap/Header.hs
@@ -13,6 +13,8 @@
   -- ^ The "major" version number.
   , headerLicenseeVersion :: Word32
   -- ^ The "minor" version number.
+  , headerPatchVersion :: Maybe Word32
+  -- ^ The "patch" version number.
   , headerLabel :: Text
   -- ^ Always @TAGame.Replay_Soccar_TA@.
   , headerProperties :: Dictionary Property
@@ -56,14 +58,29 @@
 getHeader = do
   engineVersion <- getWord32
   licenseeVersion <- getWord32
+  patchVersion <- getPatchVersion engineVersion licenseeVersion
   label <- getText
   properties <- getDictionary getProperty
-  pure (Header engineVersion licenseeVersion label properties)
+  pure (Header engineVersion licenseeVersion patchVersion label properties)
 
+getPatchVersion :: Word32 -> Word32 -> Binary.Get (Maybe Word32)
+getPatchVersion major minor =
+  if hasPatchVersion major minor
+    then do
+      patchVersion <- getWord32
+      pure (Just patchVersion)
+    else pure Nothing
+
+hasPatchVersion :: Word32 -> Word32 -> Bool
+hasPatchVersion major minor = major >= Word32 868 && minor >= Word32 18
+
 putHeader :: Header -> Binary.Put
 putHeader header = do
   putWord32 (headerEngineVersion header)
   putWord32 (headerLicenseeVersion header)
+  case headerPatchVersion header of
+    Nothing -> pure ()
+    Just patchVersion -> putWord32 patchVersion
   putText (headerLabel header)
   putDictionary putProperty (headerProperties header)
 
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -57,4 +57,4 @@
     - -with-rtsopts=-N
     main: Main.hs
     source-dirs: tests
-version: '2.2.4'
+version: '2.3.0'
diff --git a/rattletrap.cabal b/rattletrap.cabal
--- a/rattletrap.cabal
+++ b/rattletrap.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           rattletrap
-version:        2.2.4
+version:        2.3.0
 synopsis:       Parse and generate Rocket League replays.
 description:    Rattletrap parses and generates Rocket League replays.
 category:       Game
@@ -24,6 +24,7 @@
     replays/0AD21FEE4A512906BEB6C98136AAF49A.replay
     replays/1205D96C4D819800927791820096CD49.replay
     replays/160CA83E41083BFD8E6315B4BFCA0561.replay
+    replays/16D580EF479483E015207C901776F9FB.replay
     replays/18D6738D415B70B5BE4C299588D3C141.replay
     replays/1A126AC24CAA0DB0E98835BD960B8AF8.replay
     replays/1AE415514DFC65DCBF8B8391AD35488D.replay
diff --git a/replays/16D580EF479483E015207C901776F9FB.replay b/replays/16D580EF479483E015207C901776F9FB.replay
new file mode 100644
Binary files /dev/null and b/replays/16D580EF479483E015207C901776F9FB.replay differ
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -45,6 +45,7 @@
   , ("0AD21FEE4A512906BEB6C98136AAF49A", "some Latin-1 text")
   , ("1205D96C4D819800927791820096CD49", "rumble mode")
   , ("160CA83E41083BFD8E6315B4BFCA0561", "a dedicated server IP")
+  , ("16D580EF479483E015207C901776F9FB", "new property types")
   , ("18D6738D415B70B5BE4C299588D3C141", "an online loadout attribute")
   , ("1A126AC24CAA0DB0E98835BD960B8AF8", "overtime")
   , ("1AE415514DFC65DCBF8B8391AD35488D", "a game time")
