Merge pull request #2793 from hiveww/AMBARI-25132-trunk

AMBARI-25132. Cover metric view
diff --git a/ambari-server/pom.xml b/ambari-server/pom.xml
index fd8db02..24b95db 100644
--- a/ambari-server/pom.xml
+++ b/ambari-server/pom.xml
@@ -351,6 +351,18 @@
             <exclude>src/test/resources/mpacks_replay.log</exclude>
             <exclude>src/test/python/stacks/2.5/HIVE/*.txt</exclude>
             <exclude>src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/stacks/MYSTACK/3.0/services/SERVICEC/dashboards/service-metrics/STORM.txt</exclude>
+            <exclude>src/test/python/uninstall/dashboards/files/metainfo.xml</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/dashboards/files/STORM.txt</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/dashboards/SERVICEB</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/dashboards/SERVICEA</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/extensions/SERVICEB</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/extensions/SERVICEA</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/common-services/SERVICEB</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/common-services/SERVICEA</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/stacks/2.0/files/metainfo1.xml</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/stacks/2.0/files/metainfo2.xml</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/stacks/2.0/SERVICEB</exclude> <!--exclude symlink-->
+            <exclude>src/test/python/uninstall/stacks/2.0/SERVICEA</exclude> <!--exclude symlink-->
             <exclude>src/test/python/uninstall/dashboards/files/STORM.txt</exclude>
             <exclude>src/main/resources/hive-schema-0.10.0.oracle.sql</exclude>
             <exclude>src/main/resources/hive-schema-0.12.0.oracle.sql</exclude>
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
index 74fcc61..1d17ff2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java
@@ -274,10 +274,10 @@
       Long clusterId = null;
       if (CollectionUtils.isNotEmpty(componentStatuses)) {
         calculateHostStatus = true;
-        for (ComponentStatus componentStatus : componentStatuses) {
-          clusterId = componentStatus.getClusterId();
-          break;
-        }
+        clusterId = componentStatuses.stream()
+            .findFirst()
+            .map(ComponentStatus::getClusterId)
+            .orElse(null);
       }
 
       if (!calculateHostStatus && CollectionUtils.isNotEmpty(reports)) {
@@ -391,15 +391,13 @@
           }
 
           if (writeKeytabsStructuredOut != null) {
-            if (SET_KEYTAB.equalsIgnoreCase(customCommand)) {
-              Map<String, String> keytabs = writeKeytabsStructuredOut.getKeytabs();
-              if (keytabs != null) {
-                for (Map.Entry<String, String> entry : keytabs.entrySet()) {
-                  String keytabPath = entry.getValue();
-                  for (KerberosKeytabPrincipalEntity kkpe: kerberosKeytabPrincipalDAO.findByHostAndKeytab(host.getHostId(), keytabPath)) {
-                    kkpe.setDistributed(true);
-                    kerberosKeytabPrincipalDAO.merge(kkpe);
-                  }
+            Map<String, String> keytabs = writeKeytabsStructuredOut.getKeytabs();
+            if (keytabs != null) {
+              for (Map.Entry<String, String> entry : keytabs.entrySet()) {
+                String keytabPath = entry.getValue();
+                for (KerberosKeytabPrincipalEntity kkpe : kerberosKeytabPrincipalDAO.findByHostAndKeytab(host.getHostId(), keytabPath)) {
+                  kkpe.setDistributed(true);
+                  kerberosKeytabPrincipalDAO.merge(kkpe);
                 }
               }
             }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AlertDefinitionsHolder.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AlertDefinitionsHolder.java
index 308ec84..14b5877 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AlertDefinitionsHolder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/stomp/AlertDefinitionsHolder.java
@@ -152,15 +152,13 @@
         LOG.debug("Handled {} of alerts for {} cluster(s) on host with id {}, changed = {}", update.getEventType(), updateClusters.size(), hostId, changed);
         break;
       case CREATE:
-        if (!updateClusters.isEmpty()) {
-          if (!Sets.intersection(existingClusters.keySet(), updateClusters.keySet()).isEmpty()) {
-            throw new AmbariException("Existing clusters in create");
-          }
-          mergedClusters.putAll(existingClusters);
-          mergedClusters.putAll(updateClusters);
-          LOG.debug("Handled {} of alerts for {} cluster(s)", update.getEventType(), updateClusters.size());
-          changed = true;
+        if (!Sets.intersection(existingClusters.keySet(), updateClusters.keySet()).isEmpty()) {
+          throw new AmbariException("Existing clusters in create");
         }
+        mergedClusters.putAll(existingClusters);
+        mergedClusters.putAll(updateClusters);
+        LOG.debug("Handled {} of alerts for {} cluster(s)", update.getEventType(), updateClusters.size());
+        changed = true;
         break;
       default:
         LOG.warn("Unhandled event type {}", update.getEventType());
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ExtensionLinkResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ExtensionLinkResourceDefinition.java
index b52e876..ca72b04 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ExtensionLinkResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ExtensionLinkResourceDefinition.java
@@ -22,7 +22,6 @@
 import java.util.Set;
 
 import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
 
 /**
  * An extension version is like a stack version but it contains custom services.  Linking an extension
@@ -31,10 +30,6 @@
  */
 public class ExtensionLinkResourceDefinition extends BaseResourceDefinition {
 
-  public ExtensionLinkResourceDefinition(Type resourceType) {
-    super(Resource.Type.ExtensionLink);
-  }
-
   public ExtensionLinkResourceDefinition() {
     super(Resource.Type.ExtensionLink);
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ExtensionResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ExtensionResourceDefinition.java
index ae2762a..c15b5ad 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ExtensionResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ExtensionResourceDefinition.java
@@ -22,7 +22,6 @@
 import java.util.Set;
 
 import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
 
 /**
  * An extension version is like a stack version but it contains custom services.  Linking an extension
@@ -31,10 +30,6 @@
  */
 public class ExtensionResourceDefinition extends BaseResourceDefinition {
 
-  public ExtensionResourceDefinition(Type resourceType) {
-    super(Resource.Type.Extension);
-  }
-
   public ExtensionResourceDefinition() {
     super(Resource.Type.Extension);
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
index 3875135..10e8351 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
@@ -27,7 +27,6 @@
 import org.apache.ambari.server.api.util.TreeNode;
 import org.apache.ambari.server.controller.internal.ResourceImpl;
 import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,10 +39,6 @@
   private final static Logger LOG =
           LoggerFactory.getLogger(MpackResourceDefinition.class);
 
-  public MpackResourceDefinition(Type resourceType) {
-    super(Resource.Type.Mpack);
-  }
-
   public MpackResourceDefinition() {
     super(Resource.Type.Mpack);
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackResourceDefinition.java
index cdea7da..0b75dad 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackResourceDefinition.java
@@ -22,14 +22,9 @@
 import java.util.Set;
 
 import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
 
 public class StackResourceDefinition extends BaseResourceDefinition {
 
-  public StackResourceDefinition(Type resourceType) {
-    super(Resource.Type.Stack);
-  }
-
   public StackResourceDefinition() {
     super(Resource.Type.Stack);
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/PluginChecksLoadedCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/PluginChecksLoadedCheck.java
index 5538919..c342088 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/PluginChecksLoadedCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/PluginChecksLoadedCheck.java
@@ -84,16 +84,13 @@
         .map(FailedPluginClassDetail::new)
         .collect(Collectors.toSet());
 
-    // check for failure
-    if (failedPluginClasses.size() > 0) {
-      result.setStatus(UpgradeCheckStatus.WARNING);
-      result.getFailedDetail().addAll(failedPluginSimpleClasses);
-      result.setFailReason(getFailReason(result, request));
+    result.setStatus(UpgradeCheckStatus.WARNING);
+    result.getFailedDetail().addAll(failedPluginSimpleClasses);
+    result.setFailReason(getFailReason(result, request));
 
-      result.getFailedOn().addAll(failedPluginSimpleClasses.stream()
-          .map(detail -> detail.toSimpleString())
-          .collect(Collectors.toSet()));
-    }
+    result.getFailedOn().addAll(failedPluginSimpleClasses.stream()
+        .map(detail -> detail.toSimpleString())
+        .collect(Collectors.toSet()));
 
     return result;
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
index 45496c5..a7e078d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
@@ -3942,7 +3942,7 @@
 
     if (dbpasswd != null) {
       return dbpasswd;
-    } else if (dbpasswd == null && isPasswordAlias) {
+    } else if (isPasswordAlias) {
       LOG.error("Can't read db password from keystore. Please, check master key was set correctly.");
       throw new RuntimeException("Can't read db password from keystore. Please, check master key was set correctly.");
     } else {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 72454a2..42176d1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -3384,11 +3384,9 @@
     hostParamsCmd.putAll(ec.getHostLevelParams());
     ec.getHostLevelParams().putAll(hostParamsCmd);
 
-    if (null != cluster) {
-      // Generate localComponents
-      for (ServiceComponentHost sch : cluster.getServiceComponentHosts(scHost.getHostName())) {
-        ec.getLocalComponents().add(sch.getServiceComponentName());
-      }
+    // Generate localComponents
+    for (ServiceComponentHost sch : cluster.getServiceComponentHosts(scHost.getHostName())) {
+      ec.getLocalComponents().add(sch.getServiceComponentName());
     }
 
     return ec;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
index 4f4763a..064c05d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
@@ -2956,17 +2956,15 @@
     if (configurations.get(CLUSTER_HOST_INFO) == null) {
       Map<String, Set<String>> clusterHostInfo = StageUtils.getClusterHostInfo(cluster);
 
-      if (clusterHostInfo != null) {
-        Map<String, String> componentHosts = new HashMap<>();
+      Map<String, String> componentHosts = new HashMap<>();
 
-        clusterHostInfo = StageUtils.substituteHostIndexes(clusterHostInfo);
+      clusterHostInfo = StageUtils.substituteHostIndexes(clusterHostInfo);
 
-        for (Map.Entry<String, Set<String>> entry : clusterHostInfo.entrySet()) {
-          componentHosts.put(entry.getKey(), StringUtils.join(entry.getValue(), ","));
-        }
-
-        configurations.put(CLUSTER_HOST_INFO, componentHosts);
+      for (Map.Entry<String, Set<String>> entry : clusterHostInfo.entrySet()) {
+        componentHosts.put(entry.getKey(), StringUtils.join(entry.getValue(), ","));
       }
+
+      configurations.put(CLUSTER_HOST_INFO, componentHosts);
     }
     configurations.put("principals", principalNames(cluster, configurations));
     return configurations;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceRequest.java
index fe72a33..9793fc3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceRequest.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceRequest.java
@@ -26,15 +26,17 @@
   private String credentialStoreEnabled;
 
   public StackServiceRequest(String stackName, String stackVersion,
-      String serviceName) {
+                             String serviceName) {
     this(stackName, stackVersion, serviceName, null, null);
   }
 
   public StackServiceRequest(String stackName, String stackVersion,
-      String serviceName, String credentialStoreSupported, String credentialStoreEnabled) {
+                             String serviceName, String credentialStoreSupported, String credentialStoreEnabled) {
     super(stackName, stackVersion);
 
     this.setServiceName(serviceName);
+    this.setCredentialStoreSupported(credentialStoreSupported);
+    this.setCredentialStoreEnabled(credentialStoreEnabled);
   }
 
   public String getServiceName() {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java
index 72fe0ae..206986c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java
@@ -198,7 +198,7 @@
       } else {
         // Verify authorization to retrieve the requested data
         try {
-          Long clusterId = (StringUtils.isEmpty(clusterName)) ? null : getClusterId(clusterName);
+          Long clusterId = getClusterId(clusterName);
           String definitionName = (String) propertyMap.get(ALERT_DEFINITION_NAME);
           String definitionId = (String) propertyMap.get(ALERT_DEFINITION_ID);
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java
index dc0fd57..be18477 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java
@@ -422,9 +422,14 @@
       entity.setNotificationType(notificationType);
     }
 
-    String properties = s_gson.toJson(extractProperties(requestMap));
-    if (!StringUtils.isEmpty(properties)) {
-      entity.setProperties(properties);
+    Map<String, Object> propertiesMap = extractProperties(requestMap);
+
+    if (propertiesMap != null) {
+      String properties = s_gson.toJson(propertiesMap);
+      if (!StringUtils.isEmpty(properties)) {
+        LOG.debug("Updating Alert Target properties map to: " + properties);
+        entity.setProperties(properties);
+      }
     }
 
     // a null alert state implies that the key was not set and no update
@@ -533,17 +538,23 @@
   private Map<String, Object> extractProperties(Map<String, Object> requestMap) {
     Map<String, Object> normalizedMap = new HashMap<>(
       requestMap.size());
+    boolean has_properties = false;
 
     for (Entry<String, Object> entry : requestMap.entrySet()) {
       String key = entry.getKey();
       String propCat = PropertyHelper.getPropertyCategory(key);
 
       if (propCat.equals(ALERT_TARGET_PROPERTIES)) {
+        has_properties = true;
         String propKey = PropertyHelper.getPropertyName(key);
         normalizedMap.put(propKey, entry.getValue());
       }
     }
 
+    if (!has_properties) {
+      normalizedMap = null;
+    }
+
     return normalizedMap;
   }
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerLDAPConfigurationHandler.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerLDAPConfigurationHandler.java
index 7f1a49f..a3c2d1f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerLDAPConfigurationHandler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerLDAPConfigurationHandler.java
@@ -101,9 +101,6 @@
     OperationType operationType;
     try {
       operationType = OperationType.translate(operation);
-      if (operationType == null) {
-        throw new SystemException(String.format("The requested operation is not supported for this category: %s", categoryName));
-      }
     } catch (IllegalArgumentException e) {
       throw new SystemException(String.format("The requested operation is not supported for this category: %s", categoryName), e);
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerStackAdvisorAwareConfigurationHandler.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerStackAdvisorAwareConfigurationHandler.java
index 49d5ec9..78e7301 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerStackAdvisorAwareConfigurationHandler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerStackAdvisorAwareConfigurationHandler.java
@@ -19,7 +19,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -195,10 +194,6 @@
         String configType = configuration.getKey();
         Map<String, String> configurationProperties = new HashMap<>(configuration.getValue());
 
-        if (configurationProperties == null) {
-          configurationProperties = Collections.emptySortedMap();
-        }
-
         properties.put("properties", configurationProperties);
         requestConfigurations.put(configType, properties);
       }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java
index 12ef314..56c0405 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintConfigurationProcessor.java
@@ -292,8 +292,6 @@
       oozieEnvUpdaters.put("oozie_existing_mysql_host", new SingleHostTopologyUpdater("OOZIE_SERVER"));
       oozieEnvUpdaters.put("oozie_existing_oracle_host", new SingleHostTopologyUpdater("OOZIE_SERVER"));
       oozieEnvUpdaters.put("oozie_existing_postgresql_host", new SingleHostTopologyUpdater("OOZIE_SERVER"));
-      oozieEnvUpdaters.put("oozie_existing_oracle_host", new SingleHostTopologyUpdater("OOZIE_SERVER"));
-      oozieEnvUpdaters.put("oozie_existing_postgresql_host", new SingleHostTopologyUpdater("OOZIE_SERVER"));
       oozieSiteUpdaters.put("oozie.service.JPAService.jdbc.url",  new SingleHostTopologyUpdater("OOZIE_SERVER"));
 
       singleHostTopologyUpdaters.put("oozie-env", oozieEnvUpdaters);
@@ -305,8 +303,6 @@
       oozieEnvOriginalValueMap.put("oozie_existing_mysql_host", new OriginalValuePropertyUpdater());
       oozieEnvOriginalValueMap.put("oozie_existing_oracle_host", new OriginalValuePropertyUpdater());
       oozieEnvOriginalValueMap.put("oozie_existing_postgresql_host", new OriginalValuePropertyUpdater());
-      oozieEnvOriginalValueMap.put("oozie_existing_oracle_host", new OriginalValuePropertyUpdater());
-      oozieEnvOriginalValueMap.put("oozie_existing_postgresql_host", new OriginalValuePropertyUpdater());
       oozieSiteOriginalValueMap.put("oozie.service.JPAService.jdbc.url", new OriginalValuePropertyUpdater());
 
       removePropertyUpdaters.put("oozie-env", oozieEnvOriginalValueMap);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
index d223e55..1edb665 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
@@ -76,7 +76,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Inject;
-import com.google.inject.Injector;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
 
@@ -196,8 +195,7 @@
    * @param managementController the management controller
    */
   @AssistedInject
-  public HostComponentResourceProvider(@Assisted AmbariManagementController managementController,
-                                       Injector injector) {
+  public HostComponentResourceProvider(@Assisted AmbariManagementController managementController) {
     super(Resource.Type.HostComponent, propertyIds, keyPropertyIds, managementController);
 
     setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.SERVICE_ADD_DELETE_SERVICES,RoleAuthorization.HOST_ADD_DELETE_COMPONENTS));
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
index c318775..c57b150 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
@@ -711,9 +711,7 @@
         // !!! this call will result in mixed results of cluster and non-cluster.  this
         // will get fixed in a future iteration, as the host_role_command table does not
         // currently have direct cluster affinity, and changing that is a tad destructive.
-        requestIds = actionManager.getRequestsByStatus(status,
-          maxResults != null ? maxResults : BaseRequest.DEFAULT_PAGE_SIZE,
-                ascOrder != null ? ascOrder : false);
+        requestIds = actionManager.getRequestsByStatus(status, maxResults, ascOrder);
       }
 
       LOG.debug("List<Long> requestIds = actionManager.getRequestsByStatus = {}", requestIds.size());
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java
index 5685392..a5263c1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java
@@ -496,12 +496,8 @@
 
     Collection<KerberosServiceDescriptor> serviceDescriptors = getServiceDescriptors(stackInfo);
 
-    if (serviceDescriptors != null) {
-      serviceDescriptors.forEach(kerberosDescriptor::putService);
-      return kerberosDescriptor.toMap();
-    } else {
-      return null;
-    }
+    serviceDescriptors.forEach(kerberosDescriptor::putService);
+    return kerberosDescriptor.toMap();
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/RestMetricsPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/RestMetricsPropertyProvider.java
index e2f0906..896abbe 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/RestMetricsPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/RestMetricsPropertyProvider.java
@@ -303,15 +303,15 @@
       portPropertyName = metricsProperties.get(portPropertyNameInMetricsProperties);
     }
     String portStr = getPropertyValueByNameAndConfigType(portPropertyName, portConfigType, cluster, hostname);
-    if (portStr == null && metricsProperties.containsKey(DEFAULT_PORT_PROPERTY)) {
+    if (portStr == null) {
       if (metricsProperties.containsKey(DEFAULT_PORT_PROPERTY)) {
         portStr = metricsProperties.get(DEFAULT_PORT_PROPERTY);
       } else {
         String message = String.format("Can not determine REST port for " +
-            "component %s. " +
-            "Default REST port property %s is not defined at metrics.json " +
-            "file for service, and there is no any other available ways " +
-            "to determine port information.",
+                "component %s. " +
+                "Default REST port property %s is not defined at metrics.json " +
+                "file for service, and there is no any other available ways " +
+                "to determine port information.",
             componentName, DEFAULT_PORT_PROPERTY);
         throw new AmbariException(message);
       }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaHostPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaHostPropertyProvider.java
index 7abf7a8..7ae2a7f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaHostPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaHostPropertyProvider.java
@@ -45,7 +45,6 @@
     GANGLIA_CLUSTER_NAMES.add("HDPResourceManager");
     GANGLIA_CLUSTER_NAMES.add("HDPHBaseMaster");
     GANGLIA_CLUSTER_NAMES.add("HDPHistoryServer");
-    GANGLIA_CLUSTER_NAMES.add("HDPNameNode");
     GANGLIA_CLUSTER_NAMES.add("HDPTaskTracker");
     GANGLIA_CLUSTER_NAMES.add("HDPHBaseRegionServer");
     GANGLIA_CLUSTER_NAMES.add("HDPFlumeServer");
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaReportPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaReportPropertyProvider.java
index 02ea9f3..e709a8d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaReportPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/ganglia/GangliaReportPropertyProvider.java
@@ -73,9 +73,8 @@
 
     Set<Resource> keepers = new HashSet<>();
     for (Resource resource : resources) {
-      if (populateResource(resource, request, predicate)) {
-        keepers.add(resource);
-      }
+      populateResource(resource, request, predicate);
+      keepers.add(resource);
     }
     return keepers;
   }
@@ -90,17 +89,15 @@
    * @param request   the request
    * @param predicate the predicate
    *
-   * @return true if the resource was successfully populated with the requested properties
-   *
    * @throws SystemException if unable to populate the resource
    */
-  private boolean populateResource(Resource resource, Request request, Predicate predicate)
+  private void populateResource(Resource resource, Request request, Predicate predicate)
       throws SystemException {
 
     Set<String> propertyIds = getPropertyIds();
 
     if (propertyIds.isEmpty()) {
-      return true;
+      return;
     }
     String clusterName = (String) resource.getPropertyValue(clusterNamePropertyId);
 
@@ -109,12 +106,12 @@
         LOG.warn("Attempting to get metrics but the Ganglia server is unknown. Resource=" + resource +
             " : Cluster=" + clusterName);
       }
-      return true;
+      return;
     }
 
     setProperties(resource, clusterName, request, getRequestPropertyIds(request, predicate));
 
-    return true;
+    return;
   }
 
   private boolean setProperties(Resource resource, String clusterName, Request request, Set<String> ids)
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/AMSReportPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/AMSReportPropertyProvider.java
index 431f9ba..92bcfbd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/AMSReportPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/metrics/timeline/AMSReportPropertyProvider.java
@@ -102,9 +102,8 @@
 
     Set<Resource> keepers = new HashSet<>();
     for (Resource resource : resources) {
-      if (populateResource(resource, request, predicate)) {
-        keepers.add(resource);
-      }
+      populateResource(resource, request, predicate);
+      keepers.add(resource);
     }
     return keepers;
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/HiveServiceCalculatedState.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/HiveServiceCalculatedState.java
index 52ec0e7..0d6357e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/HiveServiceCalculatedState.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/HiveServiceCalculatedState.java
@@ -105,10 +105,10 @@
 
         if (nonStartedState == null ||
           (hiveServerComponentStarted && webHcatComponentStarted && activeHiveMetastoreComponentCount > 0 &&
-            (embeddedMysqlComponentExists ? mysqlComponentStarted : true))) {
+            (!embeddedMysqlComponentExists || mysqlComponentStarted))) {
           return State.STARTED;
         }
-        return nonStartedState == null ? State.INSTALLED : nonStartedState;
+        return nonStartedState;
       }
     } catch (AmbariException e) {
       LOG.error("Can't determine service state.", e);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/customactions/ActionDefinitionManager.java b/ambari-server/src/main/java/org/apache/ambari/server/customactions/ActionDefinitionManager.java
index dde2647..952bc2b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/customactions/ActionDefinitionManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/customactions/ActionDefinitionManager.java
@@ -89,7 +89,7 @@
         || !customActionDefinitionRoot.exists()
         || !customActionDefinitionRoot.canRead()) {
       LOG.warn("Cannot read custom action definitions. " +
-          customActionDefinitionRoot == null ? "" : "Check path " + customActionDefinitionRoot.getAbsolutePath());
+          (customActionDefinitionRoot == null ? "" : ("Check path " + customActionDefinitionRoot.getAbsolutePath())));
     }
 
     File[] customActionDefinitionFiles
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/UpgradeUpdateListener.java b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/UpgradeUpdateListener.java
index d6dd89b..71ce27c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/UpgradeUpdateListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/UpgradeUpdateListener.java
@@ -20,7 +20,6 @@
 import org.apache.ambari.server.EagerSingleton;
 import org.apache.ambari.server.events.RequestUpdateEvent;
 import org.apache.ambari.server.events.UpgradeUpdateEvent;
-import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
 import org.apache.ambari.server.events.publishers.STOMPUpdatePublisher;
 import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
 import org.apache.ambari.server.orm.dao.RequestDAO;
@@ -47,7 +46,7 @@
   private RequestDAO requestDAO;
 
   @Inject
-  public UpgradeUpdateListener(STOMPUpdatePublisher STOMPUpdatePublisher, AmbariEventPublisher ambariEventPublisher) {
+  public UpgradeUpdateListener(STOMPUpdatePublisher STOMPUpdatePublisher) {
     STOMPUpdatePublisher.registerAPI(this);
 
     this.STOMPUpdatePublisher = STOMPUpdatePublisher;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/StompEventsMetricsSource.java b/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/StompEventsMetricsSource.java
index b13a432..42aa778 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/StompEventsMetricsSource.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/StompEventsMetricsSource.java
@@ -64,10 +64,8 @@
         @Override
         public void run() {
           List<SingleMetric> events = getEvents();
-          if (!events.isEmpty()) {
-            sink.publish(events);
-            LOG.debug("********* Published stomp events metrics to sink **********");
-          }
+          sink.publish(events);
+          LOG.debug("********* Published stomp events metrics to sink **********");
         }
       }, interval, interval, TimeUnit.SECONDS);
     } catch (Exception e) {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/notifications/dispatchers/AlertScriptDispatcher.java b/ambari-server/src/main/java/org/apache/ambari/server/notifications/dispatchers/AlertScriptDispatcher.java
index 3a0f0a0..2dfcaa5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/notifications/dispatchers/AlertScriptDispatcher.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/notifications/dispatchers/AlertScriptDispatcher.java
@@ -414,9 +414,7 @@
         try {
           return process.exitValue();
         } catch (IllegalThreadStateException ex) {
-          if (timeRemaining > 0) {
-            Thread.sleep(Math.min(timeRemaining, 500));
-          }
+          Thread.sleep(Math.min(timeRemaining, 500));
         }
 
         long timeElapsed = System.currentTimeMillis() - startTime;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
index 4cc8032..328cce6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
@@ -1063,9 +1063,7 @@
       ScriptRunner scriptRunner = new ScriptRunner(getConnection(), false, false);
       scriptRunner.runScript(br);
     } finally {
-      if (br != null) {
-        br.close();
-      }
+      br.close();
     }
   }
 
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
index ef63538..8e091da 100644
--- 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
@@ -395,7 +395,7 @@
       String leading = stackId.getStackVersion();  // E.g, 2.3
       // In some cases during unit tests, the leading can contain 3 digits, so only the major number (first two parts) are needed.
       String[] leadingParts = leading.split("\\.");
-      if (null != leadingParts && leadingParts.length > 2) {
+      if (leadingParts.length > 2) {
         leading = leadingParts[0] + "." + leadingParts[1];
       }
       return version.startsWith(leading);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/ScriptRunner.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/ScriptRunner.java
index 7bfaa06..5b5ad91 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/ScriptRunner.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/ScriptRunner.java
@@ -143,9 +143,7 @@
         if (trimmedLine.startsWith("--")) {
           println(trimmedLine);
         } else if (trimmedLine.length() < 1
-          || trimmedLine.startsWith("//")) {
-          // Do nothing
-        } else if (trimmedLine.length() < 1
+          || trimmedLine.startsWith("//")
           || trimmedLine.startsWith("--")) {
           // Do nothing
         } else if (!fullLineDelimiter
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/authentication/kerberos/AmbariKerberosAuthenticationFilter.java b/ambari-server/src/main/java/org/apache/ambari/server/security/authentication/kerberos/AmbariKerberosAuthenticationFilter.java
index bcc65eb..5e34c2e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/security/authentication/kerberos/AmbariKerberosAuthenticationFilter.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/authentication/kerberos/AmbariKerberosAuthenticationFilter.java
@@ -102,15 +102,13 @@
     setFailureHandler(new AuthenticationFailureHandler() {
       @Override
       public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
-        if (eventHandler != null) {
-          AmbariAuthenticationException cause;
-          if (e instanceof AmbariAuthenticationException) {
-            cause = (AmbariAuthenticationException) e;
-          } else {
-            cause = new AmbariAuthenticationException(null, e.getLocalizedMessage(), false, e);
-          }
-          eventHandler.onUnsuccessfulAuthentication(AmbariKerberosAuthenticationFilter.this, httpServletRequest, httpServletResponse, cause);
+        AmbariAuthenticationException cause;
+        if (e instanceof AmbariAuthenticationException) {
+          cause = (AmbariAuthenticationException) e;
+        } else {
+          cause = new AmbariAuthenticationException(null, e.getLocalizedMessage(), false, e);
         }
+        eventHandler.onUnsuccessfulAuthentication(AmbariKerberosAuthenticationFilter.this, httpServletRequest, httpServletResponse, cause);
 
         entryPoint.commence(httpServletRequest, httpServletResponse, e);
       }
@@ -119,9 +117,7 @@
     setSuccessHandler(new AuthenticationSuccessHandler() {
       @Override
       public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
-        if (eventHandler != null) {
-          eventHandler.onSuccessfulAuthentication(AmbariKerberosAuthenticationFilter.this, httpServletRequest, httpServletResponse, authentication);
-        }
+        eventHandler.onSuccessfulAuthentication(AmbariKerberosAuthenticationFilter.this, httpServletRequest, httpServletResponse, authentication);
       }
     });
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariAuthorizationFilter.java b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariAuthorizationFilter.java
index 29b3e4f..a6f5967 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariAuthorizationFilter.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/AmbariAuthorizationFilter.java
@@ -354,7 +354,6 @@
         requestURI.matches(API_CLUSTER_CONFIG_GROUPS_ALL_PATTERN) ||
         requestURI.matches(API_HOSTS_ALL_PATTERN) ||
         requestURI.matches(API_ALERT_TARGETS_ALL_PATTERN) ||
-        requestURI.matches(API_PRIVILEGES_ALL_PATTERN) ||
         requestURI.matches(API_PERSIST_ALL_PATTERN) ||
         requestURI.matches(API_CLUSTERS_UPGRADES_PATTERN);
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/encryption/CredentialProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/security/encryption/CredentialProvider.java
index 6ebccbf..75cd5be 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/security/encryption/CredentialProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/encryption/CredentialProvider.java
@@ -147,8 +147,7 @@
         if (args.length > 2 && !args[2].isEmpty()) {
           password = args[2];
         }
-        if (alias != null && !alias.isEmpty()
-            && password != null && !password.isEmpty()) {
+        if (password != null && !password.isEmpty()) {
           try {
             credentialProvider.addAliasToCredentialStore(alias, password);
           } catch (AmbariException e) {
@@ -163,8 +162,7 @@
         if (args.length > 2 && !args[2].isEmpty()) {
           writeFilePath = args[2];
         }
-        if (alias != null && !alias.isEmpty() && writeFilePath != null &&
-            !writeFilePath.isEmpty()) {
+        if (writeFilePath != null && !writeFilePath.isEmpty()) {
           String passwd = "";
           try {
             char[] retPasswd = credentialProvider.getPasswordForAlias(alias);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java
index ca906b6..02f7616 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/CreateKeytabFilesServerAction.java
@@ -351,7 +351,7 @@
           if (canCache) {
             File cachedKeytabFile = cacheKeytab(principal, keytab);
             String previousCachedFilePath = principalEntity.getCachedKeytabPath();
-            String cachedKeytabFilePath = ((cachedKeytabFile == null) || !cachedKeytabFile.exists())
+            String cachedKeytabFilePath = (!cachedKeytabFile.exists())
                 ? null
                 : cachedKeytabFile.getAbsolutePath();
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/UpdateKerberosConfigsServerAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/UpdateKerberosConfigsServerAction.java
index 2f32312..bf3b20a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/UpdateKerberosConfigsServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/UpdateKerberosConfigsServerAction.java
@@ -137,20 +137,18 @@
 
           clusterEnvProperties.put("security_enabled", securityEnabled);
 
-          if (!configTypes.isEmpty()) {
-            String configNote = getCommandParameterValue(getCommandParameters(), KerberosServerAction.UPDATE_CONFIGURATION_NOTE);
+          String configNote = getCommandParameterValue(getCommandParameters(), KerberosServerAction.UPDATE_CONFIGURATION_NOTE);
 
-            if((configNote == null) || configNote.isEmpty()) {
-              configNote = cluster.getSecurityType() == SecurityType.KERBEROS
-                  ? "Enabling Kerberos"
-                  : "Disabling Kerberos";
-            }
+          if((configNote == null) || configNote.isEmpty()) {
+            configNote = cluster.getSecurityType() == SecurityType.KERBEROS
+                ? "Enabling Kerberos"
+                : "Disabling Kerberos";
+          }
 
-            for (String configType : configTypes) {
-              configHelper.updateConfigType(cluster, cluster.getDesiredStackVersion(), controller,
-                  configType, propertiesToSet.get(configType), propertiesToRemove.get(configType),
-                  authenticatedUserName, configNote);
-            }
+          for (String configType : configTypes) {
+            configHelper.updateConfigType(cluster, cluster.getDesiredStackVersion(), controller,
+                configType, propertiesToSet.get(configType), propertiesToRemove.get(configType),
+                authenticatedUserName, configNote);
           }
         } catch (IOException e) {
           String message = "Could not update services configs to enable kerberos";
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/ConfigureAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/ConfigureAction.java
index 3302749..a44f675 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/ConfigureAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/ConfigureAction.java
@@ -416,7 +416,7 @@
     }
 
     // set all key/value pairs
-    if (null != keyValuePairs && !keyValuePairs.isEmpty()) {
+    if (!keyValuePairs.isEmpty()) {
       for (ConfigurationKeyValue keyValuePair : keyValuePairs) {
         String key = keyValuePair.key;
         String value = keyValuePair.value;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/ExtensionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/ExtensionHelper.java
index 3a143f4..317df81 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/ExtensionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/ExtensionHelper.java
@@ -124,8 +124,8 @@
   private static void validateServiceDuplication(StackManager stackManager, StackInfo stack, ExtensionInfo extension, Collection<ServiceInfo> services) throws AmbariException {
     LOG.debug("Looking for duplicate services");
     for (ServiceInfo service : services) {
-      LOG.debug("Looking for duplicate service " + service.getName());
       if (service != null) {
+        LOG.debug("Looking for duplicate service " + service.getName());
         ServiceInfo stackService = null;
         try {
           stackService = stack.getService(service.getName());
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceDirectory.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceDirectory.java
index 7464e61..36cfc28 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceDirectory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceDirectory.java
@@ -446,7 +446,7 @@
 
       roleCommandOrder = new StackRoleCommandOrder(result);
 
-      if (LOG.isDebugEnabled() && rcoFile != null) {
+      if (LOG.isDebugEnabled()) {
         LOG.debug("Role Command Order for {}", rcoFile.getAbsolutePath());
         roleCommandOrder.printRoleCommandOrder(LOG);
       }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ClusterGrouping.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ClusterGrouping.java
index dd768be..dd61732 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ClusterGrouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ClusterGrouping.java
@@ -106,65 +106,63 @@
 
       List<StageWrapper> results = new ArrayList<>(stageWrappers);
 
-      if (executionStages != null) {
-        for (ExecuteStage execution : executionStages) {
-          if (null != execution.intendedDirection
-              && execution.intendedDirection != upgradeContext.getDirection()) {
+      for (ExecuteStage execution : executionStages) {
+        if (null != execution.intendedDirection
+            && execution.intendedDirection != upgradeContext.getDirection()) {
+          continue;
+        }
+
+        // if there is a condition on the group, evaluate it and skip scheduling
+        // of this group if the condition has not been satisfied
+        if (null != execution.condition && !execution.condition.isSatisfied(upgradeContext)) {
+          LOG.info("Skipping {} while building upgrade orchestration due to {}", execution,
+              execution.condition);
+
+          continue;
+        }
+
+        // only schedule this stage if its service is part of the upgrade
+        if (StringUtils.isNotBlank(execution.service)) {
+          if (!upgradeContext.isServiceSupported(execution.service)) {
             continue;
           }
+        }
 
-          // if there is a condition on the group, evaluate it and skip scheduling
-          // of this group if the condition has not been satisfied
-          if (null != execution.condition && !execution.condition.isSatisfied(upgradeContext)) {
-            LOG.info("Skipping {} while building upgrade orchestration due to {}", execution,
-                execution.condition);
+        // tasks can have their own condition, so check that too
+        if (null != execution.task.condition
+            && !execution.task.condition.isSatisfied(upgradeContext)) {
+          LOG.info("Skipping {} while building upgrade orchestration due to {}", execution,
+              execution.task.condition);
 
-            continue;
-          }
+          continue;
+        }
 
-          // only schedule this stage if its service is part of the upgrade
-          if (StringUtils.isNotBlank(execution.service)) {
-            if (!upgradeContext.isServiceSupported(execution.service)) {
-              continue;
-            }
-          }
+        Task task = execution.task;
 
-          // tasks can have their own condition, so check that too
-          if (null != execution.task.condition
-              && !execution.task.condition.isSatisfied(upgradeContext)) {
-            LOG.info("Skipping {} while building upgrade orchestration due to {}", execution,
-                execution.task.condition);
+        StageWrapper wrapper = null;
 
-            continue;
-          }
+        switch (task.getType()) {
+          case MANUAL:
+          case SERVER_ACTION:
+          case CONFIGURE:
+          case ADD_COMPONENT:
+            wrapper = getServerActionStageWrapper(upgradeContext, execution);
+            break;
 
-          Task task = execution.task;
+          case EXECUTE:
+            wrapper = getExecuteStageWrapper(upgradeContext, execution);
+            break;
 
-          StageWrapper wrapper = null;
+          case REGENERATE_KEYTABS:
+            wrapper = getRegenerateKeytabsWrapper(upgradeContext, execution);
+            break;
 
-          switch (task.getType()) {
-            case MANUAL:
-            case SERVER_ACTION:
-            case CONFIGURE:
-            case ADD_COMPONENT:
-              wrapper = getServerActionStageWrapper(upgradeContext, execution);
-              break;
+          default:
+            break;
+        }
 
-            case EXECUTE:
-              wrapper = getExecuteStageWrapper(upgradeContext, execution);
-              break;
-
-            case REGENERATE_KEYTABS:
-              wrapper = getRegenerateKeytabsWrapper(upgradeContext, execution);
-              break;
-
-            default:
-              break;
-          }
-
-          if (null != wrapper) {
-            results.add(wrapper);
-          }
+        if (null != wrapper) {
+          results.add(wrapper);
         }
       }
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ColocatedGrouping.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ColocatedGrouping.java
index 56a201b..f90a489 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ColocatedGrouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ColocatedGrouping.java
@@ -275,18 +275,16 @@
         }
 
         if (!proxy.restart) {
-          if (null == wrapper) {
-            TaskWrapper[] tasks = proxy.getTasksArray(predicate);
+          TaskWrapper[] tasks = proxy.getTasksArray(predicate);
 
-            if (LOG.isDebugEnabled()) {
-              for (TaskWrapper tw : tasks) {
-                LOG.debug("{}", tw);
-              }
+          if (LOG.isDebugEnabled()) {
+            for (TaskWrapper tw : tasks) {
+              LOG.debug("{}", tw);
             }
+          }
 
-            if (ArrayUtils.isNotEmpty(tasks)) {
-              wrapper = new StageWrapper(proxy.type, proxy.message, tasks);
-            }
+          if (ArrayUtils.isNotEmpty(tasks)) {
+            wrapper = new StageWrapper(proxy.type, proxy.message, tasks);
           }
         } else {
           TaskWrapper[] tasks = proxy.getTasksArray(null);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ConfigureTask.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ConfigureTask.java
index 57096b6..4ddf36c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ConfigureTask.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/ConfigureTask.java
@@ -235,7 +235,7 @@
     //Fetch the replacements that used regex to find a string
     replacements.addAll(definition.getRegexReplacements(cluster));
 
-    if( null != replacements && !replacements.isEmpty() ){
+    if( !replacements.isEmpty() ){
       List<Replace> allowedReplacements = getValidReplacements(cluster, definition.getConfigType(), replacements);
       configParameters.put(ConfigureTask.PARAMETER_REPLACEMENTS, m_gson.toJson(allowedReplacements));
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeHelper.java
index 76eab07..508a6db 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/upgrade/orchestrate/UpgradeHelper.java
@@ -1110,28 +1110,25 @@
         }
       }
 
-      if (null != newServiceDefaultConfigsByType) {
-
-        for (String clusterConfigType : clusterConfigTypes) {
-          if (processedClusterConfigTypes.contains(clusterConfigType)) {
-            newServiceDefaultConfigsByType.remove(clusterConfigType);
-          } else {
-            processedClusterConfigTypes.add(clusterConfigType);
-          }
-
+      for (String clusterConfigType : clusterConfigTypes) {
+        if (processedClusterConfigTypes.contains(clusterConfigType)) {
+          newServiceDefaultConfigsByType.remove(clusterConfigType);
+        } else {
+          processedClusterConfigTypes.add(clusterConfigType);
         }
 
-        Set<String> configTypes = newServiceDefaultConfigsByType.keySet();
-        LOG.warn("The upgrade will create the following configurations for stack {}: {}",
-            targetStackId, StringUtils.join(configTypes, ','));
-
-        String serviceVersionNote = String.format("%s %s %s", direction.getText(true),
-            direction.getPreposition(), upgradeContext.getRepositoryVersion().getVersion());
-
-        configHelper.createConfigTypes(cluster, targetStackId, controller,
-            newServiceDefaultConfigsByType, userName, serviceVersionNote);
-        configsChanged = true;
       }
+
+      Set<String> configTypes = newServiceDefaultConfigsByType.keySet();
+      LOG.warn("The upgrade will create the following configurations for stack {}: {}",
+          targetStackId, StringUtils.join(configTypes, ','));
+
+      String serviceVersionNote = String.format("%s %s %s", direction.getText(true),
+          direction.getPreposition(), upgradeContext.getRepositoryVersion().getVersion());
+
+      configHelper.createConfigTypes(cluster, targetStackId, controller,
+          newServiceDefaultConfigsByType, userName, serviceVersionNote);
+      configsChanged = true;
     }
     if (configsChanged) {
       m_configHelperProvider.get().updateAgentConfigs(Collections.singleton(cluster.getClusterName()));
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
index 91fe76e..731dab3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
@@ -274,7 +274,7 @@
       Entry<PropertyInfo, String> property = iterator.next();
       PropertyInfo propertyInfo = property.getKey();
       String propertyValue = property.getValue();
-      if (property == null || propertyValue == null || propertyValue.toLowerCase().equals("null") || propertyValue.isEmpty()) {
+      if (propertyValue == null || propertyValue.toLowerCase().equals("null") || propertyValue.isEmpty()) {
         LOG.error(String.format("Excluding property %s from %s, because of invalid or empty value!", propertyInfo.getName(), filteredListName));
         iterator.remove();
       } else {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
index 3a0cd6d..9da9771 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
@@ -396,10 +396,10 @@
   @Transactional
   public void save() {
     ClusterConfigEntity entity = clusterDAO.findConfig(configId);
-    ClusterEntity clusterEntity = clusterDAO.findById(entity.getClusterId());
 
     // if the configuration was found, then update it
     if (null != entity) {
+      ClusterEntity clusterEntity = clusterDAO.findById(entity.getClusterId());
       LOG.debug("Updating {} version {} with new configurations; a new version will not be created",
           getType(), getVersion());
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
index 539b624..27fe886 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
@@ -556,7 +556,7 @@
         hostName);
 
     // no definitions found for this host, don't bother hashing
-    if( null == definitions || definitions.size() == 0 ) {
+    if(definitions.isEmpty()) {
       return NULL_MD5_HASH;
     }
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/StackAdvisorAdapter.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/StackAdvisorAdapter.java
index 7504d45..de0a2ac 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/StackAdvisorAdapter.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/addservice/StackAdvisorAdapter.java
@@ -190,9 +190,7 @@
       if (info.getRequest().getRecommendationStrategy().shouldOverrideCustomValues()) {
         config = recommendedConfig;
         config.setParentConfiguration(userConfig);
-      }
-      else {
-        config = userConfig;
+      } else {
         config.setParentConfiguration(recommendedConfig);
         recommendedConfig.setParentConfiguration(clusterAndStackConfig);
       }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/update/HostUpdateHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/update/HostUpdateHelper.java
index 1d9b28f..6efcdee 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/update/HostUpdateHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/update/HostUpdateHelper.java
@@ -512,12 +512,10 @@
                 Collection<TopologyHostInfoEntity> topologyHostInfoEntities = topologyHostGroupEntity.getTopologyHostInfoEntities();
                 boolean updatesAvailable = false;
 
-                if (topologyHostGroupEntities != null) {
-                  for (TopologyHostInfoEntity topologyHostInfoEntity : topologyHostInfoEntities) {
-                    if (currentHostNames.contains(topologyHostInfoEntity.getFqdn())) {
-                      topologyHostInfoEntity.setFqdn(hostMapping.get(topologyHostInfoEntity.getFqdn()));
-                      updatesAvailable = true;
-                    }
+                for (TopologyHostInfoEntity topologyHostInfoEntity : topologyHostInfoEntities) {
+                  if (currentHostNames.contains(topologyHostInfoEntity.getFqdn())) {
+                    topologyHostInfoEntity.setFqdn(hostMapping.get(topologyHostInfoEntity.getFqdn()));
+                    updatesAvailable = true;
                   }
                 }
                 if (updatesAvailable) {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
index 6bcf8a9..42bde6f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
@@ -751,7 +751,7 @@
 
                 // Get the keytab file 'config name'.
                 String[] splits = keytabDescriptor.getConfiguration().split("/");
-                if (splits != null && splits.length == 2) {
+                if (splits.length == 2) {
                   updateYarnKerberosDescUpdatedList(splits[1]);
                   LOG.info("    Updated 'yarnKerberosDescUpdatedList' = " + getYarnKerberosDescUpdatedList());
                 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/HTTPUtils.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/HTTPUtils.java
index 1632c38..6c7ceee 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/utils/HTTPUtils.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/HTTPUtils.java
@@ -63,14 +63,12 @@
 
       rd = new BufferedReader(new InputStreamReader(resultInputStream));
 
-      if (rd != null) {
+      line = rd.readLine();
+      while (line != null) {
+        result += line;
         line = rd.readLine();
-        while (line != null) {
-          result += line;
-          line = rd.readLine();
-        }
-        rd.close();
       }
+      rd.close();
     } catch (Exception e) {
       e.printStackTrace();
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java
index 8d24260..7d7b58c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java
@@ -83,9 +83,6 @@
       mpackVersion = format(mpackVersion);
     }
     Matcher versionMatcher = validateMpackVersion(mpackVersion);
-    if(versionMatcher == null) {
-      throw new IllegalArgumentException("Wrong format for mpack version");
-    }
     if (versionMatcher.pattern().pattern().equals(VERSION_WITH_BUILD_PATTERN)) {
       return new MpackVersion(Integer.parseInt(versionMatcher.group(1)), Integer.parseInt(versionMatcher.group(2)),
               Integer.parseInt(versionMatcher.group(3)), 0, Integer.parseInt(versionMatcher.group(4)));
@@ -138,9 +135,6 @@
    * */
   public static MpackVersion parseStackVersion(String stackVersion) {
     Matcher versionMatcher = validateStackVersion(stackVersion);
-    if(versionMatcher == null) {
-      throw new IllegalArgumentException("Wrong format for mpack version");
-    }
 
     if(versionMatcher.pattern().pattern().equals(LEGACY_STACK_VERSION_PATTERN)) {
       return new MpackVersion(Integer.parseInt(versionMatcher.group(1)),
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java
index d0351d0..48537d6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java
@@ -343,18 +343,16 @@
 
         for (String hostName : serviceComponent.getServiceComponentHosts().keySet()) {
 
-          if (roleName != null) {
-            SortedSet<Integer> hostsForComponentsHost = hostRolesInfo.get(roleName);
+          SortedSet<Integer> hostsForComponentsHost = hostRolesInfo.get(roleName);
 
-            if (hostsForComponentsHost == null) {
-              hostsForComponentsHost = new TreeSet<>();
-              hostRolesInfo.put(roleName, hostsForComponentsHost);
-            }
-
-            int hostIndex = hostsList.indexOf(hostName);
-            //Add index of host to current host role
-            hostsForComponentsHost.add(hostIndex);
+          if (hostsForComponentsHost == null) {
+            hostsForComponentsHost = new TreeSet<>();
+            hostRolesInfo.put(roleName, hostsForComponentsHost);
           }
+
+          int hostIndex = hostsList.indexOf(hostName);
+          //Add index of host to current host role
+          hostsForComponentsHost.add(hostIndex);
         }
       }
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/HttpImpersonatorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/view/HttpImpersonatorImpl.java
index 7e67891..aa0683d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/HttpImpersonatorImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/HttpImpersonatorImpl.java
@@ -143,14 +143,12 @@
 
       rd = new BufferedReader(new InputStreamReader(resultInputStream));
 
-      if (rd != null) {
+      line = rd.readLine();
+      while (line != null) {
+        result += line;
         line = rd.readLine();
-        while (line != null) {
-          result += line;
-          line = rd.readLine();
-        }
-        rd.close();
       }
+      rd.close();
     } catch (Exception e) {
       LOG.error("Exception caught processing impersonator request.", e);
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java
index 5f6201a..ce0e652 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java
@@ -272,8 +272,7 @@
 
   // get the resource type associated with the given UnsupportedPropertyException
   private Resource.Type getResourceType(org.apache.ambari.view.UnsupportedPropertyException e) {
-    Resource.Type type = Resource.Type.valueOf(e.getType());
-    return type == null ? this.type : type;
+    return Resource.Type.valueOf(e.getType());
   }
 
   // discover the property ids for the given bean class
diff --git a/ambari-server/src/main/python/ambari_server/setupMpacks.py b/ambari-server/src/main/python/ambari_server/setupMpacks.py
index b8c0974..640cc2f 100755
--- a/ambari-server/src/main/python/ambari_server/setupMpacks.py
+++ b/ambari-server/src/main/python/ambari_server/setupMpacks.py
@@ -347,11 +347,12 @@
 
   if not replay_mode:
     purge_resources = set((v) for k, v in RESOURCE_FRIENDLY_NAMES.iteritems() if k in purge_list)
+    answer = 'yes' if options.silent else 'no'
     warn_msg = "CAUTION: You have specified the --purge option with --purge-list={0}. " \
                "This will replace all existing {1} currently installed.\n" \
-               "Are you absolutely sure you want to perform the purge [yes/no]? (no)".format(
-        purge_list, ", ".join(purge_resources))
-    okToPurge = get_YN_input(warn_msg, False)
+               "Are you absolutely sure you want to perform the purge [yes/no]? ({2})".format(
+        purge_list, ", ".join(purge_resources), answer)
+    okToPurge = get_YN_input(warn_msg, options.silent, answer)
     if not okToPurge:
       err = "Management pack installation cancelled by user"
       raise FatalException(1, err)
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/PersistenceManagerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/PersistenceManagerImplTest.java
index 5ad3ead..f7e8501 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/PersistenceManagerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/PersistenceManagerImplTest.java
@@ -213,7 +213,7 @@
     mapResourceProps1.put(PropertyHelper.getPropertyId("foo", "bar"), "value");
 
     Map<String, Object> mapResourceProps2 = new HashMap<>();
-    mapResourceProps1.put("componentId", "id2");
+    mapResourceProps2.put("componentId", "id2");
     mapResourceProps2.put(PropertyHelper.getPropertyId("foo", "bar2"), "value2");
 
     NamedPropertySet namedPropSet1 = new NamedPropertySet("", mapResourceProps1);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index 4926e87..92b32ef 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -3399,7 +3399,6 @@
     Set<ServiceRequest> reqs = new HashSet<>();
     ServiceRequest req1, req2;
     try {
-      reqs.clear();
       req1 = new ServiceRequest(cluster1, serviceName1, repositoryVersion02.getId(),
           State.STARTED.toString(), null);
       reqs.add(req1);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProviderTest.java
index efedd2b..b20dd9f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProviderTest.java
@@ -1007,6 +1007,53 @@
     verify(m_amc, m_dao);
   }
 
+  @Test
+  public void testEnable() throws Exception {
+    Capture<AlertTargetEntity> entityCapture = EasyMock.newCapture();
+    m_dao.create(capture(entityCapture));
+    expectLastCall().times(1);
+
+    AlertTargetEntity target = new AlertTargetEntity();
+    target.setEnabled(false);
+    target.setProperties("{prop1=val1}");
+    expect(m_dao.findTargetById(ALERT_TARGET_ID)).andReturn(target).times(1);
+
+    expect(m_dao.merge(capture(entityCapture))).andReturn(target).once();
+
+    replay(m_amc, m_dao);
+
+    SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
+
+    AlertTargetResourceProvider provider = createProvider(m_amc);
+    Map<String, Object> requestProps = getCreationProperties();
+    Request request = PropertyHelper.getCreateRequest(
+      Collections.singleton(requestProps), null);
+    provider.createResources(request);
+
+    // create new properties, and include the ID since we're not going through
+    // a service layer which would add it for us automatically
+    requestProps = new HashMap<>();
+    requestProps.put(AlertTargetResourceProvider.ALERT_TARGET_ID,
+      ALERT_TARGET_ID.toString());
+
+    requestProps.put(AlertTargetResourceProvider.ALERT_TARGET_ENABLED,
+      "true");
+
+    Predicate predicate = new PredicateBuilder().property(
+      AlertTargetResourceProvider.ALERT_TARGET_ID).equals(
+      ALERT_TARGET_ID.toString()).toPredicate();
+
+    request = PropertyHelper.getUpdateRequest(requestProps, null);
+    provider.updateResources(request, predicate);
+
+    assertTrue(entityCapture.hasCaptured());
+
+    AlertTargetEntity entity = entityCapture.getValue();
+    assertTrue("{prop1=val1}".equals(entity.getProperties()));
+    assertTrue(entity.isEnabled());
+    verify(m_amc, m_dao);
+  }
+
   /**
    * @param amc
    * @return
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
index 26fd36e..965ef71 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
@@ -113,7 +113,7 @@
     ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
     Injector injector = createNiceMock(Injector.class);
     HostComponentResourceProvider hostComponentResourceProvider =
-        new HostComponentResourceProvider(managementController, injector);
+        new HostComponentResourceProvider(managementController);
 
     AbstractControllerResourceProvider.init(resourceProviderFactory);
 
@@ -450,7 +450,7 @@
     Injector injector = createNiceMock(Injector.class);
 
     HostComponentResourceProvider provider =
-        new HostComponentResourceProvider(managementController, injector);
+        new HostComponentResourceProvider(managementController);
 
     // set expectations
     expect(managementController.deleteHostComponents(
@@ -489,7 +489,7 @@
     Injector injector = createNiceMock(Injector.class);
 
     HostComponentResourceProvider provider =
-        new HostComponentResourceProvider(managementController, injector);
+        new HostComponentResourceProvider(managementController);
 
     Set<String> unsupported = provider.checkPropertyIds(Collections.singleton(PropertyHelper.getPropertyId("HostRoles", "cluster_name")));
     Assert.assertTrue(unsupported.isEmpty());
@@ -717,7 +717,7 @@
      */
     public TestHostComponentResourceProvider(Set<String> propertyIds, Map<Resource.Type, String> keyPropertyIds,
                                              AmbariManagementController managementController, Injector injector) throws Exception {
-      super(managementController, injector);
+      super(managementController);
     }
 
     public void setFieldValue(String fieldName, Object fieldValue) throws Exception {
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
index cc178da..d814ae0 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
@@ -634,7 +634,7 @@
         maintenanceStateHelper, repositoryVersionDAO);
 
     ResourceProvider hostCompResourceProvider = new
-      HostComponentResourceProvider(controller, injector);
+      HostComponentResourceProvider(controller);
 
     ResourceProvider configResourceProvider = new ConfigurationResourceProvider(
         controller);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
index d81d00c..38af25f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
@@ -618,12 +618,7 @@
     // repo 2110 - CURRENT
     // repo 2111 - CURRENT (PATCH)
     for (HostVersionEntity hostVersion : hostVersions) {
-      RepositoryVersionEntity hostRepoVersion = hostVersion.getRepositoryVersion();
-      if (repositoryVersion2110.equals(hostRepoVersion)) {
-        hostVersion.setState(RepositoryVersionState.CURRENT);
-      } else {
-        hostVersion.setState(RepositoryVersionState.CURRENT);
-      }
+      hostVersion.setState(RepositoryVersionState.CURRENT);
 
       hostVersionDAO.merge(hostVersion);
     }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
index 3a98ab0..d91a30d 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
@@ -239,8 +239,7 @@
 
     group1ServiceComponents.put("service1", Arrays.asList("component1", "component3"));
     group1ServiceComponents.put("service2", Collections.singleton("component2"));
-    group2ServiceComponents.put("service2", Collections.singleton("component3"));
-    group2ServiceComponents.put("service2", Collections.singleton("component4"));
+    group2ServiceComponents.put("service2",  Arrays.asList("component3", "component4"));
 
     expect(blueprint.getHostGroup("group1")).andReturn(group1).anyTimes();
     expect(blueprint.getHostGroup("group2")).andReturn(group2).anyTimes();
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
index 46e3ff9..2067620 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartOnComponentLevelTest.java
@@ -235,8 +235,7 @@
 
     group1ServiceComponents.put("service1", Arrays.asList("component1", "component3"));
     group1ServiceComponents.put("service2", Collections.singleton("component2"));
-    group2ServiceComponents.put("service2", Collections.singleton("component3"));
-    group2ServiceComponents.put("service2", Collections.singleton("component4"));
+    group2ServiceComponents.put("service2", Arrays.asList("component3", "component4"));
 
     expect(blueprint.getHostGroup("group1")).andReturn(group1).anyTimes();
     expect(blueprint.getHostGroup("group2")).andReturn(group2).anyTimes();
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
index 61face9..59acbe9 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterInstallWithoutStartTest.java
@@ -237,8 +237,7 @@
 
     group1ServiceComponents.put("service1", Arrays.asList("component1", "component3"));
     group1ServiceComponents.put("service2", Collections.singleton("component2"));
-    group2ServiceComponents.put("service2", Collections.singleton("component3"));
-    group2ServiceComponents.put("service2", Collections.singleton("component4"));
+    group2ServiceComponents.put("service2",  Arrays.asList("component3", "component4"));
 
     expect(blueprint.getHostGroup("group1")).andReturn(group1).anyTimes();
     expect(blueprint.getHostGroup("group2")).andReturn(group2).anyTimes();
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
index cc9e7e9..71e5fb6 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/TopologyManagerTest.java
@@ -244,8 +244,7 @@
 
     group1ServiceComponents.put("service1", Arrays.asList("component1", "component3"));
     group1ServiceComponents.put("service2", Collections.singleton("component2"));
-    group2ServiceComponents.put("service2", Collections.singleton("component3"));
-    group2ServiceComponents.put("service2", Collections.singleton("component4"));
+    group2ServiceComponents.put("service2",  Arrays.asList("component3", "component4"));
 
     expect(blueprint.getHostGroup("group1")).andReturn(group1).anyTimes();
     expect(blueprint.getHostGroup("group2")).andReturn(group2).anyTimes();
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/addservice/StackAdvisorAdapterTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/addservice/StackAdvisorAdapterTest.java
index bd80bda..eacfaaf 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/addservice/StackAdvisorAdapterTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/addservice/StackAdvisorAdapterTest.java
@@ -117,7 +117,7 @@
     .put("c7406", ImmutableSet.of("DATANODE", "HDFS_CLIENT", "ZOOKEEPER_CLIENT"))
     .build();
 
-  private static final AddServiceInfo.Builder ADD_SERVICE_INFO_BUILDER = new AddServiceInfo.Builder()
+  private final AddServiceInfo.Builder addServiceInfoBuilder = new AddServiceInfo.Builder()
     .setClusterName("c1");
 
   @Test
@@ -169,58 +169,6 @@
   }
 
   @Test
-  public void getLayoutRecommendationInfo() {
-    Map<String, Map<String, Set<String>>> newServices = ImmutableMap.of(
-      "KAFKA", ImmutableMap.of(
-        "KAFKA_BROKER", ImmutableSet.of("c7401")),
-      "SPARK2", ImmutableMap.of(
-        "SPARK2_JOBHISTORYSERVER", ImmutableSet.of("c7402"),
-        "SPARK2_CLIENT", ImmutableSet.of("c7403", "c7404")),
-      "OOZIE", ImmutableMap.of(
-        "OOZIE_SERVER", ImmutableSet.of("c7401"),
-        "OOZIE_CLIENT", ImmutableSet.of("c7403", "c7404")));
-
-    AddServiceRequest request = request(ConfigRecommendationStrategy.ALWAYS_APPLY);
-    AddServiceInfo info = ADD_SERVICE_INFO_BUILDER
-      .setRequest(request)
-      .setStack(stack)
-      .setConfig(Configuration.newEmpty())
-      .setNewServices(newServices)
-      .build(); // No LayoutReommendationInfo -> needs to be calculated
-
-    LayoutRecommendationInfo layoutRecommendationInfo = adapter.getLayoutRecommendationInfo(info);
-    layoutRecommendationInfo.getAllServiceLayouts();
-
-    assertEquals(
-      ImmutableMap.of(
-        "host_group_1", ImmutableSet.of("c7401"),
-        "host_group_2", ImmutableSet.of("c7402"),
-        "host_group_3", ImmutableSet.of("c7403", "c7404")),
-      layoutRecommendationInfo.getHostGroups());
-
-    assertEquals(
-      ImmutableMap.<String, Map<String, Set<String>>>builder()
-        .put("KAFKA", ImmutableMap.of(
-          "KAFKA_BROKER", ImmutableSet.of("c7401")))
-        .put("SPARK2", ImmutableMap.of(
-          "SPARK2_JOBHISTORYSERVER", ImmutableSet.of("c7402"),
-          "SPARK2_CLIENT", ImmutableSet.of("c7403", "c7404")))
-        .put("OOZIE", ImmutableMap.of(
-          "OOZIE_SERVER", ImmutableSet.of("c7401"),
-          "OOZIE_CLIENT", ImmutableSet.of("c7403", "c7404")))
-        .put("HDFS", ImmutableMap.of(
-          "NAMENODE", ImmutableSet.of("c7401"),
-          "HDFS_CLIENT", ImmutableSet.of("c7401", "c7402")))
-        .put("ZOOKEEPER", ImmutableMap.of(
-          "ZOOKEEPER_SERVER", ImmutableSet.of("c7401"),
-          "ZOOKEEPER_CLIENT", ImmutableSet.of("c7401", "c7402")))
-        .put("MAPREDUCE2", ImmutableMap.of(
-          "HISTORYSERVER", ImmutableSet.of("c7401")))
-        .build(),
-      layoutRecommendationInfo.getAllServiceLayouts());
-  }
-
-  @Test
   public void keepNewServicesOnly() {
     Map<String, Map<String, Set<String>>> newServices = ImmutableMap.of(
       "KAFKA", emptyMap(),
@@ -368,7 +316,7 @@
       "KAFKA",
       ImmutableMap.of("KAFKA_BROKER", emptySet()));
 
-    AddServiceInfo info = ADD_SERVICE_INFO_BUILDER
+    AddServiceInfo info = addServiceInfoBuilder
       .setStack(stack)
       .setConfig(Configuration.newEmpty())
       .setNewServices(newServices)
@@ -404,7 +352,7 @@
     clusterConfig.setParentConfiguration(stackConfig);
 
     AddServiceRequest request = request(ConfigRecommendationStrategy.ALWAYS_APPLY);
-    AddServiceInfo info = ADD_SERVICE_INFO_BUILDER
+    AddServiceInfo info = addServiceInfoBuilder
       .setRequest(request)
       .setStack(stack)
       .setConfig(userConfig)
@@ -459,7 +407,7 @@
 
     LayoutRecommendationInfo layoutRecommendationInfo = new LayoutRecommendationInfo(new HashMap<>(), new HashMap<>()); // contents doesn't matter for the test
     AddServiceRequest request = request(ConfigRecommendationStrategy.ALWAYS_APPLY);
-    AddServiceInfo info = ADD_SERVICE_INFO_BUILDER
+    AddServiceInfo info = addServiceInfoBuilder
       .setRequest(request)
       .setStack(stack)
       .setConfig(userConfig)
@@ -515,7 +463,7 @@
 
     LayoutRecommendationInfo layoutRecommendationInfo = new LayoutRecommendationInfo(new HashMap<>(), new HashMap<>()); // contents doesn't matter for the test
     AddServiceRequest request = request(ConfigRecommendationStrategy.ALWAYS_APPLY_DONT_OVERRIDE_CUSTOM_VALUES);
-    AddServiceInfo info = ADD_SERVICE_INFO_BUILDER
+    AddServiceInfo info = addServiceInfoBuilder
       .setRequest(request)
       .setStack(stack)
       .setConfig(userConfig)
@@ -576,7 +524,7 @@
 
     LayoutRecommendationInfo layoutRecommendationInfo = new LayoutRecommendationInfo(new HashMap<>(), new HashMap<>()); // contents doesn't matter for the test
     AddServiceRequest request = request(ConfigRecommendationStrategy.NEVER_APPLY);
-    AddServiceInfo info = ADD_SERVICE_INFO_BUILDER
+    AddServiceInfo info = addServiceInfoBuilder
       .setRequest(request)
       .setStack(stack)
       .setConfig(userConfig)
@@ -623,7 +571,7 @@
 
     LayoutRecommendationInfo layoutRecommendationInfo = new LayoutRecommendationInfo(new HashMap<>(), new HashMap<>()); // contents doesn't matter for the test
     AddServiceRequest request = request(ConfigRecommendationStrategy.ONLY_STACK_DEFAULTS_APPLY);
-    AddServiceInfo info = ADD_SERVICE_INFO_BUILDER
+    AddServiceInfo info = addServiceInfoBuilder
       .setRequest(request)
       .setStack(stack)
       .setConfig(userConfig)
@@ -696,6 +644,58 @@
     assertEquals(recommendedConfigsForStackDefaults, recommendedConfigs);
   }
 
+  @Test
+  public void getLayoutRecommendationInfo() {
+    Map<String, Map<String, Set<String>>> newServices = ImmutableMap.of(
+      "KAFKA", ImmutableMap.of(
+        "KAFKA_BROKER", ImmutableSet.of("c7401")),
+      "SPARK2", ImmutableMap.of(
+        "SPARK2_JOBHISTORYSERVER", ImmutableSet.of("c7402"),
+        "SPARK2_CLIENT", ImmutableSet.of("c7403", "c7404")),
+      "OOZIE", ImmutableMap.of(
+        "OOZIE_SERVER", ImmutableSet.of("c7401"),
+        "OOZIE_CLIENT", ImmutableSet.of("c7403", "c7404")));
+
+    AddServiceRequest request = request(ConfigRecommendationStrategy.ALWAYS_APPLY);
+    AddServiceInfo info = addServiceInfoBuilder
+      .setRequest(request)
+      .setStack(stack)
+      .setConfig(Configuration.newEmpty())
+      .setNewServices(newServices)
+      .build(); // No LayoutReommendationInfo -> needs to be calculated
+
+    LayoutRecommendationInfo layoutRecommendationInfo = adapter.getLayoutRecommendationInfo(info);
+    layoutRecommendationInfo.getAllServiceLayouts();
+
+    assertEquals(
+      ImmutableMap.of(
+        "host_group_1", ImmutableSet.of("c7401"),
+        "host_group_2", ImmutableSet.of("c7402"),
+        "host_group_3", ImmutableSet.of("c7403", "c7404")),
+      layoutRecommendationInfo.getHostGroups());
+
+    assertEquals(
+      ImmutableMap.<String, Map<String, Set<String>>>builder()
+        .put("KAFKA", ImmutableMap.of(
+          "KAFKA_BROKER", ImmutableSet.of("c7401")))
+        .put("SPARK2", ImmutableMap.of(
+          "SPARK2_JOBHISTORYSERVER", ImmutableSet.of("c7402"),
+          "SPARK2_CLIENT", ImmutableSet.of("c7403", "c7404")))
+        .put("OOZIE", ImmutableMap.of(
+          "OOZIE_SERVER", ImmutableSet.of("c7401"),
+          "OOZIE_CLIENT", ImmutableSet.of("c7403", "c7404")))
+        .put("HDFS", ImmutableMap.of(
+          "NAMENODE", ImmutableSet.of("c7401"),
+          "HDFS_CLIENT", ImmutableSet.of("c7401", "c7402")))
+        .put("ZOOKEEPER", ImmutableMap.of(
+          "ZOOKEEPER_SERVER", ImmutableSet.of("c7401"),
+          "ZOOKEEPER_CLIENT", ImmutableSet.of("c7401", "c7402")))
+        .put("MAPREDUCE2", ImmutableMap.of(
+          "HISTORYSERVER", ImmutableSet.of("c7401")))
+        .build(),
+      layoutRecommendationInfo.getAllServiceLayouts());
+  }
+
   private static AddServiceRequest request(ConfigRecommendationStrategy strategy) {
     return new AddServiceRequest(null, strategy, null, null, null, null, null, null, null, null, null);
   }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/NameNodeHaValidatorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/NameNodeHaValidatorTest.java
index 54f2648..108a4c5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/NameNodeHaValidatorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/validators/NameNodeHaValidatorTest.java
@@ -177,7 +177,6 @@
     List<String> nameNodeHosts = ImmutableList.copyOf(hosts).subList(0, 2);
     nameNodes.addAll(nameNodeHosts);
 
-    hadoopEnv.put("dfs_ha_initial_namenode_active", nameNodeHosts.get(0));
     hadoopEnv.put("dfs_ha_initial_namenode_active", nameNodeHosts.get(1));
 
     validator.validate(clusterTopology);
diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js
index f2fcb49..760a27d 100644
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@ -163,6 +163,8 @@
   'test/mappers/alert_instances_mapper_test',
   'test/mappers/alert_definitions_mapper_test',
   'test/mappers/alert_definition_summary_mapper_test',
+  'test/mappers/alert_notification_mapper_test',
+  'test/mappers/cluster_mapper_test',
   'test/mappers/server_data_mapper_test',
   'test/mappers/hosts_mapper_test',
   'test/mappers/service_mapper_test',
@@ -171,8 +173,10 @@
   'test/mappers/users_mapper_test',
   'test/mappers/stack_mapper_test',
   'test/mappers/stack_service_mapper_test',
+  'test/mappers/stack_version_mapper_test',
   'test/mappers/repository_version_mapper_test',
   'test/mappers/stack_upgrade_history_mapper_test',
+  'test/mappers/widget_mapper_test',
   'test/mappers/configs/config_groups_mapper_test',
   'test/mappers/configs/service_config_version_mapper_test',
   'test/mappers/configs/themes_mapper_test',
diff --git a/ambari-web/app/controllers/installer.js b/ambari-web/app/controllers/installer.js
index 82aa615..c3d9cb1 100644
--- a/ambari-web/app/controllers/installer.js
+++ b/ambari-web/app/controllers/installer.js
@@ -890,8 +890,10 @@
       if (!verifyBaseUrl) {
         dfd.resolve();
       }
+      //for redhat satellite/spacewalk the os urls will be empty
+      var useRedhatSatellite = wizardStep1Controller.get('selectedStack.useRedhatSatellite');
       selectedStack.get('operatingSystems').forEach(function (os) {
-        if (os.get('isSelected') && !os.get('isEmpty')) {
+        if (os.get('isSelected') && (useRedhatSatellite || !os.get('isEmpty'))) {
           os.get('repositories').forEach(function (repo) {
             if (repo.get('showRepo')) {
               repo.setProperties({
diff --git a/ambari-web/app/mappers/alert_notification_mapper.js b/ambari-web/app/mappers/alert_notification_mapper.js
index 8c7f50f..e0ca8d2 100644
--- a/ambari-web/app/mappers/alert_notification_mapper.js
+++ b/ambari-web/app/mappers/alert_notification_mapper.js
@@ -77,7 +77,6 @@
    * @private
    */
   _setPropertiesToEachModel: function (propertyName, propertiesMap) {
-    var modelsMap = this.get('modelsMap');
     for (var recordId in propertiesMap) {
       if (propertiesMap.hasOwnProperty(recordId)) {
         App.AlertNotification.find(recordId).set(propertyName, propertiesMap[recordId]);
diff --git a/ambari-web/app/mappers/quicklinks_mapper.js b/ambari-web/app/mappers/quicklinks_mapper.js
index 6de9b34..05cd5b9 100644
--- a/ambari-web/app/mappers/quicklinks_mapper.js
+++ b/ambari-web/app/mappers/quicklinks_mapper.js
@@ -29,21 +29,5 @@
     "name" : "QuickLinkInfo.quicklink_data.QuickLinksConfiguration.name",
     "protocol" : "QuickLinkInfo.quicklink_data.QuickLinksConfiguration.configuration.protocol",
     "links" : "QuickLinkInfo.quicklink_data.QuickLinksConfiguration.configuration.links"
-  },
-
-  map: function(json){
-    console.time('App.quicklinksMapper execution time');
-
-    var result = [];
-    var linkResult = [];
-
-    json.items.forEach(function(item) {
-      var parseResult = this.parseIt(item, this.get('config'));
-      console.log("parseResult", parseResult);
-      result.push(parseResult);
-    }, this);
-
-    App.store.safeLoadMany(this.get('model'), result);
-    console.timeEnd('App.quicklinksMapper execution time');
   }
 });
diff --git a/ambari-web/app/mixins/common/widgets/widget_mixin.js b/ambari-web/app/mixins/common/widgets/widget_mixin.js
index 6486856..11ae6bc 100644
--- a/ambari-web/app/mixins/common/widgets/widget_mixin.js
+++ b/ambari-web/app/mixins/common/widgets/widget_mixin.js
@@ -263,7 +263,7 @@
     };
 
     if (request.tag) {
-      data.selectedHostsParam = '&HostRoles/host_name.in(' + App.HDFSService.find().objectAt(0).get('masterComponentGroups').findProperty('name', request.tag).hosts.join(',') + ')';
+      data.selectedHostsParam = '&HostRoles/host_name.in(' + App.HDFSService.find('HDFS').get('masterComponentGroups').findProperty('name', request.tag).hosts.join(',') + ')';
     }
 
     if (metricPaths.length) {
@@ -293,30 +293,15 @@
    * @param data
    */
   getMetricsSuccessCallback: function (data) {
-    var metrics = [];
     var atLeastOneMetricPresent = false;
 
     if (this.get('content.metrics')) {
       this.get('content.metrics').forEach(function (_metric) {
-        var metric_path = _metric.metric_path;
-        var isAggregatorFunc = false;
-        var metric_data = Em.get(data, metric_path.replace(/\//g, '.'));
+        var metricPath = _metric.metric_path;
+        
+        var metric_data = Em.get(data, metricPath.replace(/\//g, '.'));
         if (Em.isNone(metric_data)) {
-          this.aggregatorFunc.forEach(function (_item) {
-            if (metric_path.endsWith(_item) && !isAggregatorFunc) {
-              isAggregatorFunc = true;
-              var metricBeanProperty = metric_path.split("/").pop();
-              var metricBean;
-              metric_path = metric_path.substring(0, metric_path.indexOf(metricBeanProperty));
-              if (metric_path.endsWith("/")) {
-                metric_path = metric_path.slice(0, -1);
-              }
-              metricBean = Em.get(data, metric_path.replace(/\//g, '.'));
-              if (!Em.isNone(metricBean)) {
-                metric_data = metricBean[metricBeanProperty];
-              }
-            }
-          }, this);
+          metric_data = this.parseMetricsWithAggregatorFunc(data, metricPath);
         }
         if (!Em.isNone(metric_data)) {
           atLeastOneMetricPresent = true;
@@ -330,6 +315,28 @@
       }
     }
   },
+  
+  parseMetricsWithAggregatorFunc: function(data, metric_path) {
+    let isAggregatorFunc = false;
+    let metric = null;
+    this.aggregatorFunc.forEach(function (_item) {
+      if (metric_path.endsWith(_item) && !isAggregatorFunc) {
+        isAggregatorFunc = true;
+        var metricBeanProperty = metric_path.split("/").pop();
+        var metricBean;
+        metric_path = metric_path.substring(0, metric_path.indexOf(metricBeanProperty));
+        
+        if (metric_path.endsWith("/")) {
+          metric_path = metric_path.slice(0, -1);
+        }
+        metricBean = Em.get(data, metric_path.replace(/\//g, '.'));
+        if (!Em.isNone(metricBean)) {
+          metric = metricBean[metricBeanProperty];
+        }
+      }
+    }, this);
+    return metric;
+  },
 
   /**
    * if no metrics were received from server then disable graph
@@ -377,8 +384,8 @@
    * @return {$.ajax}
    */
   getHostComponentsMetrics: function (request) {
-    request.metric_paths.forEach(function (_metric, index) {
-      request.metric_paths[index] = "host_components/" + _metric.metric_path;
+    request.metric_paths  = request.metric_paths.map((_metric) => {
+      return "host_components/" + _metric.metric_path;
     });
     return App.ajax.send({
       name: 'widgets.serviceComponent.metrics.get',
@@ -422,7 +429,7 @@
   getHostsMetricsSuccessCallback: function (data) {
     var metrics = this.get('content.metrics');
     data.items.forEach(function (item) {
-      metrics.forEach(function (_metric, index) {
+      metrics.forEach(function (_metric) {
         const metric = $.extend({}, _metric, true);
         metric.hostName = item.Hosts.host_name;
         if (!Em.isNone(Em.get(item, _metric.metric_path.replace(/\//g, '.')))) {
@@ -574,7 +581,7 @@
   /*
    * make call when clicking on "clone icon" on widget
    */
-  cloneWidget: function (event) {
+  cloneWidget: function () {
     var self = this;
     return App.showConfirmationPopup(
       function () {
@@ -666,8 +673,7 @@
     var mainServiceInfoMetricsController =  App.router.get('mainServiceInfoMetricsController');
     mainServiceInfoMetricsController.saveWidgetLayout(widgets).done(function() {
       mainServiceInfoMetricsController.getActiveWidgetLayout().done(function() {
-        var newWidget = App.Widget.find().findProperty('id', id);
-        controller.editWidget(newWidget);
+        controller.editWidget(App.Widget.find(id));
       });
     });
   },
@@ -675,7 +681,7 @@
   /*
    * make call when clicking on "edit icon" on widget
    */
-  editWidget: function (event) {
+  editWidget: function () {
     var self = this;
     var isShared = this.get('content.scope') === 'CLUSTER';
     if (!isShared) {
diff --git a/ambari-web/app/models/widget.js b/ambari-web/app/models/widget.js
index 8c76123..64fd566 100644
--- a/ambari-web/app/models/widget.js
+++ b/ambari-web/app/models/widget.js
@@ -45,10 +45,13 @@
   tag: DS.attr('string'),
   isVisible: DS.attr('boolean', {defaultValue: true}),
   /**
+   * This field is not derived from API but needs to be filled in the mapper on the client side
    * @type {number}
    * @default 0
    */
-  defaultOrder: 0, // This field is not derived from API but needs to be filled in the mapper on the client side
+  defaultOrder: DS.attr('number', {
+    defaultValue: 0
+  }),
 
   /**
    * @type Em.View
diff --git a/ambari-web/test/helpers.js b/ambari-web/test/helpers.js
index b843189..5327ba2 100644
--- a/ambari-web/test/helpers.js
+++ b/ambari-web/test/helpers.js
@@ -37,11 +37,14 @@
   nestedExpect: function (expected, actual) {
     expected.forEach(function (group, i) {
       Em.keys(group).forEach(function (key) {
-        if (Em.isArray(actual[i][key])) {
-          expect(group[key]).to.eql(actual[i][key].toArray());
-        }
-        else {
-          expect(group[key]).to.equal(actual[i][key]);
+        var expectedValue = Em.get(group, key),
+          actualValue = Em.get(actual[i], key);
+        if (Em.isArray(actualValue)) {
+          expect(expectedValue).to.eql(actualValue.toArray());
+        } else if (Em.typeOf(actualValue) === 'object') {
+          expect(expectedValue).to.eql(actualValue);
+        } else {
+          expect(expectedValue).to.equal(actualValue);
         }
       });
     });
diff --git a/ambari-web/test/mappers/alert_groups_mapper_test.js b/ambari-web/test/mappers/alert_groups_mapper_test.js
index 60fee6f..7ebf0fd 100644
--- a/ambari-web/test/mappers/alert_groups_mapper_test.js
+++ b/ambari-web/test/mappers/alert_groups_mapper_test.js
@@ -103,6 +103,7 @@
       App.store.loadMany.restore();
       App.alertGroupsMapper.set('model', App.AlertGroup);
       App.cache.previousAlertGroupsMap = {};
+      App.cache.alertNotificationsGroupsMap = {};
 
     });
 
diff --git a/ambari-web/test/mappers/alert_notification_mapper_test.js b/ambari-web/test/mappers/alert_notification_mapper_test.js
new file mode 100644
index 0000000..0831982
--- /dev/null
+++ b/ambari-web/test/mappers/alert_notification_mapper_test.js
@@ -0,0 +1,429 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+var testHelpers = require('test/helpers');
+require('mappers/alert_notification_mapper');
+
+describe('App.alertNotificationMapper', function () {
+  var mapper = App.alertNotificationMapper,
+    model = App.AlertNotification,
+    records = model.find();
+
+  before(function () {
+    records.clear();
+  });
+
+  afterEach(function () {
+    records.clear();
+  });
+
+  describe('#map', function () {
+    var cases = [
+      {
+        previousAlertNotificationsFullMapBefore: null,
+        modelJSONBefore: [],
+        json: {},
+        previousAlertNotificationsFullMapAfter: {},
+        modelContentAfter: [],
+        title: 'no cached items, empty JSON'
+      },
+      {
+        previousAlertNotificationsFullMapBefore: {
+          '1': {}
+        },
+        modelJSONBefore: [],
+        json: {},
+        previousAlertNotificationsFullMapAfter: {
+          '1': {}
+        },
+        modelContentAfter: [],
+        title: 'cached items present, empty JSON passed'
+      },
+      {
+        previousAlertNotificationsFullMapBefore: null,
+        modelJSONBefore: [],
+        json: {
+          items: []
+        },
+        previousAlertNotificationsFullMapAfter: {},
+        modelContentAfter: [],
+        title: 'no cached items, empty records array'
+      },
+      {
+        previousAlertNotificationsFullMapBefore: {
+          '1': {}
+        },
+        modelJSONBefore: [],
+        json: {
+          items: []
+        },
+        previousAlertNotificationsFullMapAfter: {},
+        modelContentAfter: [],
+        title: 'cached items present, empty records array'
+      },
+      {
+        previousAlertNotificationsFullMapBefore: null,
+        modelJSONBefore: [],
+        json: {
+          items: [
+            {
+              AlertTarget: {
+                id: 1,
+                name: 'n1',
+                notification_type: 'SNMP',
+                description: 'd1',
+                global: true,
+                enabled: true,
+                properties: {
+                  p: 'v'
+                }
+              }
+            },
+            {
+              AlertTarget: {
+                id: 2,
+                name: 'n2',
+                notification_type: 'EMAIL',
+                description: 'd2',
+                global: false,
+                enabled: false,
+                alert_states: ['OK', 'WARNING', 'CRITICAL', 'UNKNOWN']
+              }
+            }
+          ]
+        },
+        previousAlertNotificationsFullMapAfter: {
+          '1': {
+            id: 1,
+            name: 'n1',
+            type: 'SNMP',
+            description: 'd1',
+            global: true,
+            enabled: true,
+            groups: [1, 2]
+          },
+          '2': {
+            id: 2,
+            name: 'n2',
+            type: 'EMAIL',
+            description: 'd2',
+            global: false,
+            enabled: false
+          }
+        },
+        modelContentAfter: [
+          {
+            id: 1,
+            name: 'n1',
+            type: 'SNMP',
+            description: 'd1',
+            global: true,
+            enabled: true,
+            properties: {
+              p: 'v'
+            }
+          },
+          {
+            id: 2,
+            name: 'n2',
+            type: 'EMAIL',
+            description: 'd2',
+            global: false,
+            enabled: false,
+            alertStates: ['OK', 'WARNING', 'CRITICAL', 'UNKNOWN']
+          }
+        ],
+        title: 'no cached items, non-empty records array'
+      },
+      {
+        previousAlertNotificationsFullMapBefore: {
+          '1': {}
+        },
+        modelJSONBefore: [],
+        json: {
+          items: []
+        },
+        previousAlertNotificationsFullMapAfter: {},
+        modelContentAfter: [],
+        title: 'cached items present, empty records array'
+      },
+      {
+        previousAlertNotificationsFullMapBefore: null,
+        modelJSONBefore: [
+          {
+            id: 3,
+            name: 'n3',
+            type: 'SNMP',
+            description: 'd3',
+            global: false,
+            enabled: true
+          }
+        ],
+        json: {
+          items: [
+            {
+              AlertTarget: {
+                id: 1,
+                name: 'n1',
+                notification_type: 'SNMP',
+                description: 'd1',
+                global: true,
+                enabled: true,
+                properties: {
+                  p: 'v'
+                }
+              }
+            },
+            {
+              AlertTarget: {
+                id: 2,
+                name: 'n2',
+                notification_type: 'EMAIL',
+                description: 'd2',
+                global: false,
+                enabled: false,
+                alert_states: ['OK', 'WARNING', 'CRITICAL', 'UNKNOWN']
+              }
+            }
+          ]
+        },
+        previousAlertNotificationsFullMapAfter: {
+          '1': {
+            id: 1,
+            name: 'n1',
+            type: 'SNMP',
+            description: 'd1',
+            global: true,
+            enabled: true,
+            groups: [1, 2]
+          },
+          '2': {
+            id: 2,
+            name: 'n2',
+            type: 'EMAIL',
+            description: 'd2',
+            global: false,
+            enabled: false
+          }
+        },
+        modelContentAfter: [
+          {
+            id: 3,
+            name: 'n3',
+            type: 'SNMP',
+            description: 'd3',
+            global: false,
+            enabled: true
+          },
+          {
+            id: 1,
+            name: 'n1',
+            type: 'SNMP',
+            description: 'd1',
+            global: true,
+            enabled: true,
+            properties: {
+              p: 'v'
+            }
+          },
+          {
+            id: 2,
+            name: 'n2',
+            type: 'EMAIL',
+            description: 'd2',
+            global: false,
+            enabled: false,
+            alertStates: ['OK', 'WARNING', 'CRITICAL', 'UNKNOWN']
+          }
+        ],
+        title: 'previous model records present, no cached items, non-empty records array'
+      },
+      {
+        previousAlertNotificationsFullMapBefore: {
+          '1': {
+            name: 'n1'
+          },
+          '2': {
+            id: 2,
+            name: 'n2',
+            type: 'EMAIL',
+            description: 'd2',
+            global: true,
+            enabled: true
+          }
+        },
+        modelJSONBefore: [
+          {
+            id: 1,
+            name: 'n1',
+            notification_type: 'EMAIL',
+            global: true,
+            enabled: true,
+            properties: {
+              p0: 'v0'
+            }
+          }
+        ],
+        json: {
+          items: [
+            {
+              AlertTarget: {
+                id: 1,
+                name: 'n1',
+                notification_type: 'SNMP',
+                description: 'd1',
+                global: true,
+                enabled: true,
+                properties: {
+                  p: 'v'
+                }
+              }
+            },
+            {
+              AlertTarget: {
+                id: 2,
+                name: 'n2',
+                notification_type: 'EMAIL',
+                description: 'd2',
+                global: false,
+                enabled: false,
+                alert_states: ['OK', 'WARNING', 'CRITICAL', 'UNKNOWN']
+              }
+            }
+          ]
+        },
+        previousAlertNotificationsFullMapAfter: {
+          1: {
+            id: 1,
+            name: 'n1',
+            type: 'SNMP',
+            description: 'd1',
+            global: true,
+            enabled: true,
+            groups: [1, 2]
+          },
+          2: {
+            id: 2,
+            name: 'n2',
+            type: 'EMAIL',
+            description: 'd2',
+            global: false,
+            enabled: false
+          }
+        },
+        modelContentAfter: [
+          {
+            id: 1,
+            name: 'n1',
+            type: 'SNMP',
+            description: 'd1',
+            global: true,
+            enabled: true,
+            properties: {
+              p: 'v'
+            }
+          },
+          {
+            id: 2,
+            name: 'n2',
+            type: 'EMAIL',
+            description: 'd2',
+            global: false,
+            enabled: false,
+            alertStates: ['OK', 'WARNING', 'CRITICAL', 'UNKNOWN']
+          }
+        ],
+        title: 'update cache and model'
+      }
+    ];
+
+    cases.forEach(function (test) {
+      describe(test.title, function () {
+        before(function () {
+          App.cache.alertNotificationsGroupsMap = {
+            1: [1, 2]
+          };
+        });
+
+        beforeEach(function () {
+          App.store.safeLoadMany(model, test.modelJSONBefore);
+          App.cache.previousAlertNotificationsFullMap = test.previousAlertNotificationsFullMapBefore;
+          mapper.map(test.json);
+        });
+
+        after(function () {
+          App.cache.previousAlertNotificationsFullMap = {};
+          App.cache.alertNotificationsGroupsMap = {};
+        });
+
+        it('previousAlertNotificationsFullMap', function () {
+          expect(App.cache.previousAlertNotificationsFullMap).to.eql(test.previousAlertNotificationsFullMapAfter);
+        });
+
+        it('records count', function () {
+          expect(records.get('length')).to.equal(test.modelContentAfter.length);
+        });
+
+        it('records', function () {
+          testHelpers.nestedExpect(test.modelContentAfter, records.toArray());
+        });
+      });
+    });
+  });
+
+  describe('#_setPropertiesToEachModel', function () {
+    beforeEach(function () {
+      App.store.safeLoadMany(model, [
+        {
+          id: 1,
+          properties: {
+            p: 'v'
+          }
+        },
+        {
+          id: 2
+        }
+      ]);
+    });
+    it('should set and update specified property', function () {
+      mapper._setPropertiesToEachModel('properties', {
+        '1': {
+          p1: 'v1'
+        },
+        '2': {
+          p2: 'v2'
+        }
+      });
+      testHelpers.nestedExpect([
+        {
+          id: 1,
+          properties: {
+            p1: 'v1'
+          }
+        },
+        {
+          id: 2,
+          properties: {
+            p2: 'v2'
+          }
+        }
+      ], records.toArray());
+    });
+  });
+});
diff --git a/ambari-web/test/mappers/cluster_mapper_test.js b/ambari-web/test/mappers/cluster_mapper_test.js
new file mode 100644
index 0000000..61eced9
--- /dev/null
+++ b/ambari-web/test/mappers/cluster_mapper_test.js
@@ -0,0 +1,97 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+var testHelpers = require('test/helpers');
+require('mappers/cluster_mapper');
+
+describe('App.clusterMapper', function () {
+  var records = App.Cluster.find();
+
+  before(function () {
+    records.clear();
+  });
+
+  afterEach(function () {
+    records.clear();
+  });
+
+  describe('#map', function () {
+    it('should load mapped data to model', function () {
+      App.clusterMapper.map({
+        Clusters: {
+          cluster_id: 'c',
+          cluster_name: 'c',
+          stack_name: 'HDP',
+          version: '3.0.0',
+          security_type: 'NONE',
+          total_hosts: 3,
+          credential_store_properties: {
+            p: 'v'
+          },
+          desired_configs: {
+            'core-site': {
+              tag: 't0'
+            },
+            'hdfs-site': {
+              tag: 't1',
+              host_overrides: [
+                {
+                  host_name: 'h0',
+                  tag: 't2'
+                },
+                {
+                  host_name: 'h1',
+                  tag: 't3'
+                }
+              ]
+            }
+          }
+        }
+      });
+      testHelpers.nestedExpect([
+        {
+          id: 'c',
+          clusterName: 'c',
+          stackName: 'HDP',
+          version: '3.0.0',
+          securityType: 'NONE',
+          totalHosts: 3,
+          credentialStoreProperties: {
+            p: 'v'
+          },
+          desiredConfigs: [
+            App.ConfigSiteTag.create({
+              site: 'core-site',
+              tag: 't0',
+              hostOverrides: {}
+            }),
+            App.ConfigSiteTag.create({
+              site: 'hdfs-site',
+              tag: 't1',
+              hostOverrides: {
+                h0: 't2',
+                h1: 't3'
+              }
+            })
+          ]
+        }
+      ], records.toArray());
+    });
+  });
+});
diff --git a/ambari-web/test/mappers/stack_version_mapper_test.js b/ambari-web/test/mappers/stack_version_mapper_test.js
new file mode 100644
index 0000000..0741bb2
--- /dev/null
+++ b/ambari-web/test/mappers/stack_version_mapper_test.js
@@ -0,0 +1,333 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+var testHelpers = require('test/helpers');
+require('mappers/stack_version_mapper');
+
+describe('App.stackVersionMapper', function () {
+  var stackVersionRecords = App.StackVersion.find(),
+    repoVersionRecords = App.RepositoryVersion.find(),
+    clearModels = function () {
+      stackVersionRecords.clear();
+      repoVersionRecords.clear();
+    };
+
+  before(clearModels);
+
+  afterEach(clearModels);
+
+  describe('#map', function () {
+    beforeEach(function () {
+      App.stackVersionMapper.map({
+        items: [
+          {
+            ClusterStackVersions: {
+              id: 1,
+              cluster_name: 'c',
+              stack: 'HDP',
+              version: '3.0',
+              repository_version: 11,
+              state: 'OUT_OF_SYNC',
+              supports_revert: false,
+              host_states: {
+                CURRENT: ['h0, h1'],
+                INSTALLED: ['h2', 'h3'],
+                INSTALLING: ['h4', 'h5'],
+                INSTALL_FAILED: ['h6', 'h7'],
+                NOT_REQUIRED: ['h8', 'h9'],
+                OUT_OF_SYNC: ['h10', 'h11'],
+                UPGRADING: ['h12', 'h13'],
+                UPGRADED: ['h14', 'h15'],
+                UPGRADE_FAILED: ['h16', 'h17']
+              },
+              repository_summary: {
+                services: {
+                  ZOOKEEPER: {
+                    version: '4.0.0',
+                    release_version: '3.0.1.1',
+                    upgrade: true
+                  }
+                }
+              }
+            },
+            repository_versions: [
+              {
+                RepositoryVersions: {
+                  id: 11,
+                  repository_version: '3.0.1.1'
+                }
+              }
+            ]
+          },
+          {
+            ClusterStackVersions: {
+              id: 2,
+              cluster_name: 'c',
+              stack: 'HDP',
+              version: '3.0',
+              repository_version: 12,
+              state: 'INSTALL_FAILED',
+              supports_revert: false,
+              host_states: {
+                CURRENT: [],
+                INSTALLED: [],
+                INSTALLING: [],
+                INSTALL_FAILED: [],
+                NOT_REQUIRED: [],
+                OUT_OF_SYNC: [],
+                UPGRADING: [],
+                UPGRADED: [],
+                UPGRADE_FAILED: []
+              },
+              repository_summary: {
+                services: {
+                  ZOOKEEPER: {
+                    version: '3.8.0',
+                    release_version: '3.0.0.0',
+                    upgrade: true
+                  }
+                }
+              }
+            },
+            repository_versions: [
+              {
+                RepositoryVersions: {
+                  id: 12,
+                  repository_version: '3.0.0.0'
+                }
+              }
+            ]
+          },
+          {
+            ClusterStackVersions: {
+              id: 3,
+              cluster_name: 'c',
+              stack: 'HDP',
+              version: '3.0',
+              repository_version: 13,
+              state: 'COMPLETED',
+              supports_revert: false,
+              host_states: {
+                CURRENT: [],
+                INSTALLED: [],
+                INSTALLING: [],
+                INSTALL_FAILED: [],
+                NOT_REQUIRED: [],
+                OUT_OF_SYNC: [],
+                UPGRADING: [],
+                UPGRADED: [],
+                UPGRADE_FAILED: []
+              },
+              repository_summary: {
+                services: {
+                  ZOOKEEPER: {
+                    version: '3.9.0',
+                    release_version: '3.0.1.0',
+                    upgrade: true
+                  }
+                }
+              }
+            },
+            repository_versions: [
+              {
+                RepositoryVersions: {
+                  id: 13,
+                  repository_version: '3.0.1.0'
+                }
+              }
+            ]
+          },
+          {
+            ClusterStackVersions: {
+              id: 4,
+              cluster_name: 'c',
+              stack: 'HDP',
+              version: '3.0',
+              repository_version: 14,
+              state: 'INSTALLING',
+              supports_revert: true,
+              revert_upgrade_id: 1,
+              host_states: {
+                CURRENT: [],
+                INSTALLED: [],
+                INSTALLING: [],
+                INSTALL_FAILED: [],
+                NOT_REQUIRED: [],
+                OUT_OF_SYNC: [],
+                UPGRADING: [],
+                UPGRADED: [],
+                UPGRADE_FAILED: []
+              },
+              repository_summary: {
+                services: {
+                  ZOOKEEPER: {
+                    version: '4.1.0',
+                    release_version: '3.1.1.0',
+                    upgrade: true
+                  }
+                }
+              }
+            },
+            repository_versions: [
+              {
+                RepositoryVersions: {
+                  id: 14,
+                  repository_version: '3.1.1.0'
+                }
+              }
+            ]
+          },
+          {
+            ClusterStackVersions: {
+              id: 5,
+              cluster_name: 'c',
+              stack: 'HDP',
+              version: '3.0',
+              repository_version: 15,
+              state: 'NOT_REQUIRED',
+              supports_revert: false,
+              host_states: {
+                CURRENT: [],
+                INSTALLED: [],
+                INSTALLING: [],
+                INSTALL_FAILED: [],
+                NOT_REQUIRED: [],
+                OUT_OF_SYNC: [],
+                UPGRADING: [],
+                UPGRADED: [],
+                UPGRADE_FAILED: []
+              },
+              repository_summary: {
+                services: {
+                  ZOOKEEPER: {
+                    version: '3.7.0',
+                    release_version: '2.99.99.0',
+                    upgrade: true
+                  }
+                }
+              }
+            },
+            repository_versions: [
+              {
+                RepositoryVersions: {
+                  id: 15,
+                  repository_version: '2.99.99.0'
+                }
+              }
+            ]
+          }
+        ]
+      });
+    });
+
+    it('should load sorted and mapped data to App.StackVersion', function () {
+      testHelpers.nestedExpect([
+        {
+          id: 5,
+          clusterName: 'c',
+          stack: 'HDP',
+          version: '3.0',
+          state: 'NOT_REQUIRED',
+          notInstalledHosts: [],
+          installingHosts: [],
+          installedHosts: [],
+          installFailedHosts: [],
+          outOfSyncHosts: [],
+          upgradingHosts: [],
+          upgradedHosts: [],
+          upgradeFailedHosts: [],
+          currentHosts: [],
+          supportsRevert: false
+        },
+        {
+          id: 2,
+          clusterName: 'c',
+          stack: 'HDP',
+          version: '3.0',
+          state: 'INSTALL_FAILED',
+          notInstalledHosts: [],
+          installingHosts: [],
+          installedHosts: [],
+          installFailedHosts: [],
+          outOfSyncHosts: [],
+          upgradingHosts: [],
+          upgradedHosts: [],
+          upgradeFailedHosts: [],
+          currentHosts: [],
+          supportsRevert: false
+        },
+        {
+          id: 3,
+          clusterName: 'c',
+          stack: 'HDP',
+          version: '3.0',
+          state: 'COMPLETED',
+          notInstalledHosts: [],
+          installingHosts: [],
+          installedHosts: [],
+          installFailedHosts: [],
+          outOfSyncHosts: [],
+          upgradingHosts: [],
+          upgradedHosts: [],
+          upgradeFailedHosts: [],
+          currentHosts: [],
+          supportsRevert: false
+        },
+        {
+          id: 1,
+          clusterName: 'c',
+          stack: 'HDP',
+          version: '3.0',
+          state: 'OUT_OF_SYNC',
+          notInstalledHosts: ['h4', 'h5', 'h6', 'h7', 'h10', 'h11'],
+          installingHosts: ['h4', 'h5'],
+          installedHosts: ['h2', 'h3', 'h12', 'h13', 'h14', 'h15', 'h16', 'h17'],
+          installFailedHosts: ['h6', 'h7'],
+          outOfSyncHosts: ['h10', 'h11'],
+          upgradingHosts: ['h12', 'h13'],
+          upgradedHosts: ['h14', 'h15'],
+          upgradeFailedHosts: ['h16', 'h17'],
+          currentHosts: ['h0, h1'],
+          supportsRevert: false
+        },
+        {
+          id: 4,
+          clusterName: 'c',
+          stack: 'HDP',
+          version: '3.0',
+          state: 'INSTALLING',
+          notInstalledHosts: [],
+          installingHosts: [],
+          installedHosts: [],
+          installFailedHosts: [],
+          outOfSyncHosts: [],
+          upgradingHosts: [],
+          upgradedHosts: [],
+          upgradeFailedHosts: [],
+          currentHosts: [],
+          supportsRevert: true
+        },
+      ], stackVersionRecords.toArray());
+    });
+
+    it('should set relations to App.RepositoryVersion', function () {
+      testHelpers.nestedExpect(stackVersionRecords.mapProperty('repositoryVersion'), repoVersionRecords.toArray());
+    })
+  });
+});
diff --git a/ambari-web/test/mappers/widget_mapper_test.js b/ambari-web/test/mappers/widget_mapper_test.js
new file mode 100644
index 0000000..22d3586
--- /dev/null
+++ b/ambari-web/test/mappers/widget_mapper_test.js
@@ -0,0 +1,162 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+var testHelpers = require('test/helpers');
+require('mappers/widget_mapper');
+
+describe('App.widgetMapper', function () {
+  var widgetModel = App.Widget,
+    layoutModel = App.WidgetLayout,
+    widgetRecords = widgetModel.find(),
+    layoutRecords = layoutModel.find(),
+    clearData = function () {
+      widgetRecords.clear();
+      layoutRecords.clear();
+    };
+
+  beforeEach(function () {
+    clearData();
+    App.store.safeLoad(layoutModel, {
+      id: 1,
+      section_name: 's0'
+    });
+    App.widgetMapper.map({
+      id: 1,
+      section_name: 's0',
+      widgets: [
+        {
+          WidgetInfo: {
+            id: 11,
+            widget_name: 'wn0',
+            widget_type: 'GRAPH',
+            service_name: 'HDFS',
+            time_created: 1,
+            author: 'a0',
+            properties: '{"graph_type":"LINE","time_range":"1"}',
+            metrics: '[{"name":"m0","metric_path":"p0/m0"},{"name":"m1","metric_path":"p1/m1"}]',
+            values: '[{"name":"n0","value":"v0"},{"name":"n1","value":"v1"}]',
+            description: 'd0',
+            scope: 'CLUSTER',
+            tag: 't0'
+          }
+        },
+        {
+          WidgetInfo: {
+            id: 12,
+            widget_name: 'wn1',
+            widget_type: 'NUMBER',
+            service_name: 'YARN',
+            time_created: 2,
+            author: 'a1',
+            properties: '{"warning_threshold":"1","error_threshold":"2"}',
+            metrics: '[{"name":"m2","metric_path":"p2/m2"},{"name":"m3","metric_path":"p3/m3"}]',
+            values: '[{"name":"n2","value":"v2"},{"name":"n3","value":"v3"}]',
+            description: 'd1',
+            scope: 'CLUSTER',
+            tag: 't1'
+          }
+        }
+      ]
+    });
+  });
+
+  afterEach(clearData);
+
+  describe('#map', function () {
+    it('should load mapped data to App.Widget', function () {
+      testHelpers.nestedExpect([
+        {
+          id: 11,
+          widgetName: 'wn0',
+          widgetType: 'GRAPH',
+          serviceName: 'HDFS',
+          timeCreated: 1,
+          author: 'a0',
+          properties: {
+            graph_type: 'LINE',
+            time_range: '1'
+          },
+          metrics: [
+            {
+              name: 'm0',
+              metric_path: 'p0/m0'
+            }, {
+              name: 'm1',
+              metric_path: 'p1/m1'
+            }
+          ],
+          values: [
+            {
+              name: 'n0',
+              value: 'v0'
+            },
+            {
+              name: 'n1',
+              value: 'v1'
+            }
+          ],
+          description: 'd0',
+          scope: 'CLUSTER',
+          tag: 't0',
+          defaultOrder: 1
+        },
+        {
+          id: 12,
+          widgetName: 'wn1',
+          widgetType: 'NUMBER',
+          serviceName: 'YARN',
+          timeCreated: 2,
+          author: 'a1',
+          properties: {
+            warning_threshold: '1',
+            error_threshold: '2'
+          },
+          metrics: [
+            {
+              name: 'm2',
+              metric_path: 'p2/m2'
+            },
+            {
+              name: 'm3',
+              metric_path: 'p3/m3'
+            }
+          ],
+          values: [
+            {
+              name: 'n2',
+              value: 'v2'
+            },
+            {
+              name: 'n3',
+              value: 'v3'
+            }
+          ],
+          description: 'd1',
+          scope: 'CLUSTER',
+          tag: 't1',
+          defaultOrder: 2
+        }
+      ], widgetRecords.toArray());
+    });
+
+    it('should set relations to App.WidgetLayout', function () {
+      testHelpers.nestedExpect(widgetRecords.mapProperty('layout').uniq(), layoutRecords.toArray());
+    });
+  });
+});
diff --git a/ambari-web/test/mixins/common/widget_mixin_test.js b/ambari-web/test/mixins/common/widget_mixin_test.js
index fb8c5d0..a075100 100644
--- a/ambari-web/test/mixins/common/widget_mixin_test.js
+++ b/ambari-web/test/mixins/common/widget_mixin_test.js
@@ -24,7 +24,13 @@
   var mixinObject;
 
   beforeEach(function () {
-    mixinObject = mixinClass.create();
+    mixinObject = mixinClass.create({
+      content: Em.Object.create(),
+      controller: Em.Object.create({
+        hideWidget: sinon.spy(),
+        editWidget: sinon.spy()
+      })
+    });
   });
 
   afterEach(function () {
@@ -81,10 +87,20 @@
     beforeEach(function () {
       this.mock = sinon.stub(mixinObject, 'getRequestData');
       sinon.stub(App.WidgetLoadAggregator, 'add');
+      sinon.stub(mixinObject, 'getHostsMetrics').returns({
+        complete: Em.clb
+      });
+      sinon.stub(mixinObject, 'getHostComponentsMetrics').returns({
+        complete: Em.clb
+      });
+      sinon.stub(mixinObject, 'onMetricsLoaded');
     });
     afterEach(function () {
       this.mock.restore();
       App.WidgetLoadAggregator.add.restore();
+      mixinObject.getHostsMetrics.restore();
+      mixinObject.getHostComponentsMetrics.restore();
+      mixinObject.onMetricsLoaded.restore();
     });
     it('has host_component_criteria', function () {
       this.mock.returns({'key1': {host_component_criteria: 'criteria'}});
@@ -100,6 +116,30 @@
 
       expect(App.WidgetLoadAggregator.add.calledOnce).to.be.true;
     });
+  
+    it('getHostsMetrics should be called', function () {
+      this.mock.returns({'key1': {
+          host_component_criteria: 'criteria',
+          service_name: 'STACK'
+        }});
+      mixinObject.set('content.widgetType', 'HEATMAP');
+      mixinObject.loadMetrics();
+    
+      expect(mixinObject.getHostsMetrics.calledOnce).to.be.true;
+      expect(mixinObject.onMetricsLoaded.calledOnce).to.be.true;
+    });
+  
+    it('getHostComponentsMetrics should be called', function () {
+      this.mock.returns({'key1': {
+          host_component_criteria: 'criteria',
+          service_name: 'S1'
+        }});
+      mixinObject.set('content.widgetType', 'HEATMAP');
+      mixinObject.loadMetrics();
+    
+      expect(mixinObject.getHostComponentsMetrics.calledOnce).to.be.true;
+      expect(mixinObject.onMetricsLoaded.calledOnce).to.be.true;
+    });
   });
 
   describe("#extractExpressions()", function () {
@@ -264,10 +304,37 @@
       });
     });
   });
+  
+  describe('#getHostComponentMetricsSuccessCallback', function() {
+    beforeEach(function() {
+      sinon.stub(mixinObject, 'getMetricsSuccessCallback');
+    });
+    afterEach(function() {
+      mixinObject.getMetricsSuccessCallback.restore();
+    });
+    
+    it('getMetricsSuccessCallback should be called', function() {
+      mixinObject.getHostComponentMetricsSuccessCallback({items: [{}]});
+      expect(mixinObject.getMetricsSuccessCallback.calledWith({})).to.be.true;
+    });
+  });
 
   describe("#getMetricsSuccessCallback()", function () {
+  
+    beforeEach(function() {
+      sinon.stub(mixinObject, 'parseMetricsWithAggregatorFunc').returns(1);
+    });
+    afterEach(function() {
+      mixinObject.parseMetricsWithAggregatorFunc.restore();
+    });
+  
     it("metric is mapped from provided path", function () {
-      var data = {
+      mixinObject.set('content.metrics', [
+        {
+          metric_path: 'metrics/hbase/ipc/IPC/numOpenConnections'
+        }
+      ]);
+      mixinObject.getMetricsSuccessCallback({
         metrics: {
           "hbase": {
             "ipc": {
@@ -277,14 +344,25 @@
             }
           }
         }
-      };
+      });
+      expect(mixinObject.get('metrics').findProperty('metric_path', 'metrics/hbase/ipc/IPC/numOpenConnections').data).to.equal(11.5);
+    });
+  
+    it("parseMetricsWithAggregatorFunc should be called", function () {
       mixinObject.set('content.metrics', [
         {
           metric_path: 'metrics/hbase/ipc/IPC/numOpenConnections'
         }
       ]);
-      mixinObject.getMetricsSuccessCallback(data);
-      expect(mixinObject.get('metrics').findProperty('metric_path', 'metrics/hbase/ipc/IPC/numOpenConnections').data).to.equal(11.5);
+      mixinObject.getMetricsSuccessCallback({});
+      expect(mixinObject.parseMetricsWithAggregatorFunc.calledWith({}, 'metrics/hbase/ipc/IPC/numOpenConnections')).to.be.true;
+    });
+  });
+  
+  describe('#parseMetricsWithAggregatorFunc', function() {
+    
+    it('should return metric value', function() {
+      expect(mixinObject.parseMetricsWithAggregatorFunc({path: {foo: {'._sum': 1}}}, 'path/foo/._sum')).to.equal(1);
     });
   });
 
@@ -377,10 +455,19 @@
 
   describe("#getHostComponentMetrics()", function () {
     beforeEach(function () {
-      sinon.stub(mixinObject, 'computeHostComponentCriteria').returns('criteria')
+      sinon.stub(mixinObject, 'computeHostComponentCriteria').returns('criteria');
+      sinon.stub(App.HDFSService, 'find').returns(Em.Object.create({
+        masterComponentGroups: [
+          {
+            name: 'tag1',
+            hosts: ['host1', 'host2']
+          }
+        ]
+      }));
     });
     afterEach(function () {
       mixinObject.computeHostComponentCriteria.restore();
+      App.HDFSService.find.restore();
     });
     it("valid request is sent", function () {
       var request = {
@@ -399,7 +486,8 @@
             "context": {}
           }
         ],
-        host_component_criteria: 'c1'
+        host_component_criteria: 'c1',
+        tag: 'tag1'
       };
       mixinObject.getHostComponentMetrics(request);
       var args = testHelpers.findAjaxRequest('name', 'widgets.hostComponent.metrics.get');
@@ -408,7 +496,8 @@
       expect(args[0].data).to.be.eql({
         componentName: 'C1',
         metricPaths: 'w1,w2',
-        hostComponentCriteria: 'criteria'
+        hostComponentCriteria: 'criteria',
+        selectedHostsParam: '&HostRoles/host_name.in(host1,host2)'
       });
     });
   });
@@ -501,20 +590,74 @@
 
   describe("#postWidgetDefinition()", function () {
     beforeEach(function () {
-      sinon.stub(mixinObject, 'collectWidgetData').returns({});
+      sinon.stub(mixinObject, 'collectWidgetData').returns({
+        WidgetInfo: {
+          widget_name: 'widget1'
+        }
+      });
     });
     afterEach(function () {
       mixinObject.collectWidgetData.restore();
     });
-    it("valid request is sent", function () {
-      mixinObject.postWidgetDefinition();
-      var args = testHelpers.findAjaxRequest('name', 'widgets.wizard.add');
-      expect(args[0]).exists;
-      expect(args[0].sender).to.be.eql(mixinObject);
-      expect(args[0].data).to.be.eql({
-        data: {}
+    it("Request for clone widget should be sent", function () {
+      mixinObject.postWidgetDefinition(true, true);
+      expect(testHelpers.findAjaxRequest('name', 'widgets.wizard.add')[0]).to.be.eql({
+        name: 'widgets.wizard.add',
+        sender: mixinObject,
+        data: {
+          data: {
+            WidgetInfo: {
+              widget_name: 'widget1(Copy)',
+              scope: 'USER'
+            }
+          }
+        },
+        success: 'editNewClonedWidget'
       });
     });
+  
+    it("Request for new widget should be sent", function () {
+      mixinObject.postWidgetDefinition(false, false);
+      expect(testHelpers.findAjaxRequest('name', 'widgets.wizard.add')[0]).to.be.eql({
+        name: 'widgets.wizard.add',
+        sender: mixinObject,
+        data: {
+          data: {
+            WidgetInfo: {
+              widget_name: 'widget1'
+            }
+          }
+        },
+        success: 'postWidgetDefinitionSuccessCallback'
+      });
+    });
+  });
+  
+  describe('#postWidgetDefinitionSuccessCallback', function() {
+    var mock = {
+      saveWidgetLayout: sinon.stub().returns({done: Em.clb}),
+      updateActiveLayout: sinon.spy()
+    };
+    beforeEach(function() {
+      sinon.stub(App.router, 'get').returns(mock);
+      mixinObject.set('content.layout', {widgets: []});
+      mixinObject.postWidgetDefinitionSuccessCallback({resources: [{WidgetInfo: {id: 1}}]});
+    });
+    afterEach(function() {
+      App.router.get.restore();
+    });
+    
+    it('saveWidgetLayout should be called', function() {
+      expect(mock.saveWidgetLayout.calledWith([
+        Em.Object.create({
+          id: 1
+        })
+      ])).to.be.true;
+    });
+  
+    it('updateActiveLayout should be called', function() {
+      expect(mock.updateActiveLayout.called).to.be.true;
+    });
   });
 
   describe('#getMetricsErrorCallback()', function () {
@@ -674,6 +817,312 @@
     });
 
   });
+  
+  describe('#beforeRender', function() {
+    beforeEach(function() {
+      sinon.stub(mixinObject, 'loadMetrics');
+    });
+    afterEach(function() {
+      mixinObject.loadMetrics.restore();
+    });
+    
+    it('loadMetrics should be called', function() {
+      mixinObject.beforeRender();
+      expect(mixinObject.loadMetrics.calledOnce).to.be.true
+;    });
+  });
+  
+  describe('#computeHostComponentCriteria', function() {
+
+    it('should return params', function() {
+      var request = {
+        host_component_criteria: 'host_components/param'
+      };
+      expect(mixinObject.computeHostComponentCriteria(request)).to.be.equal('&param');
+    });
+  });
+  
+  describe('#getHostComponentsMetrics', function() {
+   
+    it('App.ajax.send should be called', function() {
+      mixinObject.getHostComponentsMetrics({
+        service_name: 'S1',
+        component_name: 'C1',
+        metric_paths: [{metric_path: 'key1'}, {metric_path: 'key2'}]
+      });
+      expect(testHelpers.findAjaxRequest('name', 'widgets.serviceComponent.metrics.get')[0].data).to.be.eql({
+        serviceName: 'S1',
+        componentName: 'C1',
+        metricPaths: 'host_components/key1,host_components/key2'
+      })
+    });
+  });
+  
+  describe('#getHostComponentsMetricsSuccessCallback', function() {
+    
+    it('should set metrics', function() {
+      var data = {
+        host_components: [
+          {
+            HostRoles: {
+              host_name: 'host1'
+            },
+            path: {
+              foo: 1
+            }
+          }
+        ]
+      };
+      mixinObject.set('content.metrics', [
+        {
+          metric_path: 'path/foo'
+        }
+      ]);
+      mixinObject.set('metrics', []);
+      mixinObject.getHostComponentsMetricsSuccessCallback(data);
+      expect(JSON.stringify(mixinObject.get('metrics'))).to.be.eql(JSON.stringify([
+        {
+          metric_path: 'path/foo',
+          hostName: 'host1',
+          data: 1
+        }
+      ]));
+    });
+  });
+  
+  describe('#getHostsMetrics', function() {
+    
+    it('App.ajax.send should be called', function() {
+      mixinObject.getHostsMetrics({
+        metric_paths: [{metric_path: 'key1'}, {metric_path: 'key2'}]
+      });
+      expect(testHelpers.findAjaxRequest('name', 'widgets.hosts.metrics.get')[0].data).to.be.eql({
+        metricPaths: 'key1,key2'
+      })
+    });
+  });
+  
+  describe('#getHostComponentsMetricsSuccessCallback', function() {
+    
+    it('should set metrics', function() {
+      var data = {
+        items: [
+          {
+            Hosts: {
+              host_name: 'host1'
+            },
+            path: {
+              foo: 1
+            }
+          }
+        ]
+      };
+      mixinObject.set('content.metrics', [
+        {
+          metric_path: 'path/foo'
+        }
+      ]);
+      mixinObject.set('metrics', []);
+      mixinObject.getHostsMetricsSuccessCallback(data);
+      expect(JSON.stringify(mixinObject.get('metrics'))).to.be.eql(JSON.stringify([
+        {
+          metric_path: 'path/foo',
+          hostName: 'host1',
+          data: 1
+        }
+      ]));
+    });
+  });
+  
+  
+  describe('#onMetricsLoaded', function() {
+    beforeEach(function() {
+      sinon.stub(mixinObject, 'drawWidget');
+    });
+    afterEach(function() {
+      mixinObject.drawWidget.restore();
+    });
+    
+    it('drwaWidget should be called', function() {
+      mixinObject.onMetricsLoaded();
+      expect(mixinObject.drawWidget.calledOnce).to.be.true;
+    });
+  
+    it('isLoaded should be true', function() {
+      mixinObject.onMetricsLoaded();
+      expect(mixinObject.get('isLoaded')).to.be.true;
+    });
+  });
+  
+  describe('#drawWidget', function() {
+    beforeEach(function() {
+      sinon.stub(mixinObject, 'calculateValues');
+      mixinObject.set('isLoaded', true);
+      mixinObject.set('content.values', [{computedValue: 1}]);
+      mixinObject.drawWidget();
+    });
+    afterEach(function() {
+      mixinObject.calculateValues.restore();
+    });
+    
+    it('calculateValues should be called', function() {
+      expect(mixinObject.calculateValues.calledOnce).to.be.true;
+    });
+  
+    it('value should be set', function() {
+      expect(mixinObject.get('value')).to.equal(1);
+    });
+  });
+  
+  describe('#hideWidget', function() {
+    
+    it('hideWidget should be called', function() {
+      mixinObject.hideWidget({contexts: [1, 'layout1']});
+      expect(mixinObject.get('controller').hideWidget.calledWith({
+        context: Em.Object.create({
+          id: 1,
+          nsLayout: 'layout1'
+        })
+      })).to.be.true;
+    });
+  });
+  
+  describe('#collectWidgetData', function() {
+    
+    it('should return widget data', function() {
+      mixinObject.set('content', Em.Object.create({
+        widgetName: 'name1',
+        widgetType: 'type1',
+        widgetDescription: 'desc',
+        scope: 'HOST',
+        values: [1],
+        properties: [{}],
+        metrics: [
+          {
+            name: 'metric1',
+            service_name: 'S1',
+            component_name: 'C1',
+            host_component_criteria: 'criteria1',
+            metric_path: 'path/foo',
+            tag: 'tag1'
+          }
+        ]
+      }));
+      expect(mixinObject.collectWidgetData()).to.be.eql({
+        WidgetInfo: {
+          widget_name: 'name1',
+          widget_type: 'type1',
+          description: 'desc',
+          scope: 'HOST',
+          "metrics": [
+            {
+              "name": 'metric1',
+              "service_name": 'S1',
+              "component_name": 'C1',
+              "host_component_criteria":  'criteria1',
+              "metric_path": 'path/foo'
+            }
+          ],
+          values: [1],
+          properties: [{}],
+          tag: 'tag1'
+        }
+      });
+    });
+  });
+  
+  describe('#editNewClonedWidget', function() {
+    var mock = {
+      saveWidgetLayout: sinon.stub().returns({done: Em.clb}),
+      getActiveWidgetLayout: sinon.stub().returns({done: Em.clb})
+    };
+    beforeEach(function() {
+      sinon.stub(App.router, 'get').returns(mock);
+      mixinObject.set('content.layout', {widgets: []});
+      mixinObject.editNewClonedWidget({resources:[{WidgetInfo: {id: 1}}]});
+    });
+    afterEach(function() {
+      App.router.get.restore();
+    });
+    
+    it('saveWidgetLayout should be called', function() {
+      expect(mock.saveWidgetLayout.calledWith([
+        Em.Object.create({
+          id: 1
+        })
+      ])).to.be.true;
+    });
+  
+    it('getActiveWidgetLayout should be called', function() {
+      expect(mock.getActiveWidgetLayout.called).to.be.true;
+    });
+  
+    it('editWidget should be called', function() {
+      expect(mixinObject.get('controller').editWidget.called).to.be.true;
+    });
+  });
+  
+  describe('#editWidget', function() {
+    
+    it('controller.editWidget should be called', function() {
+      mixinObject.set('content', Em.Object.create({
+        scope: 'SERVICE'
+      }));
+      mixinObject.editWidget();
+      expect(mixinObject.get('controller').editWidget.calledWith(Em.Object.create({
+        scope: 'SERVICE'
+      }))).to.be.true;
+    });
+  
+    it('App.ModalPopup.show should be called', function() {
+      mixinObject.set('content', Em.Object.create({
+        scope: 'CLUSTER'
+      }));
+      mixinObject.editWidget();
+      expect(App.ModalPopup.show.called).to.be.true;
+    });
+  });
+});
+
+describe('App.WidgetPreviewMixin', function() {
+  var widgetPreview;
+  
+  beforeEach(function() {
+    widgetPreview = Em.Object.create({
+      drawWidget: sinon.spy(),
+      loadMetrics: Em.K,
+      controller: Em.Object.create(),
+      content: Em.Object.create()
+    }, App.WidgetPreviewMixin);
+  });
+  
+  describe('#loadMetrics', function() {
+   
+    it('widget properties should be set', function() {
+      widgetPreview.get('controller').setProperties({
+        widgetValues: [1],
+        widgetProperties: [{}],
+        widgetName: 'widget1',
+        widgetMetrics: [{}]
+      });
+      widgetPreview.loadMetrics();
+      expect(widgetPreview.get('content')).to.be.eql(Em.Object.create({
+        'id': 1,
+        'values': [1],
+        'properties': [{}],
+        'widgetName': 'widget1',
+        'metrics': [{}]
+      }));
+    });
+  });
+  
+  describe('#onMetricsLoaded', function() {
+    
+    it('drawWidget should be called', function() {
+      widgetPreview.onMetricsLoaded();
+      expect(widgetPreview.drawWidget.calledOnce).to.be.true;
+    });
+  });
 });
 
 
diff --git a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/UserLocal.java b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/UserLocal.java
index 41c60ab..db2cd39 100644
--- a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/UserLocal.java
+++ b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/UserLocal.java
@@ -110,11 +110,9 @@
       }
       else {
         try {
-          if (!instances.containsKey(key)) {
-            T initValue = initialValue(context);
-            LOG.info("Obtained initial value : {} for key : {}",initValue,key);
-            instances.put(key, initValue);
-          }
+          T initValue = initialValue(context);
+          LOG.info("Obtained initial value : {} for key : {}",initValue,key);
+          instances.put(key, initValue);
         }finally{
           lock.unlock();
         }