diff --git a/library/Octane/Type/Replay.hs b/library/Octane/Type/Replay.hs
--- a/library/Octane/Type/Replay.hs
+++ b/library/Octane/Type/Replay.hs
@@ -526,7 +526,14 @@
 toLoadoutOnline x =
   Value.LoadoutOnlineValue
     (map
-       (map (\(k, v) -> (toWord32 k, toCompressedWord v)))
+       (map (\ y ->
+        ( y & Rattletrap.productAttributeObjectId & toWord32
+        , y
+          & Rattletrap.productAttributeValue
+          & maybe (CompressedWord.CompressedWord 0 0) (either
+            toCompressedWord
+            (\ z -> z & fromIntegral & CompressedWord.CompressedWord 0))
+        )))
        (Rattletrap.loadoutAttributeValue x))
 
 toRemoteId :: Rattletrap.RemoteId -> RemoteId.RemoteId
diff --git a/octane.cabal b/octane.cabal
--- a/octane.cabal
+++ b/octane.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           octane
-version:        0.20.2
+version:        0.20.3
 synopsis:       Parse Rocket League replays.
 description:    Octane parses Rocket League replays.
 category:       Game
@@ -41,7 +41,7 @@
     , data-default-class <0.2
     , file-embed ==0.0.*
     , overloaded-records ==0.4.*
-    , rattletrap ==2.*
+    , rattletrap ==3.*
     , text ==1.2.*
   exposed-modules:
       Octane
@@ -122,12 +122,19 @@
   main-is: Main.hs
   hs-source-dirs:
       executable
-  ghc-options: -Wall -rtsopts -threaded -with-rtsopts=-N
+  ghc-options: -Wall -rtsopts -threaded
   build-depends:
-      aeson
-    , base
-    , binary
-    , bytestring
+      aeson >=0.11 && <1.3
+    , base >=4.9 && <4.11
+    , bimap ==0.3.*
+    , binary ==0.8.*
+    , bytestring ==0.10.*
+    , containers ==0.5.*
+    , data-default-class <0.2
+    , file-embed ==0.0.*
+    , overloaded-records ==0.4.*
+    , rattletrap ==3.*
+    , text ==1.2.*
     , http-client >=0.4.30 && <0.6
     , http-client-tls >=0.2 && <0.4
     , octane
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,31 +1,21 @@
+name: octane
+version: 0.20.3
+
 category: Game
 description: Octane parses Rocket League replays.
-executables:
-  octane:
-    dependencies:
-    - aeson
-    - base
-    - binary
-    - bytestring
-    - http-client >=0.4.30 && <0.6
-    - http-client-tls >=0.2 && <0.4
-    - octane
-    ghc-options:
-    - -rtsopts
-    - -threaded
-    - -with-rtsopts=-N
-    main: Main.hs
-    source-dirs: executable
 extra-source-files:
-- CHANGELOG.markdown
-- data/*.json
-- package.yaml
-- README.markdown
-- stack.yaml
-ghc-options: -Wall
+  - CHANGELOG.markdown
+  - data/*.json
+  - package.yaml
+  - README.markdown
+  - stack.yaml
 github: tfausak/octane
-library:
-  dependencies:
+license: MIT
+license-file: LICENSE.markdown
+maintainer: Taylor Fausak
+synopsis: Parse Rocket League replays.
+
+dependencies:
   - aeson >=0.11 && <1.3
   - base >=4.9 && <4.11
   - bimap ==0.3.*
@@ -35,13 +25,23 @@
   - data-default-class <0.2
   - file-embed ==0.0.*
   - overloaded-records ==0.4.*
-  - rattletrap ==2.*
+  - rattletrap ==3.*
   - text ==1.2.*
+ghc-options:
+  - -Wall
+
+library:
   other-modules: Paths_octane
   source-dirs: library
-license: MIT
-license-file: LICENSE.markdown
-maintainer: Taylor Fausak
-name: octane
-synopsis: Parse Rocket League replays.
-version: '0.20.2'
+
+executables:
+  octane:
+    dependencies:
+      - http-client >=0.4.30 && <0.6
+      - http-client-tls >=0.2 && <0.4
+      - octane
+    ghc-options:
+      - -rtsopts
+      - -threaded
+    main: Main.hs
+    source-dirs: executable
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,3 +1,3 @@
+resolver: lts-9.0
 extra-deps:
-- rattletrap-2.5.0
-resolver: lts-8.0
+  - rattletrap-3.0.0
