anchor.diff:  		}
   	}
   
  +	FoxBait findNearestBait() {
  +		List<FoxBait> onStreet = FoxBait.placedBait[streetName] ?? [];
  +
  +		FoxBait nearestBait;
  +		num nearestDist;
  +		onStreet.forEach((FoxBait bait) {
  +			num distX = (this.x - bait.x).abs();
  +			num distY = (this.y - bait.y).abs();
  +			num dist = sqrt(pow(distX, 2) + pow(distY, 2));
  +
  +			if (nearestDist == null || dist < nearestDist) {
  +				nearestDist = dist;
  +				nearestBait = bait;
  +			}
  +		});
  +
  +		return nearestBait;
  +	}
  +
  +	void hide() {
  +		lastState = currentState;
  +		setState('_hide');
  +	}
  +
  +	void show([String overrideState]) {
  +		String state = overrideState ?? lastState?.stateName;
  +		if (state != null) {
  +			setState(state);
  +		}
  +		lastState = null;
  +	}
  +
   	@override
   	void update() {
   		super.update();
   
  -		// TODO: behavior. https://github.com/ChildrenOfUr/cou-issues/issues/971
  +		if (movingTo == null) {
  +			// Find & target bait
  +			FoxBait nearestBait = findNearestBait();
  +			if (nearestBait != null) {
  +				// Appear
  +				show();
  +				if (movingTo == null) {
  +					movingTo = new Point(nearestBait.x, nearestBait.y);
  +				}
  +			} else {
  +				// Disappear soon
  +				if (!despawning) {
  +					despawning = true;
  +					new Future.delayed(DESPAWN_TIME).then((_) {
  +						hide();
  +						despawning = false;
  +					});
  +				}
  +			}
  +		} else {
  +			// Move toward target
  +			facingRight = (movingTo.x > this.x);
  +
  +			if (rand.nextInt(10) < 4) {
  +				// Chance of stopping
  +				speed = SPEED_STOP;
  +				setState('pause');
  +			} else if (speed == SPEED_STOP) {
  +				// Stopped, start again
  +				speed = SPEED_SLOW;
  +				setState('walk');
  +			}
  +		}
   	}
   }
   
  
positive.code: 	static final String
  		BRUSH = 'fox_brush',
  		FIBER = 'fiber';
  
  	Fox(String id, int x, int y, String streetName) : super(id, x, y, streetName) {
  		// Client rendering
  
negative.code: 			'taunt': new Spritesheet('taunt',
  				'http://c2.glitch.bz/items/2012-12-06/npc_fox_fox_orangeFox_x1_taunt_png_1354839596.png', 918, 973, 153, 139, 40, false),
  			'walk': new Spritesheet('walk',
  				'http://c2.glitch.bz/items/2012-12-06/npc_fox_fox_orangeFox_x1_walk_png_1354839598.png', 918, 556, 153, 139, 24, true),
  			'_hide': NPC.TRANSPARENT_SPRITE
  		};
  		hide();
  	}
  
  	Future<bool> brush({WebSocket userSocket, String email}) async {
  