AMBARI-3779 - During cluster install cannot go past Step0
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/QueryCreateHandler.java b/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/QueryCreateHandler.java
index 8edaa07..040a1f1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/QueryCreateHandler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/QueryCreateHandler.java
@@ -63,7 +63,7 @@
     // only get first element because we currently only support creation of a single sub-resource type
     final Map.Entry<Resource.Type, Set<Map<String, Object>>> entry = mapProperties.entrySet().iterator().next();
     ResourceInstance createResource = getResourceFactory().createResource(
-        entry.getKey(), request.getResource().getIds());
+        entry.getKey(), request.getResource().getKeyValueMap());
 
     RequestBody requestBody = new RequestBody();
     requestBody.setBody(request.getBody().getBody());
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
index 09923dd..89513fa 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
@@ -62,9 +62,14 @@
   private final Map<String, TemporalInfo> temporalInfoMap = new HashMap<String, TemporalInfo>();
 
   /**
-   * Map of primary and foreign keys and values necessary to identify the resource.
+   * Map of primary and foreign key values.
    */
-  private final Map<Resource.Type, String> resourceIds = new HashMap<Resource.Type, String>();
+  private final Map<Resource.Type, String> keyValueMap = new HashMap<Resource.Type, String>();
+
+  /**
+   * Set of maps of primary and foreign key values.
+   */
+  Set<Map<Resource.Type, String>> keyValueMaps = new HashSet<Map<Resource.Type, String>>();
 
   /**
    * Sub-resources of the resource which is being operated on.
@@ -109,16 +114,16 @@
   /**
    * Constructor
    *
-   * @param mapIds              the map of ids
+   * @param keyValueMap         the map of key values
    * @param resourceDefinition  the resource definition
    * @param clusterController   the cluster controller
    */
-  public QueryImpl(Map<Resource.Type, String> mapIds,
+  public QueryImpl(Map<Resource.Type, String> keyValueMap,
                    ResourceDefinition resourceDefinition,
                    ClusterController clusterController) {
     this.resourceDefinition = resourceDefinition;
     this.clusterController  = clusterController;
-    setIds(mapIds);
+    setKeyValueMap(keyValueMap);
   }
 
 
@@ -135,7 +140,7 @@
         Resource.Type resourceType = getResourceDefinition().getType();
         Schema        schema       = clusterController.getSchema(resourceType);
 
-        for (Resource.Type type : getIds().keySet()) {
+        for (Resource.Type type : getKeyValueMap().keySet()) {
           addLocalProperty(schema.getKeyPropertyId(type));
         }
       } else {
@@ -188,13 +193,13 @@
   // ----- ResourceInstance --------------------------------------------------
 
   @Override
-  public void setIds(Map<Resource.Type, String> mapIds) {
-    resourceIds.putAll(mapIds);
+  public void setKeyValueMap(Map<Resource.Type, String> keyValueMap) {
+    this.keyValueMap.putAll(keyValueMap);
   }
 
   @Override
-  public Map<Resource.Type, String> getIds() {
-    return new HashMap<Resource.Type, String>((resourceIds));
+  public Map<Resource.Type, String> getKeyValueMap() {
+    return new HashMap<Resource.Type, String>((keyValueMap));
   }
 
   @Override
@@ -209,7 +214,7 @@
 
   @Override
   public boolean isCollectionResource() {
-    return getIds().get(getResourceDefinition().getType()) == null;
+    return getKeyValueMap().get(getResourceDefinition().getType()) == null;
   }
 
   @Override
@@ -235,7 +240,7 @@
         !pageRequest.equals(query.pageRequest) :
         query.pageRequest != null) && queryPropertySet.equals(query.queryPropertySet) &&
         resourceDefinition.equals(query.resourceDefinition) &&
-        resourceIds.equals(query.resourceIds) && !(userPredicate != null ?
+        keyValueMap.equals(query.keyValueMap) && !(userPredicate != null ?
         !userPredicate.equals(query.userPredicate) :
         query.userPredicate != null);
   }
@@ -245,7 +250,7 @@
     int result = resourceDefinition.hashCode();
     result = 31 * result + clusterController.hashCode();
     result = 31 * result + queryPropertySet.hashCode();
-    result = 31 * result + resourceIds.hashCode();
+    result = 31 * result + keyValueMap.hashCode();
     result = 31 * result + (userPredicate != null ? userPredicate.hashCode() : 0);
     result = 31 * result + (pageRequest != null ? pageRequest.hashCode() : 0);
     return result;
@@ -266,9 +271,9 @@
       ClusterController controller = clusterController;
       for (SubResourceDefinition subResDef : setSubResourceDefs) {
         Resource.Type type = subResDef.getType();
-        Map<Resource.Type, String> ids = getIds();
-        QueryImpl resource =  new QueryImpl(ids,
-            ResourceInstanceFactoryImpl.getResourceDefinition(type, ids),
+        Map<Resource.Type, String> valueMap = getKeyValueMap();
+        QueryImpl resource =  new QueryImpl(valueMap,
+            ResourceInstanceFactoryImpl.getResourceDefinition(type, valueMap),
             controller);
 
         // ensure pk is returned
@@ -304,6 +309,8 @@
     for (Resource resource : doQuery(getPredicate())) {
       providerResourceSet.add(resource);
     }
+    keyValueMaps.add(getKeyValueMap());
+
     queryForSubResources();
   }
 
@@ -344,7 +351,7 @@
 
     Resource.Type resourceType1 = getResourceDefinition().getType();
 
-    if (getIds().get(resourceType1) == null) {
+    if (getKeyValueMap().get(resourceType1) == null) {
       addCollectionProperties(resourceType1);
     }
     if (queryPropertySet.isEmpty() && querySubResourceSet.isEmpty()) {
@@ -375,13 +382,17 @@
       for (Map.Entry<String, QueryImpl> entry : querySubResourceSet.entrySet()) {
         QueryImpl subResourceInstance = entry.getValue();
         String    subResCategory      = entry.getKey();
-        Predicate predicate           = predicateMap.get(subResCategory);
 
-        setParentIdsOnSubResource(resource, subResourceInstance);
+        Set<Map<Resource.Type, String>> resourceKeyValueMaps = getKeyValueMaps(resource, keyValueMaps);
 
-        predicateMap.put(subResCategory, predicate == null ?
-            subResourceInstance.getPredicate() :
-            new OrPredicate(predicate, subResourceInstance.getPredicate()));
+        for( Map<Resource.Type, String> map : resourceKeyValueMaps) {
+          Predicate predicate = predicateMap.get(subResCategory);
+
+          predicateMap.put(subResCategory, predicate == null ?
+              subResourceInstance.createPredicate(map) :
+              new OrPredicate(predicate, subResourceInstance.createPredicate(map)));
+        }
+        subResourceInstance.keyValueMaps.addAll(resourceKeyValueMaps);
       }
     }
     return predicateMap;
@@ -395,7 +406,7 @@
 
     Result result = new ResultImpl(true);
     Resource.Type resourceType = getResourceDefinition().getType();
-    if (getIds().get(resourceType) == null) {
+    if (getKeyValueMap().get(resourceType) == null) {
       result.getResultTree().setProperty("isCollection", "true");
     }
 
@@ -423,7 +434,7 @@
         String    subResCategory = entry.getKey();
         QueryImpl subResource    = entry.getValue();
 
-        setParentIdsOnSubResource(resource, subResource);
+        subResource.setKeyValueMap(getKeyValueMap(resource, getKeyValueMap()));
 
         TreeNode<Resource> childResult = subResource.getResult().getResultTree();
         childResult.setName(subResCategory);
@@ -442,7 +453,7 @@
     addProperty(PropertyHelper.getPropertyCategory(property),
         PropertyHelper.getPropertyName(property), null);
 
-    for (Resource.Type type : getIds().keySet()) {
+    for (Resource.Type type : getKeyValueMap().keySet()) {
       // add fk's
       String keyPropertyId = schema.getKeyPropertyId(type);
       if (keyPropertyId != null) {
@@ -495,9 +506,8 @@
     return resourceAdded;
   }
 
-  private Predicate createInternalPredicate() {
+  private Predicate createInternalPredicate(Map<Resource.Type, String> mapResourceIds) {
     Resource.Type resourceType = getResourceDefinition().getType();
-    Map<Resource.Type, String> mapResourceIds = getIds();
     Schema schema = clusterController.getSchema(resourceType);
 
     Set<Predicate> setPredicates = new HashSet<Predicate>();
@@ -520,8 +530,12 @@
   }
 
   private Predicate createPredicate() {
+    return createPredicate(getKeyValueMap());
+  }
+
+  private Predicate createPredicate(Map<Resource.Type, String> keyValueMap) {
     Predicate predicate = null;
-    Predicate internalPredicate = createInternalPredicate();
+    Predicate internalPredicate = createInternalPredicate(keyValueMap);
     if (internalPredicate == null) {
       if (userPredicate != null) {
         predicate = userPredicate;
@@ -549,13 +563,27 @@
       setProperties.add(group);
     }
 
-    return PropertyHelper.getReadRequest(allProperties ? Collections.<String>emptySet() : setProperties, mapTemporalInfo);
+    return PropertyHelper.getReadRequest(allProperties ?
+        Collections.<String>emptySet() : setProperties, mapTemporalInfo);
   }
 
-  private void setParentIdsOnSubResource(Resource resource, ResourceInstance r) {
-    Map<Resource.Type, String> mapParentIds = getIds();
-    Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>(mapParentIds.size());
-    for (Map.Entry<Resource.Type, String> resourceIdEntry : mapParentIds.entrySet()) {
+  // Get a set of key value maps based on the given resource and an existing set of key value maps
+  private Set<Map<Resource.Type, String>> getKeyValueMaps(Resource resource,
+                                                          Set<Map<Resource.Type, String>> keyValueMaps) {
+    Set<Map<Resource.Type, String>> resourceKeyValueMaps = new HashSet<Map<Resource.Type, String>>();
+
+    for(Map<Resource.Type, String> keyValueMap : keyValueMaps) {
+      Map<Resource.Type, String> resourceKeyValueMap = getKeyValueMap(resource, keyValueMap);
+      resourceKeyValueMaps.add(resourceKeyValueMap);
+    }
+    return resourceKeyValueMaps;
+  }
+
+  // Get a key value map based on the given resource and an existing key value map
+  private Map<Resource.Type, String> getKeyValueMap(Resource resource,
+                                                    Map<Resource.Type, String> keyValueMap) {
+    Map<Resource.Type, String> resourceKeyValueMap = new HashMap<Resource.Type, String>(keyValueMap.size());
+    for (Map.Entry<Resource.Type, String> resourceIdEntry : keyValueMap.entrySet()) {
       Resource.Type type = resourceIdEntry.getKey();
       String value = resourceIdEntry.getValue();
 
@@ -564,13 +592,13 @@
         value = o == null ? null : o.toString();
       }
       if (value != null) {
-        mapResourceIds.put(type, value);
+        resourceKeyValueMap.put(type, value);
       }
     }
     String resourceKeyProp = clusterController.getSchema(resource.getType()).
         getKeyPropertyId(resource.getType());
 
-    mapResourceIds.put(resource.getType(), resource.getPropertyValue(resourceKeyProp).toString());
-    r.setIds(mapResourceIds);
+    resourceKeyValueMap.put(resource.getType(), resource.getPropertyValue(resourceKeyProp).toString());
+    return resourceKeyValueMap;
   }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstance.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstance.java
index a3a8e3a..2722679 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstance.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstance.java
@@ -31,16 +31,16 @@
   /**
    * Set the values of the parent foreign keys.
    *
-   * @param mapIds  map of all parent foreign keys. Map from resource type to id value.
+   * @param keyValueMap  map of all parent foreign keys. Map from resource type to id value.
    */
-  public void setIds(Map<Resource.Type, String> mapIds);
+  public void setKeyValueMap(Map<Resource.Type, String> keyValueMap);
 
   /**
    * Obtain the primary and foreign key properties for the resource.
    *
    * @return map of primary and foreign key values keyed by resource type
    */
-  public Map<Resource.Type, String> getIds();
+  public Map<Resource.Type, String> getKeyValueMap();
 
   /**
    * Return the query associated with the resource.
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/persistence/PersistenceManagerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/persistence/PersistenceManagerImpl.java
index 5f868a0..595ad00 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/persistence/PersistenceManagerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/persistence/PersistenceManagerImpl.java
@@ -54,7 +54,7 @@
              ResourceAlreadyExistsException,
              NoSuchParentResourceException {
 
-    Map<Resource.Type, String> mapResourceIds = resource.getIds();
+    Map<Resource.Type, String> mapResourceIds = resource.getKeyValueMap();
     Resource.Type type = resource.getResourceDefinition().getType();
     Schema schema = m_controller.getSchema(type);
 
@@ -82,7 +82,7 @@
     // Allow for multiple property sets in an update request body...
     Set<NamedPropertySet> setProperties = requestBody.getNamedPropertySets();
     if (setProperties.size() > 1) {
-      Map<Resource.Type, String> mapResourceIds = resource.getIds();
+      Map<Resource.Type, String> mapResourceIds = resource.getKeyValueMap();
       Resource.Type type = resource.getResourceDefinition().getType();
       Schema schema = m_controller.getSchema(type);
 
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 890cb81..257c189 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
@@ -1093,18 +1093,17 @@
   /**
    * Find configuration tags with applied overrides
    *
-   * @param cluster
-   * @param hostName
-   * @return
-   * @throws AmbariException
+   * @param cluster   the cluster
+   * @param hostName  the host name
+   *
+   * @return the configuration tags
+   *
+   * @throws AmbariException if configuration tags can not be obtained
    */
   protected Map<String, Map<String,String>> findConfigurationTagsWithOverrides(
     Cluster cluster, String hostName) throws AmbariException {
 
-    Map<String, Map<String,String>> configTags =
-      configHelper.getEffectiveDesiredTags(cluster, hostName);
-
-    return configTags;
+    return configHelper.getEffectiveDesiredTags(cluster, hostName);
   }
 
   private List<Stage> doStageCreation(Cluster cluster,
@@ -1157,15 +1156,6 @@
       Stage stage = createNewStage(cluster, requestId, requestContext, clusterHostInfoJson);
       stage.setStageId(stageId);
 
-      Set<String> hostnames = new HashSet<String>();
-      for (Map<State, List<ServiceComponentHost>> stateListMap : changedScHosts.values()) {
-        for (List<ServiceComponentHost> serviceComponentHosts : stateListMap.values()) {
-          for (ServiceComponentHost serviceComponentHost : serviceComponentHosts) {
-            hostnames.add(serviceComponentHost.getHostName());
-          }
-        }
-      }
-
       //HACK
       String jobtrackerHost = getJobTrackerHost(cluster);
       for (String compName : changedScHosts.keySet()) {
@@ -1480,11 +1470,8 @@
     Map<String, Map<String, Map<String, Set<String>>>> hostComponentNames =
         new HashMap<String, Map<String, Map<String, Set<String>>>>();
     Set<State> seenNewStates = new HashSet<State>();
-    int numberOfRequestsProcessed = 0;
-    StackId fromStackVersion = new StackId();
     Map<ServiceComponentHost, State> directTransitionScHosts = new HashMap<ServiceComponentHost, State>();
     for (ServiceComponentHostRequest request : requests) {
-      numberOfRequestsProcessed++;
       validateServiceComponentHostRequest(request);
 
       Cluster cluster = clusters.getCluster(request.getClusterName());
@@ -1726,83 +1713,6 @@
     return false;
   }
 
-  private boolean checkIfUpgradeRequestAndValidate(ServiceComponentHostRequest request, Cluster cluster, Service s,
-                                                   ServiceComponent sc, ServiceComponentHost sch)
-      throws AmbariException {
-    boolean isUpgradeRequest = false;
-    String requestedStackIdString = request.getDesiredStackId();
-    StackId requestedStackId;
-
-    if (requestedStackIdString == null) {
-      return isUpgradeRequest;
-    }
-
-    try {
-      requestedStackId = new StackId(request.getDesiredStackId());
-    } catch (RuntimeException re) {
-      throw getHostComponentUpgradeException(request, cluster, s, sc, sch,
-          "Invalid desired stack id");
-    }
-
-    StackId clusterStackId = cluster.getCurrentStackVersion();
-    StackId currentSchStackId = sch.getStackVersion();
-    if (clusterStackId == null || clusterStackId.getStackName().equals("")) {
-      // cluster has not been upgraded yet
-      if (requestedStackId.compareTo(currentSchStackId) != 0) {
-        throw getHostComponentUpgradeException(request, cluster, s, sc, sch,
-            "Cluster has not been upgraded yet, component host cannot be upgraded");
-      }
-    } else {
-      // cluster is upgraded and sch can be independently upgraded
-      if (clusterStackId.getStackName().compareTo(requestedStackId.getStackName()) != 0) {
-        throw getHostComponentUpgradeException(request, cluster, s, sc, sch,
-            "Deployed stack name and requested stack names do not match");
-      }
-      if (clusterStackId.compareTo(requestedStackId) != 0) {
-        throw getHostComponentUpgradeException(request, cluster, s, sc, sch,
-            "Component host can only be upgraded to the same version as the cluster");
-      } else if (requestedStackId.compareTo(currentSchStackId) > 0) {
-        isUpgradeRequest = true;
-        if (sch.getState() != State.INSTALLED && sch.getState() != State.UPGRADING) {
-          throw getHostComponentUpgradeException(request, cluster, s, sc, sch,
-              "Component host is in an invalid state for upgrade");
-        }
-
-        if (request.getDesiredState() == null
-            || !request.getDesiredState().equals(State.INSTALLED.toString())) {
-          throw getHostComponentUpgradeException(request, cluster, s, sc, sch,
-              "The desired state for an upgrade request must be " + State.INSTALLED);
-        }
-        LOG.info("Received upgrade request to " + requestedStackId + " for "
-            + "component " + sch.getServiceComponentName()
-            + " on " + sch.getHostName());
-      } else {
-        LOG.info("Stack id " + requestedStackId + " provided in the request matches"
-            + " the current stack id of the "
-            + "component " + sch.getServiceComponentName()
-            + " on " + sch.getHostName() + ". It will not be upgraded.");
-      }
-    }
-
-    return isUpgradeRequest;
-  }
-
-  private AmbariException getHostComponentUpgradeException(
-      ServiceComponentHostRequest request, Cluster cluster,
-      Service s, ServiceComponent sc, ServiceComponentHost sch,
-      String message) throws AmbariException {
-    return new AmbariException(message
-        + ", clusterName=" + cluster.getClusterName()
-        + ", clusterId=" + cluster.getClusterId()
-        + ", serviceName=" + s.getName()
-        + ", componentName=" + sc.getName()
-        + ", hostname=" + sch.getHostName()
-        + ", requestedStackId=" + request.getDesiredStackId()
-        + ", requestedState=" + request.getDesiredState()
-        + ", clusterStackId=" + cluster.getCurrentStackVersion()
-        + ", hostComponentCurrentStackId=" + sch.getStackVersion());
-  }
-
   @Override
   public synchronized void updateUsers(Set<UserRequest> requests) throws AmbariException {
     for (UserRequest request : requests) {
@@ -1985,7 +1895,8 @@
 
     Set<TaskStatusResponse> responses = new HashSet<TaskStatusResponse>();
     for (HostRoleCommand command : actionManager.getTasksByRequestAndTaskIds(requestIds, taskIds)) {
-      responses.add(new TaskStatusResponse(command));
+      TaskStatusResponse taskStatusResponse = new TaskStatusResponse(command);
+      responses.add(taskStatusResponse);
     }
 
     if (responses.size() == 0) {
@@ -2285,7 +2196,16 @@
     Set<RepositoryResponse> response = new HashSet<RepositoryResponse>();
     for (RepositoryRequest request : requests) {
       try {
-        response.addAll(getRepositories(request));
+        String stackName    = request.getStackName();
+        String stackVersion = request.getStackVersion();
+
+        Set<RepositoryResponse> repositories = getRepositories(request);
+
+        for (RepositoryResponse repositoryResponse : repositories) {
+          repositoryResponse.setStackName(stackName);
+          repositoryResponse.setStackVersion(stackVersion);
+        }
+        response.addAll(repositories);
       } catch (StackAccessException e) {
         if (requests.size() == 1) {
           // only throw exception if 1 request.
@@ -2387,8 +2307,13 @@
       Set<StackVersionRequest> requests) throws AmbariException {
     Set<StackVersionResponse> response = new HashSet<StackVersionResponse>();
     for (StackVersionRequest request : requests) {
+      String stackName = request.getStackName();
       try {
-        response.addAll(getStackVersions(request));
+        Set<StackVersionResponse> stackVersions = getStackVersions(request);
+        for (StackVersionResponse stackVersionResponse : stackVersions) {
+          stackVersionResponse.setStackName(stackName);
+        }
+        response.addAll(stackVersions);
       } catch (StackAccessException e) {
         if (requests.size() == 1) {
           // only throw exception if 1 request.
@@ -2429,8 +2354,18 @@
     Set<StackServiceResponse> response = new HashSet<StackServiceResponse>();
 
     for (StackServiceRequest request : requests) {
+      String stackName    = request.getStackName();
+      String stackVersion = request.getStackVersion();
+
       try {
-        response.addAll(getStackServices(request));
+        Set<StackServiceResponse> stackServices = getStackServices(request);
+
+        for (StackServiceResponse stackServiceResponse : stackServices) {
+          stackServiceResponse.setStackName(stackName);
+          stackServiceResponse.setStackVersion(stackVersion);
+        }
+
+        response.addAll(stackServices);
       } catch (StackAccessException e) {
         if (requests.size() == 1) {
           // only throw exception if 1 request.
@@ -2468,7 +2403,20 @@
       Set<StackConfigurationRequest> requests) throws AmbariException {
     Set<StackConfigurationResponse> response = new HashSet<StackConfigurationResponse>();
     for (StackConfigurationRequest request : requests) {
-      response.addAll(getStackConfigurations(request));
+
+      String stackName    = request.getStackName();
+      String stackVersion = request.getStackVersion();
+      String serviceName  = request.getServiceName();
+
+      Set<StackConfigurationResponse> stackConfigurations = getStackConfigurations(request);
+
+      for (StackConfigurationResponse stackConfigurationResponse : stackConfigurations) {
+        stackConfigurationResponse.setStackName(stackName);
+        stackConfigurationResponse.setStackVersion(stackVersion);
+        stackConfigurationResponse.setServiceName(serviceName);
+      }
+
+      response.addAll(stackConfigurations);
     }
 
     return response;
@@ -2505,8 +2453,20 @@
       Set<StackServiceComponentRequest> requests) throws AmbariException {
     Set<StackServiceComponentResponse> response = new HashSet<StackServiceComponentResponse>();
     for (StackServiceComponentRequest request : requests) {
+      String stackName    = request.getStackName();
+      String stackVersion = request.getStackVersion();
+      String serviceName  = request.getServiceName();
+
       try {
-        response.addAll(getStackComponents(request));
+        Set<StackServiceComponentResponse> stackComponents = getStackComponents(request);
+
+        for (StackServiceComponentResponse stackServiceComponentResponse : stackComponents) {
+          stackServiceComponentResponse.setStackName(stackName);
+          stackServiceComponentResponse.setStackVersion(stackVersion);
+          stackServiceComponentResponse.setServiceName(serviceName);
+        }
+
+        response.addAll(stackComponents);
       } catch (StackAccessException e) {
         if (requests.size() == 1) {
           // only throw exception if 1 request.
@@ -2523,12 +2483,11 @@
       StackServiceComponentRequest request) throws AmbariException {
     Set<StackServiceComponentResponse> response;
 
-    String stackName = request.getStackName();
-    String stackVersion = request.getStackVersion();
-    String serviceName = request.getServiceName();
+    String stackName     = request.getStackName();
+    String stackVersion  = request.getStackVersion();
+    String serviceName   = request.getServiceName();
     String componentName = request.getComponentName();
 
-
     if (componentName != null) {
       ComponentInfo component = this.ambariMetaInfo.getComponent(stackName, stackVersion, serviceName, componentName);
       response = Collections.singleton(component.convertToResponse());
@@ -2550,7 +2509,16 @@
     Set<OperatingSystemResponse> response = new HashSet<OperatingSystemResponse>();
     for (OperatingSystemRequest request : requests) {
       try {
-        response.addAll(getStackOperatingSystems(request));
+        String stackName    = request.getStackName();
+        String stackVersion = request.getStackVersion();
+
+        Set<OperatingSystemResponse> stackOperatingSystems = getStackOperatingSystems(request);
+
+        for (OperatingSystemResponse operatingSystemResponse : stackOperatingSystems) {
+          operatingSystemResponse.setStackName(stackName);
+          operatingSystemResponse.setStackVersion(stackVersion);
+        }
+        response.addAll(stackOperatingSystems);
       } catch (StackAccessException e) {
         if (requests.size() == 1) {
           // only throw exception if 1 request.
@@ -2617,8 +2585,15 @@
       Set<RootServiceComponentRequest> requests) throws AmbariException {
     Set<RootServiceComponentResponse> response = new HashSet<RootServiceComponentResponse>();
     for (RootServiceComponentRequest request : requests) {
+      String serviceName  = request.getServiceName();
       try {
-        response.addAll(getRootServiceComponents(request));
+        Set<RootServiceComponentResponse> rootServiceComponents = getRootServiceComponents(request);
+
+        for (RootServiceComponentResponse serviceComponentResponse : rootServiceComponents) {
+          serviceComponentResponse.setServiceName(serviceName);
+        }
+
+        response.addAll(rootServiceComponents);
       } catch (AmbariException e) {
         if (requests.size() == 1) {
           // only throw exception if 1 request.
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/OperatingSystemResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/OperatingSystemResponse.java
index 21fa983..0ff2832 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/OperatingSystemResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/OperatingSystemResponse.java
@@ -20,13 +20,30 @@
 package org.apache.ambari.server.controller;
 
 public class OperatingSystemResponse {
-  
+  private String stackName;
+  private String stackVersion;
   private String osType;
 
   public OperatingSystemResponse(String osType) {
     setOsType(osType);
   }
 
+  public String getStackName() {
+    return stackName;
+  }
+
+  public void setStackName(String stackName) {
+    this.stackName = stackName;
+  }
+
+  public String getStackVersion() {
+    return stackVersion;
+  }
+
+  public void setStackVersion(String stackVersion) {
+    this.stackVersion = stackVersion;
+  }
+
   public String getOsType() {
     return osType;
   }
@@ -34,5 +51,4 @@
   public void setOsType(String osType) {
     this.osType = osType;
   }
-
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
index 3f53400..bc3ee39 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
@@ -19,7 +19,9 @@
 package org.apache.ambari.server.controller;
 
 public class RepositoryResponse {
-  
+
+  private String stackName;
+  private String stackVersion;
   private String baseUrl;
   private String osType;
   private String repoId;
@@ -38,6 +40,21 @@
     setDefaultBaseUrl(defaultBaseUrl);
   }
 
+  public String getStackName() {
+    return stackName;
+  }
+
+  public void setStackName(String stackName) {
+    this.stackName = stackName;
+  }
+
+  public String getStackVersion() {
+    return stackVersion;
+  }
+
+  public void setStackVersion(String stackVersion) {
+    this.stackVersion = stackVersion;
+  }
 
   public String getBaseUrl() {
     return baseUrl;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceComponentResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceComponentResponse.java
index cb4415c..4845c78 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceComponentResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceComponentResponse.java
@@ -23,6 +23,7 @@
 
 public class RootServiceComponentResponse {
 
+  private String serviceName;
   private String componentName;
   private Map<String, String> properties;
   private String componentVersion;
@@ -34,6 +35,14 @@
     
   }
 
+  public String getServiceName() {
+    return serviceName;
+  }
+
+  public void setServiceName(String serviceName) {
+    this.serviceName = serviceName;
+  }
+
   public String getComponentName() {
     return componentName;
   }
@@ -61,28 +70,15 @@
 
     RootServiceComponentResponse that = (RootServiceComponentResponse) o;
 
-    if (componentName != null ?
-        !componentName.equals(that.componentName) : that.componentName != null) {
-      return false;
-    }
-    
-    if (componentVersion != null ?
-        !componentVersion.equals(that.componentVersion) : that.componentVersion != null) {
-      return false;
-    }
-    
-    if (properties != null ?
-        !properties.equals(that.properties) : that.properties != null) {
-      return false;
-    }
-    
-    return true;
+    return !(componentName != null ? !componentName.equals(that.componentName) : that.componentName != null) &&
+        !(componentVersion != null ? !componentVersion.equals(that.componentVersion) : that.componentVersion != null) &&
+        !(properties != null ? !properties.equals(that.properties) : that.properties != null);
+
   }
 
   @Override
   public int hashCode() {
-    int result = 1;
-    result = 31 + (componentName != null ? componentName.hashCode() : 0);
+    int result = 31 + (componentName != null ? componentName.hashCode() : 0);
     result += (componentVersion != null ? componentVersion.hashCode() : 0);
     return result;
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceHostComponentResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceHostComponentResponse.java
index 9565afd..6cbc30c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceHostComponentResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RootServiceHostComponentResponse.java
@@ -22,6 +22,7 @@
 
 public class RootServiceHostComponentResponse {
 
+  private String serviceName;
   private String hostName;
   private String componentName;
   private String componentState;
@@ -39,6 +40,14 @@
     this.properties = properties;
   }
 
+  public String getServiceName() {
+    return serviceName;
+  }
+
+  public void setServiceName(String serviceName) {
+    this.serviceName = serviceName;
+  }
+
   public String getHostName() {
     return hostName;
   }
@@ -66,38 +75,17 @@
 
     RootServiceHostComponentResponse that = (RootServiceHostComponentResponse) o;
 
-    if (hostName != null ?
-        !hostName.equals(that.hostName) : that.hostName != null) {
-      return false;
-    }
-    
-    if (componentName != null ?
-        !componentName.equals(that.componentName) : that.componentName != null) {
-      return false;
-    }
-    
-    if (componentState != null ?
-        !componentState.equals(that.componentState) : that.componentState != null) {
-      return false;
-    }
-    
-    if (componentVersion != null ?
-        !componentVersion.equals(that.componentVersion) : that.componentVersion != null) {
-      return false;
-    }
-    
-    if (properties != null ?
-        !properties.equals(that.properties) : that.properties != null) {
-      return false;
-    }
-    
-    return true;
+    return !(hostName != null ? !hostName.equals(that.hostName) : that.hostName != null) &&
+        !(componentName != null ? !componentName.equals(that.componentName) : that.componentName != null) &&
+        !(componentState != null ? !componentState.equals(that.componentState) : that.componentState != null) &&
+        !(componentVersion != null ? !componentVersion.equals(that.componentVersion) : that.componentVersion != null) &&
+        !(properties != null ? !properties.equals(that.properties) : that.properties != null);
+
   }
 
   @Override
   public int hashCode() {
-    int result = 1;
-    result = 31 + (hostName != null ? hostName.hashCode() : 0);
+    int result = 31 + (hostName != null ? hostName.hashCode() : 0);
     result = result + (componentName != null ? componentName.hashCode() : 0);
     result = result + (componentState != null ? componentState.hashCode() : 0);
     result = result + (componentVersion != null ? componentVersion.hashCode() : 0);
@@ -108,15 +96,7 @@
     return componentState;
   }
 
-  public void setComponentState(String componentState) {
-    this.componentState = componentState;
-  }
-
   public String getComponentVersion() {
     return componentVersion;
   }
-
-  public void setComponentVersion(String componentVersion) {
-    this.componentVersion = componentVersion;
-  }
 }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackConfigurationResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackConfigurationResponse.java
index ad74b8d..e5cbdf7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackConfigurationResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackConfigurationResponse.java
@@ -28,12 +28,38 @@
     setPropertyDescription(propertyDescription);
     setType(type);
   }
-  
+
+  private String stackName;
+  private String stackVersion;
+  private String serviceName;
   private String propertyName;
   private String propertyValue;
   private String propertyDescription;
   private String type;
 
+  public String getStackName() {
+    return stackName;
+  }
+
+  public void setStackName(String stackName) {
+    this.stackName = stackName;
+  }
+
+  public String getStackVersion() {
+    return stackVersion;
+  }
+
+  public void setStackVersion(String stackVersion) {
+    this.stackVersion = stackVersion;
+  }
+
+  public String getServiceName() {
+    return serviceName;
+  }
+
+  public void setServiceName(String serviceName) {
+    this.serviceName = serviceName;
+  }
 
   public String getPropertyName() {
     return propertyName;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceComponentResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceComponentResponse.java
index 3defb2c..51871a4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceComponentResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceComponentResponse.java
@@ -20,6 +20,10 @@
 
 public class StackServiceComponentResponse {
 
+  private String stackName;
+  private String stackVersion;
+  private String serviceName;
+
   private String componentName;
 
   private String componentCategory;
@@ -36,6 +40,30 @@
     setMaster(isMaster);
   }
 
+  public String getStackName() {
+    return stackName;
+  }
+
+  public void setStackName(String stackName) {
+    this.stackName = stackName;
+  }
+
+  public String getStackVersion() {
+    return stackVersion;
+  }
+
+  public void setStackVersion(String stackVersion) {
+    this.stackVersion = stackVersion;
+  }
+
+  public String getServiceName() {
+    return serviceName;
+  }
+
+  public void setServiceName(String serviceName) {
+    this.serviceName = serviceName;
+  }
+
   public String getComponentName() {
     return componentName;
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceResponse.java
index 4aa3f49..3c90c4b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceResponse.java
@@ -22,6 +22,8 @@
 
 public class StackServiceResponse {
 
+  private String stackName;
+  private String stackVersion;
   private String serviceName;
 
   private String userName;
@@ -41,6 +43,22 @@
     configTypes = types;
   }
 
+  public String getStackName() {
+    return stackName;
+  }
+
+  public void setStackName(String stackName) {
+    this.stackName = stackName;
+  }
+
+  public String getStackVersion() {
+    return stackVersion;
+  }
+
+  public void setStackVersion(String stackVersion) {
+    this.stackVersion = stackVersion;
+  }
+
   public String getServiceName() {
     return serviceName;
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackVersionResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackVersionResponse.java
index ad5de71..84105fc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackVersionResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackVersionResponse.java
@@ -18,16 +18,13 @@
 
 package org.apache.ambari.server.controller;
 
-import java.util.List;
-
-import org.apache.ambari.server.state.RepositoryInfo;
 
 public class StackVersionResponse {
 
+  private String stackName;
   private String stackVersion;
   private String minUpgradeVersion;
   private boolean active;
-  private List<RepositoryInfo> repositories;
   private String parentVersion;
 
   public StackVersionResponse(String stackVersion, String minUpgradeVersion,
@@ -38,6 +35,14 @@
     setParentVersion(parentVersion);
   }
 
+  public String getStackName() {
+    return stackName;
+  }
+
+  public void setStackName(String stackName) {
+    this.stackName = stackName;
+  }
+
   public String getStackVersion() {
     return stackVersion;
   }
@@ -46,14 +51,6 @@
     this.stackVersion = stackVersion;
   }
 
-  public List<RepositoryInfo> getRepositories() {
-    return repositories;
-  }
-
-  public void setRepositories(List<RepositoryInfo> repositories) {
-    this.repositories = repositories;
-  }
-
   public String getMinUpgradeVersion() {
     return minUpgradeVersion;
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
index 210a9a4..3d55871 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
@@ -38,7 +38,6 @@
 import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 /**
@@ -101,14 +100,21 @@
   public Set<Resource> getResources(Request request, Predicate predicate)
       throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
 
-    final ClusterRequest clusterRequest = getRequest(PredicateHelper.getProperties(predicate));
+    final Set<ClusterRequest> requests = new HashSet<ClusterRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
-    // TODO : handle multiple requests
     Set<ClusterResponse> responses = getResources(new Command<Set<ClusterResponse>>() {
       @Override
       public Set<ClusterResponse> invoke() throws AmbariException {
-        return getManagementController().getClusters(Collections.singleton(clusterRequest));
+        return getManagementController().getClusters(requests);
       }
     });
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
index b5528cd..cc1998f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
@@ -36,7 +36,6 @@
 import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class OperatingSystemResourceProvider extends ReadOnlyResourceProvider {
@@ -64,15 +63,23 @@
   public Set<Resource> getResources(Request request, Predicate predicate)
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
-    final OperatingSystemRequest operatingSystemRequest = getRequest(PredicateHelper
-        .getProperties(predicate));
+
+    final Set<OperatingSystemRequest> requests = new HashSet<OperatingSystemRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
+
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<OperatingSystemResponse> responses = getResources(new Command<Set<OperatingSystemResponse>>() {
       @Override
       public Set<OperatingSystemResponse> invoke() throws AmbariException {
-        return getManagementController().getStackOperatingSystems(
-            Collections.singleton(operatingSystemRequest));
+        return getManagementController().getStackOperatingSystems(requests);
       }
     });
 
@@ -82,10 +89,10 @@
       Resource resource = new ResourceImpl(Resource.Type.OperatingSystem);
 
       setResourceProperty(resource, STACK_NAME_PROPERTY_ID,
-          operatingSystemRequest.getStackName(), requestedIds);
+          response.getStackName(), requestedIds);
       
       setResourceProperty(resource, STACK_VERSION_PROPERTY_ID,
-          operatingSystemRequest.getStackVersion(), requestedIds);
+          response.getStackVersion(), requestedIds);
       
       setResourceProperty(resource, OS_TYPE_PROPERTY_ID,
           response.getOsType(), requestedIds);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java
index 99139a4..878e7ef 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java
@@ -40,7 +40,6 @@
 import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class RepositoryResourceProvider extends AbstractControllerResourceProvider {
@@ -117,15 +116,21 @@
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
 
-    final RepositoryRequest repositoryRequest = getRequest(PredicateHelper
-        .getProperties(predicate));
+    final Set<RepositoryRequest> requests = new HashSet<RepositoryRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<RepositoryResponse> responses = getResources(new Command<Set<RepositoryResponse>>() {
       @Override
       public Set<RepositoryResponse> invoke() throws AmbariException {
-        return getManagementController().getRepositories(
-            Collections.singleton(repositoryRequest));
+        return getManagementController().getRepositories(requests);
       }
     });
 
@@ -135,10 +140,10 @@
         Resource resource = new ResourceImpl(Resource.Type.Repository);
 
         setResourceProperty(resource, STACK_NAME_PROPERTY_ID,
-            repositoryRequest.getStackName(), requestedIds);
+            response.getStackName(), requestedIds);
 
         setResourceProperty(resource, STACK_VERSION_PROPERTY_ID,
-            repositoryRequest.getStackVersion(), requestedIds);
+            response.getStackVersion(), requestedIds);
 
         setResourceProperty(resource, REPOSITORY_NAME_PROPERTY_ID,
             response.getRepoName(), requestedIds);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
index 947edbe..4c5320f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
@@ -36,7 +36,6 @@
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.spi.Resource.Type;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class RootServiceComponentResourceProvider extends
@@ -68,15 +67,22 @@
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
 
-    final RootServiceComponentRequest rootServiceComponentRequest = getRequest(PredicateHelper
-        .getProperties(predicate));
+    final Set<RootServiceComponentRequest> requests = new HashSet<RootServiceComponentRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
+
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<RootServiceComponentResponse> responses = getResources(new Command<Set<RootServiceComponentResponse>>() {
       @Override
       public Set<RootServiceComponentResponse> invoke() throws AmbariException {
-        return getManagementController().getRootServiceComponents(
-            Collections.singleton(rootServiceComponentRequest));
+        return getManagementController().getRootServiceComponents(requests);
       }
     });
 
@@ -86,7 +92,7 @@
       Resource resource = new ResourceImpl(Resource.Type.RootServiceComponent);
 
       setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID,
-          rootServiceComponentRequest.getServiceName(), requestedIds);
+          response.getServiceName(), requestedIds);
       
       setResourceProperty(resource, COMPONENT_NAME_PROPERTY_ID,
           response.getComponentName(), requestedIds);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
index 5d5691f..51aaeec 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
@@ -38,7 +38,6 @@
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.spi.Resource.Type;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class RootServiceHostComponentResourceProvider extends
@@ -74,14 +73,22 @@
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
 
-    final RootServiceHostComponentRequest rootServiceComponentRequest = getRequest(PredicateHelper.getProperties(predicate));
+    final Set<RootServiceHostComponentRequest> requests = new HashSet<RootServiceHostComponentRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
+
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<RootServiceHostComponentResponse> responses = getResources(new Command<Set<RootServiceHostComponentResponse>>() {
       @Override
       public Set<RootServiceHostComponentResponse> invoke() throws AmbariException {
-        return getRootServiceHostComponents(
-            Collections.singleton(rootServiceComponentRequest));
+        return getRootServiceHostComponents(requests);
       }
     });
 
@@ -91,7 +98,7 @@
       Resource resource = new ResourceImpl(Resource.Type.RootServiceHostComponent);
 
       setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID,
-          rootServiceComponentRequest.getServiceName(), requestedIds);
+          response.getServiceName(), requestedIds);
       
       setResourceProperty(resource, HOST_NAME_PROPERTY_ID,
           response.getHostName(), requestedIds);
@@ -130,8 +137,14 @@
       Set<RootServiceHostComponentRequest> requests) throws AmbariException {
     Set<RootServiceHostComponentResponse> response = new HashSet<RootServiceHostComponentResponse>();
     for (RootServiceHostComponentRequest request : requests) {
+      String serviceName = request.getServiceName();
       try {
-        response.addAll(getRootServiceHostComponents(request));
+        Set<RootServiceHostComponentResponse> rootServiceHostComponents = getRootServiceHostComponents(request);
+        for (RootServiceHostComponentResponse rootServiceHostComponentResponse : rootServiceHostComponents ) {
+          rootServiceHostComponentResponse.setServiceName(serviceName);
+        }
+
+        response.addAll(rootServiceHostComponents);
       } catch (AmbariException e) {
         if (requests.size() == 1) {
           // only throw exception if 1 request.
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
index 1dfde5a..43d0a85 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
@@ -36,7 +36,6 @@
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.spi.Resource.Type;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class RootServiceResourceProvider extends ReadOnlyResourceProvider {
@@ -58,15 +57,22 @@
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
 
-    final RootServiceRequest ambariServiceRequest = getRequest(PredicateHelper
-        .getProperties(predicate));
+    final Set<RootServiceRequest> requests = new HashSet<RootServiceRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
+
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<RootServiceResponse> responses = getResources(new Command<Set<RootServiceResponse>>() {
       @Override
       public Set<RootServiceResponse> invoke() throws AmbariException {
-        return getManagementController().getRootServices(
-            Collections.singleton(ambariServiceRequest));
+        return getManagementController().getRootServices(requests);
       }
     });
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
index 8979829..7ce98af 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
@@ -37,7 +37,6 @@
 import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class StackConfigurationResourceProvider extends
@@ -80,15 +79,23 @@
   public Set<Resource> getResources(Request request, Predicate predicate)
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
-    final StackConfigurationRequest stackConfigurationRequest = getRequest(PredicateHelper
-        .getProperties(predicate));
+
+    final Set<StackConfigurationRequest> requests = new HashSet<StackConfigurationRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
+
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<StackConfigurationResponse> responses = getResources(new Command<Set<StackConfigurationResponse>>() {
       @Override
       public Set<StackConfigurationResponse> invoke() throws AmbariException {
-        return getManagementController().getStackConfigurations(
-            Collections.singleton(stackConfigurationRequest));
+        return getManagementController().getStackConfigurations(requests);
       }
     });
 
@@ -98,13 +105,13 @@
       Resource resource = new ResourceImpl(Resource.Type.StackConfiguration);
 
       setResourceProperty(resource, STACK_NAME_PROPERTY_ID,
-          stackConfigurationRequest.getStackName(), requestedIds);
+          response.getStackName(), requestedIds);
 
       setResourceProperty(resource, STACK_VERSION_PROPERTY_ID,
-          stackConfigurationRequest.getStackVersion(), requestedIds);
+          response.getStackVersion(), requestedIds);
 
       setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID,
-          stackConfigurationRequest.getServiceName(), requestedIds);
+          response.getServiceName(), requestedIds);
 
       setResourceProperty(resource, PROPERTY_NAME_PROPERTY_ID,
           response.getPropertyName(), requestedIds);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackResourceProvider.java
index face32b..9321acf 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackResourceProvider.java
@@ -27,7 +27,6 @@
 import org.apache.ambari.server.controller.StackResponse;
 import org.apache.ambari.server.controller.spi.*;
 import org.apache.ambari.server.controller.spi.Resource.Type;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class StackResourceProvider extends ReadOnlyResourceProvider {
@@ -50,15 +49,18 @@
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
 
-    final StackRequest stackRequest = getRequest(PredicateHelper
-        .getProperties(predicate));
+    final Set<StackRequest> requests = new HashSet<StackRequest>();
+
+    for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+      requests.add(getRequest(propertyMap));
+    }
+
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<StackResponse> responses = getResources(new Command<Set<StackResponse>>() {
       @Override
       public Set<StackResponse> invoke() throws AmbariException {
-        return getManagementController().getStacks(
-            Collections.singleton(stackRequest));
+        return getManagementController().getStacks(requests);
       }
     });
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceComponentResourceProvider.java
index 61e8c3d..fe570fe 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceComponentResourceProvider.java
@@ -36,7 +36,6 @@
 import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class StackServiceComponentResourceProvider extends
@@ -73,15 +72,22 @@
   public Set<Resource> getResources(Request request, Predicate predicate)
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
-    final StackServiceComponentRequest stackRequest = getRequest(PredicateHelper
-        .getProperties(predicate));
+    final Set<StackServiceComponentRequest> requests = new HashSet<StackServiceComponentRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
+
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<StackServiceComponentResponse> responses = getResources(new Command<Set<StackServiceComponentResponse>>() {
       @Override
       public Set<StackServiceComponentResponse> invoke() throws AmbariException {
-        return getManagementController().getStackComponents(
-            Collections.singleton(stackRequest));
+        return getManagementController().getStackComponents(requests);
       }
     });
 
@@ -91,13 +97,13 @@
       Resource resource = new ResourceImpl(Resource.Type.StackServiceComponent);
 
       setResourceProperty(resource, STACK_NAME_PROPERTY_ID,
-          stackRequest.getStackName(), requestedIds);
+          response.getStackName(), requestedIds);
       
       setResourceProperty(resource, STACK_VERSION_PROPERTY_ID,
-          stackRequest.getStackVersion(), requestedIds);
+          response.getStackVersion(), requestedIds);
       
       setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID,
-          stackRequest.getServiceName(), requestedIds);
+          response.getServiceName(), requestedIds);
       
       setResourceProperty(resource, COMPONENT_NAME_PROPERTY_ID,
           response.getComponentName(), requestedIds);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
index 3265782..21546e4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
@@ -37,7 +37,6 @@
 import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class StackServiceResourceProvider extends ReadOnlyResourceProvider {
@@ -78,15 +77,22 @@
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
 
-    final StackServiceRequest stackServiceRequest = getRequest(PredicateHelper
-        .getProperties(predicate));
+    final Set<StackServiceRequest> requests = new HashSet<StackServiceRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
+
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<StackServiceResponse> responses = getResources(new Command<Set<StackServiceResponse>>() {
       @Override
       public Set<StackServiceResponse> invoke() throws AmbariException {
-        return getManagementController().getStackServices(
-            Collections.singleton(stackServiceRequest));
+        return getManagementController().getStackServices(requests);
       }
     });
 
@@ -96,10 +102,10 @@
       Resource resource = new ResourceImpl(Resource.Type.StackService);
 
       setResourceProperty(resource, STACK_NAME_PROPERTY_ID,
-          stackServiceRequest.getStackName(), requestedIds);
+          response.getStackName(), requestedIds);
 
       setResourceProperty(resource, STACK_VERSION_PROPERTY_ID,
-          stackServiceRequest.getStackVersion(), requestedIds);
+          response.getStackVersion(), requestedIds);
 
       setResourceProperty(resource, SERVICE_NAME_PROPERTY_ID,
           response.getServiceName(), requestedIds);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
index a3babb6..9cef695 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
@@ -37,7 +37,6 @@
 import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 public class StackVersionResourceProvider extends ReadOnlyResourceProvider {
@@ -72,15 +71,22 @@
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
 
-    final StackVersionRequest stackVersionRequest = getRequest(PredicateHelper
-        .getProperties(predicate));
+    final Set<StackVersionRequest> requests = new HashSet<StackVersionRequest>();
+
+    if (predicate == null) {
+      requests.add(getRequest(Collections.<String, Object>emptyMap()));
+    } else {
+      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+        requests.add(getRequest(propertyMap));
+      }
+    }
+
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
     Set<StackVersionResponse> responses = getResources(new Command<Set<StackVersionResponse>>() {
       @Override
       public Set<StackVersionResponse> invoke() throws AmbariException {
-        return getManagementController().getStackVersions(
-            Collections.singleton(stackVersionRequest));
+        return getManagementController().getStackVersions(requests);
       }
     });
 
@@ -90,7 +96,7 @@
       Resource resource = new ResourceImpl(Resource.Type.StackVersion);
 
       setResourceProperty(resource, STACK_NAME_PROPERTY_ID,
-          stackVersionRequest.getStackName(), requestedIds);
+          response.getStackName(), requestedIds);
 
       setResourceProperty(resource, STACK_VERSION_PROPERTY_ID,
           response.getStackVersion(), requestedIds);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
index 03dcf12..b9e3cd2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
@@ -29,11 +29,10 @@
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
 import java.util.Arrays;
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -92,46 +91,60 @@
       throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
 
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
-    final Map<String, Object> predicateProperties = PredicateHelper.getProperties(predicate);
 
-    String clusterName = (String) predicateProperties.get(TASK_CLUSTER_NAME_PROPERTY_ID);
-    Long   request_id  = new Long((String) predicateProperties.get(TASK_REQUEST_ID_PROPERTY_ID));
+    Map<String, Set<TaskStatusRequest>> requestsMap = new HashMap<String, Set<TaskStatusRequest>>();
 
-    // TODO : handle multiple requests
+    for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+      String clusterName = (String) propertyMap.get(TASK_CLUSTER_NAME_PROPERTY_ID);
 
-    Set<TaskStatusResponse> responses = getResources(new Command<Set<TaskStatusResponse>>() {
-      @Override
-      public Set<TaskStatusResponse> invoke() throws AmbariException {
-        return getManagementController().getTaskStatus(Collections.singleton(getRequest(predicateProperties)));
+      Set<TaskStatusRequest> requests = requestsMap.get(clusterName);
+      if (requests == null) {
+        requests = new HashSet<TaskStatusRequest>();
+        requestsMap.put(clusterName, requests);
       }
-    });
-    
-    if (LOG.isDebugEnabled()) {
-      LOG.debug("Printing size of responses " + responses.size());
-      for (TaskStatusResponse response : responses) {
-        LOG.debug("Printing response from management controller "
-            + response.toString());
-      }
+      requests.add(getRequest(propertyMap));
     }
 
-    Set<Resource> resources = new HashSet<Resource>();
-    for (TaskStatusResponse response : responses) {
-      Resource resource = new ResourceImpl(Resource.Type.Task);
+    Set<Resource> resources = null;
 
-      setResourceProperty(resource, TASK_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
-      setResourceProperty(resource, TASK_REQUEST_ID_PROPERTY_ID, request_id, requestedIds);
-      setResourceProperty(resource, TASK_ID_PROPERTY_ID, response.getTaskId(), requestedIds);
-      setResourceProperty(resource, TASK_STAGE_ID_PROPERTY_ID, response.getStageId(), requestedIds);
-      setResourceProperty(resource, TASK_HOST_NAME_PROPERTY_ID, response.getHostName(), requestedIds);
-      setResourceProperty(resource, TASK_ROLE_PROPERTY_ID, response.getRole(), requestedIds);
-      setResourceProperty(resource, TASK_COMMAND_PROPERTY_ID, response.getCommand(), requestedIds);
-      setResourceProperty(resource, TASK_STATUS_PROPERTY_ID, response.getStatus(), requestedIds);
-      setResourceProperty(resource, TASK_EXIT_CODE_PROPERTY_ID, response.getExitCode(), requestedIds);
-      setResourceProperty(resource, TASK_STDERR_PROPERTY_ID, response.getStderr(), requestedIds);
-      setResourceProperty(resource, TASK_STOUT_PROPERTY_ID, response.getStdout(), requestedIds);
-      setResourceProperty(resource, TASK_START_TIME_PROPERTY_ID, response.getStartTime(), requestedIds);
-      setResourceProperty(resource, TASK_ATTEMPT_CNT_PROPERTY_ID, response.getAttemptCount(), requestedIds);
-      resources.add(resource);
+    for (Map.Entry<String, Set<TaskStatusRequest>> entry : requestsMap.entrySet()) {
+
+      final Set<TaskStatusRequest> requests = entry.getValue();
+
+      Set<TaskStatusResponse> responses = getResources(new Command<Set<TaskStatusResponse>>() {
+        @Override
+        public Set<TaskStatusResponse> invoke() throws AmbariException {
+          return getManagementController().getTaskStatus(requests);
+        }
+      });
+
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Printing size of responses " + responses.size());
+        for (TaskStatusResponse response : responses) {
+          LOG.debug("Printing response from management controller "
+              + response.toString());
+        }
+      }
+
+      resources = new HashSet<Resource>();
+      for (TaskStatusResponse response : responses) {
+        Resource resource = new ResourceImpl(Resource.Type.Task);
+
+        setResourceProperty(resource, TASK_CLUSTER_NAME_PROPERTY_ID, entry.getKey(), requestedIds);
+        setResourceProperty(resource, TASK_REQUEST_ID_PROPERTY_ID, response.getRequestId(), requestedIds);
+        setResourceProperty(resource, TASK_ID_PROPERTY_ID, response.getTaskId(), requestedIds);
+        setResourceProperty(resource, TASK_STAGE_ID_PROPERTY_ID, response.getStageId(), requestedIds);
+        setResourceProperty(resource, TASK_HOST_NAME_PROPERTY_ID, response.getHostName(), requestedIds);
+        setResourceProperty(resource, TASK_ROLE_PROPERTY_ID, response.getRole(), requestedIds);
+        setResourceProperty(resource, TASK_COMMAND_PROPERTY_ID, response.getCommand(), requestedIds);
+        setResourceProperty(resource, TASK_STATUS_PROPERTY_ID, response.getStatus(), requestedIds);
+        setResourceProperty(resource, TASK_EXIT_CODE_PROPERTY_ID, response.getExitCode(), requestedIds);
+        setResourceProperty(resource, TASK_STDERR_PROPERTY_ID, response.getStderr(), requestedIds);
+        setResourceProperty(resource, TASK_STOUT_PROPERTY_ID, response.getStdout(), requestedIds);
+        setResourceProperty(resource, TASK_START_TIME_PROPERTY_ID, response.getStartTime(), requestedIds);
+        setResourceProperty(resource, TASK_ATTEMPT_CNT_PROPERTY_ID, response.getAttemptCount(), requestedIds);
+        resources.add(resource);
+      }
     }
     return resources;
   }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/handlers/QueryCreateHandlerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/handlers/QueryCreateHandlerTest.java
index b063065..f6e3ebd 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/handlers/QueryCreateHandlerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/handlers/QueryCreateHandlerTest.java
@@ -149,7 +149,7 @@
     expect(body.getNamedPropertySets()).andReturn(setRequestProps).anyTimes();
 
     expect(resourceInstance.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-    expect(resourceInstance.getIds()).andReturn(mapIds).anyTimes();
+    expect(resourceInstance.getKeyValueMap()).andReturn(mapIds).anyTimes();
     expect(resourceInstance.getSubResources()).andReturn(mapSubResources).anyTimes();
 
     expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
@@ -282,7 +282,7 @@
     expect(body.getNamedPropertySets()).andReturn(setRequestProps).anyTimes();
 
     expect(resourceInstance.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-    expect(resourceInstance.getIds()).andReturn(mapIds).anyTimes();
+    expect(resourceInstance.getKeyValueMap()).andReturn(mapIds).anyTimes();
 
     expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
     expect(controller.getSchema(Resource.Type.Service)).andReturn(serviceSchema).anyTimes();
@@ -385,7 +385,7 @@
     expect(body.getNamedPropertySets()).andReturn(setRequestProps).anyTimes();
 
     expect(resourceInstance.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-    expect(resourceInstance.getIds()).andReturn(mapIds).anyTimes();
+    expect(resourceInstance.getKeyValueMap()).andReturn(mapIds).anyTimes();
     expect(resourceInstance.getSubResources()).andReturn(mapSubResources).anyTimes();
 
     expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
@@ -459,7 +459,7 @@
     expect(body.getNamedPropertySets()).andReturn(setRequestProps).anyTimes();
 
     expect(resourceInstance.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-    expect(resourceInstance.getIds()).andReturn(mapIds).anyTimes();
+    expect(resourceInstance.getKeyValueMap()).andReturn(mapIds).anyTimes();
 
     expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
     expect(controller.getSchema(Resource.Type.Service)).andReturn(serviceSchema).anyTimes();
@@ -568,7 +568,7 @@
     expect(body.getNamedPropertySets()).andReturn(setRequestProps).anyTimes();
 
     expect(resourceInstance.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-    expect(resourceInstance.getIds()).andReturn(mapIds).anyTimes();
+    expect(resourceInstance.getKeyValueMap()).andReturn(mapIds).anyTimes();
     expect(resourceInstance.getSubResources()).andReturn(mapSubResources).anyTimes();
 
     expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
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 1667499..f98ada8 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
@@ -71,7 +71,7 @@
     setExpected.add(mapExpected);
 
     //expectations
-    expect(resource.getIds()).andReturn(mapResourceIds);
+    expect(resource.getKeyValueMap()).andReturn(mapResourceIds);
     expect(resource.getResourceDefinition()).andReturn(resourceDefinition).atLeastOnce();
     expect(resourceDefinition.getType()).andReturn(Resource.Type.Component);
     expect(controller.getSchema(Resource.Type.Component)).andReturn(schema);
@@ -112,7 +112,7 @@
     setExpected.add(mapExpected);
 
     //expectations
-    expect(resource.getIds()).andReturn(mapResourceIds);
+    expect(resource.getKeyValueMap()).andReturn(mapResourceIds);
     expect(resource.getResourceDefinition()).andReturn(resourceDefinition).atLeastOnce();
     expect(resourceDefinition.getType()).andReturn(Resource.Type.Component);
     expect(controller.getSchema(Resource.Type.Component)).andReturn(schema);
@@ -170,7 +170,7 @@
     setExpected.add(mapExpected2);
 
     //expectations
-    expect(resource.getIds()).andReturn(mapResourceIds);
+    expect(resource.getKeyValueMap()).andReturn(mapResourceIds);
     expect(resource.getResourceDefinition()).andReturn(resourceDefinition);
     expect(resourceDefinition.getType()).andReturn(Resource.Type.Component);
     expect(controller.getSchema(Resource.Type.Component)).andReturn(schema);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
index ec30a74..391ff99 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
@@ -58,6 +58,8 @@
 
     RepositoryResponse rr = new RepositoryResponse(VAL_BASE_URL, VAL_OS,
         VAL_REPO_ID, VAL_REPO_NAME, null, null);
+    rr.setStackName(VAL_STACK_NAME);
+    rr.setStackVersion(VAL_STACK_VERSION);
     Set<RepositoryResponse> allResponse = new HashSet<RepositoryResponse>();
     allResponse.add(rr);