private Remedy computeRemedy(RemedyConfig configuration, IProgressMonitor monitor) {
    Remedy remedy = new Remedy(originalRequest);
    remedy.setConfig(configuration);
    IPlanner planner = session.getPlanner();
    RequestFlexer av = new RequestFlexer(planner);
    av.setAllowDifferentVersion(configuration.allowDifferentVersion);
    av.setAllowInstalledElementChange(configuration.allowInstalledUpdate);
    av.setAllowInstalledElementRemoval(configuration.allowInstalledRemoval);
    av.setAllowPartialInstall(configuration.allowPartialInstall);
    av.setProvisioningContext(getProvisioningContext());
    remedy.setRequest(
        (ProfileChangeRequest)
            av.getChangeRequest(
                originalRequest, ((ProfileChangeRequest) originalRequest).getProfile(), monitor));
    if (remedy.getRequest() == null) return null;

    if (configuration.allowInstalledUpdate && !configuration.allowInstalledRemoval) {
      remedy.setInstallationRelaxedWeight(HIGH_WEIGHT);
    } else if (!configuration.allowInstalledUpdate && configuration.allowInstalledRemoval) {
      remedy.setInstallationRelaxedWeight(MEDIUM_WEIGHT);
    } else if (configuration.allowInstalledUpdate && configuration.allowInstalledRemoval) {
      remedy.setInstallationRelaxedWeight(LOW_WEIGHT);
    } else remedy.setInstallationRelaxedWeight(ZERO_WEIGHT);

    if (configuration.allowDifferentVersion && !configuration.allowPartialInstall) {
      remedy.setBeingInstalledRelaxedWeight(HIGH_WEIGHT);
    } else if (!configuration.allowDifferentVersion && configuration.allowPartialInstall) {
      remedy.setBeingInstalledRelaxedWeight(MEDIUM_WEIGHT);
    } else if (configuration.allowDifferentVersion && configuration.allowPartialInstall) {
      remedy.setBeingInstalledRelaxedWeight(LOW_WEIGHT);
    } else {
      remedy.setBeingInstalledRelaxedWeight(ZERO_WEIGHT);
    }
    computeRemedyDetails(remedy);
    return remedy;
  }