@Override
	protected void enter() {
		final GameObject support = ctx.objects.select().select(new Filter<GameObject>() {
			@Override
			public boolean accept(GameObject gameObject) {
				final ObjectDefinition definition = ctx.definitions.get(gameObject);
				return definition != null && Arrays.equals(SUPPORT_MODELS, definition.modelIds);
			}
		}).nearest().poll();
		if (support.valid()) {
			final GameObject door = ctx.objects.select().select(ObjectDefinition.name(ctx, "Large door")).select(new Filter<GameObject>() {
				@Override
				public boolean accept(GameObject gameObject) {
					final ObjectDefinition definition = ctx.definitions.get(gameObject);
					if (definition != null) {
						for (String s : definition.actions) {
							if (s != null && s.equals("Open")) {
								return true;
							}
						}
					}
					return false;
				}
			}).each(Interactive.doSetBounds(LARGE_DOOR_BOUNDS)).nearest(support).limit(2).shuffle().poll();

			if (door.tile().distanceTo(ctx.players.local()) > 10) {
				ctx.movement.myWalk(door.tile().derive(Random.nextInt(-3, 3), Random.nextInt(-3, 3)));
				return;
			}

			if (ctx.camera.prepare(door) && door.interact("Open")) {
				Condition.wait(new Callable<Boolean>() {
					@Override
					public Boolean call() throws Exception {
						return npc().tile().matrix(ctx).reachable();
					}
				}, 200, 20);
			}
		}
	}