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);
     
