diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -11,8 +11,8 @@
 can be used to modify replays in order to force everyone into the same car or
 change the map a game was played on.
 
-Rattletrap supports every version of Rocket League up to [1.62][], also known
-as the "esports shop update". If a replay can be played by the Rocket League
+Rattletrap supports every version of Rocket League up to [1.66][], also known
+as the "season 12 update". If a replay can be played by the Rocket League
 client, it can be parsed by Rattletrap. (If not, that's a bug. Please report
 it!)
 
@@ -51,8 +51,11 @@
 Rattletrap is a command line application.
 
 ``` sh
-> rattletrap --help
-rattletrap.EXE version 8.0.0
+$ rattletrap --help
+```
+
+```
+rattletrap version 9.0.1
   -c           --compact         minify JSON output
   -f           --fast            only encode or decode the header
   -h           --help            show the help
@@ -68,23 +71,23 @@
 `encode`.
 
 Input extension | Output extension | Mode
---- | --- | ---
-`.replay` | anything | `decode` (parse)
-`.json` | anything | `encode` (generate)
-anything | `.replay` | `encode` (generate)
-anything | `.json` | `decode` (parse)
-anything | anything | `decode` (parse)
+---             | ---              | ---
+`.replay`       | anything         | `decode` (parse)
+`.json`         | anything         | `encode` (generate)
+anything        | `.replay`        | `encode` (generate)
+anything        | `.json`          | `decode` (parse)
+anything        | anything         | `decode` (parse)
 
 ## Parse
 
 Rattletrap can parse (decode) Rocket League replays and output them as JSON.
 
 ``` sh
-> rattletrap --input http://example.com/input.replay --output output.json
+$ rattletrap --input http://example.com/input.replay --output output.json
 # or
-> rattletrap -i input.replay -o output.json
+$ rattletrap -i input.replay -o output.json
 # or
-> rattletrap < input.replay > output.json
+$ rattletrap < input.replay > output.json
 ```
 
 The input argument can either be a local path or a URL.
@@ -99,11 +102,11 @@
 Rattletrap can also generate (encode) Rocket League replays from JSON files.
 
 ``` sh
-> rattletrap --input http://example.com/input.json --output output.replay
+$ rattletrap --input http://example.com/input.json --output output.replay
 # or
-> rattletrap -i input.json -o output.replay
+$ rattletrap -i input.json -o output.replay
 # or
-> rattletrap --mode encode < input.json > output.replay
+$ rattletrap --mode encode < input.json > output.replay
 ```
 
 The input argument can either be a local path or a URL.
@@ -117,7 +120,7 @@
 used to modify replays.
 
 ``` sh
-> rattletrap -i input.replay |
+$ rattletrap -i input.replay |
   modify-replay-json |
   rattletrap -o output.replay
 ```
@@ -132,7 +135,7 @@
 [Docker build badge]: https://img.shields.io/docker/build/taylorfausak/rattletrap.svg?label=docker&logo=docker&logoColor=white
 [docker build]: https://hub.docker.com/r/taylorfausak/rattletrap
 [Rocket League]: https://www.rocketleague.com
-[1.62]: https://www.rocketleague.com/news/patch-notes-v1-62/
+[1.66]: https://www.rocketleague.com/news/patch-notes-v1-66-season-12-update-/
 [Ball Chasing]: https://ballchasing.com
 [Haskell]: https://www.haskell.org
 [C# parser]: https://github.com/jjbott/RocketLeagueReplayParser
diff --git a/library/Rattletrap/Data.hs b/library/Rattletrap/Data.hs
--- a/library/Rattletrap/Data.hs
+++ b/library/Rattletrap/Data.hs
@@ -59,6 +59,7 @@
   , ("TAGame.SpecialPickup_TA", "TAGame.CarComponent_TA")
   , ("TAGame.SpecialPickup_Targeted_TA", "TAGame.SpecialPickup_TA")
   , ("TAGame.SpecialPickup_Tornado_TA", "TAGame.SpecialPickup_TA")
+  , ("TAGame.SpecialPickup_HauntedBallBeam_TA", "TAGame.SpecialPickup_TA")
   , ("TAGame.Team_Soccar_TA", "TAGame.Team_TA")
   , ("TAGame.Team_TA", "Engine.TeamInfo")
   , ("TAGame.Vehicle_TA", "TAGame.RBActor_TA")
@@ -69,10 +70,23 @@
 rawClassesWithLocation :: [String]
 rawClassesWithLocation =
   [ "TAGame.Ball_Breakout_TA"
+  , "Archetypes.Ball.Ball_Breakout"
   , "TAGame.Ball_TA"
-  , "TAGame.CameraSettingsActor_TA"
+  , "Archetypes.Ball.Ball_BasketBall_Mutator"
+  , "Archetypes.Ball.Ball_BasketBall"
+  , "Archetypes.Ball.Ball_Basketball"
+  , "Archetypes.Ball.Ball_Default"
+  , "Archetypes.Ball.Ball_Puck"
+  , "Archetypes.Ball.CubeBall"
+  , "Archetypes.Ball.Ball_Haunted"
+  , "TAGame.Ball_Haunted_TA"
   , "TAGame.Car_Season_TA"
   , "TAGame.Car_TA"
+  , "Archetypes.Car.Car_Default"
+  , "Archetypes.GameEvent.GameEvent_Season:CarArchetype"
+  , "Archetypes.SpecialPickups.SpecialPickup_HauntedBallBeam"
+  , "Archetypes.SpecialPickups.SpecialPickup_Rugby"
+  , "TAGame.CameraSettingsActor_TA"
   , "TAGame.CarComponent_Boost_TA"
   , "TAGame.CarComponent_Dodge_TA"
   , "TAGame.CarComponent_DoubleJump_TA"
@@ -96,14 +110,36 @@
   , "TAGame.SpecialPickup_Swapper_TA"
   , "TAGame.SpecialPickup_Tornado_TA"
   , "TAGame.Team_Soccar_TA"
+  , "TAGame.Default__CameraSettingsActor_TA"
+  , "TAGame.Default__PRI_TA"
+  , "TheWorld:PersistentLevel.BreakOutActor_Platform_TA"
+  , "TheWorld:PersistentLevel.CrowdActor_TA"
+  , "TheWorld:PersistentLevel.CrowdManager_TA"
+  , "TheWorld:PersistentLevel.InMapScoreboard_TA"
+  , "TheWorld:PersistentLevel.VehiclePickup_Boost_TA"
+  , "TAGame.HauntedBallTrapTrigger_TA"
+  , "ProjectX.NetModeReplicator"
   ]
 
 rawClassesWithRotation :: [String]
 rawClassesWithRotation =
   [ "TAGame.Ball_Breakout_TA"
+  , "Archetypes.Ball.Ball_Breakout"
   , "TAGame.Ball_TA"
+  , "Archetypes.Ball.Ball_BasketBall_Mutator"
+  , "Archetypes.Ball.Ball_BasketBall"
+  , "Archetypes.Ball.Ball_Basketball"
+  , "Archetypes.Ball.Ball_Default"
+  , "Archetypes.Ball.Ball_Puck"
+  , "Archetypes.Ball.CubeBall"
+  , "Archetypes.Ball.Ball_Haunted"
+  , "TAGame.Ball_Haunted_TA"
   , "TAGame.Car_Season_TA"
   , "TAGame.Car_TA"
+  , "Archetypes.Car.Car_Default"
+  , "Archetypes.GameEvent.GameEvent_Season:CarArchetype"
+  , "Archetypes.SpecialPickups.SpecialPickup_HauntedBallBeam"
+  , "Archetypes.SpecialPickups.SpecialPickup_Rugby"
   -- This comments forces Brittany to use a multi-line layout for this list.
   ]
 
@@ -112,8 +148,10 @@
   [ ("Archetypes.Ball.Ball_BasketBall_Mutator", "TAGame.Ball_TA")
   , ("Archetypes.Ball.Ball_Basketball", "TAGame.Ball_TA")
   , ("Archetypes.Ball.Ball_BasketBall", "TAGame.Ball_TA")
+  , ("Archetypes.Ball.Ball_Beachball", "TAGame.Ball_TA")
   , ("Archetypes.Ball.Ball_Breakout", "TAGame.Ball_Breakout_TA")
   , ("Archetypes.Ball.Ball_Default", "TAGame.Ball_TA")
+  , ("Archetypes.Ball.Ball_Haunted", "TAGame.Ball_Haunted_TA")
   , ("Archetypes.Ball.Ball_Puck", "TAGame.Ball_TA")
   , ("Archetypes.Ball.CubeBall", "TAGame.Ball_TA")
   , ("Archetypes.Car.Car_Default", "TAGame.Car_TA")
@@ -148,6 +186,8 @@
   , ("Archetypes.SpecialPickups.SpecialPickup_StrongHit", "TAGame.SpecialPickup_HitForce_TA")
   , ("Archetypes.SpecialPickups.SpecialPickup_Swapper", "TAGame.SpecialPickup_Swapper_TA")
   , ("Archetypes.SpecialPickups.SpecialPickup_Tornado", "TAGame.SpecialPickup_Tornado_TA")
+  , ("Archetypes.SpecialPickups.SpecialPickup_HauntedBallBeam", "TAGame.SpecialPickup_HauntedBallBeam_TA")
+  , ("Archetypes.SpecialPickups.SpecialPickup_Rugby", "TAGame.SpecialPickup_Rugby_TA")
   , ("Archetypes.Teams.Team0", "TAGame.Team_Soccar_TA")
   , ("Archetypes.Teams.Team1", "TAGame.Team_Soccar_TA")
   , ("GameInfo_Basketball.GameInfo.GameInfo_Basketball:GameReplicationInfoArchetype", "TAGame.GRI_TA")
@@ -156,6 +196,7 @@
   , ("GameInfo_Items.GameInfo.GameInfo_Items:GameReplicationInfoArchetype", "TAGame.GRI_TA")
   , ("GameInfo_Season.GameInfo.GameInfo_Season:GameReplicationInfoArchetype", "TAGame.GRI_TA")
   , ("GameInfo_Soccar.GameInfo.GameInfo_Soccar:GameReplicationInfoArchetype", "TAGame.GRI_TA")
+  , ("ProjectX.Default__NetModeReplicator_X", "ProjectX.NetModeReplicator")
   , ("TAGame.Default__CameraSettingsActor_TA", "TAGame.CameraSettingsActor_TA")
   , ("TAGame.Default__PRI_TA", "TAGame.PRI_TA")
   , ("TheWorld:PersistentLevel.BreakOutActor_Platform_TA", "TAGame.BreakOutActor_Platform_TA")
@@ -163,6 +204,8 @@
   , ("TheWorld:PersistentLevel.CrowdManager_TA", "TAGame.CrowdManager_TA")
   , ("TheWorld:PersistentLevel.InMapScoreboard_TA", "TAGame.InMapScoreboard_TA")
   , ("TheWorld:PersistentLevel.VehiclePickup_Boost_TA", "TAGame.VehiclePickup_Boost_TA")
+  , ("Haunted_TrainStation_P.TheWorld:PersistentLevel.HauntedBallTrapTrigger_TA_1", "TAGame.HauntedBallTrapTrigger_TA")
+  , ("Haunted_TrainStation_P.TheWorld:PersistentLevel.HauntedBallTrapTrigger_TA_0", "TAGame.HauntedBallTrapTrigger_TA")
   ]
 
 rawAttributeTypes :: [(String, AttributeType)]
@@ -297,15 +340,16 @@
   , ("TAGame.PRI_TA:PersistentCamera", AttributeTypeFlaggedInt)
   , ("TAGame.PRI_TA:PlayerHistoryKey", AttributeTypePlayerHistoryKey)
   , ("TAGame.PRI_TA:PlayerHistoryValid", AttributeTypeBoolean)
-  , ("TAGame.PRI_TA:PrimaryTitle", AttributeTypeTitle)
   , ("TAGame.PRI_TA:ReplicatedGameEvent", AttributeTypeFlaggedInt)
   , ("TAGame.PRI_TA:ReplicatedWorstNetQualityBeyondLatency", AttributeTypeByte)
-  , ("TAGame.PRI_TA:SecondaryTitle", AttributeTypeTitle)
-  , ("TAGame.PRI_TA:SpectatorShortcut", AttributeTypeInt)
   , ("TAGame.PRI_TA:SteeringSensitivity", AttributeTypeFloat)
+  , ("TAGame.PRI_TA:SkillTier", AttributeTypeFlaggedByte)
   , ("TAGame.PRI_TA:TimeTillItem", AttributeTypeInt)
   , ("TAGame.PRI_TA:Title", AttributeTypeInt)
   , ("TAGame.PRI_TA:TotalXP", AttributeTypeInt)
+  , ("TAGame.PRI_TA:PrimaryTitle", AttributeTypeTitle)
+  , ("TAGame.PRI_TA:SecondaryTitle", AttributeTypeTitle)
+  , ("TAGame.PRI_TA:SpectatorShortcut", AttributeTypeInt)
   , ("TAGame.RBActor_TA:bFrozen", AttributeTypeBoolean)
   , ("TAGame.RBActor_TA:bIgnoreSyncing", AttributeTypeBoolean)
   , ("TAGame.RBActor_TA:bReplayActor", AttributeTypeBoolean)
@@ -329,6 +373,12 @@
   , ("TAGame.Vehicle_TA:ReplicatedThrottle", AttributeTypeByte)
   , ("TAGame.VehiclePickup_TA:bNoPickup", AttributeTypeBoolean)
   , ("TAGame.VehiclePickup_TA:ReplicatedPickupData", AttributeTypePickup)
+  , ("TAGame.Ball_Haunted_TA:LastTeamTouch", AttributeTypeByte)
+  , ("TAGame.Ball_Haunted_TA:TotalActiveBeams", AttributeTypeByte)
+  , ("TAGame.Ball_Haunted_TA:DeactivatedGoalIndex", AttributeTypeByte)
+  , ("TAGame.Ball_Haunted_TA:ReplicatedBeamBrokenValue", AttributeTypeByte)
+  , ("TAGame.Ball_Haunted_TA:bIsBallBeamed", AttributeTypeBoolean)
+  , ("TAGame.SpecialPickup_Rugby_TA:bBallWelded", AttributeTypeBoolean)
   ]
 
 rawCrc32Table :: Integral a => [a]
diff --git a/library/Rattletrap/Decode/AttributeValue.hs b/library/Rattletrap/Decode/AttributeValue.hs
--- a/library/Rattletrap/Decode/AttributeValue.hs
+++ b/library/Rattletrap/Decode/AttributeValue.hs
@@ -17,6 +17,7 @@
 import Rattletrap.Decode.ExplosionAttribute
 import Rattletrap.Decode.ExtendedExplosionAttribute
 import Rattletrap.Decode.FlaggedIntAttribute
+import Rattletrap.Decode.FlaggedByteAttribute
 import Rattletrap.Decode.FloatAttribute
 import Rattletrap.Decode.GameModeAttribute
 import Rattletrap.Decode.Int64Attribute
@@ -76,6 +77,8 @@
       <$> decodeExtendedExplosionAttributeBits version
     AttributeTypeFlaggedInt ->
       AttributeValueFlaggedInt <$> decodeFlaggedIntAttributeBits
+    AttributeTypeFlaggedByte ->
+      AttributeValueFlaggedByte <$> decodeFlaggedByteAttributeBits
     AttributeTypeFloat -> AttributeValueFloat <$> decodeFloatAttributeBits
     AttributeTypeGameMode ->
       AttributeValueGameMode <$> decodeGameModeAttributeBits version
diff --git a/library/Rattletrap/Decode/FlaggedByteAttribute.hs b/library/Rattletrap/Decode/FlaggedByteAttribute.hs
new file mode 100644
--- /dev/null
+++ b/library/Rattletrap/Decode/FlaggedByteAttribute.hs
@@ -0,0 +1,12 @@
+module Rattletrap.Decode.FlaggedByteAttribute
+  ( decodeFlaggedByteAttributeBits
+  )
+where
+
+import Rattletrap.Decode.Common
+import Rattletrap.Decode.Word8le
+import Rattletrap.Type.FlaggedByteAttribute
+
+
+decodeFlaggedByteAttributeBits :: DecodeBits FlaggedByteAttribute
+decodeFlaggedByteAttributeBits = FlaggedByteAttribute <$> getBool <*> decodeWord8leBits
diff --git a/library/Rattletrap/Encode/AttributeValue.hs b/library/Rattletrap/Encode/AttributeValue.hs
--- a/library/Rattletrap/Encode/AttributeValue.hs
+++ b/library/Rattletrap/Encode/AttributeValue.hs
@@ -14,6 +14,7 @@
 import Rattletrap.Encode.ExplosionAttribute
 import Rattletrap.Encode.ExtendedExplosionAttribute
 import Rattletrap.Encode.FlaggedIntAttribute
+import Rattletrap.Encode.FlaggedByteAttribute
 import Rattletrap.Encode.FloatAttribute
 import Rattletrap.Encode.GameModeAttribute
 import Rattletrap.Encode.Int64Attribute
@@ -54,6 +55,7 @@
   AttributeValueExplosion x -> putExplosionAttribute x
   AttributeValueExtendedExplosion x -> putExtendedExplosionAttribute x
   AttributeValueFlaggedInt x -> putFlaggedIntAttribute x
+  AttributeValueFlaggedByte x -> putFlaggedByteAttribute x
   AttributeValueFloat x -> putFloatAttribute x
   AttributeValueGameMode x -> putGameModeAttribute x
   AttributeValueInt x -> putIntAttribute x
diff --git a/library/Rattletrap/Encode/FlaggedByteAttribute.hs b/library/Rattletrap/Encode/FlaggedByteAttribute.hs
new file mode 100644
--- /dev/null
+++ b/library/Rattletrap/Encode/FlaggedByteAttribute.hs
@@ -0,0 +1,14 @@
+module Rattletrap.Encode.FlaggedByteAttribute
+  ( putFlaggedByteAttribute
+  )
+where
+
+import Rattletrap.Encode.Word8le
+import Rattletrap.Type.FlaggedByteAttribute
+
+import qualified Data.Binary.Bits.Put as BinaryBits
+
+putFlaggedByteAttribute :: FlaggedByteAttribute -> BinaryBits.BitPut ()
+putFlaggedByteAttribute flaggedByteAttribute = do
+  BinaryBits.putBool (flaggedByteAttributeFlag flaggedByteAttribute)
+  putWord8Bits (flaggedByteAttributeByte flaggedByteAttribute)
diff --git a/library/Rattletrap/Type/AttributeType.hs b/library/Rattletrap/Type/AttributeType.hs
--- a/library/Rattletrap/Type/AttributeType.hs
+++ b/library/Rattletrap/Type/AttributeType.hs
@@ -19,6 +19,7 @@
   | AttributeTypeExplosion
   | AttributeTypeExtendedExplosion
   | AttributeTypeFlaggedInt
+  | AttributeTypeFlaggedByte
   | AttributeTypeFloat
   | AttributeTypeGameMode
   | AttributeTypeInt
diff --git a/library/Rattletrap/Type/AttributeValue.hs b/library/Rattletrap/Type/AttributeValue.hs
--- a/library/Rattletrap/Type/AttributeValue.hs
+++ b/library/Rattletrap/Type/AttributeValue.hs
@@ -17,6 +17,7 @@
 import Rattletrap.Type.ExplosionAttribute
 import Rattletrap.Type.ExtendedExplosionAttribute
 import Rattletrap.Type.FlaggedIntAttribute
+import Rattletrap.Type.FlaggedByteAttribute
 import Rattletrap.Type.FloatAttribute
 import Rattletrap.Type.GameModeAttribute
 import Rattletrap.Type.Int64Attribute
@@ -53,6 +54,7 @@
   | AttributeValueExplosion ExplosionAttribute
   | AttributeValueExtendedExplosion ExtendedExplosionAttribute
   | AttributeValueFlaggedInt FlaggedIntAttribute
+  | AttributeValueFlaggedByte FlaggedByteAttribute
   | AttributeValueFloat FloatAttribute
   | AttributeValueGameMode GameModeAttribute
   | AttributeValueInt IntAttribute
diff --git a/library/Rattletrap/Type/FlaggedByteAttribute.hs b/library/Rattletrap/Type/FlaggedByteAttribute.hs
new file mode 100644
--- /dev/null
+++ b/library/Rattletrap/Type/FlaggedByteAttribute.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module Rattletrap.Type.FlaggedByteAttribute
+  ( FlaggedByteAttribute(..)
+  )
+where
+
+import Rattletrap.Type.Common
+import Rattletrap.Type.Word8le
+
+data FlaggedByteAttribute = FlaggedByteAttribute
+  { flaggedByteAttributeFlag :: Bool
+  , flaggedByteAttributeByte :: Word8le
+  } deriving (Eq, Ord, Show)
+
+$(deriveJson ''FlaggedByteAttribute)
diff --git a/rattletrap.cabal b/rattletrap.cabal
--- a/rattletrap.cabal
+++ b/rattletrap.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name: rattletrap
-version: 9.0.1
+version: 9.0.2
 
 category: Game
 description: Rattletrap parses and generates Rocket League replays.
@@ -78,6 +78,7 @@
     Rattletrap.Decode.ExplosionAttribute
     Rattletrap.Decode.ExtendedExplosionAttribute
     Rattletrap.Decode.FlaggedIntAttribute
+    Rattletrap.Decode.FlaggedByteAttribute
     Rattletrap.Decode.Float32le
     Rattletrap.Decode.FloatAttribute
     Rattletrap.Decode.Frame
@@ -152,6 +153,7 @@
     Rattletrap.Encode.ExplosionAttribute
     Rattletrap.Encode.ExtendedExplosionAttribute
     Rattletrap.Encode.FlaggedIntAttribute
+    Rattletrap.Encode.FlaggedByteAttribute
     Rattletrap.Encode.Float32le
     Rattletrap.Encode.FloatAttribute
     Rattletrap.Encode.Frame
@@ -228,6 +230,7 @@
     Rattletrap.Type.ExplosionAttribute
     Rattletrap.Type.ExtendedExplosionAttribute
     Rattletrap.Type.FlaggedIntAttribute
+    Rattletrap.Type.FlaggedByteAttribute
     Rattletrap.Type.Float32le
     Rattletrap.Type.FloatAttribute
     Rattletrap.Type.Frame
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -95,7 +95,8 @@
 
 replays :: [(String, String)]
 replays =
-  [ ("0008", "a flip time")
+  [ ("21a8", "v1.66")
+  , ("0008", "a flip time")
   , ("000b", "nintendo switch")
   , ("07e9", "a game mode before Neo Tokyo")
   , ("0ad2", "some Latin-1 text")
