public boolean exitHandler(final Exit exit, final Client client) {
		final Player player = getPlayer(client);           // get current player
		final Room room = getRoom( player.getLocation() ); // get current room

		debug("Entering exit handler (Exit)...");

		boolean canUse = false;

		if (exit.getExitType() == ExitType.DOOR && exit instanceof Door) {
			final Door d = (Door) exit;

			if ( !d.isLocked() ) canUse = true;
			else                 send("The door is locked.", client);
		}
		else if (exit.getExitType() == ExitType.PORTAL && exit instanceof Portal) {
			final Portal p = (Portal) exit;

			if ( p.isActive() ) {
				canUse = true;
			}
			else {
				if ( p.requiresKey() && p.hasKey(player) ) {
					// TODO should we activate the portal here
					// activate portal
					canUse = true;
				}
			}
		}
		else {
			canUse = true;
		}
		
		// TODO need to resolve the possibility of an invalid destination here
		
		if (canUse) { // exit lock check?
			debug("success");

			// send the success message
			if (!exit.getMessage("succMsg").equals("")) {
				// TODO check where these messages end up getting sent to
				addMessage( new Message(null, player, exit.getMessage("succMsg")) );
				addMessage( new Message(null, player, "You leave the room.") );
			}

			// execute leave triggers
			for (final Trigger trigger : room.getTriggers(TriggerType.onLeave)) {
				System.out.println(trigger);
				
				// TODO need new way to send text here if the trigger result isn't a script
				// execTrigger(trigger, room, client);
				send(pgm.interpret(trigger.getScript(), getPlayer(client), room), client);
			}

			// send other exit properties
			send("Exit Type: " + exit.getExitType().getName(), client);

			// set player's location
			if (exit.getExitType() == ExitType.DOOR) {
				Door d = (Door) exit;

				int dbref = room.getDBRef();

				int orig = d.getLocation();
				int dest = d.getDestination();

				if (dbref == orig)      player.setLocation(dest);
				else if (dbref == dest) player.setLocation(orig);
			}
			else {
				player.setLocation( exit.getDestination() );
			}

			// remove listener from room
			room.removeListener(player);

			// send the osuccess message
			if (!exit.getMessage("osuccMsg").equals("")) {
				// TODO check where these messages end up getting sent to
				addMessage( new Message(exit.getMessage("osuccMsg"), room) );
				addMessage( new Message(player.getName() + " left the room.") ); // TODO fix kludge
			}
			
			// cancel this player's current trade, if they are in one
			final Trade trade = trades.get(player);

			if( trade != null ) {
				trades.remove( trade.p1 );
				trades.remove( trade.p2 );

				notify(trade.p1, "Your trade with " + trade.p2.getName() + " was canceled.");
				notify(trade.p2, "Your trade with " + trade.p1.getName() + " was canceled.");
			}

			// get new room object
			final Room room1 = getRoom( player.getLocation() );

			// add listener to room
			room1.addListener(player);
			
			// TODO what is the purpose of the 'outside' list
            if (room.getRoomType() == RoomType.OUTSIDE && !outside.contains(player)) {
                outside.add(player);
            }
            else outside.remove(player);
            
			// execute enter triggers
			for (final Trigger trigger : room1.getTriggers(TriggerType.onEnter)) {
				System.out.println(trigger);
				
				// TODO need new way to send text here if the trigger result isn't a script
				// execTrigger(trigger, room, client);
				send(pgm.interpret(trigger.getScript(), getPlayer(client), room1), client);
			}

			// call msp to play a tune that is the theme for a type of room
			// MSP is turned on (server) and enabled (player)
			if (msp == 1 && player.getConfigOption("msp_enabled")) {
				// if inside play the room's music
				if (room.getRoomType().equals(RoomType.INSIDE)) {
					playMusic("tranquil.wav", client);
				}
				// if outside, play appropriate weather sounds?
				else if (room1.getRoomType().equals(RoomType.OUTSIDE)) {
					// perhaps simply setting a pattern of some kind would be good?
					// in case we wish to have an ambient background (rain, wind) and an effect sound for lightning (thunder)

					// ASIDE: some clients only support one sound, so an effect
					// sound should be handled as the sound, and then in the ambient background
					
					final String wsName = room1.getWeather().getState().getName();
					
					// get weather, then play related sound
					switch (wsName) {
					case "Rain":        playMusic("rain.wav", client); break;
					case "Cloudy":      playMusic("rain.wav", client); break;
					case "Clear Skies": playMusic("rain.wav", client); break;
					default:            break;
					}
				}
			}

			// show the description
			look(room1, client);

			// tell us we are leaving the exit handler
			debug("Exiting exit handler...");
		}

		return true;
	}