diff --git a/conf/config.yaml b/conf/config.yaml
index f283bb0e175f5a3f9b1bd1186e3d5246780747b1..019b2da24ce2af409e5667660129818982386b2d 100644
--- a/conf/config.yaml
+++ b/conf/config.yaml
@@ -9,7 +9,7 @@
 :restart_delay: 10
 :address: 0.0.0.0
 :intro_file: intro.txt
-:start_room: 136a3824-e27a-67d0-bfe0-292f070de261
+:start_room: c1551b23-e2ef-628a-a7d9-e76a68d2e789
 :restart_limit: 15
 :mccp: false
 :mssp: false
diff --git a/lib/aethyr/core/components/storage.rb b/lib/aethyr/core/components/storage.rb
index 50c28333a9d17fc145c104545a1da219214e6a7b..de1b36ab8fc0053f39438291fe34f3ea6dddb0b3 100644
--- a/lib/aethyr/core/components/storage.rb
+++ b/lib/aethyr/core/components/storage.rb
@@ -63,17 +63,6 @@ class StorageMachine
       end
     end
 
-    #Yeah, so whatever on this little deal. Probably should do it better later.
-    player.use_color = player.io.display.use_color if player.io
-    player.color_settings = player.io.display.color_settings if player.io
-    player.layout = player.io.display.layout_type if player.io
-
-    #Okay, this is tricky. We can't serialize the IO object stored in the Player
-    #objects. To get around this (we don't want to store it anyhow), we temporarily
-    #set it to nil, then back to whatever it was.
-    player_connection = player.instance_variable_get(:@player)
-    player.instance_variable_set(:@player, nil)
-
     log "Saving player: #{player.name}"
     store_object(player)
 
@@ -82,7 +71,6 @@ class StorageMachine
     end
 
     log "Player saved: #{player.name}"
-    player.instance_variable_set(:@player, player_connection)
   end
 
   #Sets password for a given player. Accepts player name or player object.
@@ -197,6 +185,8 @@ class StorageMachine
   #Warning: this temporarily removes the object's observers.
   def store_object(object)
 
+    volatile_data = object.dehydrate()
+
     if object.is_a? Observable
       observers = object.instance_variable_get(:@observer_peers)
       unless observers.nil?
@@ -225,6 +215,8 @@ class StorageMachine
 
     @saved += 1
 
+    object.rehydrate(volatile_data)
+
     log "Stored #{object} # #{object.game_object_id}", Logger::Ultimate
   end
 
@@ -339,6 +331,9 @@ class StorageMachine
         object.container = ServerConfig.start_room
       end
     end
+
+    object.rehydrate(nil)
+
     return object
   end
 
diff --git a/lib/aethyr/core/objects/game_object.rb b/lib/aethyr/core/objects/game_object.rb
index 4a86b3191fa26adcb0b2fc923af61c4d1142bfff..ecef6a0fb9b24961c1e3d845196264f1856c2869 100644
--- a/lib/aethyr/core/objects/game_object.rb
+++ b/lib/aethyr/core/objects/game_object.rb
@@ -19,6 +19,13 @@ class GameObject < Publisher
   alias :can? :respond_to?
   alias :goid :game_object_id
 
+  @@volatile = []
+
+  def self.volatile(*attrs)
+    @@volatile += attrs
+    @@volatile.uniq!
+  end
+
   #Creates a new GameObject. Most of this long list of parameters is simply ignored at creation time,
   #because they can all be set later.
   def initialize(game_object_id = nil, container = nil, name = "", alt_names = Array.new, short_desc = "Nothing interesting here.", long_desc = "", generic = "", sex = "n", article = "a")
@@ -72,6 +79,23 @@ class GameObject < Publisher
     @admin = false
   end
 
+  # removes all volatle data but provides it as a map for restoration in rehydrate
+  def dehydrate
+    volatile_data = {}
+    @@volatile.each do |attr|
+      volatile_data[attr] = self.instance_variable_get(attr)
+      self.instance_variable_set(attr, nil)
+    end
+    return volatile_data
+  end
+
+  def rehydrate(volatile_data)
+    return if volatile_data.nil?
+    volatile_data.each do |attr, data|
+      self.instance_variable_set(attr, data) if @@volatile.include? attr
+    end
+  end
+
   def flags
     Hash.new @info.flags
   end
diff --git a/lib/aethyr/core/objects/player.rb b/lib/aethyr/core/objects/player.rb
index 885e98100bfc7f9e2eb54b1ca21d54ca3fccc02e..c45f4c01d4b89cbb3c53bfc8fe73e52c84ef6be8 100644
--- a/lib/aethyr/core/objects/player.rb
+++ b/lib/aethyr/core/objects/player.rb
@@ -42,6 +42,7 @@ class Player < LivingObject
 
   attr_reader :admin, :color_settings, :help_library
   attr_accessor :use_color, :reply_to, :page_height
+  volatile :@help_library, :@player
 
   #Create a new player object with the given socket connection. You must also pass in a game_object_id and a room, although if you pass in nil for game_object_id it will auto-generate one for you.
   def initialize(connection, game_object_id, room, *args)
@@ -58,7 +59,8 @@ class Player < LivingObject
     @blind = false
     @reply_to = nil
     @prompt_shown = false
-    @player.display.layout(layout: :basic)
+    @layout = :basic
+    @player.display.layout(layout: @layout)
     @help_library = Aethyr::Core::Help::HelpLibrary.new
 
     info.stats.satiety = 120
@@ -69,6 +71,19 @@ class Player < LivingObject
     map_skill.add_xp 750
   end
 
+  #called right before saving to temporarily remove volatile data.
+  def dehydrate
+    volatile_data = super()
+    @layout = volatile_data[:@player].display.layout_type
+    return volatile_data
+  end
+
+  #This should be called anytime the volatile data needs to be restored or initialized during a save or load
+  def rehydrate(volatile_data)
+    super(volatile_data)
+    @help_library = Aethyr::Core::Help::HelpLibrary.new if @help_library.nil?
+  end
+
   def layout
     return nil if @player.display.nil?
     return @player.display.layout_type