public boolean resolveVariables(ActivityExecutor executor) {
		this.subState = SubState.ResolvingVariables;
		boolean sync = true;

		List<Variable> implementationVariables = this.getActivity().getImplementationVariables();
		List<Variable> runtimevaVariables = this.getActivity().getRuntimeVariables();
		ActivityContext context = new ActivityContext(this, executor);

		for (int i = 0; i < implementationVariables.size(); i++) {
			Variable variable = implementationVariables.get(i);

			if (!variable.tryPopulateLocation(executor, context)) {
				Helper.assertNotNull(variable.getDefault());
				executor.scheduleExpression(
						variable.getDefault(),
						this,
						this.getEnvironment(),
						this.getEnvironment().getLocation(variable.getId()));
				sync = false;
			}
		}

		for (int i = 0; i < runtimevaVariables.size(); i++) {
			Variable variable = runtimevaVariables.get(i);

			// try fast-path
			if (!variable.tryPopulateLocation(executor, context)) {
				Helper.assertNotNull(variable.getDefault());
				executor.scheduleExpression(
						variable.getDefault(),
						this,
						this.getEnvironment(),
						// FIXME should not direct use real location, use Referencelocation
						this.getEnvironment().getLocation(variable.getId()));
				sync = false;
			}
		}
		return sync;
	}