You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2018/06/21 16:06:59 UTC

[ambari] branch branch-feature-AMBARI-14714 updated: [AMBARI-24156] - Remove RepositoryVersionEntity and Begin Switching Checks To Use UpgradePlan (#1589)

This is an automated email from the ASF dual-hosted git repository.

jonathanhurley pushed a commit to branch branch-feature-AMBARI-14714
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-feature-AMBARI-14714 by this push:
     new 4957146  [AMBARI-24156] - Remove RepositoryVersionEntity and Begin Switching Checks To Use UpgradePlan (#1589)
4957146 is described below

commit 4957146b8dc26846ec2ffd18a90fb5c1b53dca47
Author: Jonathan Hurley <jo...@apache.org>
AuthorDate: Thu Jun 21 12:06:56 2018 -0400

    [AMBARI-24156] - Remove RepositoryVersionEntity and Begin Switching Checks To Use UpgradePlan (#1589)
---
 .../ambari/annotations/ExperimentalFeature.java    |  15 +-
 .../api/query/render/ClusterBlueprintRenderer.java |   2 +-
 .../server/checks/AutoStartDisabledCheck.java      |  19 +--
 .../ambari/server/checks/CheckDescription.java     | 128 +++++++++++----
 ...tractCheckDescriptor.java => ClusterCheck.java} | 169 +++++++++++--------
 .../server/checks/ComponentsExistInRepoCheck.java  | 140 ++++++++--------
 .../server/checks/ComponentsInstallationCheck.java |  73 +++++----
 .../server/checks/ConfigurationMergeCheck.java     |  81 ++++++----
 .../HardcodedStackVersionPropertiesCheck.java      |  19 ++-
 .../apache/ambari/server/checks/HealthCheck.java   |  20 ++-
 .../server/checks/HostMaintenanceModeCheck.java    |  30 ++--
 .../ambari/server/checks/HostsHeartbeatCheck.java  |  21 +--
 .../server/checks/HostsMasterMaintenanceCheck.java |  74 ++++-----
 .../ambari/server/checks/PreUpgradeCheck.java      |  98 ++++++++++++
 .../server/checks/PreviousUpgradeCompleted.java    |  16 +-
 .../server/checks/ServiceCheckValidityCheck.java   |  20 ++-
 .../ambari/server/checks/ServicePresenceCheck.java |  26 +--
 .../checks/ServicesMaintenanceModeCheck.java       |  31 ++--
 .../ambari/server/checks/ServicesUpCheck.java      | 178 +++++++++++----------
 .../apache/ambari/server/checks/UpgradeCheck.java  |   2 +-
 .../ambari/server/checks/UpgradeCheckRegistry.java |  37 +++--
 .../ambari/server/checks/VersionMismatchCheck.java |  29 ++--
 .../server/controller/ActionExecutionContext.java  |  34 ----
 .../ambari/server/controller/ControllerModule.java |  29 ++--
 .../server/controller/PrereqCheckRequest.java      | 110 ++++---------
 .../controller/PrereqCheckRequestFactory.java      |  38 +++++
 .../internal/CompatibleRepositoryVersion.java      |  62 -------
 .../internal/PreUpgradeCheckResourceProvider.java  |  92 ++---------
 .../internal/UpgradeResourceProvider.java          |   4 -
 .../HostComponentVersionAdvertisedEvent.java       |   2 +-
 .../orm/entities/RepositoryVersionEntity.java      |  85 ----------
 .../ambari/server/orm/entities/UpgradeEntity.java  |  21 +--
 .../apache/ambari/server/state/CheckHelper.java    |  78 ++++-----
 .../org/apache/ambari/server/state/Cluster.java    |  10 --
 .../ambari/server/state/ServiceComponent.java      |   8 +-
 .../ambari/server/state/ServiceComponentImpl.java  |  12 +-
 .../apache/ambari/server/state/UpgradeContext.java |  25 +--
 .../ambari/server/state/cluster/ClusterImpl.java   |  13 +-
 ...requisiteCheck.java => UpgradeCheckResult.java} |  29 ++--
 .../stack/upgrade/RepositoryVersionHelper.java     |  70 --------
 .../svccomphost/ServiceComponentHostSummary.java   |  91 -----------
 .../src/main/resources/Ambari-DDL-Derby-CREATE.sql |   1 -
 .../src/main/resources/Ambari-DDL-MySQL-CREATE.sql |   1 -
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql    |   1 -
 .../main/resources/Ambari-DDL-Postgres-CREATE.sql  |   1 -
 .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql    |   1 -
 .../main/resources/Ambari-DDL-SQLServer-CREATE.sql |   1 -
 .../query/render/ClusterBlueprintRendererTest.java |   2 +-
 .../server/checks/AutoStartDisabledCheckTest.java  |  39 +++--
 ...ckDescriptorTest.java => ClusterCheckTest.java} |  34 ++--
 .../checks/ComponentExistsInRepoCheckTest.java     |  93 +++++------
 .../checks/ComponentsInstallationCheckTest.java    |  47 +++---
 .../server/checks/ConfigurationMergeCheckTest.java |  44 ++---
 .../ambari/server/checks/HealthCheckTest.java      |  24 +--
 .../checks/HostMaintenanceModeCheckTest.java       |  40 +++--
 .../server/checks/HostsHeartbeatCheckTest.java     |  30 ++--
 .../checks/HostsMasterMaintenanceCheckTest.java    |  39 +++--
 .../checks/PreviousUpgradeCompletedTest.java       |  20 +--
 .../checks/ServiceCheckValidityCheckTest.java      |  47 ++++--
 .../server/checks/ServicePresenceCheckTest.java    |  74 +++++----
 .../checks/ServicesMaintenanceModeCheckTest.java   |  21 +--
 .../ambari/server/checks/ServicesUpCheckTest.java  |  46 +++---
 .../server/checks/UpgradeCheckOrderTest.java       |  10 +-
 .../server/checks/VersionMismatchCheckTest.java    |  22 ++-
 .../PreUpgradeCheckResourceProviderTest.java       |   5 +-
 .../UpgradeSummaryResourceProviderTest.java        |   1 -
 .../ambari/server/orm/dao/UpgradeDAOTest.java      |   5 -
 .../server/sample/checks/SampleServiceCheck.java   |  16 +-
 .../upgrades/ComponentVersionCheckActionTest.java  |   2 -
 .../upgrades/CreateAndConfigureActionTest.java     |   1 -
 .../ambari/server/state/CheckHelperTest.java       |  77 +++++----
 .../services/RetryUpgradeActionServiceTest.java    |   1 -
 .../ambari/server/topology/AmbariContextTest.java  |   2 +-
 73 files changed, 1321 insertions(+), 1468 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/annotations/ExperimentalFeature.java b/ambari-server/src/main/java/org/apache/ambari/annotations/ExperimentalFeature.java
index c5cff1f..d85d51c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/annotations/ExperimentalFeature.java
+++ b/ambari-server/src/main/java/org/apache/ambari/annotations/ExperimentalFeature.java
@@ -40,19 +40,24 @@ public enum ExperimentalFeature {
   MULTI_SERVICE,
 
   /**
+   * Component version reporting, storage, and comparison.
+   */
+  VERSION_REPORTING,
+
+  /**
    * For code that is for upgrading Mpacks.  Use this to mark code that may ultimately
    * be removed.
    */
   MPACK_UPGRADES,
 
   /**
-   * Used to mark code that is required for successful removal and refactoring
-   * when repo versions are dropped.
+   * Use this annotation when a test needs to be written.
    */
-  REPO_VERSION_REMOVAL,
+  UNIT_TEST_REQUIRED,
 
   /**
-   * Use this annotation when a test needs to be written.
+   * Loading and dealing with upgrade checks dynamically and injecting
+   * configurations into them.
    */
-  UNIT_TEST_REQUIRED;
+  UPGRADE_PACK_PRE_CHECKS;
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
index 8ab41f4..f6a2625 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRenderer.java
@@ -82,7 +82,7 @@ import com.google.common.collect.ImmutableMap;
  * Renderer which renders a cluster resource as a blueprint.
  */
 @Experimental(
-    feature = ExperimentalFeature.REPO_VERSION_REMOVAL,
+    feature = ExperimentalFeature.MULTI_SERVICE,
     comment = "Blueprints must get mpack data from a different endpoint, not stack_versions")
 public class ClusterBlueprintRenderer extends BaseRenderer implements Renderer {
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/AutoStartDisabledCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/AutoStartDisabledCheck.java
index a0d9906..70029e2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/AutoStartDisabledCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/AutoStartDisabledCheck.java
@@ -23,7 +23,7 @@ import java.util.Set;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 
@@ -37,7 +37,7 @@ import com.google.inject.Singleton;
 @UpgradeCheck(
     group = UpgradeCheckGroup.CONFIGURATION_WARNING,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class AutoStartDisabledCheck extends AbstractCheckDescriptor {
+public class AutoStartDisabledCheck extends ClusterCheck {
 
   static final String CLUSTER_ENV_TYPE = "cluster-env";
   static final String RECOVERY_ENABLED_KEY = "recovery_enabled";
@@ -63,23 +63,24 @@ public class AutoStartDisabledCheck extends AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+  public UpgradeCheckResult perform(PrereqCheckRequest request) throws AmbariException {
 
     String autoStartEnabled = getProperty(request, CLUSTER_ENV_TYPE, RECOVERY_ENABLED_KEY);
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
 
     // !!! auto-start is already disabled
     if (!Boolean.valueOf(autoStartEnabled)) {
-      return;
+      return result;
     }
 
     // !!! double check the value is AUTO_START.  it's the only supported value (and there's no enum for it)
     String recoveryType = getProperty(request, CLUSTER_ENV_TYPE, RECOVERY_TYPE_KEY);
     if (StringUtils.equals(recoveryType, RECOVERY_AUTO_START)) {
-
-      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, request));
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.getFailedOn().add(request.getClusterName());
-
+      result.setFailReason(getFailReason(result, request));
+      result.setStatus(PrereqCheckStatus.FAIL);
+      result.getFailedOn().add(request.getClusterName());
     }
+
+    return result;
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
index 57be5f7..0e07945 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
@@ -17,44 +17,53 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 
 import org.apache.ambari.server.state.stack.PrereqCheckType;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableMap;
 
 /**
- * Enum that wraps the various type, text and failure messages for the checks
- * done for Stack Upgrades.
+ * The {@link CheckDescription} class wraps information about an upgrade check
+ * in a way that is extendable by 3rd party {@link PreUpgradeCheck}s.
  */
 public class CheckDescription {
 
+  /**
+   * All of the instantiated {@link CheckDescription}s.
+   */
+  private static final Set<CheckDescription> s_values = new LinkedHashSet<>();
+
   public static CheckDescription HOSTS_HEARTBEAT = new CheckDescription("HOSTS_HEARTBEAT",
     PrereqCheckType.HOST,
     "All hosts must be communicating with Ambari. Hosts which are not reachable should be placed in Maintenance Mode.",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "There are hosts which are not communicating with Ambari.").build());
 
   public static CheckDescription HEALTH = new CheckDescription("HEALTH",
     PrereqCheckType.CLUSTER,
     "Cluster Health",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "The following issues have been detected on this cluster and should be addressed before upgrading: %s").build());
 
   public static CheckDescription SERVICE_CHECK = new CheckDescription("SERVICE_CHECK",
     PrereqCheckType.SERVICE,
     "Last Service Check should be more recent than the last configuration change for the given service",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "The following service configurations have been updated and their Service Checks should be run again: %s").build());
 
   public static CheckDescription HOSTS_MAINTENANCE_MODE = new CheckDescription("HOSTS_MAINTENANCE_MODE",
     PrereqCheckType.HOST,
     "Hosts in Maintenance Mode will be excluded from the upgrade.",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "There are hosts in Maintenance Mode which excludes them from being upgraded.")
       .put(HostMaintenanceModeCheck.KEY_CANNOT_START_HOST_ORDERED,
           "The following hosts cannot be in Maintenance Mode: {{fails}}.").build());
@@ -63,53 +72,49 @@ public class CheckDescription {
     PrereqCheckType.HOST,
     "Hosts in Maintenance Mode must not have any master components",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
-          "The following hosts must not be in in Maintenance Mode since they host Master components: {{fails}}.")
-      .put(HostsMasterMaintenanceCheck.KEY_NO_UPGRADE_NAME,
-          "Could not find suitable upgrade pack for %s %s to version {{version}}.")
-      .put(HostsMasterMaintenanceCheck.KEY_NO_UPGRADE_PACK,
-          "Could not find upgrade pack named %s.").build());
+      .put(ClusterCheck.DEFAULT,
+          "The following hosts must not be in in Maintenance Mode since they host Master components: {{fails}}.").build());
 
   public static CheckDescription SERVICES_MAINTENANCE_MODE = new CheckDescription("SERVICES_MAINTENANCE_MODE",
     PrereqCheckType.SERVICE,
     "No services can be in Maintenance Mode",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "The following Services must not be in Maintenance Mode: {{fails}}.").build());
 
   public static CheckDescription SERVICES_UP = new CheckDescription("SERVICES_UP",
     PrereqCheckType.SERVICE,
     "All services must be started",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "The following Services must be started: {{fails}}. Try to do a Stop & Start in case they were started outside of Ambari.").build());
 
   public static CheckDescription COMPONENTS_INSTALLATION = new CheckDescription("COMPONENTS_INSTALLATION",
     PrereqCheckType.SERVICE,
     "All service components must be installed",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "The following Services must be reinstalled: {{fails}}. Try to reinstall the service components in INSTALL_FAILED state.").build());
 
   public static CheckDescription PREVIOUS_UPGRADE_COMPLETED = new CheckDescription("PREVIOUS_UPGRADE_COMPLETED",
     PrereqCheckType.CLUSTER,
     "A previous upgrade did not complete.",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "The last upgrade attempt did not complete. {{fails}}").build());
 
   public static CheckDescription CONFIG_MERGE = new CheckDescription("CONFIG_MERGE",
     PrereqCheckType.CLUSTER,
     "Configuration Merge Check",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "The following config types will have values overwritten: %s").build());
 
   public static CheckDescription HARDCODED_STACK_VERSION_PROPERTIES_CHECK = new CheckDescription("HARDCODED_STACK_VERSION_PROPERTIES_CHECK",
     PrereqCheckType.CLUSTER,
     "Found hardcoded stack version in property value.",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "Some properties seem to contain hardcoded stack version string \"%s\"." +
           " That is a potential problem when doing stack update.").build());
 
@@ -117,14 +122,14 @@ public class CheckDescription {
     PrereqCheckType.HOST,
     "All components must be reporting the expected version",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "There are components which are not reporting the expected stack version: \n%s").build());
 
   public static CheckDescription SERVICE_PRESENCE_CHECK = new CheckDescription("SERVICE_PRESENCE_CHECK",
     PrereqCheckType.SERVICE,
     "Service Is Not Supported For Upgrades",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
           "The %s service is currently installed on the cluster. " +
           "This service does not support upgrades and must be removed before the upgrade can continue. " +
           "After upgrading, %s can be reinstalled")
@@ -137,7 +142,7 @@ public class CheckDescription {
     PrereqCheckType.CLUSTER,
     "Auto-Start Disabled Check",
     new ImmutableMap.Builder<String, String>()
-      .put(AbstractCheckDescriptor.DEFAULT,
+      .put(ClusterCheck.DEFAULT,
         "Auto Start must be disabled before performing an Upgrade. To disable Auto Start, navigate to " +
           "Admin > Service Auto Start. Turn the toggle switch off to Disabled and hit Save.").build());
 
@@ -146,7 +151,7 @@ public class CheckDescription {
       PrereqCheckType.CLUSTER,
       "LZO Codec Check",
       new ImmutableMap.Builder<String, String>()
-          .put(AbstractCheckDescriptor.DEFAULT,
+          .put(ClusterCheck.DEFAULT,
               "You have LZO codec enabled in the core-site config of your cluster. LZO is no longer installed automatically. " +
                   "If any hosts require LZO, it should be installed before starting the upgrade. " +
                   "Consult Ambari documentation for instructions on how to do this.").build());
@@ -155,33 +160,51 @@ public class CheckDescription {
       PrereqCheckType.CLUSTER,
       "Verify Java version requirement",
       new ImmutableMap.Builder<String, String>()
-        .put(AbstractCheckDescriptor.DEFAULT, "Ambari requires JDK with minimum version %s. Reconfigure Ambari with a JDK that meets the version requirement.")
+        .put(ClusterCheck.DEFAULT, "Ambari requires JDK with minimum version %s. Reconfigure Ambari with a JDK that meets the version requirement.")
           .build());
 
   public static CheckDescription COMPONENTS_EXIST_IN_TARGET_REPO = new CheckDescription("COMPONENTS_EXIST_IN_TARGET_REPO",
       PrereqCheckType.CLUSTER,
       "Verify Cluster Components Exist In Target Repository",
       new ImmutableMap.Builder<String, String>()
-        .put(AbstractCheckDescriptor.DEFAULT, "The following components do not exist in the target repository's stack. They must be removed from the cluster before upgrading.")
+        .put(ClusterCheck.DEFAULT, "The following components do not exist in the target repository's stack. They must be removed from the cluster before upgrading.")
           .build());
 
   public static CheckDescription VALID_SERVICES_INCLUDED_IN_REPOSITORY = new CheckDescription("VALID_SERVICES_INCLUDED_IN_REPOSITORY",
       PrereqCheckType.CLUSTER,
       "The repository is missing services which are required",
       new ImmutableMap.Builder<String, String>()
-        .put(AbstractCheckDescriptor.DEFAULT,
+        .put(ClusterCheck.DEFAULT,
             "The following services are included in the upgrade but the repository is missing their dependencies:\n%s").build());
 
-
-  private String m_name;
-  private PrereqCheckType m_type;
-  private String m_description;
+  /**
+   * A unique identifier.
+   */
+  private final String m_name;
+  private final PrereqCheckType m_type;
+  private final String m_description;
   private Map<String, String> m_fails;
+
+  /**
+   * Constructor.
+   *
+   * @param name
+   * @param type
+   * @param description
+   * @param fails
+   */
   public CheckDescription(String name, PrereqCheckType type, String description, Map<String, String> fails) {
     m_name = name;
     m_type = type;
     m_description = description;
     m_fails = fails;
+
+    if (s_values.contains(this)) {
+      throw new RuntimeException("Unable to add the upgrade check description named " + m_name
+          + " because it already is registered");
+    }
+
+    s_values.add(this);
   }
 
   /**
@@ -192,6 +215,15 @@ public class CheckDescription {
   }
 
   /**
+   * Gets all of the registered check descriptions.
+   *
+   * @return
+   */
+  public Set<CheckDescription> values() {
+    return s_values;
+  }
+
+  /**
    * @return the type of check
    */
   public PrereqCheckType getType() {
@@ -212,4 +244,42 @@ public class CheckDescription {
   public String getFail(String key) {
     return m_fails.containsKey(key) ? m_fails.get(key) : "";
   }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public int hashCode() {
+    return Objects.hash(m_name);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public boolean equals(Object object) {
+    if (null == object) {
+      return false;
+    }
+
+    if (this == object) {
+      return true;
+    }
+
+    if (object.getClass() != getClass()) {
+      return false;
+    }
+
+    CheckDescription that = (CheckDescription) object;
+
+    return Objects.equals(m_name, that.m_name);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this).add("name", m_name).toString();
+  }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ClusterCheck.java
similarity index 74%
rename from ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
rename to ambari-server/src/main/java/org/apache/ambari/server/checks/ClusterCheck.java
index c48b5e0..97250b4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ClusterCheck.java
@@ -24,37 +24,44 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.dao.UpgradeDAO;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.orm.entities.UpgradePlanDetailEntity;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.Mpack;
+import org.apache.ambari.server.state.Mpack.ModuleVersionChange;
+import org.apache.ambari.server.state.Mpack.MpackChangeSummary;
 import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.ServiceGroup;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrereqCheckType;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-import org.apache.ambari.server.state.stack.UpgradePack;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 import org.codehaus.jackson.annotate.JsonProperty;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.gson.Gson;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
 /**
- * Describes prerequisite check.
+ * A {@link ClusterCheck} is used to run a pre-upgrade check against a condition
+ * that is not dependent on any installed service.
  */
-public abstract class AbstractCheckDescriptor {
+public abstract class ClusterCheck implements PreUpgradeCheck {
 
   protected static final String DEFAULT = "default";
 
@@ -76,50 +83,45 @@ public abstract class AbstractCheckDescriptor {
   @Inject
   Gson gson;
 
-  private CheckDescription m_description;
+  private final CheckDescription m_description;
 
   /**
    * Constructor.
    *
    * @param description description
    */
-  protected AbstractCheckDescriptor(CheckDescription description) {
+  protected ClusterCheck(CheckDescription description) {
     m_description = description;
   }
 
   /**
-   * Gets the set of services that this check is associated with. If the check
-   * is not associated with a particular service, then this should be an empty
-   * set.
-   *
-   * @return a set of services which will determine whether this check is
-   *         applicable.
+   * {@inheritDoc}
    */
+  @Override
+  public CheckDescription getCheckDescrption() {
+    return m_description;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
   public Set<String> getApplicableServices() {
     return Collections.emptySet();
   }
 
   /**
-   * Gets any additional qualifications which an upgrade check should run in
-   * order to determine if it's applicable to the upgrade.
-   *
-   * @return a list of qualifications, or an empty list.
+   * {@inheritDoc}
    */
+  @Override
   public List<CheckQualification> getQualifications() {
     return Collections.emptyList();
   }
 
   /**
-   * Tests if the prerequisite check is applicable to given upgrade request. If
-   * a check requires some extra processing
-   *
-   * @param request
-   *          prerequisite check request
-   * @return true if check should be performed
-   *
-   * @throws org.apache.ambari.server.AmbariException
-   *           if server error happens
+   * {@inheritDoc}
    */
+  @Override
   public final boolean isApplicable(PrereqCheckRequest request) throws AmbariException {
     List<CheckQualification> qualifications = Lists.newArrayList(
         new ServiceQualification());
@@ -137,30 +139,16 @@ public abstract class AbstractCheckDescriptor {
 
 
   /**
-   * Executes check against given cluster.
-   *
-   * @param prerequisiteCheck dto for upgrade check results
-   * @param request pre upgrade check request
-   *
-   * @throws AmbariException if server error happens
+   * {@inheritDoc}
    */
-  public abstract void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException;
+  @Override
+  public abstract UpgradeCheckResult perform(PrereqCheckRequest request) throws AmbariException;
 
 
   /**
-   * Gets the description of the check.
-   *
-   * @return the description (not {@code null}).
-   */
-  public CheckDescription getDescription() {
-    return m_description;
-  }
-
-  /**
-   * Gets the type of check.
-   *
-   * @return the type of check (not {@code null}).
+   * {@inheritDoc}
    */
+  @Override
   public PrereqCheckType getType() {
     return m_description.getType();
   }
@@ -171,7 +159,7 @@ public abstract class AbstractCheckDescriptor {
    * @param request           the request
    * @return the failure string
    */
-  protected String getFailReason(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+  protected String getFailReason(UpgradeCheckResult prerequisiteCheck, PrereqCheckRequest request)
       throws AmbariException {
     return getFailReason(DEFAULT, prerequisiteCheck, request);
   }
@@ -192,8 +180,8 @@ public abstract class AbstractCheckDescriptor {
    */
   protected String getProperty(PrereqCheckRequest request, String configType, String propertyName)
       throws AmbariException {
-    final String clusterName = request.getClusterName();
-    final Cluster cluster = clustersProvider.get().getCluster(clusterName);
+    UpgradePlanEntity upgradePlan = request.getUpgradePlan();
+    final Cluster cluster = clustersProvider.get().getCluster(upgradePlan.getClusterId());
     final Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
     final DesiredConfig desiredConfig = desiredConfigs.get(configType);
 
@@ -214,24 +202,18 @@ public abstract class AbstractCheckDescriptor {
    * @param request           the request
    * @return the failure string
    */
-  protected String getFailReason(String key, PrerequisiteCheck prerequisiteCheck,
+  protected String getFailReason(String key, UpgradeCheckResult prerequisiteCheck,
       PrereqCheckRequest request) throws AmbariException {
+    UpgradePlanEntity upgradePlan = request.getUpgradePlan();
     String fail = m_description.getFail(key);
 
-    RepositoryVersionEntity repositoryVersion = request.getTargetRepositoryVersion();
-    if (fail.contains("{{version}}") && null != repositoryVersion) {
-      fail = fail.replace("{{version}}", repositoryVersion.getVersion());
-    }
-
     if (fail.contains("{{fails}}")) {
       LinkedHashSet<String> names = prerequisiteCheck.getFailedOn();
 
       // If Type=PrereqCheckType.HOST, names list is already populated
-      if (getDescription().getType() == PrereqCheckType.SERVICE) {
+      if (m_description.getType() == PrereqCheckType.SERVICE) {
         Clusters clusters = clustersProvider.get();
-        AmbariMetaInfo metaInfo = ambariMetaInfo.get();
-
-        Cluster c = clusters.getCluster(request.getClusterName());
+        Cluster c = clusters.getCluster(upgradePlan.getClusterId());
         Map<String, Service> services = c.getServicesByName();
 
         LinkedHashSet<String> displays = new LinkedHashSet<>();
@@ -276,12 +258,9 @@ public abstract class AbstractCheckDescriptor {
   }
 
   /**
-   * Gets whether this upgrade check is required for the specified
-   * {@link UpgradeType}. Checks which are marked as required do not need to be
-   * explicitely declared in the {@link UpgradePack} to be run.
-   *
-   * @return {@code true} if it is required, {@code false} otherwise.
+   * {@inheritDoc}
    */
+  @Override
   public boolean isRequired(UpgradeType upgradeType) {
     UpgradeType[] upgradeTypes = getClass().getAnnotation(UpgradeCheck.class).required();
     for (UpgradeType requiredType : upgradeTypes) {
@@ -294,16 +273,64 @@ public abstract class AbstractCheckDescriptor {
   }
 
   /**
-   * Gets the services participating in the upgrade from the VDF.
+   * Gets the services participating in the upgrade as a flat set of services
+   * which are not associated with any service groups.
    *
    * @param request
    *          the upgrade check request.
-   * @return the services participating in the upgrade, which can either be all
-   *         of the cluster's services or a subset based on repository type.
+   * @return the services participating in the upgrade
    */
-  final Set<String> getServicesInUpgrade(PrereqCheckRequest request) throws AmbariException {
-    final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName());
-    return Sets.newHashSet();
+  final Set<String> getDistinctServicesInUpgrade(PrereqCheckRequest request)
+      throws AmbariException {
+    Set<String> servicesInUpgrade = Sets.newHashSet();
+    UpgradePlanEntity upgradePlan = request.getUpgradePlan();
+    final Cluster cluster = clustersProvider.get().getCluster(upgradePlan.getClusterId());
+    List<UpgradePlanDetailEntity> details = upgradePlan.getDetails();
+    for (UpgradePlanDetailEntity detail : details) {
+      ServiceGroup serviceGroup = cluster.getServiceGroup(detail.getServiceGroupId());
+      Mpack sourceMpack = ambariMetaInfo.get().getMpack(serviceGroup.getMpackId());
+      Mpack targetMpack = ambariMetaInfo.get().getMpack(detail.getMpackTargetId());
+      MpackChangeSummary changeSummary = sourceMpack.getChangeSummary(targetMpack);
+      Set<ModuleVersionChange> moduleChanges = changeSummary.getModuleVersionChanges();
+
+      servicesInUpgrade.addAll(
+          moduleChanges.stream().map(moduleChange -> moduleChange.getSource().getName()).collect(
+              Collectors.toSet()));
+    }
+
+    return servicesInUpgrade;
+  }
+
+  /**
+   * Gets the services participating in the upgrade organized by their service
+   * groups.
+   *
+   * @param request
+   * @return the service groups and their services which are participating in
+   *         the upgrade.
+   * @throws AmbariException
+   */
+  final Map<ServiceGroup, Set<String>> getServicesInUpgrade(PrereqCheckRequest request) throws AmbariException {
+    Map<ServiceGroup, Set<String>> serviceGroupsInUpgrade = Maps.newLinkedHashMap();
+    UpgradePlanEntity upgradePlan = request.getUpgradePlan();
+    final Cluster cluster = clustersProvider.get().getCluster(upgradePlan.getClusterId());
+    List<UpgradePlanDetailEntity> details = upgradePlan.getDetails();
+    for (UpgradePlanDetailEntity detail : details) {
+      Set<String> servicesInUpgrade = Sets.newHashSet();
+      ServiceGroup serviceGroup = cluster.getServiceGroup(detail.getServiceGroupId());
+      serviceGroupsInUpgrade.put(serviceGroup, servicesInUpgrade);
+
+      Mpack sourceMpack = ambariMetaInfo.get().getMpack(serviceGroup.getMpackId());
+      Mpack targetMpack = ambariMetaInfo.get().getMpack(detail.getMpackTargetId());
+      MpackChangeSummary changeSummary = sourceMpack.getChangeSummary(targetMpack);
+      Set<ModuleVersionChange> moduleChanges = changeSummary.getModuleVersionChanges();
+
+      servicesInUpgrade.addAll(
+          moduleChanges.stream().map(moduleChange -> moduleChange.getSource().getName()).collect(
+              Collectors.toSet()));
+    }
+
+    return serviceGroupsInUpgrade;
   }
 
   /**
@@ -327,7 +354,7 @@ public abstract class AbstractCheckDescriptor {
   /**
    * The {@link ServiceQualification} class is used to determine if the
    * service(s) associated with an upgraade check are both installed in the
-   * cluster and included in thr upgrade.
+   * cluster and included in the upgrade.
    * <p/>
    * If a service is installed but not included in the upgrade (for example of
    * the upgrade is a patch upgrade), then the check should not qualify to run.
@@ -348,7 +375,7 @@ public abstract class AbstractCheckDescriptor {
         return true;
       }
 
-      Set<String> servicesForUpgrade = getServicesInUpgrade(request);
+      Set<String> servicesForUpgrade = getDistinctServicesInUpgrade(request);
 
       for (String serviceInUpgrade : servicesForUpgrade) {
         if (applicableServices.contains(serviceInUpgrade)) {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsExistInRepoCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsExistInRepoCheck.java
index 8bbada2..d8fad10 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsExistInRepoCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsExistInRepoCheck.java
@@ -27,15 +27,17 @@ import java.util.stream.Collectors;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.StackAccessException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.orm.entities.UpgradePlanDetailEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.ComponentInfo;
+import org.apache.ambari.server.state.Mpack;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
+import org.apache.ambari.server.state.ServiceGroup;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 
@@ -50,7 +52,7 @@ import com.google.inject.Singleton;
 @UpgradeCheck(
     group = UpgradeCheckGroup.TOPOLOGY,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class ComponentsExistInRepoCheck extends AbstractCheckDescriptor {
+public class ComponentsExistInRepoCheck extends ClusterCheck {
 
   /**
    * Constructor.
@@ -60,94 +62,104 @@ public class ComponentsExistInRepoCheck extends AbstractCheckDescriptor {
   }
 
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+  public UpgradeCheckResult perform(PrereqCheckRequest request)
       throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
-    RepositoryVersionEntity repositoryVersion = request.getTargetRepositoryVersion();
 
-    StackId sourceStack = request.getSourceStackId();
-    StackId targetStack = repositoryVersion.getStackId();
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
 
-    Set<ServiceDetail> failedServices = new TreeSet<>();
-    Set<ServiceComponentDetail> failedComponents = new TreeSet<>();
+    for (UpgradePlanDetailEntity upgradeDetail : request.getUpgradePlan().getDetails()) {
+      ServiceGroup serviceGroup = cluster.getServiceGroup(upgradeDetail.getServiceGroupId());
+      Mpack targetMpack = ambariMetaInfo.get().getMpack(upgradeDetail.getMpackTargetId());
 
-    Set<String> servicesInUpgrade = getServicesInUpgrade(request);
-    for (String serviceName : servicesInUpgrade) {
-      try {
-        Service service = cluster.getService(serviceName);
+      StackId sourceStack = serviceGroup.getStackId();
+      StackId targetStack = targetMpack.getStackId();
+
+      Set<ServiceDetail> failedServices = new TreeSet<>();
+      Set<ServiceComponentDetail> failedComponents = new TreeSet<>();
+
+      for (Service service : serviceGroup.getServices()) {
+        String serviceName = service.getName();
         String serviceType = service.getServiceType();
-        ServiceInfo serviceInfo = ambariMetaInfo.get().getService(targetStack.getStackName(),
-            targetStack.getStackVersion(), serviceType);
 
-        if (serviceInfo.isDeleted() || !serviceInfo.isValid()) {
-          failedServices.add(new ServiceDetail(serviceName));
-          continue;
-        }
+        try {
+          ServiceInfo serviceInfo = ambariMetaInfo.get().getService(targetStack.getStackName(),
+              targetStack.getStackVersion(), serviceType);
 
-        Map<String, ServiceComponent> componentsInUpgrade = service.getServiceComponents();
-        for (String componentName : componentsInUpgrade.keySet()) {
-          try {
-            ComponentInfo componentInfo = ambariMetaInfo.get().getComponent(
-                targetStack.getStackName(), targetStack.getStackVersion(), serviceType,
-                componentName);
+          if (serviceInfo.isDeleted() || !serviceInfo.isValid()) {
+            failedServices.add(new ServiceDetail(serviceName));
+            continue;
+          }
 
-            // if this component isn't included in the upgrade, then skip it
-            if (!componentInfo.isVersionAdvertised()) {
-              continue;
-            }
+          Map<String, ServiceComponent> componentsInUpgrade = service.getServiceComponents();
+          for (String componentName : componentsInUpgrade.keySet()) {
+            try {
+              ComponentInfo componentInfo = ambariMetaInfo.get().getComponent(
+                  targetStack.getStackName(), targetStack.getStackVersion(), serviceType,
+                  componentName);
+
+              // if this component isn't included in the upgrade, then skip it
+              if (!componentInfo.isVersionAdvertised()) {
+                continue;
+              }
 
-            if (componentInfo.isDeleted()) {
+              if (componentInfo.isDeleted()) {
+                failedComponents.add(new ServiceComponentDetail(serviceName, componentName));
+              }
+
+            } catch (StackAccessException stackAccessException) {
               failedComponents.add(new ServiceComponentDetail(serviceName, componentName));
             }
-
-          } catch (StackAccessException stackAccessException) {
-            failedComponents.add(new ServiceComponentDetail(serviceName, componentName));
           }
+        } catch (StackAccessException stackAccessException) {
+          failedServices.add(new ServiceDetail(serviceName));
         }
-      } catch (StackAccessException stackAccessException) {
-        failedServices.add(new ServiceDetail(serviceName));
       }
-    }
 
-    if (failedServices.isEmpty() && failedComponents.isEmpty()) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.PASS);
-      return;
-    }
+      if (failedServices.isEmpty() && failedComponents.isEmpty()) {
+        continue;
+      }
 
-    Set<String> failedServiceNames = failedServices.stream().map(
-        failureDetail -> failureDetail.serviceName).collect(
-            Collectors.toCollection(LinkedHashSet::new));
+      Set<String> failedServiceNames = failedServices.stream().map(
+          failureDetail -> failureDetail.serviceName).collect(
+              Collectors.toCollection(LinkedHashSet::new));
 
-    Set<String> failedComponentNames = failedComponents.stream().map(
-        failureDetail -> failureDetail.componentName).collect(
-            Collectors.toCollection(LinkedHashSet::new));
+      Set<String> failedComponentNames = failedComponents.stream().map(
+          failureDetail -> failureDetail.componentName).collect(
+              Collectors.toCollection(LinkedHashSet::new));
 
-    LinkedHashSet<String> failures = new LinkedHashSet<>();
-    failures.addAll(failedServiceNames);
-    failures.addAll(failedComponentNames);
+      LinkedHashSet<String> failures = new LinkedHashSet<>();
+      failures.addAll(failedServiceNames);
+      failures.addAll(failedComponentNames);
 
-    prerequisiteCheck.setFailedOn(failures);
-    prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
+      result.setFailedOn(failures);
+      result.setStatus(PrereqCheckStatus.FAIL);
 
-    prerequisiteCheck.getFailedDetail().addAll(failedServices);
-    prerequisiteCheck.getFailedDetail().addAll(failedComponents);
+      result.getFailedDetail().addAll(failedServices);
+      result.getFailedDetail().addAll(failedComponents);
 
-    String message = "The following {0} exist in {1} but are not included in {2}. They must be removed before upgrading.";
-    String messageFragment = "";
-    if (!failedServices.isEmpty()) {
-      messageFragment = "services";
-    }
+      String message = "In the {0} service group the following {1} exist in {2} but are not included in {3}. They must be removed before upgrading.";
+      String messageFragment = "";
+      if (!failedServices.isEmpty()) {
+        messageFragment = "services";
+      }
+
+      if (!failedComponents.isEmpty()) {
+        if (!StringUtils.isEmpty(messageFragment)) {
+          messageFragment += " and ";
+        }
 
-    if( !failedComponents.isEmpty() ){
-      if(!StringUtils.isEmpty(messageFragment)){
-        messageFragment += " and ";
+        messageFragment += "components";
       }
 
-      messageFragment += "components";
+      message = MessageFormat.format(message, serviceGroup.getServiceGroupName(), messageFragment,
+          sourceStack, targetStack);
+
+      result.setFailReason(message);
+      return result;
     }
 
-    message = MessageFormat.format(message, messageFragment, sourceStack, targetStack);
-    prerequisiteCheck.setFailReason(message);
+    return result;
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsInstallationCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsInstallationCheck.java
index 3f39d48..f67d9d6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsInstallationCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ComponentsInstallationCheck.java
@@ -32,9 +32,10 @@ import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
+import org.apache.ambari.server.state.ServiceGroup;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 
@@ -48,7 +49,7 @@ import com.google.inject.Singleton;
     group = UpgradeCheckGroup.LIVELINESS,
     order = 2.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class ComponentsInstallationCheck extends AbstractCheckDescriptor {
+public class ComponentsInstallationCheck extends ClusterCheck {
 
   /**
    * Constructor.
@@ -58,40 +59,44 @@ public class ComponentsInstallationCheck extends AbstractCheckDescriptor {
   }
 
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+  public UpgradeCheckResult perform(PrereqCheckRequest request) throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     Set<String> failedServiceNames = new HashSet<>();
 
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
     // Preq-req check should fail if any service component is in INSTALL_FAILED state
     Set<String> installFailedHostComponents = new HashSet<>();
-
-    Set<String> servicesInUpgrade = getServicesInUpgrade(request);
-    for (String serviceName : servicesInUpgrade) {
-      final Service service = cluster.getService(serviceName);
-      // Skip service if it is in maintenance mode
-      if (service.getMaintenanceState() == MaintenanceState.ON) {
-        continue;
-      }
-
-      Map<String, ServiceComponent> serviceComponents = service.getServiceComponents();
-      for (Map.Entry<String, ServiceComponent> component : serviceComponents.entrySet()) {
-        ServiceComponent serviceComponent = component.getValue();
-        if (serviceComponent.isVersionAdvertised()) {
-          List<HostComponentSummary> hostComponentSummaries = HostComponentSummary.getHostComponentSummaries(
-              cluster.getClusterId(), service.getServiceGroupId(), service.getServiceId(), serviceComponent.getName());
-
-          for (HostComponentSummary hcs : hostComponentSummaries) {
-            // Skip host if it is in maintenance mode
-            Host host = clustersProvider.get().getHost(hcs.getHostName());
-            if (host.getMaintenanceState(cluster.getClusterId()) != MaintenanceState.ON) {
-              if (hcs.getCurrentState() == State.INSTALL_FAILED) {
-
-                prerequisiteCheck.getFailedDetail().add(hcs);
-
-                failedServiceNames.add(service.getName());
-                installFailedHostComponents.add(MessageFormat.format("[{0}:{1} on {2}]",
-                    service.getName(), serviceComponent.getName(), hcs.getHostName()));
+    
+    Map<ServiceGroup, Set<String>> serviceGroupsInUpgrade = getServicesInUpgrade(request);
+    for (ServiceGroup serviceGroup : serviceGroupsInUpgrade.keySet()) {
+      for( String serviceName : serviceGroupsInUpgrade.get(serviceGroup) ) {
+        final Service service = cluster.getService(serviceName);
+        // Skip service if it is in maintenance mode
+        if (service.getMaintenanceState() == MaintenanceState.ON) {
+          continue;
+        }
+  
+        Map<String, ServiceComponent> serviceComponents = service.getServiceComponents();
+        for (Map.Entry<String, ServiceComponent> component : serviceComponents.entrySet()) {
+          ServiceComponent serviceComponent = component.getValue();
+          if (serviceComponent.isVersionAdvertised()) {
+            List<HostComponentSummary> hostComponentSummaries = HostComponentSummary.getHostComponentSummaries(
+                cluster.getClusterId(), service.getServiceGroupId(), service.getServiceId(), serviceComponent.getName());
+  
+            for (HostComponentSummary hcs : hostComponentSummaries) {
+              // Skip host if it is in maintenance mode
+              Host host = clustersProvider.get().getHost(hcs.getHostName());
+              if (host.getMaintenanceState(cluster.getClusterId()) != MaintenanceState.ON) {
+                if (hcs.getCurrentState() == State.INSTALL_FAILED) {
+  
+                  result.getFailedDetail().add(hcs);
+  
+                  failedServiceNames.add(service.getName());
+                  installFailedHostComponents.add(MessageFormat.format("[{0}:{1} on {2}]",
+                      service.getName(), serviceComponent.getName(), hcs.getHostName()));
+                }
               }
             }
           }
@@ -103,10 +108,12 @@ public class ComponentsInstallationCheck extends AbstractCheckDescriptor {
       String message = MessageFormat.format("Service components in INSTALL_FAILED state: {0}.",
           StringUtils.join(installFailedHostComponents, ", "));
 
-      prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failedServiceNames));
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason(
+      result.setFailedOn(new LinkedHashSet<>(failedServiceNames));
+      result.setStatus(PrereqCheckStatus.FAIL);
+      result.setFailReason(
           "Found service components in INSTALL_FAILED state. Please re-install these components. " + message);
     }
+
+    return result;
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java
index d886d4f..fb5fe25 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ConfigurationMergeCheck.java
@@ -24,11 +24,15 @@ import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.orm.entities.UpgradePlanDetailEntity;
+import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.ConfigMergeHelper;
 import org.apache.ambari.server.state.ConfigMergeHelper.ThreeWayValue;
+import org.apache.ambari.server.state.Mpack;
+import org.apache.ambari.server.state.ServiceGroup;
+import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 
@@ -42,7 +46,7 @@ import com.google.inject.Singleton;
 @UpgradeCheck(
     order = 99.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class ConfigurationMergeCheck extends AbstractCheckDescriptor {
+public class ConfigurationMergeCheck extends ClusterCheck {
 
   @Inject
   ConfigMergeHelper m_mergeHelper;
@@ -60,39 +64,32 @@ public class ConfigurationMergeCheck extends AbstractCheckDescriptor {
    * </ul>
    */
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+  public UpgradeCheckResult perform(PrereqCheckRequest request)
       throws AmbariException {
 
-    RepositoryVersionEntity rve = request.getTargetRepositoryVersion();
-
-    Map<String, Map<String, ThreeWayValue>> changes =
-        m_mergeHelper.getConflicts(request.getClusterName(), rve.getStackId());
-
+    final String clusterName = request.getClusterName();
+    final Cluster cluster = clustersProvider.get().getCluster(clusterName);
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
     Set<String> failedTypes = new HashSet<>();
 
-    for (Entry<String, Map<String, ThreeWayValue>> entry : changes.entrySet()) {
-      for (Entry<String, ThreeWayValue> configEntry : entry.getValue().entrySet()) {
+    for (UpgradePlanDetailEntity upgradeDetail : request.getUpgradePlan().getDetails()) {
+      ServiceGroup serviceGroup = cluster.getServiceGroup(upgradeDetail.getServiceGroupId());
+      Mpack targetMpack = ambariMetaInfo.get().getMpack(upgradeDetail.getMpackTargetId());
 
-        ThreeWayValue twv = configEntry.getValue();
-        if (null == twv.oldStackValue) { // !!! did not exist and in the map means changed
-          failedTypes.add(entry.getKey());
+      StackId sourceStack = serviceGroup.getStackId();
+      StackId targetStack = targetMpack.getStackId();
 
-          prerequisiteCheck.getFailedOn().add(entry.getKey() + "/" + configEntry.getKey());
+      Map<String, Map<String, ThreeWayValue>> changes =
+          m_mergeHelper.getConflicts(request.getClusterName(), targetStack);
 
-          MergeDetail md = new MergeDetail();
-          md.type = entry.getKey();
-          md.property = configEntry.getKey();
-          md.current = twv.savedValue;
-          md.new_stack_value = twv.newStackValue;
-          md.result_value = md.current;
-          prerequisiteCheck.getFailedDetail().add(md);
+      for (Entry<String, Map<String, ThreeWayValue>> entry : changes.entrySet()) {
+        for (Entry<String, ThreeWayValue> configEntry : entry.getValue().entrySet()) {
 
-        } else if (!twv.oldStackValue.equals(twv.savedValue)) {  // !!! value customized
-          if (null == twv.newStackValue || // !!! not in new stack
-              !twv.oldStackValue.equals(twv.newStackValue)) { // !!! or the default value changed
+          ThreeWayValue twv = configEntry.getValue();
+          if (null == twv.oldStackValue) { // !!! did not exist and in the map means changed
             failedTypes.add(entry.getKey());
 
-            prerequisiteCheck.getFailedOn().add(entry.getKey() + "/" + configEntry.getKey());
+            result.getFailedOn().add(entry.getKey() + "/" + configEntry.getKey());
 
             MergeDetail md = new MergeDetail();
             md.type = entry.getKey();
@@ -100,22 +97,38 @@ public class ConfigurationMergeCheck extends AbstractCheckDescriptor {
             md.current = twv.savedValue;
             md.new_stack_value = twv.newStackValue;
             md.result_value = md.current;
-            prerequisiteCheck.getFailedDetail().add(md);
+            result.getFailedDetail().add(md);
+
+          } else if (!twv.oldStackValue.equals(twv.savedValue)) {  // !!! value customized
+            if (null == twv.newStackValue || // !!! not in new stack
+                !twv.oldStackValue.equals(twv.newStackValue)) { // !!! or the default value changed
+              failedTypes.add(entry.getKey());
+
+              result.getFailedOn().add(entry.getKey() + "/" + configEntry.getKey());
+
+              MergeDetail md = new MergeDetail();
+              md.type = entry.getKey();
+              md.property = configEntry.getKey();
+              md.current = twv.savedValue;
+              md.new_stack_value = twv.newStackValue;
+              md.result_value = md.current;
+              result.getFailedDetail().add(md);
+            }
           }
         }
       }
     }
 
-    if (prerequisiteCheck.getFailedOn().size() > 0) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING);
-      String failReason = getFailReason(prerequisiteCheck, request);
-
-      prerequisiteCheck.setFailReason(String.format(failReason, StringUtils.join(
-          failedTypes, ", ")));
+    if (result.getFailedOn().size() > 0) {
+      result.setStatus(PrereqCheckStatus.WARNING);
+      String failReason = getFailReason(result, request);
 
+      result.setFailReason(String.format(failReason, StringUtils.join(failedTypes, ", ")));
     } else {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.PASS);
+      result.setStatus(PrereqCheckStatus.PASS);
     }
+
+    return result;
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java
index 48c300d..d3597b0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java
@@ -31,7 +31,7 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 
@@ -47,14 +47,14 @@ import com.google.inject.Singleton;
 @UpgradeCheck(
     order = 98.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class HardcodedStackVersionPropertiesCheck extends AbstractCheckDescriptor {
+public class HardcodedStackVersionPropertiesCheck extends ClusterCheck {
 
   public HardcodedStackVersionPropertiesCheck() {
     super(CheckDescription.HARDCODED_STACK_VERSION_PROPERTIES_CHECK);
   }
 
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+  public UpgradeCheckResult perform(PrereqCheckRequest request)
       throws AmbariException {
 
     Cluster cluster = clustersProvider.get().getCluster(request.getClusterName());
@@ -85,17 +85,20 @@ public class HardcodedStackVersionPropertiesCheck extends AbstractCheckDescripto
       }
     }
 
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
     if (failures.size() > 0) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING);
-      String failReason = getFailReason(prerequisiteCheck, request);
+      result.setStatus(PrereqCheckStatus.WARNING);
+      String failReason = getFailReason(result, request);
 
-      prerequisiteCheck.setFailReason(String.format(failReason, StringUtils.join(failedVersions, ',')));
-      prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failures));
+      result.setFailReason(String.format(failReason, StringUtils.join(failedVersions, ',')));
+      result.setFailedOn(new LinkedHashSet<>(failures));
 
     } else {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.PASS);
+      result.setStatus(PrereqCheckStatus.PASS);
     }
 
+    return result;
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HealthCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HealthCheck.java
index 7ba0d4a..58e00d9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HealthCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HealthCheck.java
@@ -34,7 +34,7 @@ import org.apache.ambari.server.state.AlertState;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 import org.codehaus.jackson.annotate.JsonProperty;
@@ -51,7 +51,7 @@ import com.google.inject.Singleton;
 @UpgradeCheck(
     group = UpgradeCheckGroup.DEFAULT,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class HealthCheck extends AbstractCheckDescriptor {
+public class HealthCheck extends ClusterCheck {
 
   private static final List<AlertState> ALERT_STATES = asList(WARNING, CRITICAL);
 
@@ -69,7 +69,7 @@ public class HealthCheck extends AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+  public UpgradeCheckResult perform(PrereqCheckRequest request)
       throws AmbariException {
 
     AlertsDAO alertsDAO = alertsDAOProvider.get();
@@ -79,6 +79,8 @@ public class HealthCheck extends AbstractCheckDescriptor {
 
     List<String> errorMessages = new ArrayList<>();
 
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
     for (AlertCurrentEntity alert : alerts) {
       AlertHistoryEntity alertHistory = alert.getAlertHistory();
       AlertState alertState = alertHistory.getAlertState();
@@ -92,17 +94,19 @@ public class HealthCheck extends AbstractCheckDescriptor {
         } else {
           errorMessages.add(state + ": " + label + ": " + hostName);
         }
-        prerequisiteCheck.getFailedDetail().add(new AlertDetail(state, label, hostName));
+        result.getFailedDetail().add(new AlertDetail(state, label, hostName));
       }
     }
 
     if (!errorMessages.isEmpty()) {
-      prerequisiteCheck.getFailedOn().add(clusterName);
-      prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING);
-      String failReason = getFailReason(prerequisiteCheck, request);
-      prerequisiteCheck.setFailReason(
+      result.getFailedOn().add(clusterName);
+      result.setStatus(PrereqCheckStatus.WARNING);
+      String failReason = getFailReason(result, request);
+      result.setFailReason(
           String.format(failReason, StringUtils.join(errorMessages, System.lineSeparator())));
     }
+
+    return result;
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostMaintenanceModeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostMaintenanceModeCheck.java
index ca74231..1bf3473 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostMaintenanceModeCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostMaintenanceModeCheck.java
@@ -21,11 +21,12 @@ import java.util.Collection;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
 import com.google.inject.Singleton;
@@ -44,7 +45,7 @@ import com.google.inject.Singleton;
     group = UpgradeCheckGroup.MAINTENANCE_MODE,
     order = 7.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class HostMaintenanceModeCheck extends AbstractCheckDescriptor {
+public class HostMaintenanceModeCheck extends ClusterCheck {
 
   public static final String KEY_CANNOT_START_HOST_ORDERED = "cannot_upgrade_mm_hosts";
 
@@ -59,34 +60,39 @@ public class HostMaintenanceModeCheck extends AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+  public UpgradeCheckResult perform(PrereqCheckRequest request)
       throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     Collection<Host> hosts = cluster.getHosts();
 
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
     // see if any hosts in the cluster are in MM
     for (Host host : hosts) {
       MaintenanceState maintenanceState = host.getMaintenanceState(cluster.getClusterId());
       if (maintenanceState != MaintenanceState.OFF) {
-        prerequisiteCheck.getFailedOn().add(host.getHostName());
+        result.getFailedOn().add(host.getHostName());
 
-        prerequisiteCheck.getFailedDetail().add(
+        result.getFailedDetail().add(
             new HostDetail(host.getHostId(), host.getHostName()));
       }
     }
 
     // for any host in MM, produce a warning
-    if (!prerequisiteCheck.getFailedOn().isEmpty()) {
-      PrereqCheckStatus status = request.getUpgradeType() == UpgradeType.HOST_ORDERED ?
+    if (!result.getFailedOn().isEmpty()) {
+      UpgradePlanEntity upgradePlan =  request.getUpgradePlan();
+      PrereqCheckStatus status = upgradePlan.getUpgradeType() == UpgradeType.HOST_ORDERED ?
           PrereqCheckStatus.FAIL : PrereqCheckStatus.WARNING;
-      prerequisiteCheck.setStatus(status);
+      result.setStatus(status);
 
-      String failReason = request.getUpgradeType() == UpgradeType.HOST_ORDERED ?
-          getFailReason(KEY_CANNOT_START_HOST_ORDERED, prerequisiteCheck, request) :
-          getFailReason(prerequisiteCheck, request);
+      String failReason = upgradePlan.getUpgradeType() == UpgradeType.HOST_ORDERED ?
+          getFailReason(KEY_CANNOT_START_HOST_ORDERED, result, request)
+          : getFailReason(result, request);
 
-      prerequisiteCheck.setFailReason(failReason);
+      result.setFailReason(failReason);
     }
+
+    return result;
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
index f6b6296..881a057 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsHeartbeatCheck.java
@@ -26,7 +26,7 @@ import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.HostHealthStatus.HealthStatus;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
 import com.google.inject.Singleton;
@@ -46,7 +46,7 @@ import com.google.inject.Singleton;
     group = UpgradeCheckGroup.LIVELINESS,
     order = 1.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class HostsHeartbeatCheck extends AbstractCheckDescriptor {
+public class HostsHeartbeatCheck extends ClusterCheck {
 
   /**
    * Constructor.
@@ -59,12 +59,14 @@ public class HostsHeartbeatCheck extends AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+  public UpgradeCheckResult perform(PrereqCheckRequest request)
       throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     Collection<Host> hosts = cluster.getHosts();
 
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
     for (Host host : hosts) {
       HealthStatus hostHealth = host.getHealthStatus().getHealthStatus();
       MaintenanceState maintenanceState = host.getMaintenanceState(cluster.getClusterId());
@@ -72,9 +74,9 @@ public class HostsHeartbeatCheck extends AbstractCheckDescriptor {
         case UNHEALTHY:
         case UNKNOWN:
           if (maintenanceState == MaintenanceState.OFF) {
-            prerequisiteCheck.getFailedOn().add(host.getHostName());
+            result.getFailedOn().add(host.getHostName());
 
-            prerequisiteCheck.getFailedDetail().add(
+            result.getFailedDetail().add(
                 new HostDetail(host.getHostId(), host.getHostName()));
           }
           break;
@@ -85,10 +87,11 @@ public class HostsHeartbeatCheck extends AbstractCheckDescriptor {
     }
 
     // for any hosts unhealthy and NOT in MM mode, fail this check
-    if (!prerequisiteCheck.getFailedOn().isEmpty()) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, request));
-      return;
+    if (!result.getFailedOn().isEmpty()) {
+      result.setStatus(PrereqCheckStatus.FAIL);
+      result.setFailReason(getFailReason(result, request));
     }
+
+    return result;
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
index f5204d8..901ff9c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
@@ -23,18 +23,21 @@ import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.orm.entities.UpgradePlanDetailEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.ModuleComponent;
+import org.apache.ambari.server.state.Mpack;
+import org.apache.ambari.server.state.Mpack.ModuleComponentVersionChange;
+import org.apache.ambari.server.state.Mpack.MpackChangeSummary;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
-import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.ServiceGroup;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-import org.apache.ambari.server.state.stack.UpgradePack;
-import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
+import org.apache.commons.lang3.StringUtils;
 
 import com.google.inject.Singleton;
 
@@ -46,10 +49,7 @@ import com.google.inject.Singleton;
     group = UpgradeCheckGroup.MAINTENANCE_MODE,
     order = 5.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class HostsMasterMaintenanceCheck extends AbstractCheckDescriptor {
-
-  static final String KEY_NO_UPGRADE_NAME = "no_upgrade_name";
-  static final String KEY_NO_UPGRADE_PACK = "no_upgrade_pack";
+public class HostsMasterMaintenanceCheck extends ClusterCheck {
 
   /**
    * Constructor.
@@ -59,42 +59,28 @@ public class HostsMasterMaintenanceCheck extends AbstractCheckDescriptor {
   }
 
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+  public UpgradeCheckResult perform(PrereqCheckRequest request) throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
-    final StackId stackId = request.getSourceStackId();
     final Set<String> hostsWithMasterComponent = new HashSet<>();
 
-    // TODO AMBARI-12698, need to pass the upgrade pack to use in the request, or at least the type.
-    RepositoryVersionEntity repositoryVersion = request.getTargetRepositoryVersion();
-
-    final String upgradePackName = repositoryVersionHelper.get().getUpgradePackageName(
-        stackId.getStackName(), stackId.getStackVersion(), repositoryVersion.getVersion(), null);
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
 
-    if (upgradePackName == null) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      String fail = getFailReason(KEY_NO_UPGRADE_NAME, prerequisiteCheck, request);
-      prerequisiteCheck.setFailReason(String.format(fail, stackId.getStackName(), stackId.getStackVersion()));
-      return;
-    }
+    for (UpgradePlanDetailEntity upgradeDetail : request.getUpgradePlan().getDetails()) {
+      ServiceGroup serviceGroup = cluster.getServiceGroup(upgradeDetail.getServiceGroupId());
+      Mpack sourceMpack = ambariMetaInfo.get().getMpack(serviceGroup.getMpackId());
+      Mpack targetMpack = ambariMetaInfo.get().getMpack(upgradeDetail.getMpackTargetId());
 
-    final UpgradePack upgradePack = ambariMetaInfo.get().getUpgradePacks(stackId.getStackName(), stackId.getStackVersion()).get(upgradePackName);
-    if (upgradePack == null) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      String fail = getFailReason(KEY_NO_UPGRADE_PACK, prerequisiteCheck, request);
-      prerequisiteCheck.setFailReason(String.format(fail, upgradePackName));
-      return;
-    }
+      MpackChangeSummary changeSummary = sourceMpack.getChangeSummary(targetMpack);
+      for( ModuleComponentVersionChange componentChanges : changeSummary.getComponentVersionChanges()) {
+        ModuleComponent moduleComponent = componentChanges.getSource();
 
-    final Set<String> componentsFromUpgradePack = new HashSet<>();
-    for (Map<String, ProcessingComponent> task: upgradePack.getTasks().values()) {
-      componentsFromUpgradePack.addAll(task.keySet());
-    }
-
-    for (Service service: cluster.getServices()) {
-      for (ServiceComponent serviceComponent: service.getServiceComponents().values()) {
-        if (serviceComponent.isMasterComponent() && componentsFromUpgradePack.contains(serviceComponent.getName())) {
-          hostsWithMasterComponent.addAll(serviceComponent.getServiceComponentHosts().keySet());
+        for (Service service: serviceGroup.getServices()) {
+          for (ServiceComponent serviceComponent: service.getServiceComponents().values()) {
+            if (serviceComponent.isMasterComponent() && StringUtils.equals(moduleComponent.getName(), serviceComponent.getName())) {
+              hostsWithMasterComponent.addAll(serviceComponent.getServiceComponentHosts().keySet());
+            }
+          }
         }
       }
     }
@@ -103,16 +89,18 @@ public class HostsMasterMaintenanceCheck extends AbstractCheckDescriptor {
     for (Map.Entry<String, Host> hostEntry : clusterHosts.entrySet()) {
       final Host host = hostEntry.getValue();
       if (host.getMaintenanceState(cluster.getClusterId()) == MaintenanceState.ON && hostsWithMasterComponent.contains(host.getHostName())) {
-        prerequisiteCheck.getFailedOn().add(host.getHostName());
+        result.getFailedOn().add(host.getHostName());
 
-        prerequisiteCheck.getFailedDetail().add(
+        result.getFailedDetail().add(
             new HostDetail(host.getHostId(), host.getHostName()));
       }
     }
 
-    if (!prerequisiteCheck.getFailedOn().isEmpty()) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, request));
+    if (!result.getFailedOn().isEmpty()) {
+      result.setStatus(PrereqCheckStatus.FAIL);
+      result.setFailReason(getFailReason(result, request));
     }
+
+    return result;
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/PreUpgradeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/PreUpgradeCheck.java
new file mode 100644
index 0000000..b098478
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/PreUpgradeCheck.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.checks;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.checks.ClusterCheck.CheckQualification;
+import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.state.stack.PrereqCheckType;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
+import org.apache.ambari.server.state.stack.UpgradePack;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
+
+/**
+ * The {@link PreUpgradeCheck} is used before an upgrade in order to present the
+ * administrator with a warning or a failure about an upgrade.
+ */
+public interface PreUpgradeCheck {
+
+  /**
+   * Gets the set of services that this check is associated with. If the check
+   * is not associated with a particular service, then this should be an empty
+   * set.
+   *
+   * @return a set of services which will determine whether this check is
+   *         applicable, or an empty set.
+   */
+  Set<String> getApplicableServices();
+
+  /**
+   * Gets any additional qualifications which an upgrade check should run in
+   * order to determine if it's applicable to the upgrade.
+   *
+   * @return a list of qualifications, or an empty list.
+   */
+  List<CheckQualification> getQualifications();
+
+  /**
+   * Tests if the prerequisite check is applicable to given upgrade request.
+   *
+   * @param request
+   *          prerequisite check request
+   * @return true if check should be performed
+   * @throws AmbariException
+   */
+  boolean isApplicable(PrereqCheckRequest request) throws AmbariException;
+
+  /**
+   * Executes check against given cluster.
+   * @param request pre upgrade check request
+   * @return TODO
+   *
+   * @throws AmbariException if server error happens
+   */
+  UpgradeCheckResult perform(PrereqCheckRequest request)
+      throws AmbariException;
+
+  /**
+   * Gets the type of check.
+   *
+   * @return the type of check (not {@code null}).
+   */
+  PrereqCheckType getType();
+
+  /**
+   * Gets whether this upgrade check is required for the specified
+   * {@link UpgradeType}. Checks which are marked as required do not need to be
+   * explicitely declared in the {@link UpgradePack} to be run.
+   *
+   * @return {@code true} if it is required, {@code false} otherwise.
+   */
+  boolean isRequired(UpgradeType upgradeType);
+
+  /**
+   * The {@link CheckDescription} which includes the name, description, and
+   * success/failure messages for a {@link PreUpgradeCheck}.
+   *
+   * @return the check description.
+   */
+  CheckDescription getCheckDescrption();
+}
\ No newline at end of file
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/PreviousUpgradeCompleted.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/PreviousUpgradeCompleted.java
index 286ffd7..4f6667b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/PreviousUpgradeCompleted.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/PreviousUpgradeCompleted.java
@@ -25,7 +25,7 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.UpgradeEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.Direction;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
@@ -41,7 +41,7 @@ import com.google.inject.Singleton;
     group = UpgradeCheckGroup.DEFAULT,
     order = 4.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class PreviousUpgradeCompleted extends AbstractCheckDescriptor {
+public class PreviousUpgradeCompleted extends ClusterCheck {
 
   /**
    * The message displayed as part of this pre-upgrade check.
@@ -56,7 +56,7 @@ public class PreviousUpgradeCompleted extends AbstractCheckDescriptor {
   }
 
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+  public UpgradeCheckResult perform(PrereqCheckRequest request) throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
 
@@ -70,12 +70,16 @@ public class PreviousUpgradeCompleted extends AbstractCheckDescriptor {
           directionText);
     }
 
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
     if (null != errorMessage) {
       LinkedHashSet<String> failedOn = new LinkedHashSet<>();
       failedOn.add(cluster.getClusterName());
-      prerequisiteCheck.setFailedOn(failedOn);
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason(errorMessage);
+      result.setFailedOn(failedOn);
+      result.setStatus(PrereqCheckStatus.FAIL);
+      result.setFailReason(errorMessage);
     }
+
+    return result;
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServiceCheckValidityCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServiceCheckValidityCheck.java
index 236cced..473a086 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServiceCheckValidityCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServiceCheckValidityCheck.java
@@ -43,7 +43,7 @@ import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 import org.codehaus.jackson.annotate.JsonProperty;
@@ -63,7 +63,7 @@ import com.google.inject.Singleton;
 @UpgradeCheck(
     group = UpgradeCheckGroup.DEFAULT,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class ServiceCheckValidityCheck extends AbstractCheckDescriptor {
+public class ServiceCheckValidityCheck extends ClusterCheck {
 
   private static final Logger LOG = LoggerFactory.getLogger(ServiceCheckValidityCheck.class);
 
@@ -89,7 +89,7 @@ public class ServiceCheckValidityCheck extends AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+  public UpgradeCheckResult perform(PrereqCheckRequest request)
       throws AmbariException {
 
     ServiceConfigDAO serviceConfigDAO = serviceConfigDAOProvider.get();
@@ -150,17 +150,21 @@ public class ServiceCheckValidityCheck extends AbstractCheckDescriptor {
       }
     }
 
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
     if (!failures.isEmpty()) {
-      prerequisiteCheck.getFailedDetail().addAll(failures);
+      result.getFailedDetail().addAll(failures);
 
       LinkedHashSet<String> failedServiceNames = failures.stream().map(
           failure -> failure.serviceName).collect(Collectors.toCollection(LinkedHashSet::new));
 
-      prerequisiteCheck.setFailedOn(failedServiceNames);
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      String failReason = getFailReason(prerequisiteCheck, request);
-      prerequisiteCheck.setFailReason(String.format(failReason, StringUtils.join(failedServiceNames, ", ")));
+      result.setFailedOn(failedServiceNames);
+      result.setStatus(PrereqCheckStatus.FAIL);
+      String failReason = getFailReason(result, request);
+      result.setFailReason(String.format(failReason, StringUtils.join(failedServiceNames, ", ")));
     }
+
+    return result;
   }
 
   private boolean hasAtLeastOneComponentVersionAdvertised(Service service) {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicePresenceCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicePresenceCheck.java
index 3425a1d..ea9922e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicePresenceCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicePresenceCheck.java
@@ -28,7 +28,7 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -42,7 +42,7 @@ import com.google.inject.Singleton;
  */
 @Singleton
 @UpgradeCheck(group = UpgradeCheckGroup.DEFAULT)
-public class ServicePresenceCheck extends AbstractCheckDescriptor{
+public class ServicePresenceCheck extends ClusterCheck{
 
   private static final Logger LOG = LoggerFactory.getLogger(ServicePresenceCheck.class);
 
@@ -75,7 +75,7 @@ public class ServicePresenceCheck extends AbstractCheckDescriptor{
   }
 
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+  public UpgradeCheckResult perform(PrereqCheckRequest request) throws AmbariException {
     final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName());
     Set<String> installedServices = cluster.getServicesByName().keySet();
 
@@ -85,39 +85,43 @@ public class ServicePresenceCheck extends AbstractCheckDescriptor{
 
     List<String> failReasons = new ArrayList<>();
 
-    String reason = getFailReason(prerequisiteCheck, request);
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
+    String reason = getFailReason(result, request);
     for(String service: noUpgradeSupportServices){
       if (installedServices.contains(service.toUpperCase())){
-        prerequisiteCheck.getFailedOn().add(service);
+        result.getFailedOn().add(service);
         String msg = String.format(reason, service, service);
         failReasons.add(msg);
       }
     }
 
-    reason = getFailReason(KEY_SERVICE_REPLACED, prerequisiteCheck, request);
+    reason = getFailReason(KEY_SERVICE_REPLACED, result, request);
     for (Map.Entry<String, String> entry : replacedServices.entrySet()) {
       String removedService = entry.getKey();
       if(installedServices.contains(removedService.toUpperCase())){
-        prerequisiteCheck.getFailedOn().add(removedService);
+        result.getFailedOn().add(removedService);
         String newService = entry.getValue();
         String msg = String.format(reason, removedService, newService);
         failReasons.add(msg);
       }
     }
 
-    reason = getFailReason(KEY_SERVICE_REMOVED, prerequisiteCheck, request);
+    reason = getFailReason(KEY_SERVICE_REMOVED, result, request);
     for(String service: removedServices){
       if (installedServices.contains(service.toUpperCase())){
-        prerequisiteCheck.getFailedOn().add(service);
+        result.getFailedOn().add(service);
         String msg = String.format(reason, service, service);
         failReasons.add(msg);
       }
     }
 
     if(!failReasons.isEmpty()){
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason(StringUtils.join(failReasons, '\n'));
+      result.setStatus(PrereqCheckStatus.FAIL);
+      result.setFailReason(StringUtils.join(failReasons, '\n'));
     }
+
+    return result;
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
index 8d7cd1b..ecd9d96 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
@@ -24,8 +25,9 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.ServiceGroup;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
 import com.google.inject.Singleton;
@@ -38,7 +40,7 @@ import com.google.inject.Singleton;
     group = UpgradeCheckGroup.MAINTENANCE_MODE,
     order = 6.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class ServicesMaintenanceModeCheck extends AbstractCheckDescriptor {
+public class ServicesMaintenanceModeCheck extends ClusterCheck {
 
   /**
    * Constructor.
@@ -48,19 +50,26 @@ public class ServicesMaintenanceModeCheck extends AbstractCheckDescriptor {
   }
 
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+  public UpgradeCheckResult perform(PrereqCheckRequest request) throws AmbariException {
     final Cluster cluster = clustersProvider.get().getCluster(request.getClusterName());
-    Set<String> servicesInUpgrade = getServicesInUpgrade(request);
+    Map<ServiceGroup, Set<String>> serviceGroupsInUpgrade = getServicesInUpgrade(request);
 
-    for (String serviceName : servicesInUpgrade) {
-      final Service service = cluster.getService(serviceName);
-      if (!service.isClientOnlyService() && service.getMaintenanceState() == MaintenanceState.ON) {
-        prerequisiteCheck.getFailedOn().add(service.getName());
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
+    for (ServiceGroup serviceGroup : serviceGroupsInUpgrade.keySet()) {
+      for( String serviceName : serviceGroupsInUpgrade.get(serviceGroup) ) {  
+        final Service service = cluster.getService(serviceName);
+        if (!service.isClientOnlyService() && service.getMaintenanceState() == MaintenanceState.ON) {
+          result.getFailedOn().add(service.getName());
+        }
       }
     }
-    if (!prerequisiteCheck.getFailedOn().isEmpty()) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, request));
+  
+    if (!result.getFailedOn().isEmpty()) {
+      result.setStatus(PrereqCheckStatus.FAIL);
+      result.setFailReason(getFailReason(result, request));
     }
+
+    return result;
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java
index b65aff7..eb54d2c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesUpCheck.java
@@ -34,10 +34,11 @@ import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
+import org.apache.ambari.server.state.ServiceGroup;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 
@@ -68,7 +69,7 @@ import com.google.inject.Singleton;
     group = UpgradeCheckGroup.LIVELINESS,
     order = 2.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class ServicesUpCheck extends AbstractCheckDescriptor {
+public class ServicesUpCheck extends ClusterCheck {
 
   private static final float SLAVE_THRESHOLD = 0.5f;
 
@@ -83,7 +84,7 @@ public class ServicesUpCheck extends AbstractCheckDescriptor {
    * {@inheritDoc}
    */
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+  public UpgradeCheckResult perform(PrereqCheckRequest request)
       throws AmbariException {
 
     final String clusterName = request.getClusterName();
@@ -91,109 +92,116 @@ public class ServicesUpCheck extends AbstractCheckDescriptor {
     List<String> errorMessages = new ArrayList<>();
     LinkedHashSet<ServiceDetail> failedServices = new LinkedHashSet<>();
 
-    Set<String> servicesInUpgrade = getServicesInUpgrade(request);
-    for (String serviceName : servicesInUpgrade) {
-      final Service service = cluster.getService(serviceName);
+    Map<ServiceGroup, Set<String>> serviceGroupsInUpgrade = getServicesInUpgrade(request);
+    for (ServiceGroup serviceGroup : serviceGroupsInUpgrade.keySet()) {
+      for( String serviceName : serviceGroupsInUpgrade.get(serviceGroup) ) {
 
-      // Ignore services like Tez that are clientOnly.
-      if (service.isClientOnlyService()) {
-        continue;
-      }
-
-      Map<String, ServiceComponent> serviceComponents = service.getServiceComponents();
-      for (Map.Entry<String, ServiceComponent> component : serviceComponents.entrySet()) {
-
-        ServiceComponent serviceComponent = component.getValue();
-        // In Services like HDFS, ignore components like HDFS Client
-        if (serviceComponent.isClientComponent()) {
-          continue;
-        }
-
-        // skip if the component is not part of the finalization version check
-        if (!serviceComponent.isVersionAdvertised()) {
+        final Service service = cluster.getService(serviceName);
+  
+        // Ignore services like Tez that are clientOnly.
+        if (service.isClientOnlyService()) {
           continue;
         }
-
-        // TODO, add more logic that checks the Upgrade Pack.
-        // These components are not in the upgrade pack and do not advertise a
-        // version:
-        // ZKFC, Ambari Metrics, Kerberos, Atlas (right now).
-        // Generally, if it advertises a version => in the upgrade pack.
-        // So it can be in the Upgrade Pack but not advertise a version.
-        List<HostComponentSummary> hostComponentSummaries = HostComponentSummary.getHostComponentSummaries(
-          service.getClusterId(), service.getServiceGroupId(), service.getServiceId(), serviceComponent.getName());
-
-        // not installed, nothing to do
-        if (hostComponentSummaries.isEmpty()) {
-          continue;
-        }
-
-        // non-master, "true" slaves with cardinality 1+
-        boolean checkThreshold = false;
-        if (!serviceComponent.isMasterComponent()) {
-          StackId stackId = service.getStackId();
-          ComponentInfo componentInfo = ambariMetaInfo.get().getComponent(stackId.getStackName(),
-              stackId.getStackVersion(), serviceComponent.getServiceType(),
-              serviceComponent.getName());
-
-          String cardinality = componentInfo.getCardinality();
-          // !!! check if there can be more than one. This will match, say,
-          // datanodes but not ZKFC
-          if (null != cardinality
-              && (cardinality.equals("ALL") || cardinality.matches("[1-9].*"))) {
-            checkThreshold = true;
+  
+        Map<String, ServiceComponent> serviceComponents = service.getServiceComponents();
+        for (Map.Entry<String, ServiceComponent> component : serviceComponents.entrySet()) {
+  
+          ServiceComponent serviceComponent = component.getValue();
+          // In Services like HDFS, ignore components like HDFS Client
+          if (serviceComponent.isClientComponent()) {
+            continue;
           }
-        }
-
-        // check threshold for slaves which have a non-0 cardinality
-        if (checkThreshold) {
-          int total = hostComponentSummaries.size();
-          int up = 0;
-          int down = 0;
-
-          for (HostComponentSummary summary : hostComponentSummaries) {
-            if (isConsideredDown(cluster, serviceComponent, summary)) {
-              down++;
-            } else {
-              up++;
-            }
+  
+          // skip if the component is not part of the finalization version check
+          if (!serviceComponent.isVersionAdvertised()) {
+            continue;
           }
-
-          if ((float) down / total > SLAVE_THRESHOLD) { // arbitrary
-            failedServices.add(new ServiceDetail(serviceName));
-
-            String message = MessageFormat.format(
-                "{0}: {1} out of {2} {3} are started; there should be {4,number,percent} started before upgrading.",
-                service.getName(), up, total, serviceComponent.getName(), SLAVE_THRESHOLD);
-            errorMessages.add(message);
+  
+          // TODO, add more logic that checks the Upgrade Pack.
+          // These components are not in the upgrade pack and do not advertise a
+          // version:
+          // ZKFC, Ambari Metrics, Kerberos, Atlas (right now).
+          // Generally, if it advertises a version => in the upgrade pack.
+          // So it can be in the Upgrade Pack but not advertise a version.
+          List<HostComponentSummary> hostComponentSummaries = HostComponentSummary.getHostComponentSummaries(
+            service.getClusterId(), service.getServiceGroupId(), service.getServiceId(), serviceComponent.getName());
+  
+          // not installed, nothing to do
+          if (hostComponentSummaries.isEmpty()) {
+            continue;
+          }
+  
+          // non-master, "true" slaves with cardinality 1+
+          boolean checkThreshold = false;
+          if (!serviceComponent.isMasterComponent()) {
+            StackId stackId = service.getStackId();
+            ComponentInfo componentInfo = ambariMetaInfo.get().getComponent(stackId.getStackName(),
+                stackId.getStackVersion(), serviceComponent.getServiceType(),
+                serviceComponent.getName());
+  
+            String cardinality = componentInfo.getCardinality();
+            // !!! check if there can be more than one. This will match, say,
+            // datanodes but not ZKFC
+            if (null != cardinality
+                && (cardinality.equals("ALL") || cardinality.matches("[1-9].*"))) {
+              checkThreshold = true;
+            }
           }
-        } else {
-          for (HostComponentSummary summary : hostComponentSummaries) {
-            if (isConsideredDown(cluster, serviceComponent, summary)) {
+  
+          // check threshold for slaves which have a non-0 cardinality
+          if (checkThreshold) {
+            int total = hostComponentSummaries.size();
+            int up = 0;
+            int down = 0;
+  
+            for (HostComponentSummary summary : hostComponentSummaries) {
+              if (isConsideredDown(cluster, serviceComponent, summary)) {
+                down++;
+              } else {
+                up++;
+              }
+            }
+  
+            if ((float) down / total > SLAVE_THRESHOLD) { // arbitrary
               failedServices.add(new ServiceDetail(serviceName));
-
-              String message = MessageFormat.format("{0}: {1} (in {2} on host {3})",
-                  service.getName(), serviceComponent.getName(), summary.getCurrentState(),
-                  summary.getHostName());
+  
+              String message = MessageFormat.format(
+                  "{0}: {1} out of {2} {3} are started; there should be {4,number,percent} started before upgrading.",
+                  service.getName(), up, total, serviceComponent.getName(), SLAVE_THRESHOLD);
               errorMessages.add(message);
-              break;
+            }
+          } else {
+            for (HostComponentSummary summary : hostComponentSummaries) {
+              if (isConsideredDown(cluster, serviceComponent, summary)) {
+                failedServices.add(new ServiceDetail(serviceName));
+  
+                String message = MessageFormat.format("{0}: {1} (in {2} on host {3})",
+                    service.getName(), serviceComponent.getName(), summary.getCurrentState(),
+                    summary.getHostName());
+                errorMessages.add(message);
+                break;
+              }
             }
           }
         }
       }
     }
 
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
     if (!errorMessages.isEmpty()) {
-      prerequisiteCheck.setFailedOn(
+      result.setFailedOn(
           failedServices.stream().map(failedService -> failedService.serviceName).collect(
               Collectors.toCollection(LinkedHashSet::new)));
 
-      prerequisiteCheck.getFailedDetail().addAll(failedServices);
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason(
+      result.getFailedDetail().addAll(failedServices);
+      result.setStatus(PrereqCheckStatus.FAIL);
+      result.setFailReason(
           "The following Service Components should be in a started state.  Please invoke a service Stop and full Start and try again. "
               + StringUtils.join(errorMessages, ", "));
     }
+
+    return result;
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
index 58ef4ba..a8161f6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheck.java
@@ -30,7 +30,7 @@ import com.google.inject.Singleton;
 
 /**
  * The {@link UpgradeCheck} annotation is used to provide ordering and grouping
- * to any {@link AbstractCheckDescriptor} instance.
+ * to any {@link ClusterCheck} instance.
  * <p/>
  * Classes marked with this annotation should also be {@link Singleton}. They
  * will be discovered on the classpath and then registered with the
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
index ff3aeda..5e2f4b6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/UpgradeCheckRegistry.java
@@ -28,6 +28,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.apache.ambari.annotations.Experimental;
+import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.slf4j.Logger;
@@ -48,7 +50,7 @@ public class UpgradeCheckRegistry {
   /**
    * The list of upgrade checks to run through.
    */
-  private Set<AbstractCheckDescriptor> m_upgradeChecks = new TreeSet<>(
+  private Set<PreUpgradeCheck> m_upgradeChecks = new TreeSet<>(
     new PreUpgradeCheckComparator());
 
   /**
@@ -57,7 +59,7 @@ public class UpgradeCheckRegistry {
    * @param upgradeCheck
    *          the check to register (not {@code null}).
    */
-  public void register(AbstractCheckDescriptor upgradeCheck) {
+  public void register(PreUpgradeCheck upgradeCheck) {
     m_upgradeChecks.add(upgradeCheck);
   }
 
@@ -66,11 +68,15 @@ public class UpgradeCheckRegistry {
    *
    * @return
    */
-  public List<AbstractCheckDescriptor> getUpgradeChecks() {
+  public List<PreUpgradeCheck> getUpgradeChecks() {
     return new ArrayList<>(m_upgradeChecks);
   }
 
-  public List<AbstractCheckDescriptor> getServiceLevelUpgradeChecks(UpgradePack upgradePack, Map<String, ServiceInfo> services) {
+  @Experimental(
+      feature = ExperimentalFeature.UPGRADE_PACK_PRE_CHECKS,
+      comment = "Need a different way to register these and inject configs into them")
+  public List<PreUpgradeCheck> getServiceLevelUpgradeChecks(UpgradePack upgradePack,
+      Map<String, ServiceInfo> services) {
     List<String> prerequisiteChecks = upgradePack.getPrerequisiteChecks();
     List<String> missingChecks = new ArrayList<>();
     for (String prerequisiteCheck : prerequisiteChecks) {
@@ -79,7 +85,7 @@ public class UpgradeCheckRegistry {
       }
     }
 
-    List<AbstractCheckDescriptor> checks = new ArrayList<>(missingChecks.size());
+    List<PreUpgradeCheck> checks = new ArrayList<>(missingChecks.size());
     if (missingChecks.isEmpty()) {
       return checks;
     }
@@ -116,7 +122,7 @@ public class UpgradeCheckRegistry {
       }
       try {
         if (clazz != null) {
-          AbstractCheckDescriptor upgradeCheck = (AbstractCheckDescriptor) clazz.newInstance();
+          PreUpgradeCheck upgradeCheck = (PreUpgradeCheck) clazz.newInstance();
           checks.add(upgradeCheck);
         }
       } catch (Exception exception) {
@@ -127,7 +133,7 @@ public class UpgradeCheckRegistry {
   }
 
   private boolean isRegistered(String prerequisiteCheck) {
-    for (AbstractCheckDescriptor descriptor: m_upgradeChecks){
+    for (PreUpgradeCheck descriptor: m_upgradeChecks){
       if (prerequisiteCheck.equals(descriptor.getClass().getName())){
         return true;
       }
@@ -140,10 +146,10 @@ public class UpgradeCheckRegistry {
    * @param upgradePack Upgrade pack object with the list of required checks to be included
    * @return
    */
-  public List<AbstractCheckDescriptor> getFilteredUpgradeChecks(UpgradePack upgradePack){
+  public List<PreUpgradeCheck> getFilteredUpgradeChecks(UpgradePack upgradePack) {
     List<String> prerequisiteChecks = upgradePack.getPrerequisiteChecks();
-    List<AbstractCheckDescriptor> resultCheckDescriptor = new ArrayList<>();
-    for (AbstractCheckDescriptor descriptor: m_upgradeChecks){
+    List<PreUpgradeCheck> resultCheckDescriptor = new ArrayList<>();
+    for (PreUpgradeCheck descriptor : m_upgradeChecks) {
       if (descriptor.isRequired(upgradePack.getType())) {
         resultCheckDescriptor.add(descriptor);
       } else if (prerequisiteChecks.contains(descriptor.getClass().getName())){
@@ -155,19 +161,18 @@ public class UpgradeCheckRegistry {
 
   /**
    * THe {@link PreUpgradeCheckComparator} class is used to compare
-   * {@link AbstractCheckDescriptor} based on their {@link UpgradeCheck}
-   * annotations.
+   * {@link PreUpgradeCheck} based on their {@link UpgradeCheck} annotations.
    */
   private static final class PreUpgradeCheckComparator implements
-      Comparator<AbstractCheckDescriptor> {
+      Comparator<PreUpgradeCheck> {
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public int compare(AbstractCheckDescriptor check1, AbstractCheckDescriptor check2) {
-      Class<? extends AbstractCheckDescriptor> clazz1 = check1.getClass();
-      Class<? extends AbstractCheckDescriptor> clazz2 = check2.getClass();
+    public int compare(PreUpgradeCheck check1, PreUpgradeCheck check2) {
+      Class<? extends PreUpgradeCheck> clazz1 = check1.getClass();
+      Class<? extends PreUpgradeCheck> clazz2 = check2.getClass();
 
       UpgradeCheck annotation1 = clazz1.getAnnotation(UpgradeCheck.class);
       UpgradeCheck annotation2 = clazz2.getAnnotation(UpgradeCheck.class);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/VersionMismatchCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/VersionMismatchCheck.java
index 9c8f66b..83f8328 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/VersionMismatchCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/VersionMismatchCheck.java
@@ -29,7 +29,7 @@ import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
 import org.apache.ambari.server.state.UpgradeState;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 
@@ -44,27 +44,32 @@ import com.google.inject.Singleton;
     group = UpgradeCheckGroup.COMPONENT_VERSION,
     order = 7.0f,
     required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-public class VersionMismatchCheck extends AbstractCheckDescriptor {
+public class VersionMismatchCheck extends ClusterCheck {
 
   public VersionMismatchCheck() {
     super(CheckDescription.VERSION_MISMATCH);
   }
 
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+  public UpgradeCheckResult perform(PrereqCheckRequest request) throws AmbariException {
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     List<String> errorMessages = new ArrayList<>();
+
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+
     for (Service service : cluster.getServices()) {
-      validateService(service, prerequisiteCheck, errorMessages);
+      validateService(service, result, errorMessages);
     }
 
-    if (!prerequisiteCheck.getFailedOn().isEmpty()) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING);
-      String failReason = getFailReason(prerequisiteCheck, request);
-      prerequisiteCheck.setFailReason(String.format(failReason, StringUtils.join(errorMessages, "\n")));
-      prerequisiteCheck.setFailReason(StringUtils.join(errorMessages, "\n"));
+    if (!result.getFailedOn().isEmpty()) {
+      result.setStatus(PrereqCheckStatus.WARNING);
+      String failReason = getFailReason(result, request);
+      result.setFailReason(String.format(failReason, StringUtils.join(errorMessages, "\n")));
+      result.setFailReason(StringUtils.join(errorMessages, "\n"));
     }
+
+    return result;
   }
 
   /**
@@ -74,7 +79,7 @@ public class VersionMismatchCheck extends AbstractCheckDescriptor {
    * @param errorMessages
    * @throws AmbariException
    */
-  private void validateService(Service service, PrerequisiteCheck prerequisiteCheck,
+  private void validateService(Service service, UpgradeCheckResult prerequisiteCheck,
                                List<String> errorMessages) throws AmbariException {
     Map<String, ServiceComponent> serviceComponents = service.getServiceComponents();
     for (ServiceComponent serviceComponent : serviceComponents.values()) {
@@ -89,7 +94,7 @@ public class VersionMismatchCheck extends AbstractCheckDescriptor {
    * @param errorMessages
    */
   private void validateServiceComponent(ServiceComponent serviceComponent,
-                                        PrerequisiteCheck prerequisiteCheck, List<String> errorMessages) {
+                                        UpgradeCheckResult prerequisiteCheck, List<String> errorMessages) {
     Map<String, ServiceComponentHost> serviceComponentHosts = serviceComponent.getServiceComponentHosts();
     for (ServiceComponentHost serviceComponentHost : serviceComponentHosts.values()) {
       validateServiceComponentHost(serviceComponent, serviceComponentHost,
@@ -108,7 +113,7 @@ public class VersionMismatchCheck extends AbstractCheckDescriptor {
    */
   private void validateServiceComponentHost(ServiceComponent serviceComponent,
                                             ServiceComponentHost serviceComponentHost,
-                                            PrerequisiteCheck prerequisiteCheck,
+                                            UpgradeCheckResult prerequisiteCheck,
                                             List<String> errorMessages) {
     if (serviceComponentHost.getUpgradeState().equals(UpgradeState.VERSION_MISMATCH)) {
       String hostName = serviceComponentHost.getHostName();
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java
index c0be480..cf95d65 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java
@@ -23,13 +23,10 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.ambari.annotations.Experimental;
-import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.actionmanager.TargetHostType;
 import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.controller.internal.RequestOperationLevel;
 import org.apache.ambari.server.controller.internal.RequestResourceFilter;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 
 /**
  * The context required to create tasks and stages for a custom action
@@ -48,7 +45,6 @@ public class ActionExecutionContext {
   private String expectedComponentName;
   private boolean hostsInMaintenanceModeExcluded = true;
   private boolean allowRetry = false;
-  private RepositoryVersionEntity repositoryVersion;
   private List<ExecutionCommandVisitor> m_visitors = new ArrayList<>();
 
   /**
@@ -196,36 +192,6 @@ public class ActionExecutionContext {
   }
 
   /**
-   * Gets the stack/version to use for generating stack-associated values for a
-   * command. In some cases the cluster's stack is not the correct one to use,
-   * such as when distributing a repository.
-   *
-   * @return the repository for the stack/version to use when generating
-   *         stack-specific content for the command.
-   *
-   * @return
-   */
-  @Deprecated
-  @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
-  public RepositoryVersionEntity getRepositoryVersion() {
-    return repositoryVersion;
-  }
-
-  /**
-   * Sets the stack/version to use for generating stack-associated values for a
-   * command. In some cases the cluster's stack is not the correct one to use,
-   * such as when distributing a repository.
-   *
-   * @param stackId
-   *          the stackId to use for stack-based properties on the command.
-   */
-  @Deprecated
-  @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
-  public void setRepositoryVersion(RepositoryVersionEntity repositoryVersion) {
-    this.repositoryVersion = repositoryVersion;
-  }
-
-  /**
    * Adds a command visitor that will be invoked after a command is created.  Provides access
    * to the command.
    *
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
index 493a209..9fa570f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
@@ -44,6 +44,8 @@ import java.util.List;
 import java.util.Properties;
 import java.util.Set;
 
+import org.apache.ambari.annotations.Experimental;
+import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariService;
 import org.apache.ambari.server.EagerSingleton;
 import org.apache.ambari.server.StaticallyInject;
@@ -55,8 +57,8 @@ import org.apache.ambari.server.actionmanager.HostRoleCommandFactoryImpl;
 import org.apache.ambari.server.actionmanager.RequestFactory;
 import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.actionmanager.StageFactoryImpl;
-import org.apache.ambari.server.checks.AbstractCheckDescriptor;
 import org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper;
+import org.apache.ambari.server.checks.PreUpgradeCheck;
 import org.apache.ambari.server.checks.UpgradeCheckRegistry;
 import org.apache.ambari.server.cleanup.ClasspathScannerUtils;
 import org.apache.ambari.server.configuration.Configuration;
@@ -531,6 +533,7 @@ public class ControllerModule extends AbstractModule {
     install(new FactoryModuleBuilder().build(UpgradeContextFactory.class));
     install(new FactoryModuleBuilder().build(MpackManagerFactory.class));
     install(new FactoryModuleBuilder().build(RootLevelSettingsManagerFactory.class));
+    install(new FactoryModuleBuilder().build(PrereqCheckRequestFactory.class));
 
     bind(RegistryFactory.class).to(RegistryFactoryImpl.class);
     bind(HostRoleCommandFactory.class).to(HostRoleCommandFactoryImpl.class);
@@ -700,11 +703,13 @@ public class ControllerModule extends AbstractModule {
   }
 
   /**
-   * Searches for all instances of {@link AbstractCheckDescriptor} on the
-   * classpath and registers each as a singleton with the
-   * {@link UpgradeCheckRegistry}.
+   * Searches for all instances of {@link PreUpgradeCheck} on the classpath and
+   * registers each as a singleton with the {@link UpgradeCheckRegistry}.
    */
   @SuppressWarnings("unchecked")
+  @Experimental(
+      feature = ExperimentalFeature.UPGRADE_PACK_PRE_CHECKS,
+      comment = "Need a different way to register these and inject configs into them")
   protected Set<BeanDefinition> registerUpgradeChecks(Set<BeanDefinition> beanDefinitions) {
 
     // make the registry a singleton
@@ -712,14 +717,14 @@ public class ControllerModule extends AbstractModule {
     bind(UpgradeCheckRegistry.class).toInstance(registry);
 
     if (null == beanDefinitions || beanDefinitions.isEmpty()) {
-      String packageName = AbstractCheckDescriptor.class.getPackage().getName();
+      String packageName = PreUpgradeCheck.class.getPackage().getName();
       LOG.info("Searching package {} for classes matching {}", packageName,
-          AbstractCheckDescriptor.class);
+          PreUpgradeCheck.class);
 
       ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
 
       // match all implementations of the base check class
-      AssignableTypeFilter filter = new AssignableTypeFilter(AbstractCheckDescriptor.class);
+      AssignableTypeFilter filter = new AssignableTypeFilter(PreUpgradeCheck.class);
       scanner.addIncludeFilter(filter);
 
       beanDefinitions = scanner.findCandidateComponents(packageName);
@@ -727,7 +732,7 @@ public class ControllerModule extends AbstractModule {
 
     // no dispatchers is a problem
     if (null == beanDefinitions || beanDefinitions.size() == 0) {
-      LOG.error("No instances of {} found to register", AbstractCheckDescriptor.class);
+      LOG.error("No instances of {} found to register", PreUpgradeCheck.class);
       return null;
     }
 
@@ -738,8 +743,8 @@ public class ControllerModule extends AbstractModule {
       Class<?> clazz = ClassUtils.resolveClassName(className, ClassUtils.getDefaultClassLoader());
 
       try {
-        AbstractCheckDescriptor upgradeCheck = (AbstractCheckDescriptor) clazz.newInstance();
-        bind((Class<AbstractCheckDescriptor>) clazz).toInstance(upgradeCheck);
+        PreUpgradeCheck upgradeCheck = (PreUpgradeCheck) clazz.newInstance();
+        bind((Class<PreUpgradeCheck>) clazz).toInstance(upgradeCheck);
         registry.register(upgradeCheck);
       } catch (Exception exception) {
         LOG.error("Unable to bind and register upgrade check {}", clazz, exception);
@@ -747,8 +752,8 @@ public class ControllerModule extends AbstractModule {
     }
 
     // log the order of the pre-upgrade checks
-    List<AbstractCheckDescriptor> upgradeChecks = registry.getUpgradeChecks();
-    for (AbstractCheckDescriptor upgradeCheck : upgradeChecks) {
+    List<PreUpgradeCheck> upgradeChecks = registry.getUpgradeChecks();
+    for (PreUpgradeCheck upgradeCheck : upgradeChecks) {
       LOG.info("Registered pre-upgrade check {}", upgradeCheck.getClass());
     }
     return beanDefinitions;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java
index 6d9f655..5c793c7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequest.java
@@ -20,48 +20,59 @@ package org.apache.ambari.server.controller;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.checks.CheckDescription;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
-import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
+import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
-import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
+
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
 
 /**
  * Represents a prerequisite check request.
  */
 public class PrereqCheckRequest {
-  private String m_clusterName;
-  private StackId m_sourceStackId;
-  private RepositoryVersionEntity m_targetRepositoryVersion;
+  private final UpgradePlanEntity m_upgradePlan;
   private PrerequisiteCheckConfig m_prereqCheckConfig;
 
-  private UpgradeType m_upgradeType;
-
   private Map<CheckDescription, PrereqCheckStatus> m_results = new HashMap<>();
-  private boolean m_revert = false;
-
 
-  public PrereqCheckRequest(String clusterName, UpgradeType upgradeType) {
-    m_clusterName = clusterName;
-    m_upgradeType = upgradeType;
-  }
+  /**
+   *
+   */
+  @Inject
+  private Clusters m_clusters;
 
   /**
-   * Construct a request to performs checks before an Upgrade.
-   * The default type is Rolling.
-   * @param clusterName
+   * Constructor.
+   *
+   * @param upgradePlan
+   *          the upgrade plan.
    */
-  public PrereqCheckRequest(String clusterName) {
-    this(clusterName, UpgradeType.ROLLING);
+  @AssistedInject
+  public PrereqCheckRequest(@Assisted UpgradePlanEntity upgradePlan) {
+    m_upgradePlan = upgradePlan;
   }
 
-  public String getClusterName() {
-    return m_clusterName;
+  /**
+   * Gets the upgrade plan associated with this upgrade pre-check request.
+   *
+   * @return the upgrade plan.
+   */
+  public UpgradePlanEntity getUpgradePlan() {
+    return m_upgradePlan;
   }
 
-  public UpgradeType getUpgradeType() {
-    return m_upgradeType;
+  /**
+   * Gets the cluster name involved in the pre upgrade checks.
+   *
+   * @return the cluster name.
+   */
+  public String getClusterName() throws AmbariException {
+    return m_clusters.getCluster(m_upgradePlan.getClusterId()).getClusterName();
   }
 
   /**
@@ -83,44 +94,6 @@ public class PrereqCheckRequest {
   }
 
   /**
-   * Gets the cluster's current stack before upgrade.
-   *
-   * @return the sourceStackId the source stack ID.
-   */
-  public StackId getSourceStackId() {
-    return m_sourceStackId;
-  }
-
-  /**
-   * Sets the cluster's current stack before upgrade.
-   *
-   * @param sourceStackId
-   *          the sourceStackId to set
-   */
-  public void setSourceStackId(StackId sourceStackId) {
-    m_sourceStackId = sourceStackId;
-  }
-
-  /**
-   * Gets the target repository of the upgrade.
-   *
-   * @return the target repository.
-   */
-  public RepositoryVersionEntity getTargetRepositoryVersion() {
-    return m_targetRepositoryVersion;
-  }
-
-  /**
-   * Sets the target of the upgrade.
-   *
-   * @param targetRepositoryVersion
-   *          the target repository version
-   */
-  public void setTargetRepositoryVersion(RepositoryVersionEntity targetRepositoryVersion) {
-    m_targetRepositoryVersion = targetRepositoryVersion;
-  }
-
-  /**
    * Gets the prerequisite check config
    * @return the prereqCheckConfig
    */
@@ -135,19 +108,4 @@ public class PrereqCheckRequest {
   public void setPrerequisiteCheckConfig(PrerequisiteCheckConfig prereqCheckConfig) {
     m_prereqCheckConfig = prereqCheckConfig;
   }
-
-  /**
-   * @param revert
-   *          {@code true} if the check is for a patch reversion
-   */
-  public void setRevert(boolean revert) {
-    m_revert = revert;
-  }
-
-  /**
-   * @return if the check is for a patch reversion
-   */
-  public boolean isRevert() {
-    return m_revert;
-  }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequestFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequestFactory.java
new file mode 100644
index 0000000..36412db
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/PrereqCheckRequestFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller;
+
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
+
+/**
+ * Used for building dependency injected instances of
+ * {@link PrereqCheckRequest}s.
+ */
+public interface PrereqCheckRequestFactory {
+
+  /**
+   * Creates a new {@link PrereqCheckRequest} based off of a supplied upgrade
+   * plan.
+   *
+   * @param upgradePlanEntity
+   *          the upgrade plan
+   * @return the upgrade check request
+   */
+  PrereqCheckRequest createNew(UpgradePlanEntity upgradePlanEntity);
+
+}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersion.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersion.java
deleted file mode 100644
index 408d216..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersion.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.server.controller.internal;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
-import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
-
-/**
- * Helper class for maintaining RepositoryVersionEntity along with
- * supported Upgrade Type(s).
- */
-public class CompatibleRepositoryVersion {
-  private RepositoryVersionEntity repositoryVersionEntity;
-  private Set<UpgradeType> supportedTypes;
-
-  public CompatibleRepositoryVersion(RepositoryVersionEntity repositoryVersionEntity) {
-    this.repositoryVersionEntity = repositoryVersionEntity;
-    this.supportedTypes = new HashSet<>();
-  }
-
-  /**
-   * Maintains the List of Upgrade Types.
-   *
-   * @param type Supported Upgrade Type.
-   */
-  public void addUpgradePackType(UpgradeType type) {
-    supportedTypes.add(type);
-  }
-
-  /**
-   * @return List of supported Upgrade Type(s).
-   */
-  public Set<UpgradeType> getSupportedTypes() {
-    return supportedTypes;
-  }
-
-  /**
-   * @return RepositoryVersionEntity instance.
-   */
-  public RepositoryVersionEntity getRepositoryVersionEntity() {
-    return repositoryVersionEntity;
-  }
-
-}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java
index e5da5d7..2686a65 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProvider.java
@@ -24,10 +24,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.ambari.annotations.Experimental;
+import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.ParentObjectNotFoundException;
 import org.apache.ambari.server.StaticallyInject;
-import org.apache.ambari.server.checks.AbstractCheckDescriptor;
+import org.apache.ambari.server.checks.PreUpgradeCheck;
 import org.apache.ambari.server.checks.UpgradeCheckRegistry;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
@@ -41,18 +42,13 @@ import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.CheckHelper;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
-import org.apache.ambari.server.state.ServiceInfo;
-import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.UpgradeHelper;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-import org.apache.ambari.server.state.stack.UpgradePack;
-import org.apache.ambari.server.state.stack.upgrade.Direction;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
-import org.apache.commons.lang.BooleanUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -80,14 +76,6 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider {
   public static final String UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID        = PropertyHelper.getPropertyId("UpgradeChecks", "cluster_name");
   public static final String UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID        = PropertyHelper.getPropertyId("UpgradeChecks", "upgrade_type");
   public static final String UPGRADE_CHECK_UPGRADE_PLAN_ID = PropertyHelper.getPropertyId("UpgradeChecks", "upgrade_plan_id");
-  public static final String UPGRADE_CHECK_TARGET_REPOSITORY_VERSION       = PropertyHelper.getPropertyId("UpgradeChecks", "repository_version");
-
-  /**
-   * Optional parameter to specify the preferred Upgrade Pack to use.
-   */
-  public static final String UPGRADE_CHECK_UPGRADE_PACK_PROPERTY_ID       = PropertyHelper.getPropertyId("UpgradeChecks", "upgrade_pack");
-  public static final String UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("UpgradeChecks", "repository_version");
-  public static final String UPGRADE_CHECK_FOR_REVERT_PROPERTY_ID = PropertyHelper.getPropertyId("UpgradeChecks", "for_revert");
 
   @Inject
   private static Provider<Clusters> clustersProvider;
@@ -116,9 +104,7 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider {
       UPGRADE_CHECK_CHECK_TYPE_PROPERTY_ID,
       UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID,
       UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID,
-      UPGRADE_CHECK_FOR_REVERT_PROPERTY_ID,
-      UPGRADE_CHECK_UPGRADE_PLAN_ID,
-      UPGRADE_CHECK_UPGRADE_PACK_PROPERTY_ID);
+      UPGRADE_CHECK_UPGRADE_PLAN_ID);
 
 
   @SuppressWarnings("serial")
@@ -175,61 +161,15 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider {
                 UPGRADE_CHECK_UPGRADE_PLAN_ID));
       }
 
-      final PrereqCheckRequest upgradeCheckRequest = new PrereqCheckRequest(clusterName,
-          upgradeType);
-
-      StackId sourceStackId = cluster.getCurrentStackVersion();
-      upgradeCheckRequest.setSourceStackId(cluster.getCurrentStackVersion());
-
-      RepositoryVersionEntity repositoryVersion = null;
+      @Experimental(
+          feature = ExperimentalFeature.UPGRADE_PACK_PRE_CHECKS,
+          comment = "This no longer accounts for custom checks")
+      UpgradePlanEntity upgradePlan = null;
+      final PrereqCheckRequest upgradeCheckRequest = new PrereqCheckRequest(upgradePlan);
+      List<PreUpgradeCheck> upgradeChecksToRun = upgradeCheckRegistry.getFilteredUpgradeChecks(null);
 
-      upgradeCheckRequest.setTargetRepositoryVersion(repositoryVersion);
 
-      if (propertyMap.containsKey(UPGRADE_CHECK_FOR_REVERT_PROPERTY_ID)) {
-        Boolean forRevert = BooleanUtils.toBooleanObject(propertyMap.get(UPGRADE_CHECK_FOR_REVERT_PROPERTY_ID).toString());
-        upgradeCheckRequest.setRevert(forRevert);
-      }
-
-      //ambariMetaInfo.getStack(stackName, cluster.getCurrentStackVersion().getStackVersion()).getUpgradePacks()
-      // TODO AMBARI-12698, filter the upgrade checks to run based on the stack and upgrade type, or the upgrade pack.
-      UpgradePack upgradePack = null;
-      String preferredUpgradePackName = propertyMap.containsKey(UPGRADE_CHECK_UPGRADE_PACK_PROPERTY_ID) ?
-          (String) propertyMap.get(UPGRADE_CHECK_UPGRADE_PACK_PROPERTY_ID) : null;
-      try{
-        // Hint: PreChecks currently executing only before UPGRADE direction
-        upgradePack = upgradeHelper.get().suggestUpgradePack(clusterName, sourceStackId,
-            repositoryVersion.getStackId(), Direction.UPGRADE, upgradeType,
-            preferredUpgradePackName);
-      } catch (AmbariException e) {
-        throw new SystemException(e.getMessage(), e);
-      }
-
-      if (upgradePack == null) {
-        throw new SystemException(
-            String.format("Upgrade pack not found for the target repository version %s",
-                upgradeCheckRequest.getTargetRepositoryVersion()));
-      }
-
-      // ToDo: properly handle exceptions, i.e. create fake check with error description
-      List<AbstractCheckDescriptor> upgradeChecksToRun = upgradeCheckRegistry.getFilteredUpgradeChecks(upgradePack);
-      upgradeCheckRequest.setPrerequisiteCheckConfig(upgradePack.getPrerequisiteCheckConfig());
-
-      try {
-        // Register all the custom prechecks from the services
-        Map<String, ServiceInfo> services = getManagementController().getAmbariMetaInfo().getServices(
-            sourceStackId.getStackName(), sourceStackId.getStackVersion());
-
-        List<AbstractCheckDescriptor> serviceLevelUpgradeChecksToRun = upgradeCheckRegistry.getServiceLevelUpgradeChecks(upgradePack, services);
-        upgradeChecksToRun.addAll(serviceLevelUpgradeChecksToRun);
-      } catch (ParentObjectNotFoundException parentNotFoundException) {
-        LOG.error("Invalid stack version: {}", sourceStackId, parentNotFoundException);
-      } catch (AmbariException ambariException) {
-        LOG.error("Unable to register all the custom prechecks from the services", ambariException);
-      } catch (Exception e) {
-        LOG.error("Failed to register custom prechecks for the services", e);
-      }
-
-      for (PrerequisiteCheck prerequisiteCheck : checkHelper.performChecks(upgradeCheckRequest, upgradeChecksToRun, config.get())) {
+      for (UpgradeCheckResult prerequisiteCheck : checkHelper.performChecks(upgradeCheckRequest, upgradeChecksToRun, config.get())) {
         final Resource resource = new ResourceImpl(Resource.Type.PreUpgradeCheck);
         setResourceProperty(resource, UPGRADE_CHECK_ID_PROPERTY_ID, prerequisiteCheck.getId(), requestedIds);
         setResourceProperty(resource, UPGRADE_CHECK_CHECK_PROPERTY_ID, prerequisiteCheck.getDescription(), requestedIds);
@@ -238,12 +178,10 @@ public class PreUpgradeCheckResourceProvider extends ReadOnlyResourceProvider {
         setResourceProperty(resource, UPGRADE_CHECK_FAILED_ON_PROPERTY_ID, prerequisiteCheck.getFailedOn(), requestedIds);
         setResourceProperty(resource, UPGRADE_CHECK_FAILED_DETAIL_PROPERTY_ID,prerequisiteCheck.getFailedDetail(), requestedIds);
         setResourceProperty(resource, UPGRADE_CHECK_CHECK_TYPE_PROPERTY_ID, prerequisiteCheck.getType(), requestedIds);
-        setResourceProperty(resource, UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID, prerequisiteCheck.getClusterName(), requestedIds);
+        setResourceProperty(resource, UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID, cluster.getClusterName(), requestedIds);
         setResourceProperty(resource, UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID, upgradeType, requestedIds);
 
-        setResourceProperty(resource, UPGRADE_CHECK_UPGRADE_PLAN_ID, repositoryVersion.getId(), requestedIds);
-        setResourceProperty(resource, UPGRADE_CHECK_TARGET_REPOSITORY_VERSION, repositoryVersion.getVersion(), requestedIds);
-
+        setResourceProperty(resource, UPGRADE_CHECK_UPGRADE_PLAN_ID, upgradePlan.getId(), requestedIds);
         resources.add(resource);
       }
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
index 99bbcac..a5aec09 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
@@ -125,7 +125,6 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
   public static final String UPGRADE_CLUSTER_NAME = "Upgrade/cluster_name";
   public static final String UPGRADE_PLAN_ID = "Upgrade/upgrade_plan_id";
   public static final String UPGRADE_TYPE = "Upgrade/upgrade_type";
-  public static final String UPGRADE_PACK = "Upgrade/pack";
   public static final String UPGRADE_ID = "Upgrade/upgrade_id";
   public static final String UPGRADE_REQUEST_ID = "Upgrade/request_id";
   public static final String UPGRADE_SUMMARY = "Upgrade/summary";
@@ -264,7 +263,6 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
     PROPERTY_IDS.add(UPGRADE_CLUSTER_NAME);
     PROPERTY_IDS.add(UPGRADE_PLAN_ID);
     PROPERTY_IDS.add(UPGRADE_TYPE);
-    PROPERTY_IDS.add(UPGRADE_PACK);
     PROPERTY_IDS.add(UPGRADE_ID);
     PROPERTY_IDS.add(UPGRADE_REQUEST_ID);
     PROPERTY_IDS.add(UPGRADE_SUMMARY);
@@ -625,7 +623,6 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
     setResourceProperty(resource, UPGRADE_ID, entity.getId(), requestedIds);
     setResourceProperty(resource, UPGRADE_CLUSTER_NAME, cluster.getClusterName(), requestedIds);
     setResourceProperty(resource, UPGRADE_TYPE, entity.getUpgradeType(), requestedIds);
-    setResourceProperty(resource, UPGRADE_PACK, entity.getUpgradePackage(), requestedIds);
     setResourceProperty(resource, UPGRADE_REQUEST_ID, entity.getRequestId(), requestedIds);
     setResourceProperty(resource, UPGRADE_DIRECTION, entity.getDirection(), requestedIds);
     setResourceProperty(resource, UPGRADE_SUSPENDED, entity.isSuspended(), requestedIds);
@@ -747,7 +744,6 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
     UpgradeEntity upgrade = new UpgradeEntity();
     upgrade.setClusterId(cluster.getClusterId());
     upgrade.setDirection(direction);
-    upgrade.setUpgradePackage(pack.getName());
     upgrade.setUpgradeType(pack.getType());
     upgrade.setAutoSkipComponentFailures(upgradeContext.isComponentFailureAutoSkipped());
     upgrade.setAutoSkipServiceCheckFailures(upgradeContext.isServiceCheckFailureAutoSkipped());
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/HostComponentVersionAdvertisedEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/HostComponentVersionAdvertisedEvent.java
index e8509b4..664bce6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/HostComponentVersionAdvertisedEvent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/HostComponentVersionAdvertisedEvent.java
@@ -27,7 +27,7 @@ import org.apache.ambari.server.state.ServiceComponentHost;
  * occurs when a Host Component advertises it's current version value.
  */
 @Deprecated
-@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
+@Experimental(feature = ExperimentalFeature.VERSION_REPORTING)
 public class HostComponentVersionAdvertisedEvent extends ClusterEvent {
 
   protected Cluster cluster;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
deleted file mode 100644
index bda687a..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.server.orm.entities;
-
-import org.apache.ambari.annotations.Experimental;
-import org.apache.ambari.annotations.ExperimentalFeature;
-import org.apache.ambari.server.state.StackId;
-
-@Deprecated
-@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
-public class RepositoryVersionEntity {
-
-  public RepositoryVersionEntity() {
-
-  }
-
-  public Long getId() {
-    return null;
-  }
-
-  /**
-   * Gets the repository version's stack.
-   *
-   * @return the stack.
-   */
-  public StackEntity getStack() {
-    return null;
-  }
-
-  public String getVersion() {
-    return null;
-  }
-
-  public String getDisplayName() {
-    return null;
-  }
-
-  public String getStackName() {
-    return null;
-  }
-
-  public String getStackVersion() {
-    return null;
-  }
-
-  public StackId getStackId() {
-    return null;
-  }
-
-  /**
-   * @return the XML that is the basis for the version
-   */
-  public String getVersionXml() {
-    return null;
-  }
-
-  /**
-   * @return The url used for the version.  Optional in case the XML was loaded via blob.
-   */
-  public String getVersionUrl() {
-    return null;
-  }
-
-  /**
-   * @return the XSD name extracted from the XML.
-   */
-  public String getVersionXsd() {
-    return null;
-  }
-}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/UpgradeEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/UpgradeEntity.java
index bb99b72..4df3db9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/UpgradeEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/UpgradeEntity.java
@@ -116,9 +116,6 @@ public class UpgradeEntity {
   @Enumerated(value = EnumType.STRING)
   private Direction direction = Direction.UPGRADE;
 
-  @Column(name="upgrade_package", nullable = false)
-  private String upgradePackage;
-
   @Column(name="upgrade_type", nullable = false)
   @Enumerated(value = EnumType.STRING)
   private UpgradeType upgradeType;
@@ -320,20 +317,6 @@ public class UpgradeEntity {
   }
 
   /**
-   * @return the upgrade package name, without the extension.
-   */
-  public String getUpgradePackage() {
-    return upgradePackage;
-  }
-
-  /**
-   * @param upgradePackage the upgrade pack to set
-   */
-  public void setUpgradePackage(String upgradePackage) {
-    this.upgradePackage = upgradePackage;
-  }
-
-  /**
    * Gets whether skippable components that failed are automatically skipped.
    * They will be placed into the {@link HostRoleStatus#SKIPPED_FAILED} state.
    *
@@ -443,7 +426,6 @@ public class UpgradeEntity {
         .append(direction, that.direction)
         .append(suspended, that.suspended)
         .append(upgradeType, that.upgradeType)
-        .append(upgradePackage, that.upgradePackage)
         .isEquals();
   }
 
@@ -452,8 +434,7 @@ public class UpgradeEntity {
    */
   @Override
   public int hashCode() {
-    return Objects.hashCode(upgradeId, clusterId, requestId, direction, suspended, upgradeType,
-        upgradePackage);
+    return Objects.hashCode(upgradeId, clusterId, requestId, direction, suspended, upgradeType);
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/CheckHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/CheckHelper.java
index 7fe3256..705cb78 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/CheckHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/CheckHelper.java
@@ -22,29 +22,18 @@ import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.ambari.server.ClusterNotFoundException;
-import org.apache.ambari.server.checks.AbstractCheckDescriptor;
+import org.apache.ambari.server.checks.CheckDescription;
+import org.apache.ambari.server.checks.PreUpgradeCheck;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.inject.Singleton;
 
-
-class DescriptorPreCheck {
-
-  public AbstractCheckDescriptor descriptor;
-  public PrerequisiteCheck check;
-
-  public DescriptorPreCheck(AbstractCheckDescriptor descriptor, PrerequisiteCheck check) {
-    this.descriptor = descriptor;
-    this.check = check;
-  }
-}
-
 @Singleton
 public class CheckHelper {
   /**
@@ -60,22 +49,19 @@ public class CheckHelper {
    * @param checksRegistry Registry with all PreChecks that may be applied.
    * @return List of applicable PreChecks.
    */
-  public List<DescriptorPreCheck> getApplicablePrerequisiteChecks(PrereqCheckRequest request,
-                                                       List<AbstractCheckDescriptor> checksRegistry) {
-    List<DescriptorPreCheck> applicablePreChecks = new LinkedList<>();
-
-    final String clusterName = request.getClusterName();
-    for (AbstractCheckDescriptor checkDescriptor : checksRegistry) {
-      final PrerequisiteCheck prerequisiteCheck = new PrerequisiteCheck(checkDescriptor.getDescription(), clusterName);
+  public List<PreUpgradeCheck> getApplicablePrerequisiteChecks(PrereqCheckRequest request,
+      List<PreUpgradeCheck> checksRegistry) {
+    List<PreUpgradeCheck> applicablePreChecks = new LinkedList<>();
 
+    for (PreUpgradeCheck preUpgradeCheck : checksRegistry) {
       try {
-        if (checkDescriptor.isApplicable(request)) {
-          applicablePreChecks.add(new DescriptorPreCheck(checkDescriptor, prerequisiteCheck));
+        if (preUpgradeCheck.isApplicable(request)) {
+          applicablePreChecks.add(preUpgradeCheck);
         }
       } catch (Exception ex) {
         LOG.error(
             "Unable to determine whether the pre-upgrade check {} is applicable to this upgrade",
-            checkDescriptor.getDescription().name(), ex);
+            preUpgradeCheck.getCheckDescrption().name(), ex);
       }
     }
     return applicablePreChecks;
@@ -88,39 +74,39 @@ public class CheckHelper {
    *          pre-requisite check request
    * @return list of pre-requisite check results
    */
-  public List<PrerequisiteCheck> performChecks(PrereqCheckRequest request,
-                                               List<AbstractCheckDescriptor> checksRegistry, Configuration config) {
+  public List<UpgradeCheckResult> performChecks(PrereqCheckRequest request,
+      List<PreUpgradeCheck> checksRegistry, Configuration config) {
 
-    final String clusterName = request.getClusterName();
-    final List<PrerequisiteCheck> prerequisiteCheckResults = new ArrayList<>();
+    final List<UpgradeCheckResult> prerequisiteCheckResults = new ArrayList<>();
     final boolean canBypassPreChecks = config.isUpgradePrecheckBypass();
 
-    List<DescriptorPreCheck> applicablePreChecks = getApplicablePrerequisiteChecks(request, checksRegistry);
+    List<PreUpgradeCheck> applicablePreChecks = getApplicablePrerequisiteChecks(request, checksRegistry);
 
-    for (DescriptorPreCheck descriptorPreCheck : applicablePreChecks) {
-      AbstractCheckDescriptor checkDescriptor = descriptorPreCheck.descriptor;
-      PrerequisiteCheck prerequisiteCheck = descriptorPreCheck.check;
+    for (PreUpgradeCheck preUpgradeCheck : applicablePreChecks) {
+      CheckDescription checkDescription = preUpgradeCheck.getCheckDescrption();
+      UpgradeCheckResult result;
       try {
-        checkDescriptor.perform(prerequisiteCheck, request);
+        result = preUpgradeCheck.perform(request);
       } catch (ClusterNotFoundException ex) {
-        prerequisiteCheck.setFailReason("Cluster with name " + clusterName + " doesn't exists");
-        prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
+        result = new UpgradeCheckResult(preUpgradeCheck, PrereqCheckStatus.FAIL);
+        result.setFailReason("The cluster could not be found.");
       } catch (Exception ex) {
-        LOG.error("Check " + checkDescriptor.getDescription().name() + " failed", ex);
-        prerequisiteCheck.setFailReason("Unexpected server error happened");
-        prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
+        LOG.error("Check " + checkDescription.name() + " failed", ex);
+        result = new UpgradeCheckResult(preUpgradeCheck, PrereqCheckStatus.FAIL);
+        result.setFailReason("Unexpected server error happened");
       }
 
-      if (prerequisiteCheck.getStatus() == PrereqCheckStatus.FAIL && canBypassPreChecks) {
-        LOG.error("Check {} failed but stack upgrade is allowed to bypass failures. Error to bypass: {}. Failed on: {}",
-          checkDescriptor.getDescription().name(),
-          prerequisiteCheck.getFailReason(),
-          StringUtils.join(prerequisiteCheck.getFailedOn(), ", "));
-        prerequisiteCheck.setStatus(PrereqCheckStatus.BYPASS);
+      if (result.getStatus() == PrereqCheckStatus.FAIL && canBypassPreChecks) {
+        LOG.error(
+            "Check {} failed but stack upgrade is allowed to bypass failures. Error to bypass: {}. Failed on: {}",
+            checkDescription.name(), result.getFailReason(),
+            StringUtils.join(result.getFailedOn(), ", "));
+
+        result.setStatus(PrereqCheckStatus.BYPASS);
       }
 
-      prerequisiteCheckResults.add(prerequisiteCheck);
-      request.addResult(checkDescriptor.getDescription(), prerequisiteCheck.getStatus());
+      prerequisiteCheckResults.add(result);
+      request.addResult(checkDescription, result.getStatus());
     }
 
     return prerequisiteCheckResults;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
index 477be2f..0161ed9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
@@ -23,8 +23,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.ambari.annotations.Experimental;
-import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ClusterSettingNotFoundException;
 import org.apache.ambari.server.ServiceGroupNotFoundException;
@@ -357,14 +355,6 @@ public interface Cluster {
   void setCurrentStackVersion(StackId stackVersion) throws AmbariException;
 
   /**
-   * @return
-   * @throws AmbariException
-   */
-  @Deprecated
-  @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
-  List<Host> transitionHostsToInstalling() throws AmbariException;
-
-  /**
    * Gets whether the cluster is still initializing or has finished with its
    * deployment requests.
    *
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
index a90f006..f5f028d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
@@ -66,17 +66,13 @@ public interface ServiceComponent {
   void setDesiredState(State state);
 
   @Deprecated
-  @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
+  @Experimental(feature = ExperimentalFeature.VERSION_REPORTING)
   StackId getStackId();
 
   @Deprecated
-  @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
+  @Experimental(feature = ExperimentalFeature.VERSION_REPORTING)
   String getDesiredVersion();
 
-  @Deprecated
-  @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
-  void setDesiredRepositoryVersion();
-
   /**
    * Refresh Component info due to current stack
    * @throws AmbariException
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
index 889d5c7..702f99d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
@@ -397,19 +397,9 @@ public class ServiceComponentImpl implements ServiceComponent {
     }
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  @Deprecated
-  @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
-  public void setDesiredRepositoryVersion() {
-  }
-
-
   @Override
   @Deprecated
-  @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL)
+  @Experimental(feature = ExperimentalFeature.VERSION_REPORTING)
   public String getDesiredVersion() {
     Cluster cluster = service.getCluster();
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
index 4482aca..9e3b5ec 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
@@ -19,7 +19,6 @@ package org.apache.ambari.server.state;
 
 import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_FAIL_ON_CHECK_WARNINGS;
 import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_HOST_ORDERED_HOSTS;
-import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_PACK;
 import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_PLAN_ID;
 import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_REVERT_UPGRADE_ID;
 import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_SKIP_FAILURES;
@@ -198,6 +197,7 @@ public class UpgradeContext {
    * Used to suggest upgrade packs during creation of an upgrade context.
    */
   @Inject
+  @Experimental(feature = ExperimentalFeature.MPACK_UPGRADES)
   private UpgradeHelper m_upgradeHelper;
 
   /**
@@ -289,9 +289,6 @@ public class UpgradeContext {
         m_serviceGroups.put(serviceGroup, summary);
       }
 
-      // !!! use the same upgrade pack that was used in the upgrade being reverted
-      upgradeRequestMap.put(UPGRADE_PACK, revertUpgrade.getUpgradePackage());
-
       // !!! direction can ONLY be an downgrade on revert
       m_direction = Direction.DOWNGRADE;
     } else {
@@ -336,14 +333,6 @@ public class UpgradeContext {
       }
     }
 
-    /**
-     * For the unit tests tests, there are multiple upgrade packs for the same
-     * type, so allow picking one of them. In prod, this is empty.
-     */
-    @Experimental(feature = ExperimentalFeature.MPACK_UPGRADES, comment = "No longer using single packs")
-    String preferredUpgradePackName = (String) upgradeRequestMap.get(UPGRADE_PACK);
-    m_upgradePack = null;
-
     // the validator will throw an exception if the upgrade request is not valid
     UpgradeRequestValidator upgradeRequestValidator = buildValidator(m_type);
     upgradeRequestValidator.validate(cluster, m_direction, m_type, m_upgradePack,
@@ -402,13 +391,6 @@ public class UpgradeContext {
 
     populateParticipatingServiceGroups(cluster, m_serviceGroups, upgradeEntity, false);
 
-    @Experimental(
-        feature = ExperimentalFeature.MPACK_UPGRADES,
-        comment = "We need a way to get the upgrade packs given multiple mpacks")
-    String upgradePackage = upgradeEntity.getUpgradePackage();
-    Map<String, UpgradePack> packs = m_metaInfo.getUpgradePacks(null, null);
-    m_upgradePack = packs.get(upgradePackage);
-
     m_resolver = new MasterHostResolver(m_cluster, configHelper, this);
     m_isRevert = upgradeEntity.isRevert();
   }
@@ -977,7 +959,6 @@ public class UpgradeContext {
       String upgradePlanId = (String) requestMap.get(UPGRADE_PLAN_ID);
       boolean skipPrereqChecks = Boolean.parseBoolean((String) requestMap.get(UPGRADE_SKIP_PREREQUISITE_CHECKS));
       boolean failOnCheckWarnings = Boolean.parseBoolean((String) requestMap.get(UPGRADE_FAIL_ON_CHECK_WARNINGS));
-      String preferredUpgradePack = requestMap.containsKey(UPGRADE_PACK) ? (String) requestMap.get(UPGRADE_PACK) : null;
 
       // verify that there is not an upgrade or downgrade that is in progress or suspended
       UpgradeEntity existingUpgrade = cluster.getUpgradeInProgress();
@@ -1000,9 +981,7 @@ public class UpgradeContext {
       Predicate preUpgradeCheckPredicate = new PredicateBuilder().property(
           PreUpgradeCheckResourceProvider.UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID).equals(cluster.getClusterName()).and().property(
           PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_PLAN_ID).equals(upgradePlanId).and().property(
-          PreUpgradeCheckResourceProvider.UPGRADE_CHECK_FOR_REVERT_PROPERTY_ID).equals(m_isRevert).and().property(
-          PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID).equals(type).and().property(
-          PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_PACK_PROPERTY_ID).equals(preferredUpgradePack).toPredicate();
+          PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID).equals(type).toPredicate();
 
       Request preUpgradeCheckRequest = PropertyHelper.getReadRequest();
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 6698e59..11ee53c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -163,7 +163,6 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
@@ -1420,15 +1419,6 @@ public class ClusterImpl implements Cluster {
     clusterEntity = clusterDAO.merge(clusterEntity);
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  @Transactional
-  public List<Host> transitionHostsToInstalling() throws AmbariException {
-    return Lists.newArrayList();
-  }
-
   @Override
   @Transactional
   public void setCurrentStackVersion(StackId stackId) throws AmbariException {
@@ -3390,6 +3380,9 @@ public class ClusterImpl implements Cluster {
    * {@inheritDoc}
    */
   @Override
+  @Experimental(
+      feature = ExperimentalFeature.VERSION_REPORTING,
+      comment = "This needs to be changed to include service groups and to use the module component version")
   public Map<String, Map<String, String>> getComponentVersionMap() {
     Map<String, Map<String, String>> componentVersionMap = new HashMap<>();
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/PrerequisiteCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradeCheckResult.java
similarity index 77%
rename from ambari-server/src/main/java/org/apache/ambari/server/state/stack/PrerequisiteCheck.java
rename to ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradeCheckResult.java
index 0e605dd..49dc43f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/PrerequisiteCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradeCheckResult.java
@@ -21,32 +21,35 @@ import java.util.ArrayList;
 import java.util.LinkedHashSet;
 import java.util.List;
 
-import org.apache.ambari.server.checks.CheckDescription;
+import org.apache.ambari.server.checks.PreUpgradeCheck;
 
 /**
  * Contains information about performed prerequisite check. Newly initialized
- * {@link PrerequisiteCheck} instances are always set to
+ * {@link UpgradeCheckResult} instances are always set to
  * {@link PrereqCheckStatus#PASS}.
  */
-public class PrerequisiteCheck {
-  private final CheckDescription m_description;
-  private final String m_clusterName;
+public class UpgradeCheckResult {
+  private PreUpgradeCheck m_upgradeCheck;
   private PrereqCheckStatus m_status = PrereqCheckStatus.PASS;
   private String m_failReason = "";
   private LinkedHashSet<String> m_failedOn = new LinkedHashSet<>();
   private List<Object> m_failedDetail = new ArrayList<>();
 
-  public PrerequisiteCheck(CheckDescription description, String clusterName) {
-    m_description = description;
-    m_clusterName = clusterName;
+  public UpgradeCheckResult(PreUpgradeCheck check) {
+    m_upgradeCheck = check;
+  }
+
+  public UpgradeCheckResult(PreUpgradeCheck check, PrereqCheckStatus status) {
+    m_upgradeCheck = check;
+    m_status = status;
   }
 
   public String getId() {
-    return m_description.name();
+    return m_upgradeCheck.getCheckDescrption().name();
   }
 
   public String getDescription() {
-    return m_description.getText();
+    return m_upgradeCheck.getCheckDescrption().getText();
   }
 
   public PrereqCheckStatus getStatus() {
@@ -78,10 +81,6 @@ public class PrerequisiteCheck {
   }
 
   public PrereqCheckType getType() {
-    return m_description.getType();
-  }
-
-  public String getClusterName() {
-    return m_clusterName;
+    return m_upgradeCheck.getType();
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
index c19f9a5..d451b4c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
@@ -19,38 +19,29 @@ package org.apache.ambari.server.state.stack.upgrade;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Set;
 
 import org.apache.ambari.annotations.Experimental;
 import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.agent.CommandRepository;
-import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.ActionExecutionContext;
-import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.orm.dao.MpackDAO;
 import org.apache.ambari.server.orm.entities.MpackEntity;
 import org.apache.ambari.server.orm.entities.RepoDefinitionEntity;
 import org.apache.ambari.server.orm.entities.RepoOsEntity;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.Mpack;
-import org.apache.ambari.server.state.OsSpecific;
 import org.apache.ambari.server.state.RepositoryInfo;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceGroup;
-import org.apache.ambari.server.state.ServiceInfo;
-import org.apache.ambari.server.state.StackId;
-import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.stack.OsFamily;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.commons.lang.StringUtils;
@@ -154,67 +145,6 @@ public class RepositoryVersionHelper {
   }
 
   /**
-   * Build the role parameters for an install command.
-   *
-   * @param amc           the management controller.  Tests don't use the same instance that gets injected.
-   * @param repoVersion   the repository version
-   * @param osFamily      the os family
-   * @param servicesOnHost the set of services to check for packages
-   * @return a Map<String, String> to use in
-   */
-  public Map<String, String> buildRoleParams(AmbariManagementController amc, RepositoryVersionEntity repoVersion, String osFamily, Set<String> servicesOnHost)
-    throws SystemException {
-
-    StackId stackId = repoVersion.getStackId();
-
-    List<OsSpecific.Package> packages = new ArrayList<>();
-
-    for (String serviceName : servicesOnHost) {
-      ServiceInfo serviceInfo;
-      StackInfo stackInfo;
-
-      try {
-        if (ami.get().isServiceRemovedInStack(stackId.getStackName(), stackId.getStackVersion(), serviceName)) {
-          LOG.info(String.format("%s has been removed from stack %s-%s. Skip calculating its installation packages", stackId.getStackName(), stackId.getStackVersion(), serviceName));
-          continue; //No need to calculate install packages for removed services
-        }
-
-        stackInfo = ami.get().getStack(stackId);
-        serviceInfo = ami.get().getService(stackId.getStackName(), stackId.getStackVersion(), serviceName);
-      } catch (AmbariException e) {
-        throw new SystemException(String.format("Cannot obtain stack information for %s-%s", stackId.getStackName(), stackId.getStackVersion()), e);
-      }
-
-      List<OsSpecific.Package> packagesForStackService = amc.getPackagesForStackServiceHost(stackInfo, serviceInfo,
-        new HashMap<>(), osFamily);
-
-      List<String> blacklistedPackagePrefixes = configuration.get().getRollingUpgradeSkipPackagesPrefixes();
-      for (OsSpecific.Package aPackage : packagesForStackService) {
-        if (!aPackage.getSkipUpgrade()) {
-          boolean blacklisted = false;
-          for (String prefix : blacklistedPackagePrefixes) {
-            if (aPackage.getName().startsWith(prefix)) {
-              blacklisted = true;
-              break;
-            }
-          }
-          if (! blacklisted) {
-            packages.add(aPackage);
-          }
-        }
-      }
-    }
-
-    Map<String, String> roleParams = new HashMap<>();
-    roleParams.put("stack_id", stackId.getStackId());
-    // !!! TODO make roleParams <String, Object> so we don't have to do this awfulness.
-    roleParams.put(KeyNames.PACKAGE_LIST, gson.toJson(packages));
-
-    return roleParams;
-  }
-
-
-  /**
    * Return repositories available for target os version on host based on the
    * mpack and host family.
    *
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostSummary.java b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostSummary.java
deleted file mode 100644
index 33737e1..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostSummary.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ambari.server.state.svccomphost;
-
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.api.services.AmbariMetaInfo;
-import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
-import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
-import org.apache.ambari.server.orm.entities.HostEntity;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
-import org.apache.ambari.server.state.ComponentInfo;
-import org.apache.ambari.server.state.State;
-import org.apache.ambari.server.state.UpgradeState;
-import org.apache.commons.lang.StringUtils;
-
-
-/**
- * Represents a summary of the versions of the components installed on a host.
- */
-public class ServiceComponentHostSummary {
-
-  private Collection<HostComponentStateEntity> allHostComponents;
-  private Collection<HostComponentStateEntity> haveAdvertisedVersion;
-  private Collection<HostComponentStateEntity> waitingToAdvertiseVersion;
-  private Collection<HostComponentStateEntity> noVersionToAdvertise;
-
-  /**
-   * Constructor.
-   *
-   * @param ambariMetaInfo
-   *          used to lookup whether a component advertises a version (not
-   *          {@code null}).
-   * @param host
-   *          the host to generate a component summary for (not {@code null}).
-   * @param repositoryVersion
-   *          the repository to generate a summary for (not {@code null}).
-   * @throws AmbariException
-   */
-  public ServiceComponentHostSummary(AmbariMetaInfo ambariMetaInfo, HostEntity host,
-      RepositoryVersionEntity repositoryVersion) throws AmbariException {
-    allHostComponents = host.getHostComponentStateEntities();
-    haveAdvertisedVersion = new HashSet<>();
-    waitingToAdvertiseVersion = new HashSet<>();
-    noVersionToAdvertise = new HashSet<>();
-
-    String stackName = repositoryVersion.getStackName();
-    String stackVersion = repositoryVersion.getStackVersion();
-
-    for (HostComponentStateEntity hostComponentStateEntity : allHostComponents) {
-      ClusterServiceEntity serviceEntity = hostComponentStateEntity.getServiceComponentDesiredStateEntity().getClusterServiceEntity();
-      String serviceType  = serviceEntity.getServiceType();
-      ComponentInfo compInfo = ambariMetaInfo.getComponent(stackName, stackVersion, serviceType,
-                                                           hostComponentStateEntity.getComponentName());
-
-      if (!compInfo.isVersionAdvertised()) {
-        // Some Components cannot advertise a version. E.g., ZKF, AMBARI_METRICS, Kerberos
-        noVersionToAdvertise.add(hostComponentStateEntity);
-        continue;
-      }
-
-      String versionAdvertised = hostComponentStateEntity.getVersion();
-      if (hostComponentStateEntity.getUpgradeState() == UpgradeState.IN_PROGRESS
-          || StringUtils.equals(versionAdvertised, State.UNKNOWN.name())) {
-        waitingToAdvertiseVersion.add(hostComponentStateEntity);
-        continue;
-      }
-
-      haveAdvertisedVersion.add(hostComponentStateEntity);
-    }
-  }
-}
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
index cd851cf..66c3bfe 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
@@ -966,7 +966,6 @@ CREATE TABLE upgrade (
   cluster_id BIGINT NOT NULL,
   request_id BIGINT NOT NULL,
   direction VARCHAR(255) DEFAULT 'UPGRADE' NOT NULL,
-  upgrade_package VARCHAR(255) NOT NULL,
   upgrade_type VARCHAR(32) NOT NULL,
   skip_failures SMALLINT DEFAULT 0 NOT NULL,
   skip_sc_failures SMALLINT DEFAULT 0 NOT NULL,
diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
index d89c454..463f3da 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -983,7 +983,6 @@ CREATE TABLE upgrade (
   cluster_id BIGINT NOT NULL,
   request_id BIGINT NOT NULL,
   direction VARCHAR(255) DEFAULT 'UPGRADE' NOT NULL,
-  upgrade_package VARCHAR(255) NOT NULL,
   upgrade_type VARCHAR(32) NOT NULL,
   skip_failures TINYINT(1) NOT NULL DEFAULT 0,
   skip_sc_failures TINYINT(1) NOT NULL DEFAULT 0,
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
index afed777..6f9e48d 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -961,7 +961,6 @@ CREATE TABLE upgrade (
   cluster_id NUMBER(19) NOT NULL,
   request_id NUMBER(19) NOT NULL,
   direction VARCHAR2(255) DEFAULT 'UPGRADE' NOT NULL,
-  upgrade_package VARCHAR2(255) NOT NULL,
   upgrade_type VARCHAR2(32) NOT NULL,
   skip_failures NUMBER(1) DEFAULT 0 NOT NULL,
   skip_sc_failures NUMBER(1) DEFAULT 0 NOT NULL,
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
index f7b6c0c..0f6228c 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -967,7 +967,6 @@ CREATE TABLE upgrade (
   cluster_id BIGINT NOT NULL,
   request_id BIGINT NOT NULL,
   direction VARCHAR(255) DEFAULT 'UPGRADE' NOT NULL,
-  upgrade_package VARCHAR(255) NOT NULL,
   upgrade_type VARCHAR(32) NOT NULL,
   skip_failures SMALLINT DEFAULT 0 NOT NULL,
   skip_sc_failures SMALLINT DEFAULT 0 NOT NULL,
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
index 77daf73..6fbb812 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
@@ -962,7 +962,6 @@ CREATE TABLE upgrade (
   request_id NUMERIC(19) NOT NULL,
   direction VARCHAR(255) DEFAULT 'UPGRADE' NOT NULL,
   upgrade_type VARCHAR(32) NOT NULL,
-  upgrade_package VARCHAR(255) NOT NULL,
   skip_failures BIT NOT NULL DEFAULT 0,
   skip_sc_failures BIT NOT NULL DEFAULT 0,
   downgrade_allowed BIT NOT NULL DEFAULT 1,
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
index 4bcc399..eff3e92 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
@@ -984,7 +984,6 @@ CREATE TABLE upgrade (
   cluster_id BIGINT NOT NULL,
   request_id BIGINT NOT NULL,
   direction VARCHAR(255) DEFAULT 'UPGRADE' NOT NULL,
-  upgrade_package VARCHAR(255) NOT NULL,
   upgrade_type VARCHAR(32) NOT NULL,
   skip_failures BIT NOT NULL DEFAULT 0,
   skip_sc_failures BIT NOT NULL DEFAULT 0,
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
index b881b9d..1675a5f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/ClusterBlueprintRendererTest.java
@@ -819,7 +819,7 @@ public class ClusterBlueprintRendererTest {
   }
 
   @Experimental(
-      feature = ExperimentalFeature.REPO_VERSION_REMOVAL,
+      feature = ExperimentalFeature.MULTI_SERVICE,
       comment = "Blueprints must get mpack data from a different endpoint, not stack_versions")
   private void addStackVersions(TreeNode<Resource> clusterTree) {
   }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/AutoStartDisabledCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/AutoStartDisabledCheckTest.java
index d1d66fa..828ee49 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/AutoStartDisabledCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/AutoStartDisabledCheckTest.java
@@ -26,12 +26,14 @@ import java.util.Map;
 import org.apache.ambari.annotations.Experimental;
 import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 import org.easymock.EasyMock;
 import org.junit.Assert;
@@ -82,48 +84,51 @@ public class AutoStartDisabledCheckTest {
 
   @Test
   public void testNoAutoStart() throws Exception {
-    PrerequisiteCheck check = new PrerequisiteCheck(CheckDescription.AUTO_START_DISABLED, "foo");
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = EasyMock.createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     Assert.assertTrue(m_check.isApplicable(request));
 
-    m_check.perform(check, request);
+    UpgradeCheckResult result = m_check.perform(request);
 
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(StringUtils.isBlank(check.getFailReason()));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(StringUtils.isBlank(result.getFailReason()));
   }
 
   @Test
   public void testAutoStartFalse() throws Exception {
-    PrerequisiteCheck check = new PrerequisiteCheck(CheckDescription.AUTO_START_DISABLED, "foo");
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = EasyMock.createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     Assert.assertTrue(m_check.isApplicable(request));
 
     m_configMap.put(AutoStartDisabledCheck.RECOVERY_ENABLED_KEY, "false");
 
-    m_check.perform(check, request);
+    UpgradeCheckResult result = m_check.perform(request);
 
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(StringUtils.isBlank(check.getFailReason()));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(StringUtils.isBlank(result.getFailReason()));
   }
 
   @Test
   public void testAutoStartTrue() throws Exception {
-    PrerequisiteCheck check = new PrerequisiteCheck(CheckDescription.AUTO_START_DISABLED, "foo");
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = EasyMock.createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     Assert.assertTrue(m_check.isApplicable(request));
 
     m_configMap.put(AutoStartDisabledCheck.RECOVERY_ENABLED_KEY, "true");
     m_configMap.put(AutoStartDisabledCheck.RECOVERY_TYPE_KEY, AutoStartDisabledCheck.RECOVERY_AUTO_START);
 
-    m_check.perform(check, request);
+    UpgradeCheckResult result = m_check.perform(request);
 
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
-    Assert.assertTrue(StringUtils.isNotBlank(check.getFailReason()));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
+    Assert.assertTrue(StringUtils.isNotBlank(result.getFailReason()));
     Assert.assertEquals("Auto Start must be disabled before performing an Upgrade. To disable Auto Start, navigate to " +
-          "Admin > Service Auto Start. Turn the toggle switch off to Disabled and hit Save.", check.getFailReason());
+          "Admin > Service Auto Start. Turn the toggle switch off to Disabled and hit Save.", result.getFailReason());
 
   }
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/AbstractCheckDescriptorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ClusterCheckTest.java
similarity index 86%
rename from ambari-server/src/test/java/org/apache/ambari/server/checks/AbstractCheckDescriptorTest.java
rename to ambari-server/src/test/java/org/apache/ambari/server/checks/ClusterCheckTest.java
index bd970ea..be6d3f6 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/AbstractCheckDescriptorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ClusterCheckTest.java
@@ -29,12 +29,13 @@ import org.apache.ambari.annotations.Experimental;
 import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.stack.PrereqCheckType;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.easymock.EasyMockSupport;
 import org.easymock.Mock;
@@ -52,7 +53,7 @@ import junit.framework.Assert;
  */
 @Ignore
 @Experimental(feature = ExperimentalFeature.UNIT_TEST_REQUIRED)
-public class AbstractCheckDescriptorTest extends EasyMockSupport {
+public class ClusterCheckTest extends EasyMockSupport {
   @Mock
   private Clusters clusters;
 
@@ -69,7 +70,7 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
 
   @Test
   public void testFormatEntityList() {
-    AbstractCheckDescriptor check = new TestCheckImpl(PrereqCheckType.HOST);
+    ClusterCheck check = new TestCheckImpl(PrereqCheckType.HOST);
 
     Assert.assertEquals("", check.formatEntityList(null));
 
@@ -113,6 +114,7 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
     Set<String> missingServiceList = Sets.newHashSet("MISSING_SERVICE");
 
     expect(clusters.getCluster(anyString())).andReturn(cluster).atLeastOnce();
+    expect(clusters.getCluster(clusterName)).andReturn(cluster).anyTimes();
     expect(cluster.getServicesByName()).andReturn(services).atLeastOnce();
     expect(cluster.getServices()).andReturn(services.values()).anyTimes();
 
@@ -122,7 +124,10 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
     replayAll();
 
     TestCheckImpl check = new TestCheckImpl(PrereqCheckType.SERVICE);
-    PrereqCheckRequest request = new PrereqCheckRequest(clusterName, UpgradeType.ROLLING);
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     // case, where we need at least one service to be present
     check.setApplicableServices(oneServiceList);
@@ -157,6 +162,7 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
     Set<String> oneServiceList = Sets.newHashSet("SERVICE1");
 
     expect(clusters.getCluster(anyString())).andReturn(cluster).atLeastOnce();
+    expect(clusters.getCluster(clusterName)).andReturn(cluster).anyTimes();
     expect(cluster.getServicesByName()).andReturn(services).atLeastOnce();
     expect(cluster.getServices()).andReturn(services.values()).anyTimes();
 
@@ -168,7 +174,10 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
     replayAll();
 
     TestCheckImpl check = new TestCheckImpl(PrereqCheckType.SERVICE);
-    PrereqCheckRequest request = new PrereqCheckRequest(clusterName, UpgradeType.ROLLING);
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     // since the check is for SERVICE2, it should not match even though its
     // installed since the repository is only for SERVICE1
@@ -206,7 +215,7 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
       group = UpgradeCheckGroup.DEFAULT,
       order = 1.0f,
       required = { UpgradeType.ROLLING, UpgradeType.EXPRESS, UpgradeType.HOST_ORDERED })
-  private class TestCheckImpl extends AbstractCheckDescriptor {
+  private class TestCheckImpl extends ClusterCheck {
     private PrereqCheckType m_type;
     private Set<String> m_applicableServices = Sets.newHashSet();
 
@@ -228,8 +237,9 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
     }
 
     @Override
-    public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+    public UpgradeCheckResult perform(PrereqCheckRequest request)
         throws AmbariException {
+      return new UpgradeCheckResult(this);
     }
 
     /**
@@ -246,7 +256,7 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
   }
 
   @UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 1.0f, required = { UpgradeType.ROLLING })
-  private class RollingTestCheckImpl extends AbstractCheckDescriptor {
+  private class RollingTestCheckImpl extends ClusterCheck {
     private PrereqCheckType m_type;
 
     RollingTestCheckImpl(PrereqCheckType type) {
@@ -262,13 +272,14 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
     }
 
     @Override
-    public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+    public UpgradeCheckResult perform(PrereqCheckRequest request)
         throws AmbariException {
+      return new UpgradeCheckResult(this);
     }
   }
 
   @UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 1.0f)
-  private class NotRequiredCheckTest extends AbstractCheckDescriptor {
+  private class NotRequiredCheckTest extends ClusterCheck {
     private PrereqCheckType m_type;
 
     NotRequiredCheckTest(PrereqCheckType type) {
@@ -284,8 +295,9 @@ public class AbstractCheckDescriptorTest extends EasyMockSupport {
     }
 
     @Override
-    public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+    public UpgradeCheckResult perform(PrereqCheckRequest request)
         throws AmbariException {
+      return new UpgradeCheckResult(this);
     }
   }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentExistsInRepoCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentExistsInRepoCheckTest.java
index 729ee45..ee40d81 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentExistsInRepoCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentExistsInRepoCheckTest.java
@@ -28,6 +28,7 @@ import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.StackAccessException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ComponentInfo;
@@ -37,7 +38,8 @@ import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.commons.lang.StringUtils;
 import org.easymock.EasyMockSupport;
 import org.easymock.Mock;
@@ -157,9 +159,9 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
    */
   @Test
   public void testCheckPassesWhenServicAndComponentsExist() throws Exception {
-    PrerequisiteCheck check = new PrerequisiteCheck(CheckDescription.COMPONENTS_EXIST_IN_TARGET_REPO, "c1");
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
-    request.setSourceStackId(SOURCE_STACK);
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     CLUSTER_SERVICES.put("ZOOKEEPER", m_zookeeperService);
     expect(m_zookeeperInfo.isValid()).andReturn(true).atLeastOnce();
@@ -171,11 +173,11 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
 
     Assert.assertTrue(m_check.isApplicable(request));
 
-    m_check.perform(check, request);
+    UpgradeCheckResult result = m_check.perform(request);
 
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
-    Assert.assertTrue(StringUtils.isBlank(check.getFailReason()));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
+    Assert.assertTrue(StringUtils.isBlank(result.getFailReason()));
   }
 
   /**
@@ -186,9 +188,9 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
    */
   @Test
   public void testCheckPassesWhenComponentNotAdvertisingVersion() throws Exception {
-    PrerequisiteCheck check = new PrerequisiteCheck(CheckDescription.COMPONENTS_EXIST_IN_TARGET_REPO, "c1");
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
-    request.setSourceStackId(SOURCE_STACK);
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     CLUSTER_SERVICES.put("FOO_SERVICE", m_fooService);
 
@@ -208,11 +210,11 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
 
     Assert.assertTrue(m_check.isApplicable(request));
 
-    m_check.perform(check, request);
+    UpgradeCheckResult result = m_check.perform(request);
 
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
-    Assert.assertTrue(StringUtils.isBlank(check.getFailReason()));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
+    Assert.assertTrue(StringUtils.isBlank(result.getFailReason()));
   }
 
   /**
@@ -222,9 +224,9 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
    */
   @Test
   public void testCheckFailsWhenServiceExistsButIsDeleted() throws Exception {
-    PrerequisiteCheck check = new PrerequisiteCheck(CheckDescription.COMPONENTS_EXIST_IN_TARGET_REPO, "c1");
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
-    request.setSourceStackId(SOURCE_STACK);
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     CLUSTER_SERVICES.put("ZOOKEEPER", m_zookeeperService);
     expect(m_zookeeperInfo.isValid()).andReturn(true).atLeastOnce();
@@ -234,11 +236,11 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
 
     Assert.assertTrue(m_check.isApplicable(request));
 
-    m_check.perform(check, request);
+    UpgradeCheckResult result = m_check.perform(request);
 
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
-    Assert.assertEquals(1, check.getFailedDetail().size());
-    Assert.assertTrue(check.getFailedOn().contains("ZOOKEEPER"));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
+    Assert.assertEquals(1, result.getFailedDetail().size());
+    Assert.assertTrue(result.getFailedOn().contains("ZOOKEEPER"));
   }
 
   /**
@@ -248,9 +250,10 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
    */
   @Test
   public void testCheckFailsWhenComponentExistsButIsDeleted() throws Exception {
-    PrerequisiteCheck check = new PrerequisiteCheck(CheckDescription.COMPONENTS_EXIST_IN_TARGET_REPO, "c1");
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
-    request.setSourceStackId(SOURCE_STACK);
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     CLUSTER_SERVICES.put("ZOOKEEPER", m_zookeeperService);
     expect(m_zookeeperInfo.isValid()).andReturn(true).atLeastOnce();
@@ -262,11 +265,11 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
 
     Assert.assertTrue(m_check.isApplicable(request));
 
-    m_check.perform(check, request);
+    UpgradeCheckResult result = m_check.perform(request);
 
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
-    Assert.assertEquals(1, check.getFailedDetail().size());
-    Assert.assertTrue(check.getFailedOn().contains("ZOOKEEPER_SERVER"));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
+    Assert.assertEquals(1, result.getFailedDetail().size());
+    Assert.assertTrue(result.getFailedOn().contains("ZOOKEEPER_SERVER"));
   }
 
   /**
@@ -276,10 +279,10 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
    */
   @Test
   public void testCheckFailsWhenServiceIsMissing() throws Exception {
-    PrerequisiteCheck check = new PrerequisiteCheck(
-        CheckDescription.COMPONENTS_EXIST_IN_TARGET_REPO, "c1");
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
-    request.setSourceStackId(SOURCE_STACK);
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     CLUSTER_SERVICES.put("ZOOKEEPER", m_zookeeperService);
     CLUSTER_SERVICES.put("FOO_SERVICE", m_fooService);
@@ -296,11 +299,11 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
 
     Assert.assertTrue(m_check.isApplicable(request));
 
-    m_check.perform(check, request);
+    UpgradeCheckResult result = m_check.perform(request);
 
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
-    Assert.assertEquals(1, check.getFailedDetail().size());
-    Assert.assertTrue(check.getFailedOn().contains("FOO_SERVICE"));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
+    Assert.assertEquals(1, result.getFailedDetail().size());
+    Assert.assertTrue(result.getFailedOn().contains("FOO_SERVICE"));
   }
 
   /**
@@ -310,10 +313,10 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
    */
   @Test
   public void testCheckFailsWhenComponentIsMissing() throws Exception {
-    PrerequisiteCheck check = new PrerequisiteCheck(
-        CheckDescription.COMPONENTS_EXIST_IN_TARGET_REPO, "c1");
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
-    request.setSourceStackId(SOURCE_STACK);
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+    expect(upgradePlan.getUpgradeType()).andReturn(UpgradeType.ROLLING).anyTimes();
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     CLUSTER_SERVICES.put("FOO_SERVICE", m_fooService);
 
@@ -336,11 +339,11 @@ public class ComponentExistsInRepoCheckTest extends EasyMockSupport {
 
     Assert.assertTrue(m_check.isApplicable(request));
 
-    m_check.perform(check, request);
+    UpgradeCheckResult result = m_check.perform(request);
 
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
-    Assert.assertEquals(1, check.getFailedDetail().size());
-    Assert.assertTrue(check.getFailedOn().contains("FOO_COMPONENT"));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
+    Assert.assertEquals(1, result.getFailedDetail().size());
+    Assert.assertTrue(result.getFailedOn().contains("FOO_COMPONENT"));
   }
 
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentsInstallationCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentsInstallationCheckTest.java
index cb6c2cb..007f9ce 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentsInstallationCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ComponentsInstallationCheckTest.java
@@ -28,6 +28,7 @@ import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.orm.models.HostComponentSummary;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
@@ -40,7 +41,7 @@ import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -88,8 +89,8 @@ public class ComponentsInstallationCheckTest {
 
   @Test
   public void testIsApplicable() throws Exception {
-    PrereqCheckRequest checkRequest = new PrereqCheckRequest("c1");
-    checkRequest.setSourceStackId(new StackId("HDP", "2.2"));
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    PrereqCheckRequest checkRequest = new PrereqCheckRequest(upgradePlan);
     ComponentsInstallationCheck cic = new ComponentsInstallationCheck();
     Configuration config = Mockito.mock(Configuration.class);
     cic.config = config;
@@ -275,45 +276,41 @@ public class ComponentsInstallationCheckTest {
       Mockito.when(hcs.getCurrentState()).thenReturn(State.STARTED);
     }
 
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     Mockito.when(hcsTezClient.getCurrentState()).thenReturn(State.INSTALLED);
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    componentsInstallationCheck.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
+    UpgradeCheckResult result = componentsInstallationCheck.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
 
     // Case 2. Ensure that AMS is ignored even if their current state is not INSTALLED
     Mockito.when(hcsMetricsCollector.getCurrentState()).thenReturn(State.INSTALL_FAILED);
     Mockito.when(hcsMetricsMonitor.getCurrentState()).thenReturn(State.INSTALL_FAILED);
-    check = new PrerequisiteCheck(null, null);
-    componentsInstallationCheck.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
+    result = componentsInstallationCheck.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
 
     // Case 3: Change TEZ client state to INSTALL_FAILED, should fail
     Mockito.when(hcsTezClient.getCurrentState()).thenReturn(State.INSTALL_FAILED);
-    check = new PrerequisiteCheck(null, null);
-    componentsInstallationCheck.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
-    Assert.assertTrue(check.getFailReason().indexOf("Service components in INSTALL_FAILED state") > -1);
-    Assert.assertEquals(1, check.getFailedDetail().size());
+    result = componentsInstallationCheck.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
+    Assert.assertTrue(result.getFailReason().indexOf("Service components in INSTALL_FAILED state") > -1);
+    Assert.assertEquals(1, result.getFailedDetail().size());
 
     // Case 4: Change TEZ client state to INSTALL_FAILED and place TEZ in Maintenance mode, should succeed
     Mockito.when(tezService.getMaintenanceState()).thenReturn(MaintenanceState.ON);
     Mockito.when(hcsTezClient.getCurrentState()).thenReturn(State.INSTALL_FAILED);
-    check = new PrerequisiteCheck(null, null);
-    componentsInstallationCheck.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
+    result = componentsInstallationCheck.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
 
     // Case 5: Change TEZ client state to INSTALL_FAILED and place host2 in Maintenance mode, should succeed
     Mockito.when(tezService.getMaintenanceState()).thenReturn(MaintenanceState.OFF);
     Mockito.when(host2.getMaintenanceState(1L)).thenReturn(MaintenanceState.ON);
     Mockito.when(hcsTezClient.getCurrentState()).thenReturn(State.INSTALL_FAILED);
-    check = new PrerequisiteCheck(null, null);
-    componentsInstallationCheck.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
+    result = componentsInstallationCheck.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
   }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java
index a6b9784..e5dd02d 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ConfigurationMergeCheckTest.java
@@ -31,6 +31,7 @@ import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
@@ -38,7 +39,7 @@ import org.apache.ambari.server.state.ConfigMergeHelper;
 import org.apache.ambari.server.state.PropertyInfo;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.easymock.EasyMock;
 import org.junit.Assert;
 import org.junit.Before;
@@ -88,8 +89,10 @@ public class ConfigurationMergeCheckTest {
 
   @Test
   public void testApplicable() throws Exception {
-
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = EasyMock.createNiceMock(UpgradePlanEntity.class); 
+    replay(upgradePlan);
+    
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     ConfigurationMergeCheck cmc = new ConfigurationMergeCheck();
     Configuration config = EasyMock.createMock(Configuration.class);
@@ -148,41 +151,40 @@ public class ConfigurationMergeCheckTest {
 
     replay(ami);
 
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = EasyMock.createNiceMock(UpgradePlanEntity.class); 
+    replay(upgradePlan);
+    
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, "cluster");
-    cmc.perform(check, request);
-    Assert.assertEquals("Expect no warnings", 0, check.getFailedOn().size());
+    UpgradeCheckResult result = cmc.perform(request);
+    Assert.assertEquals("Expect no warnings", 0, result.getFailedOn().size());
 
-    check = new PrerequisiteCheck(null, "cluster");
     m_configMap.put(CONFIG_PROPERTY, "1025m");
     pi11.setValue("1026");
-    cmc.perform(check, request);
+    result = cmc.perform(request);
     Assert.assertEquals("Expect warning when user-set has changed from new default",
-        1, check.getFailedOn().size());
-    Assert.assertEquals(1, check.getFailedDetail().size());
-    ConfigurationMergeCheck.MergeDetail detail = (ConfigurationMergeCheck.MergeDetail) check.getFailedDetail().get(0);
+        1, result.getFailedOn().size());
+    Assert.assertEquals(1, result.getFailedDetail().size());
+    ConfigurationMergeCheck.MergeDetail detail = (ConfigurationMergeCheck.MergeDetail) result.getFailedDetail().get(0);
     Assert.assertEquals("1025m", detail.current);
     Assert.assertEquals("1026m", detail.new_stack_value);
     Assert.assertEquals("1025m", detail.result_value);
     Assert.assertEquals(CONFIG_TYPE, detail.type);
     Assert.assertEquals(CONFIG_PROPERTY, detail.property);
 
-    check = new PrerequisiteCheck(null, "cluster");
     pi11.setName(CONFIG_PROPERTY + ".foo");
-    cmc.perform(check, request);
+    result = cmc.perform(request);
     Assert.assertEquals("Expect no warning when user new stack is empty",
-        0, check.getFailedOn().size());
-    Assert.assertEquals(0, check.getFailedDetail().size());
+        0, result.getFailedOn().size());
+    Assert.assertEquals(0, result.getFailedDetail().size());
 
-    check = new PrerequisiteCheck(null, "cluster");
     pi11.setName(CONFIG_PROPERTY);
     pi10.setName(CONFIG_PROPERTY + ".foo");
-    cmc.perform(check, request);
+    result = cmc.perform(request);
     Assert.assertEquals("Expect warning when user old stack is empty, and value changed",
-        1, check.getFailedOn().size());
-    Assert.assertEquals(1, check.getFailedDetail().size());
-    detail = (ConfigurationMergeCheck.MergeDetail) check.getFailedDetail().get(0);
+        1, result.getFailedOn().size());
+    Assert.assertEquals(1, result.getFailedDetail().size());
+    detail = (ConfigurationMergeCheck.MergeDetail) result.getFailedDetail().get(0);
     Assert.assertEquals("1025m", detail.current);
     Assert.assertEquals("1026m", detail.new_stack_value);
   }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/HealthCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/HealthCheckTest.java
index 76f9f30..5bdb8e8 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/HealthCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/HealthCheckTest.java
@@ -30,18 +30,20 @@ import org.apache.ambari.server.orm.dao.AlertsDAO;
 import org.apache.ambari.server.orm.entities.AlertCurrentEntity;
 import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
 import org.apache.ambari.server.orm.entities.AlertHistoryEntity;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.AlertState;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import com.google.inject.Provider;
 
-
+@Ignore
 public class HealthCheckTest {
   private static final String CLUSTER_NAME = "cluster1";
   private static final long CLUSTER_ID = 1L;
@@ -79,10 +81,11 @@ public class HealthCheckTest {
   public void testWarningWhenNoAlertsExist() throws AmbariException {
     when(alertsDAO.findCurrentByCluster(eq(CLUSTER_ID))).thenReturn(Collections.emptyList());
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
-    healthCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
+    UpgradePlanEntity upgradePlan = mock(UpgradePlanEntity.class);
+
+    UpgradeCheckResult result = healthCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
   }
 
   @Test
@@ -110,9 +113,10 @@ public class HealthCheckTest {
 
     when(alertsDAO.findCurrentByCluster(eq(CLUSTER_ID))).thenReturn(asList(alertCurrentEntity));
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
-    healthCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
-    Assert.assertEquals(PrereqCheckStatus.WARNING, check.getStatus());
-    Assert.assertFalse(check.getFailedDetail().isEmpty());
+    UpgradePlanEntity upgradePlan = mock(UpgradePlanEntity.class);
+
+    UpgradeCheckResult result = healthCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.WARNING, result.getStatus());
+    Assert.assertFalse(result.getFailedDetail().isEmpty());
   }
 }
\ No newline at end of file
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostMaintenanceModeCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostMaintenanceModeCheckTest.java
index 286313c..12bc66b 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostMaintenanceModeCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostMaintenanceModeCheckTest.java
@@ -21,15 +21,17 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -38,6 +40,7 @@ import com.google.inject.Provider;
 /**
  * Tests {@link HostMaintenanceModeCheck}.
  */
+@Ignore
 public class HostMaintenanceModeCheckTest {
   private final Clusters clusters = Mockito.mock(Clusters.class);
 
@@ -75,15 +78,16 @@ public class HostMaintenanceModeCheckTest {
 
     Mockito.when(cluster.getHosts()).thenReturn(hosts);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    hostMaintenanceModeCheck.perform(check, new PrereqCheckRequest("cluster"));
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    Mockito.when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    UpgradeCheckResult result = hostMaintenanceModeCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
 
     // put a host into MM in order to trigger the warning
-    check = new PrerequisiteCheck(null, null);
     Mockito.when(host3.getMaintenanceState(1L)).thenReturn(MaintenanceState.ON);
-    hostMaintenanceModeCheck.perform(check, new PrereqCheckRequest("cluster"));
-    Assert.assertEquals(PrereqCheckStatus.WARNING, check.getStatus());
+    result = hostMaintenanceModeCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.WARNING, result.getStatus());
   }
 
   @Test
@@ -120,17 +124,21 @@ public class HostMaintenanceModeCheckTest {
 
     Mockito.when(cluster.getHosts()).thenReturn(hosts);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    hostMaintenanceModeCheck.perform(check, new PrereqCheckRequest("cluster"));
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+
+    UpgradeCheckResult result = hostMaintenanceModeCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
 
     // put a host into MM in order to trigger the warning
-    check = new PrerequisiteCheck(null, null);
     Mockito.when(host3.getMaintenanceState(1L)).thenReturn(MaintenanceState.ON);
-    hostMaintenanceModeCheck.perform(check, new PrereqCheckRequest("cluster", UpgradeType.HOST_ORDERED));
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
-    Assert.assertFalse(check.getFailedDetail().isEmpty());
-    Assert.assertEquals("The following hosts cannot be in Maintenance Mode: h3.", check.getFailReason());
+
+    upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    Mockito.when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.HOST_ORDERED);
+
+    result = hostMaintenanceModeCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
+    Assert.assertFalse(result.getFailedDetail().isEmpty());
+    Assert.assertEquals("The following hosts cannot be in Maintenance Mode: h3.", result.getFailReason());
   }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsHeartbeatCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsHeartbeatCheckTest.java
index d6e6920..501cd83 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsHeartbeatCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsHeartbeatCheckTest.java
@@ -24,6 +24,7 @@ import org.apache.ambari.annotations.Experimental;
 import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Host;
@@ -32,7 +33,7 @@ import org.apache.ambari.server.state.HostHealthStatus.HealthStatus;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -59,8 +60,9 @@ public class HostsHeartbeatCheckTest {
 
   @Test
   public void testIsApplicable() throws Exception {
-    PrereqCheckRequest checkRequest = new PrereqCheckRequest("c1");
-    checkRequest.setSourceStackId(new StackId("HDP", "2.2"));
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    PrereqCheckRequest checkRequest = new PrereqCheckRequest(upgradePlan);
+
     HostsHeartbeatCheck hhc = new HostsHeartbeatCheck();
     Configuration config = Mockito.mock(Configuration.class);
     hhc.config = config;
@@ -114,24 +116,22 @@ public class HostsHeartbeatCheckTest {
 
     Mockito.when(cluster.getHosts()).thenReturn(hosts);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    hostHeartbeatCheck.perform(check, new PrereqCheckRequest("cluster"));
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
-    Assert.assertFalse(check.getFailedDetail().isEmpty());
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    UpgradeCheckResult result = hostHeartbeatCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
+    Assert.assertFalse(result.getFailedDetail().isEmpty());
 
     // put the unhealthy host into MM which will allow this check to pass
-    check = new PrerequisiteCheck(null, null);
     Mockito.when(host3.getMaintenanceState(1L)).thenReturn(MaintenanceState.ON);
-    hostHeartbeatCheck.perform(check, new PrereqCheckRequest("cluster"));
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
+    result = hostHeartbeatCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
 
     // make the host healthy and take it out of MM to produce a PASS result
     Mockito.when(status3.getHealthStatus()).thenReturn(HealthStatus.HEALTHY);
-    check = new PrerequisiteCheck(null, null);
     Mockito.when(host3.getMaintenanceState(1L)).thenReturn(MaintenanceState.OFF);
-    hostHeartbeatCheck.perform(check, new PrereqCheckRequest("cluster"));
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
-    Assert.assertTrue(check.getFailedDetail().isEmpty());
+    result = hostHeartbeatCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
+    Assert.assertTrue(result.getFailedDetail().isEmpty());
   }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
index 36b1646..16b09b2 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheckTest.java
@@ -25,13 +25,14 @@ import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
@@ -72,16 +73,17 @@ public class HostsMasterMaintenanceCheckTest {
 
   @Test
   public void testIsApplicable() throws Exception {
-    final PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    PrereqCheckRequest checkRequest = new PrereqCheckRequest(upgradePlan);
     HostsMasterMaintenanceCheck hmmc = new HostsMasterMaintenanceCheck();
     Configuration config = Mockito.mock(Configuration.class);
     hmmc.config = config;
-    Assert.assertTrue(hmmc.isApplicable(request));
-    Assert.assertTrue(new HostsMasterMaintenanceCheck().isApplicable(request));
+    Assert.assertTrue(hmmc.isApplicable(checkRequest));
+    Assert.assertTrue(new HostsMasterMaintenanceCheck().isApplicable(checkRequest));
 
     HostsMasterMaintenanceCheck hmmc2 = new HostsMasterMaintenanceCheck();
     hmmc2.config = config;
-    Assert.assertTrue(hmmc2.isApplicable(request));
+    Assert.assertTrue(hmmc2.isApplicable(checkRequest));
   }
 
   @Test
@@ -114,22 +116,18 @@ public class HostsMasterMaintenanceCheckTest {
     Mockito.when(cluster.getDesiredStackVersion()).thenReturn(new StackId("HDP", "1.0"));
     Mockito.when(repositoryVersionHelper.getUpgradePackageName(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), (UpgradeType) Mockito.anyObject())).thenReturn(null);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    PrereqCheckRequest checkRequest = new PrereqCheckRequest("cluster");
-    checkRequest.setSourceStackId(new StackId("HDP-1.0"));
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    PrereqCheckRequest checkRequest = new PrereqCheckRequest(upgradePlan);
 
-    hostsMasterMaintenanceCheck.perform(check, checkRequest);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradeCheckResult result = hostsMasterMaintenanceCheck.perform(checkRequest);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
 
     Mockito.when(repositoryVersionHelper.getUpgradePackageName(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), (UpgradeType) Mockito.anyObject())).thenReturn(upgradePackName);
     Mockito.when(ambariMetaInfo.getUpgradePacks(Mockito.anyString(), Mockito.anyString())).thenReturn(new HashMap<>());
 
-    check = new PrerequisiteCheck(null, null);
-    checkRequest = new PrereqCheckRequest("cluster");
-    checkRequest.setSourceStackId(new StackId("HDP-1.0"));
-
-    hostsMasterMaintenanceCheck.perform(check, checkRequest);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    checkRequest = new PrereqCheckRequest(upgradePlan);
+    result = hostsMasterMaintenanceCheck.perform(checkRequest);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
 
     final Map<String, UpgradePack> upgradePacks = new HashMap<>();
     final UpgradePack upgradePack = Mockito.mock(UpgradePack.class);
@@ -140,11 +138,10 @@ public class HostsMasterMaintenanceCheckTest {
     Mockito.when(cluster.getServicesByName()).thenReturn(new HashMap<>());
     Mockito.when(clusters.getHostsForCluster(Mockito.anyString())).thenReturn(new HashMap<>());
 
-    check = new PrerequisiteCheck(null, null);
-    checkRequest = new PrereqCheckRequest("cluster");
-    checkRequest.setSourceStackId(new StackId("HDP-1.0"));
+    checkRequest = new PrereqCheckRequest(upgradePlan);
+    result = hostsMasterMaintenanceCheck.perform(checkRequest);
 
-    hostsMasterMaintenanceCheck.perform(check, checkRequest);
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+    hostsMasterMaintenanceCheck.perform(checkRequest);
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
   }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/PreviousUpgradeCompletedTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/PreviousUpgradeCompletedTest.java
index 4ad72af..40cdd24 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/PreviousUpgradeCompletedTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/PreviousUpgradeCompletedTest.java
@@ -22,11 +22,12 @@ import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.orm.entities.UpgradeEntity;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.upgrade.Direction;
 import org.junit.Assert;
 import org.junit.Before;
@@ -49,7 +50,7 @@ public class PreviousUpgradeCompletedTest {
   private StackId sourceStackId = new StackId("HDP", "2.2");
   private StackId targetStackId = new StackId("HDP", "2.2");
   private String clusterName = "cluster";
-  private PrereqCheckRequest checkRequest = new PrereqCheckRequest(clusterName);
+  private PrereqCheckRequest checkRequest;
   private PreviousUpgradeCompleted puc = new PreviousUpgradeCompleted();
 
 
@@ -68,23 +69,23 @@ public class PreviousUpgradeCompletedTest {
     stack.setStackName(stackId.getStackName());
     stack.setStackVersion(stackId.getStackVersion());
 
-    checkRequest.setSourceStackId(sourceStackId);
-
     puc.clustersProvider = new Provider<Clusters>() {
       @Override
       public Clusters get() {
         return clusters;
       }
     };
+
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    checkRequest = new PrereqCheckRequest(upgradePlan);
   }
 
   @Test
   public void testPerform() throws Exception {
     // no existing upgrades
     Mockito.when(cluster.getUpgradeInProgress()).thenReturn(null);
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    puc.perform(check, checkRequest);
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+    UpgradeCheckResult result = puc.perform(checkRequest);
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
 
     // existing upgrade
     UpgradeEntity upgradeInProgress = Mockito.mock(UpgradeEntity.class);
@@ -92,8 +93,7 @@ public class PreviousUpgradeCompletedTest {
     Mockito.when(upgradeInProgress.getClusterId()).thenReturn(1L);
 
     Mockito.when(cluster.getUpgradeInProgress()).thenReturn(upgradeInProgress);
-    check = new PrerequisiteCheck(null, null);
-    puc.perform(check, checkRequest);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    result = puc.perform(checkRequest);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServiceCheckValidityCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServiceCheckValidityCheckTest.java
index 63aae86..d7bb5e1 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServiceCheckValidityCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServiceCheckValidityCheckTest.java
@@ -35,6 +35,7 @@ import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
 import org.apache.ambari.server.orm.dao.HostRoleCommandDAO.LastServiceCheckDTO;
 import org.apache.ambari.server.orm.dao.ServiceConfigDAO;
 import org.apache.ambari.server.orm.entities.ServiceConfigEntity;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.MaintenanceState;
@@ -42,9 +43,11 @@ import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -52,6 +55,7 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Provider;
 
+@Ignore
 public class ServiceCheckValidityCheckTest {
   private static final String CLUSTER_NAME = "cluster1";
   private static final long CLUSTER_ID = 1L;
@@ -146,13 +150,16 @@ public class ServiceCheckValidityCheckTest {
     when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_ID))).thenReturn(serviceConfigEntity);
     when(hostRoleCommandDAO.getLatestServiceChecksByRole(any(Long.class))).thenReturn(asList(lastServiceCheckDTO1, lastServiceCheckDTO2));
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
+    UpgradePlanEntity upgradePlan = mock(UpgradePlanEntity.class);
+    when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
     try {
-      serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
+      UpgradeCheckResult result = serviceCheckValidityCheck.perform(new PrereqCheckRequest(upgradePlan));
+      Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
     } catch (NullPointerException ex){
       Assert.fail("serviceCheckValidityCheck failed due to null at start_time were not handled");
     }
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+
   }
 
   @Test
@@ -173,9 +180,11 @@ public class ServiceCheckValidityCheckTest {
     when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_ID))).thenReturn(serviceConfigEntity);
     when(hostRoleCommandDAO.getLatestServiceChecksByRole(any(Long.class))).thenReturn(singletonList(lastServiceCheckDTO));
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
-    serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradePlanEntity upgradePlan = mock(UpgradePlanEntity.class);
+    when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    UpgradeCheckResult result = serviceCheckValidityCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 
 
@@ -195,9 +204,11 @@ public class ServiceCheckValidityCheckTest {
     when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_ID))).thenReturn(serviceConfigEntity);
     when(hostRoleCommandDAO.getLatestServiceChecksByRole(any(Long.class))).thenReturn(Collections.emptyList());
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
-    serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradePlanEntity upgradePlan = mock(UpgradePlanEntity.class);
+    when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    UpgradeCheckResult result = serviceCheckValidityCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 
   @Test
@@ -219,9 +230,11 @@ public class ServiceCheckValidityCheckTest {
     when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_ID))).thenReturn(serviceConfigEntity);
     when(hostRoleCommandDAO.getLatestServiceChecksByRole(any(Long.class))).thenReturn(asList(lastServiceCheckDTO1, lastServiceCheckDTO2));
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
-    serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradePlanEntity upgradePlan = mock(UpgradePlanEntity.class);
+    when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    UpgradeCheckResult result = serviceCheckValidityCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 
   /**
@@ -254,7 +267,9 @@ public class ServiceCheckValidityCheckTest {
     when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_ID))).thenReturn(serviceConfigEntity);
     when(hostRoleCommandDAO.getLatestServiceChecksByRole(any(Long.class))).thenReturn(asList(lastServiceCheckDTO1, lastServiceCheckDTO2));
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
-    serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());  }
+    UpgradePlanEntity upgradePlan = mock(UpgradePlanEntity.class);
+    when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    UpgradeCheckResult result = serviceCheckValidityCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());  }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicePresenceCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicePresenceCheckTest.java
index 1b76eba..f12ed7a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicePresenceCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicePresenceCheckTest.java
@@ -23,12 +23,14 @@ import java.util.Map;
 import org.apache.ambari.annotations.Experimental;
 import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -77,12 +79,14 @@ public class ServicePresenceCheckTest {
     Mockito.when(prerequisiteCheckConfig.getCheckProperties(
         m_check.getClass().getName())).thenReturn(checkProperties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    Mockito.when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
     request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
-    m_check.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+    UpgradeCheckResult result = m_check.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
   }
 
   @Test
@@ -101,12 +105,14 @@ public class ServicePresenceCheckTest {
     Mockito.when(prerequisiteCheckConfig.getCheckProperties(
         m_check.getClass().getName())).thenReturn(checkProperties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    Mockito.when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
     request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
-    m_check.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradeCheckResult result = m_check.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 
   @Test
@@ -129,12 +135,14 @@ public class ServicePresenceCheckTest {
         prerequisiteCheckConfig.getCheckProperties(m_check.getClass().getName())).thenReturn(
             checkProperties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    Mockito.when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
     request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
-    m_check.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradeCheckResult result = m_check.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 
   @Test
@@ -155,12 +163,14 @@ public class ServicePresenceCheckTest {
     Mockito.when(prerequisiteCheckConfig.getCheckProperties(
         m_check.getClass().getName())).thenReturn(checkProperties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    Mockito.when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
     request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
-    m_check.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradeCheckResult result = m_check.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 
   @Test
@@ -184,12 +194,14 @@ public class ServicePresenceCheckTest {
     Mockito.when(prerequisiteCheckConfig.getCheckProperties(
         m_check.getClass().getName())).thenReturn(checkProperties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    Mockito.when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
     request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
-    m_check.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradeCheckResult result = m_check.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 
   @Test
@@ -211,12 +223,14 @@ public class ServicePresenceCheckTest {
     Mockito.when(prerequisiteCheckConfig.getCheckProperties(
         m_check.getClass().getName())).thenReturn(checkProperties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    Mockito.when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
     request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
-    m_check.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradeCheckResult result = m_check.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 
   @Test
@@ -241,11 +255,13 @@ public class ServicePresenceCheckTest {
     Mockito.when(prerequisiteCheckConfig.getCheckProperties(
         m_check.getClass().getName())).thenReturn(checkProperties);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    Mockito.when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
     request.setPrerequisiteCheckConfig(prerequisiteCheckConfig);
 
-    m_check.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    UpgradeCheckResult result = m_check.perform(request);
+    Assert.assertEquals(PrereqCheckStatus.FAIL, result.getStatus());
   }
 }
\ No newline at end of file
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheckTest.java
index e162a38..e2951a0 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheckTest.java
@@ -26,6 +26,7 @@ import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Service;
@@ -33,7 +34,7 @@ import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -72,8 +73,8 @@ public class ServicesMaintenanceModeCheckTest {
 
   @Test
   public void testIsApplicable() throws Exception {
-    PrereqCheckRequest checkRequest = new PrereqCheckRequest("c1");
-    checkRequest.setSourceStackId(new StackId("HDP", "2.2"));
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    PrereqCheckRequest checkRequest = new PrereqCheckRequest(upgradePlan);
 
     ServicesMaintenanceModeCheck smmc = new ServicesMaintenanceModeCheck();
     Configuration config = Mockito.mock(Configuration.class);
@@ -109,16 +110,16 @@ public class ServicesMaintenanceModeCheckTest {
 
     // We don't bother checking service desired state as it's performed by a separate check
     Mockito.when(service.getDesiredState()).thenReturn(State.UNKNOWN);
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
 
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    PrereqCheckRequest checkRequest = new PrereqCheckRequest(upgradePlan);
 
-    servicesMaintenanceModeCheck.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+    UpgradeCheckResult result = servicesMaintenanceModeCheck.perform(checkRequest);
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
 
     Mockito.when(service.getDesiredState()).thenReturn(State.STARTED);
-    check = new PrerequisiteCheck(null, null);
-    servicesMaintenanceModeCheck.perform(check, request);
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    result = servicesMaintenanceModeCheck.perform(checkRequest);
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
   }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesUpCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesUpCheckTest.java
index e7ee71e..cd0da86 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesUpCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/ServicesUpCheckTest.java
@@ -28,6 +28,7 @@ import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.orm.models.HostComponentSummary;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
@@ -40,7 +41,7 @@ import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -89,8 +90,8 @@ public class ServicesUpCheckTest {
 
   @Test
   public void testIsApplicable() throws Exception {
-    PrereqCheckRequest checkRequest = new PrereqCheckRequest("c1");
-    checkRequest.setSourceStackId(new StackId("HDP", "2.2"));
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    PrereqCheckRequest checkRequest = new PrereqCheckRequest(upgradePlan);
 
     ServicesUpCheck suc = new ServicesUpCheck();
     Configuration config = Mockito.mock(Configuration.class);
@@ -284,10 +285,11 @@ public class ServicesUpCheckTest {
       Mockito.when(hcs.getCurrentState()).thenReturn(State.STARTED);
     }
 
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = Mockito.mock(UpgradePlanEntity.class);
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
-    servicesUpCheck.perform(check, request);
+    UpgradeCheckResult check = new UpgradeCheckResult(null, null);
+    servicesUpCheck.perform(request);
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
     Assert.assertTrue(check.getFailedDetail().isEmpty());
 
@@ -295,8 +297,8 @@ public class ServicesUpCheckTest {
     Mockito.when(hcsNameNode.getDesiredState()).thenReturn(State.STARTED);
     Mockito.when(hcsDataNode1.getDesiredState()).thenReturn(State.STARTED);
 
-    check = new PrerequisiteCheck(null, null);
-    servicesUpCheck.perform(check, request);
+    check = new UpgradeCheckResult(null, null);
+    servicesUpCheck.perform(request);
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
     Assert.assertTrue(check.getFailedDetail().isEmpty());
 
@@ -305,8 +307,8 @@ public class ServicesUpCheckTest {
     Mockito.when(hcsMetricsCollector.getCurrentState()).thenReturn(State.INSTALLED);
     Mockito.when(hcsMetricsMonitor.getCurrentState()).thenReturn(State.INSTALLED);
 
-    check = new PrerequisiteCheck(null, null);
-    servicesUpCheck.perform(check, request);
+    check = new UpgradeCheckResult(null, null);
+    servicesUpCheck.perform(request);
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
     Assert.assertTrue(check.getFailedDetail().isEmpty());
 
@@ -314,16 +316,16 @@ public class ServicesUpCheckTest {
     Mockito.when(hcsNameNode.getCurrentState()).thenReturn(State.INSTALLED);
     Mockito.when(hcsDataNode1.getCurrentState()).thenReturn(State.INSTALLED);
 
-    check = new PrerequisiteCheck(null, null);
-    servicesUpCheck.perform(check, request);
+    check = new UpgradeCheckResult(null, null);
+    servicesUpCheck.perform(request);
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
     Assert.assertFalse(check.getFailedDetail().isEmpty());
 
     // Case 5. Change HDFS master to STARTED, but one slave to INSTALLED, should pass (2/3 are up).
     Mockito.when(hcsNameNode.getCurrentState()).thenReturn(State.STARTED);
     Mockito.when(hcsDataNode1.getCurrentState()).thenReturn(State.INSTALLED);
-    check = new PrerequisiteCheck(null, null);
-    servicesUpCheck.perform(check, request);
+    check = new UpgradeCheckResult(null, null);
+    servicesUpCheck.perform(request);
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
     Assert.assertTrue(check.getFailedDetail().isEmpty());
 
@@ -331,8 +333,8 @@ public class ServicesUpCheckTest {
     Mockito.when(hcsNameNode.getCurrentState()).thenReturn(State.STARTED);
     Mockito.when(hcsDataNode1.getCurrentState()).thenReturn(State.INSTALLED);
     Mockito.when(hcsDataNode2.getCurrentState()).thenReturn(State.INSTALLED);
-    check = new PrerequisiteCheck(null, null);
-    servicesUpCheck.perform(check, request);
+    check = new UpgradeCheckResult(null, null);
+    servicesUpCheck.perform(request);
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
     Assert.assertTrue(check.getFailReason().indexOf("50%") > -1);
     Assert.assertFalse(check.getFailedDetail().isEmpty());
@@ -340,8 +342,8 @@ public class ServicesUpCheckTest {
     // place the DN slaves into MM which will allow them to be skipped
     Mockito.when(host1.getMaintenanceState(Mockito.anyLong())).thenReturn(MaintenanceState.ON);
     Mockito.when(host3.getMaintenanceState(Mockito.anyLong())).thenReturn(MaintenanceState.ON);
-    check = new PrerequisiteCheck(null, null);
-    servicesUpCheck.perform(check, request);
+    check = new UpgradeCheckResult(null, null);
+    servicesUpCheck.perform(request);
     Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
     Assert.assertTrue(check.getFailedDetail().isEmpty());
 
@@ -352,15 +354,15 @@ public class ServicesUpCheckTest {
     Mockito.when(host1.getMaintenanceState(Mockito.anyLong())).thenReturn(MaintenanceState.OFF);
     Mockito.when(host3.getMaintenanceState(Mockito.anyLong())).thenReturn(MaintenanceState.OFF);
 
-    check = new PrerequisiteCheck(null, null);
-    servicesUpCheck.perform(check, request);
+    check = new UpgradeCheckResult(null, null);
+    servicesUpCheck.perform(request);
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
     Assert.assertFalse(check.getFailedDetail().isEmpty());
 
     // put NN into MM; should still fail since it's a master
     Mockito.when(host1.getMaintenanceState(Mockito.anyLong())).thenReturn(MaintenanceState.ON);
-    check = new PrerequisiteCheck(null, null);
-    servicesUpCheck.perform(check, request);
+    check = new UpgradeCheckResult(null, null);
+    servicesUpCheck.perform(request);
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
     Assert.assertFalse(check.getFailedDetail().isEmpty());
   }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/UpgradeCheckOrderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/UpgradeCheckOrderTest.java
index 0bc1584..b527a03 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/UpgradeCheckOrderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/UpgradeCheckOrderTest.java
@@ -41,7 +41,7 @@ import com.google.inject.Injector;
 public class UpgradeCheckOrderTest {
 
   /**
-   * Tests that instances of {@link AbstractCheckDescriptor} are ordered
+   * Tests that instances of {@link ClusterCheck} are ordered
    * correctly.
    *
    * @throws Exception
@@ -63,11 +63,11 @@ public class UpgradeCheckOrderTest {
     Assert.assertEquals(registry, registry2);
 
     // get the check list
-    List<AbstractCheckDescriptor> checks = registry.getUpgradeChecks();
+    List<PreUpgradeCheck> checks = registry.getUpgradeChecks();
 
     // scan for all checks
     ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
-    AssignableTypeFilter filter = new AssignableTypeFilter(AbstractCheckDescriptor.class);
+    AssignableTypeFilter filter = new AssignableTypeFilter(ClusterCheck.class);
     scanner.addIncludeFilter(filter);
 
     // grab all check subclasses using the exact folder they are in to avoid loading the SampleServiceCheck from the test jar
@@ -76,8 +76,8 @@ public class UpgradeCheckOrderTest {
     // verify they are equal
     Assert.assertEquals(beanDefinitions.size(), checks.size());
 
-    AbstractCheckDescriptor lastCheck = null;
-    for (AbstractCheckDescriptor check : checks) {
+    PreUpgradeCheck lastCheck = null;
+    for (PreUpgradeCheck check : checks) {
       UpgradeCheckGroup group = UpgradeCheckGroup.DEFAULT;
       UpgradeCheckGroup lastGroup = UpgradeCheckGroup.DEFAULT;
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/VersionMismatchCheckTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/VersionMismatchCheckTest.java
index c7310f8..ded1c3d 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/VersionMismatchCheckTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/VersionMismatchCheckTest.java
@@ -25,15 +25,18 @@ import static org.mockito.Mockito.when;
 import java.util.Map;
 
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableMap;
@@ -44,6 +47,7 @@ import com.google.inject.Provider;
  * Checks VersionMismatchCheck pre-upgrade check. Includes tests that emulate both
  * clusters with and without host components in VERSION_MISMATCH upgrade state.
  */
+@Ignore
 public class VersionMismatchCheckTest {
   private static final String CLUSTER_NAME = "cluster1";
   private static final String FIRST_SERVICE_NAME = "service1";
@@ -82,17 +86,21 @@ public class VersionMismatchCheckTest {
   public void testWarningWhenHostWithVersionMismatchExists() throws Exception {
     when(firstServiceComponentHosts.get(FIRST_SERVICE_COMPONENT_HOST_NAME).getUpgradeState()).thenReturn(VERSION_MISMATCH);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
-    versionMismatchCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
-    Assert.assertEquals(PrereqCheckStatus.WARNING, check.getStatus());
+    UpgradePlanEntity upgradePlan = mock(UpgradePlanEntity.class);
+    when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    UpgradeCheckResult result = versionMismatchCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.WARNING, result.getStatus());
   }
 
   @Test
   public void testWarningWhenHostWithVersionMismatchDoesNotExist() throws Exception {
     when(firstServiceComponentHosts.get(FIRST_SERVICE_COMPONENT_HOST_NAME).getUpgradeState()).thenReturn(IN_PROGRESS);
 
-    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
-    versionMismatchCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
-    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+    UpgradePlanEntity upgradePlan = mock(UpgradePlanEntity.class);
+    when(upgradePlan.getUpgradeType()).thenReturn(UpgradeType.ROLLING);
+
+    UpgradeCheckResult result = versionMismatchCheck.perform(new PrereqCheckRequest(upgradePlan));
+    Assert.assertEquals(PrereqCheckStatus.PASS, result.getStatus());
   }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java
index 6a89cb1..e054947 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/PreUpgradeCheckResourceProviderTest.java
@@ -38,7 +38,7 @@ import org.apache.ambari.annotations.Experimental;
 import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
-import org.apache.ambari.server.checks.AbstractCheckDescriptor;
+import org.apache.ambari.server.checks.ClusterCheck;
 import org.apache.ambari.server.checks.UpgradeCheckRegistry;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
@@ -124,7 +124,7 @@ public class PreUpgradeCheckResourceProviderTest {
 
     expect(upgradeHelper.suggestUpgradePack("Cluster100", currentStackId, targetStackId, Direction.UPGRADE, UpgradeType.EXPRESS, "upgrade_pack11")).andReturn(upgradePack);
 
-    List<AbstractCheckDescriptor> upgradeChecksToRun = new LinkedList<>();
+    List<ClusterCheck> upgradeChecksToRun = new LinkedList<>();
     List<String> prerequisiteChecks = new LinkedList<>();
     prerequisiteChecks.add("org.apache.ambari.server.sample.checks.SampleServiceCheck");
     expect(upgradePack.getPrerequisiteCheckConfig()).andReturn(config);
@@ -144,7 +144,6 @@ public class PreUpgradeCheckResourceProviderTest {
     Request request = PropertyHelper.getReadRequest(new HashSet<>());
     PredicateBuilder builder = new PredicateBuilder();
     Predicate predicate = builder.property(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").and()
-        .property(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_PACK_PROPERTY_ID).equals("upgrade_pack11").and()
         .property(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID).equals(UpgradeType.EXPRESS).and()
         .property(PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_PLAN_ID).equals("1").toPredicate();
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeSummaryResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeSummaryResourceProviderTest.java
index 30f29a6..4e66811 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeSummaryResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeSummaryResourceProviderTest.java
@@ -265,7 +265,6 @@ public class UpgradeSummaryResourceProviderTest {
     upgrade.setRequestEntity(requestEntity);
     upgrade.setClusterId(cluster.getClusterId());
     upgrade.setId(1L);
-    upgrade.setUpgradePackage("some-name");
     upgrade.setUpgradeType(UpgradeType.ROLLING);
     upgrade.setDirection(Direction.UPGRADE);
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/UpgradeDAOTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/UpgradeDAOTest.java
index eda9f2c..112188a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/UpgradeDAOTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/UpgradeDAOTest.java
@@ -103,7 +103,6 @@ public class UpgradeDAOTest {
     entity.setClusterId(clusterId.longValue());
     entity.setRequestEntity(requestEntity);
     entity.setUpgradeType(UpgradeType.ROLLING);
-    entity.setUpgradePackage("test-upgrade");
     entity.setDowngradeAllowed(true);
 
     UpgradeGroupEntity group = new UpgradeGroupEntity();
@@ -179,7 +178,6 @@ public class UpgradeDAOTest {
     entity1.setDirection(Direction.UPGRADE);
     entity1.setRequestEntity(requestEntity);
     entity1.setUpgradeType(UpgradeType.ROLLING);
-    entity1.setUpgradePackage("test-upgrade");
     entity1.setDowngradeAllowed(true);
     dao.create(entity1);
     UpgradeEntity entity2 = new UpgradeEntity();
@@ -188,7 +186,6 @@ public class UpgradeDAOTest {
     entity2.setDirection(Direction.DOWNGRADE);
     entity2.setRequestEntity(requestEntity);
     entity2.setUpgradeType(UpgradeType.ROLLING);
-    entity2.setUpgradePackage("test-upgrade");
     entity2.setDowngradeAllowed(true);
     dao.create(entity2);
     UpgradeEntity entity3 = new UpgradeEntity();
@@ -197,7 +194,6 @@ public class UpgradeDAOTest {
     entity3.setDirection(Direction.UPGRADE);
     entity3.setRequestEntity(requestEntity);
     entity3.setUpgradeType(UpgradeType.ROLLING);
-    entity3.setUpgradePackage("test-upgrade");
     entity3.setDowngradeAllowed(true);
     dao.create(entity3);
     UpgradeEntity lastUpgradeForCluster = dao.findLastUpgradeForCluster(clusterId.longValue(), Direction.UPGRADE);
@@ -225,7 +221,6 @@ public class UpgradeDAOTest {
     upgradeEntity.setDirection(Direction.UPGRADE);
     upgradeEntity.setRequestEntity(requestEntity);
     upgradeEntity.setUpgradeType(UpgradeType.ROLLING);
-    upgradeEntity.setUpgradePackage("test-upgrade");
     dao.create(upgradeEntity);
 
     UpgradeEntity lastUpgradeForCluster = dao.findLastUpgradeForCluster(1, Direction.UPGRADE);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/sample/checks/SampleServiceCheck.java b/ambari-server/src/test/java/org/apache/ambari/server/sample/checks/SampleServiceCheck.java
index 3a07928..0ce4b6a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/sample/checks/SampleServiceCheck.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/sample/checks/SampleServiceCheck.java
@@ -18,30 +18,32 @@
 package org.apache.ambari.server.sample.checks;
 
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.checks.AbstractCheckDescriptor;
 import org.apache.ambari.server.checks.CheckDescription;
+import org.apache.ambari.server.checks.ClusterCheck;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrereqCheckType;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
 
 import com.google.common.collect.ImmutableMap;
 
-public class SampleServiceCheck extends AbstractCheckDescriptor {
+public class SampleServiceCheck extends ClusterCheck {
 
   public SampleServiceCheck() {
     super(new CheckDescription("SAMPLE_SERVICE_CHECK",
           PrereqCheckType.HOST,
           "Sample service check description.",
           new ImmutableMap.Builder<String, String>()
-                          .put(AbstractCheckDescriptor.DEFAULT,
+                          .put(ClusterCheck.DEFAULT,
                               "Sample service check default property description.").build()));
   }
 
   @Override
-  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
-    prerequisiteCheck.setFailReason("Sample service check always fails.");
-    prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
+  public UpgradeCheckResult perform(PrereqCheckRequest request) throws AmbariException {
+    UpgradeCheckResult result = new UpgradeCheckResult(this);
+    result.setFailReason("Sample service check always fails.");
+    result.setStatus(PrereqCheckStatus.FAIL);
+    return result;
   }
 
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
index 358f19d..f84c79f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
@@ -193,7 +193,6 @@ public class ComponentVersionCheckActionTest {
     upgradeEntity.setId(1L);
     upgradeEntity.setClusterId(c.getClusterId());
     upgradeEntity.setRequestEntity(requestEntity);
-    upgradeEntity.setUpgradePackage("");
     upgradeEntity.setUpgradeType(UpgradeType.EXPRESS);
     upgradeDAO.create(upgradeEntity);
 
@@ -256,7 +255,6 @@ public class ComponentVersionCheckActionTest {
     upgradeEntity.setId(1L);
     upgradeEntity.setClusterId(c.getClusterId());
     upgradeEntity.setRequestEntity(requestEntity);
-    upgradeEntity.setUpgradePackage("");
     upgradeEntity.setUpgradeType(UpgradeType.EXPRESS);
     upgradeDAO.create(upgradeEntity);
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/CreateAndConfigureActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/CreateAndConfigureActionTest.java
index 1601b1e..59a54b9 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/CreateAndConfigureActionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/CreateAndConfigureActionTest.java
@@ -312,7 +312,6 @@ public class CreateAndConfigureActionTest {
     upgradeEntity.setId(1L);
     upgradeEntity.setClusterId(cluster.getClusterId());
     upgradeEntity.setRequestEntity(requestEntity);
-    upgradeEntity.setUpgradePackage("");
     upgradeEntity.setUpgradeType(UpgradeType.EXPRESS);
 
     ServiceGroupDAO serviceGroupDAO = m_injector.getInstance(ServiceGroupDAO.class);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
index 3f3be20..eb1369f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
@@ -18,6 +18,8 @@
 
 package org.apache.ambari.server.state;
 
+import static org.easymock.EasyMock.expect;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -27,14 +29,16 @@ import java.util.Set;
 import org.apache.ambari.annotations.Experimental;
 import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.checks.AbstractCheckDescriptor;
 import org.apache.ambari.server.checks.CheckDescription;
+import org.apache.ambari.server.checks.ClusterCheck;
+import org.apache.ambari.server.checks.PreUpgradeCheck;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.entities.UpgradePlanEntity;
 import org.apache.ambari.server.state.repository.ClusterVersionSummary;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
-import org.apache.ambari.server.state.stack.PrerequisiteCheck;
-import org.easymock.EasyMock;
+import org.apache.ambari.server.state.stack.UpgradeCheckResult;
+import org.easymock.EasyMockSupport;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -55,7 +59,7 @@ import junit.framework.Assert;
 @Ignore
 @Experimental(feature = ExperimentalFeature.UNIT_TEST_REQUIRED)
 @RunWith(MockitoJUnitRunner.class)
-public class CheckHelperTest {
+public class CheckHelperTest extends EasyMockSupport {
 
   private final Clusters clusters = Mockito.mock(Clusters.class);
 
@@ -87,14 +91,16 @@ public class CheckHelperTest {
   @Test
   public void testPreUpgradeCheck() throws Exception {
     final CheckHelper helper = new CheckHelper();
-    Configuration configuration = EasyMock.createNiceMock(Configuration.class);
-    List<AbstractCheckDescriptor> updateChecksRegistry = new ArrayList<>();
+    Configuration configuration = createNiceMock(Configuration.class);
+    List<PreUpgradeCheck> updateChecksRegistry = new ArrayList<>();
 
-    EasyMock.expect(configuration.isUpgradePrecheckBypass()).andReturn(false);
-    EasyMock.replay(configuration);
+    expect(configuration.isUpgradePrecheckBypass()).andReturn(false);
     updateChecksRegistry.add(m_mockCheck);
 
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+
+    replayAll();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     helper.performChecks(request, updateChecksRegistry, configuration);
 
@@ -116,14 +122,16 @@ public class CheckHelperTest {
     Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster);
 
     final CheckHelper helper = new CheckHelper();
-    Configuration configuration = EasyMock.createNiceMock(Configuration.class);
-    List<AbstractCheckDescriptor> updateChecksRegistry = new ArrayList<>();
+    Configuration configuration = createNiceMock(Configuration.class);
+    List<PreUpgradeCheck> updateChecksRegistry = new ArrayList<>();
 
-    EasyMock.expect(configuration.isUpgradePrecheckBypass()).andReturn(false);
-    EasyMock.replay(configuration);
+    expect(configuration.isUpgradePrecheckBypass()).andReturn(false);
     updateChecksRegistry.add(m_mockCheck);
 
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+
+    replayAll();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     helper.performChecks(request, updateChecksRegistry, configuration);
 
@@ -137,17 +145,19 @@ public class CheckHelperTest {
   @Test
   public void testPreUpgradeCheckThrowsException() throws Exception {
     final CheckHelper helper = new CheckHelper();
-    Configuration configuration = EasyMock.createNiceMock(Configuration.class);
-    List<AbstractCheckDescriptor> updateChecksRegistry = new ArrayList<>();
+    Configuration configuration = createNiceMock(Configuration.class);
+    List<PreUpgradeCheck> updateChecksRegistry = new ArrayList<>();
 
-    EasyMock.expect(configuration.isUpgradePrecheckBypass()).andReturn(false);
-    EasyMock.replay(configuration);
+    expect(configuration.isUpgradePrecheckBypass()).andReturn(false);
     updateChecksRegistry.add(m_mockCheck);
 
     // this will cause an exception
     Mockito.when(m_mockPerform.toString()).thenThrow(new RuntimeException());
 
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+
+    replayAll();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     helper.performChecks(request, updateChecksRegistry, configuration);
 
@@ -160,18 +170,20 @@ public class CheckHelperTest {
   @Test
   public void testPreUpgradeCheckBypassesFailure() throws Exception {
     final CheckHelper helper = new CheckHelper();
-    Configuration configuration = EasyMock.createNiceMock(Configuration.class);
-    List<AbstractCheckDescriptor> updateChecksRegistry = new ArrayList<>();
+    Configuration configuration = createNiceMock(Configuration.class);
+    List<PreUpgradeCheck> updateChecksRegistry = new ArrayList<>();
 
-    EasyMock.expect(configuration.isUpgradePrecheckBypass()).andReturn(true);
-    EasyMock.replay(configuration);
+    expect(configuration.isUpgradePrecheckBypass()).andReturn(true);
     updateChecksRegistry.add(m_mockCheck);
 
     // this will cause an exception, triggering the bypass
     Mockito.when(m_mockPerform.toString()).thenThrow(new RuntimeException());
 
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+
+    replayAll();
 
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
     helper.performChecks(request, updateChecksRegistry, configuration);
 
     Assert.assertEquals(PrereqCheckStatus.BYPASS, request.getResult(m_mockCheckDescription));
@@ -190,24 +202,26 @@ public class CheckHelperTest {
     Mockito.when(clusters.getCluster(Mockito.anyString())).thenReturn(cluster);
 
     final CheckHelper helper = new CheckHelper();
-    Configuration configuration = EasyMock.createNiceMock(Configuration.class);
-    List<AbstractCheckDescriptor> updateChecksRegistry = new ArrayList<>();
+    Configuration configuration = createNiceMock(Configuration.class);
+    List<PreUpgradeCheck> updateChecksRegistry = new ArrayList<>();
 
-    EasyMock.expect(configuration.isUpgradePrecheckBypass()).andReturn(false);
-    EasyMock.replay(configuration);
+    expect(configuration.isUpgradePrecheckBypass()).andReturn(false);
     updateChecksRegistry.add(m_mockCheck);
 
     // this will cause an exception, triggering the fail
     Mockito.when(m_mockPerform.toString()).thenThrow(new RuntimeException());
 
-    PrereqCheckRequest request = new PrereqCheckRequest("cluster");
+    UpgradePlanEntity upgradePlan = createNiceMock(UpgradePlanEntity.class);
+
+    replayAll();
+    PrereqCheckRequest request = new PrereqCheckRequest(upgradePlan);
 
     helper.performChecks(request, updateChecksRegistry, configuration);
 
     Assert.assertEquals(PrereqCheckStatus.FAIL, request.getResult(m_mockCheckDescription));
   }
 
-  class MockCheck extends AbstractCheckDescriptor {
+  class MockCheck extends ClusterCheck {
 
     protected MockCheck() {
       super(m_mockCheckDescription);
@@ -230,9 +244,10 @@ public class CheckHelperTest {
     }
 
     @Override
-    public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request)
+    public UpgradeCheckResult perform(PrereqCheckRequest request)
         throws AmbariException {
       m_mockPerform.toString();
+      return new UpgradeCheckResult(this);
     }
   }
 }
\ No newline at end of file
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/services/RetryUpgradeActionServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/services/RetryUpgradeActionServiceTest.java
index 655c439..3810310 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/services/RetryUpgradeActionServiceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/services/RetryUpgradeActionServiceTest.java
@@ -257,7 +257,6 @@ public class RetryUpgradeActionServiceTest {
     upgrade.setId(1L);
     upgrade.setRequestEntity(requestEntity);
     upgrade.setClusterId(cluster.getClusterId());
-    upgrade.setUpgradePackage("some-name");
     upgrade.setUpgradeType(UpgradeType.ROLLING);
     upgrade.setDirection(Direction.UPGRADE);
     upgradeDAO.create(upgrade);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
index d3bed44..7e42c5e 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
@@ -91,7 +91,7 @@ import com.google.common.collect.ImmutableSet;
  */
 //todo: switch over to EasyMockSupport
 @Experimental(
-    feature = ExperimentalFeature.REPO_VERSION_REMOVAL,
+    feature = ExperimentalFeature.UNIT_TEST_REQUIRED,
     comment = "Add test cases for mpacks and multiple/bad versions")
 public class AmbariContextTest {