     }
 
     /**
-     * Clean up after a few things when we depart from a scene.
-     */
-    protected function handleDeparture () :void
-    {
-        // clear out our last known location id
-        _location = null;
+     * Called when we move from one scene to another, or to a non-scene.
+     */
+    protected function handleSceneChange (plobj :PlaceObject) :void
+    {
+        // determine our location in the new scene if we have one
+        var scloc :SceneLocation = null;
+        var ssobj :SpotSceneObject = (plobj as SpotSceneObject);
+        if (ssobj != null) {
+            scloc = ssobj.occupantLocs.get((_self as BodyObject).getOid()) as SceneLocation;
+        }
+        _location = (scloc == null) ? null : scloc.loc;
     }
 
     /**

import com.threerings.crowd.chat.data.ChatCodes;
import com.threerings.crowd.client.LocationAdapter;
import com.threerings.crowd.client.LocationDirector;
import com.threerings.crowd.data.PlaceObject;

import com.threerings.whirled.client.SceneDirector;
import com.threerings.whirled.data.SceneModel;
import com.threerings.whirled.data.ScenedBodyObject;
import com.threerings.whirled.util.WhirledContext;

import com.threerings.whirled.spot.data.ClusteredBodyObject;
import com.threerings.whirled.spot.data.Location;
import com.threerings.whirled.spot.data.Portal;
import com.threerings.whirled.spot.data.SpotCodes;
import com.threerings.whirled.spot.data.SpotScene;

/**
 * Extends the standard scene director with facilities to move between locations within a scene.


        // sanity check the server's notion of what scene we're in with our notion of it
        var sceneId :int = _scdir.getScene().getId();
        if (sceneId != _self.getSceneId()) {
            log.warning("Client and server differ in opinion of what scene we're in " +
                        "[sSceneId=" + _self.getSceneId() + ", cSceneId=" + sceneId + "].");
            return false;
        }

