diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee
index 5a04c070d..7c7ead9ea 100644
--- a/app/lib/LevelLoader.coffee
+++ b/app/lib/LevelLoader.coffee
@@ -156,11 +156,9 @@ module.exports = class LevelLoader extends CocoClass
     return if @inLevelEditor
     return unless @level.get('type') is 'hero' and hero = _.find @level.get('thangs'), id: 'Hero Placeholder'
     heroConfig = @session.get('heroConfig')
-    hero.thangType = heroConfig.thangType
-    hero.inventory = heroConfig.inventory  # Will take effect in Level's denormalizeThang
-    hero.placeholderComponents = hero.components  # Will be replaced in Level's denormalizeThang
-    hero.components = []
+    hero.thangType = heroConfig.thangType  # Will mutate the level, but we're okay showing the last-used Hero here
     #hero.id = ... ?  # What do we want to do about this?
+    # Actually, swapping out inventory and placeholder Components is done in Level's denormalizeThang
 
   loadItemThangsEquippedByLevelThang: (levelThang) ->
     return unless levelThang.components
@@ -333,7 +331,7 @@ module.exports = class LevelLoader extends CocoClass
     @initialized = true
     @world = new World()
     @world.levelSessionIDs = if @opponentSessionID then [@sessionID, @opponentSessionID] else [@sessionID]
-    serializedLevel = @level.serialize(@supermodel)
+    serializedLevel = @level.serialize(@supermodel, @session)
     @world.loadFromLevel serializedLevel, false
     console.log 'World has been initialized from level loader.'
 
diff --git a/app/models/Level.coffee b/app/models/Level.coffee
index 27210b1a6..2d4ff0ff3 100644
--- a/app/models/Level.coffee
+++ b/app/models/Level.coffee
@@ -8,8 +8,8 @@ module.exports = class Level extends CocoModel
   @schema: require 'schemas/models/level'
   urlRoot: '/db/level'
 
-  serialize: (supermodel) ->
-    o = @denormalize supermodel
+  serialize: (supermodel, session) ->
+    o = @denormalize supermodel, session
 
     # Figure out Components
     o.levelComponents = _.cloneDeep (lc.attributes for lc in supermodel.getModels LevelComponent)
@@ -28,23 +28,28 @@ module.exports = class Level extends CocoModel
 
     o
 
-  denormalize: (supermodel) ->
+  denormalize: (supermodel, session) ->
     o = $.extend true, {}, @attributes
     if @get('type') is 'hero'
       # TOOD: figure out if/when/how we are doing this for non-Hero levels that aren't expecting denormalization.
       for levelThang in o.thangs
-        @denormalizeThang(levelThang, supermodel)
+        @denormalizeThang(levelThang, supermodel, session)
     o
 
-  denormalizeThang: (levelThang, supermodel) ->
+  denormalizeThang: (levelThang, supermodel, session) ->
     levelThang.components ?= []
     thangType = supermodel.getModelByOriginal(ThangType, levelThang.thangType)
+
+    # Empty out placeholder Components and store their values if we're the hero placeholder.
+    placeholders = {}
+    if levelThang.id is 'Hero Placeholder'
+      for thangComponent in levelThang.components ? []
+        placeholders[thangComponent.original] = thangComponent
+      levelThang.components = []
+
     configs = {}
     for thangComponent in levelThang.components
       configs[thangComponent.original] = thangComponent
-    placeholders = {}
-    for thangComponent in levelThang.placeholderComponents ? []
-      placeholders[thangComponent.original] = thangComponent
 
     for defaultThangComponent in thangType.get('components')
       if levelThangComponent = configs[defaultThangComponent.original]
@@ -70,9 +75,9 @@ module.exports = class Level extends CocoModel
           copy = $.extend true, {}, placeholderConfig
           levelThangComponent.config = _.merge copy, levelThangComponent.config
 
-    if levelThang.inventory and equips = _.find levelThang.components, {original: LevelComponent.EquipsID}
-      # inventory is assigned from the LevelSession in LevelLoader's populateHero
-      equips.config.inventory = $.extend true, {}, levelThang.inventory
+    if levelThang.id is 'Hero Placeholder' and equips = _.find levelThang.components, {original: LevelComponent.EquipsID}
+      inventory = session?.get('heroConfig')?.inventory
+      equips.config.inventory = $.extend true, {}, inventory if inventory
 
 
   sortSystems: (levelSystems, systemModels) ->
diff --git a/app/views/play/SpectateView.coffee b/app/views/play/SpectateView.coffee
index 1cea2b868..bda2cce7e 100644
--- a/app/views/play/SpectateView.coffee
+++ b/app/views/play/SpectateView.coffee
@@ -90,7 +90,7 @@ module.exports = class SpectateLevelView extends RootView
     application.router.navigate "/play?not_found=#{@levelID}", {trigger: true}
 
   setLevel: (@level, @supermodel) ->
-    serializedLevel = @level.serialize @supermodel
+    serializedLevel = @level.serialize @supermodel, @session
     @god?.setLevel serializedLevel
     if @world
       @world.loadFromLevel serializedLevel, false
@@ -155,7 +155,7 @@ module.exports = class SpectateLevelView extends RootView
     #at this point, all requisite data is loaded, and sessions are not denormalized
     team = @world.teamForPlayer(0)
     @loadOpponentTeam(team)
-    @god.setLevel @level.serialize @supermodel
+    @god.setLevel @level.serialize @supermodel, @session
     @god.setLevelSessionIDs if @otherSession then [@session.id, @otherSession.id] else [@session.id]
     @god.setWorldClassMap @world.classMap
     @setTeam team
diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee
index 391c99f4c..604625705 100644
--- a/app/views/play/level/PlayLevelView.coffee
+++ b/app/views/play/level/PlayLevelView.coffee
@@ -104,7 +104,7 @@ module.exports = class PlayLevelView extends RootView
     @supermodel.collections = givenSupermodel.collections
     @supermodel.shouldSaveBackups = givenSupermodel.shouldSaveBackups
 
-    serializedLevel = @level.serialize @supermodel
+    serializedLevel = @level.serialize @supermodel, @session
     @god?.setLevel serializedLevel
     if @world
       @world.loadFromLevel serializedLevel, false
@@ -213,7 +213,7 @@ module.exports = class PlayLevelView extends RootView
       @session.set 'multiplayer', false
 
   setupGod: ->
-    @god.setLevel @level.serialize @supermodel
+    @god.setLevel @level.serialize @supermodel, @session
     @god.setLevelSessionIDs if @otherSession then [@session.id, @otherSession.id] else [@session.id]
     @god.setWorldClassMap @world.classMap