http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
index df8cfd1,5e995da..a72e052
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/registry/RegistryManager.java
@@@ -32,7 -34,8 +34,9 @@@ import org.apache.stratos.autoscaler.ut
  import org.apache.stratos.autoscaler.util.Serializer;
  import org.apache.stratos.autoscaler.util.ServiceReferenceHolder;
  import 
org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+ import org.apache.stratos.messaging.domain.applications.Application;
+ import org.apache.stratos.messaging.domain.applications.Applications;
 +import org.apache.stratos.common.kubernetes.KubernetesGroup;
  import org.wso2.carbon.registry.core.Registry;
  import org.wso2.carbon.registry.core.Resource;
  import org.wso2.carbon.registry.core.exceptions.RegistryException;
@@@ -141,6 -144,68 +145,69 @@@ public class RegistryManager 
          }
      }
  
+ 
++
+     public void persistApplication (Application application) {
+ 
+         String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.APPLICATIONS_RESOURCE +
+                 "/" + application.getUniqueIdentifier();
+         persist(application, resourcePath);
+         if(log.isDebugEnabled()) {
+             log.debug("Application [ " + application.getUniqueIdentifier() +
+                     " ] persisted successfully in the Autoscaler Registry");
+         }
+     }
+ 
+     public String [] getApplicationResourcePaths () {
+         Object obj = retrieve(AutoScalerConstants.AUTOSCALER_RESOURCE +
+                 AutoScalerConstants.APPLICATIONS_RESOURCE);
+ 
+         if (obj != null) {
+             if (obj instanceof String []) {
+                 return (String []) obj;
+             } else {
+                 log.warn("Expected object type not found for Applications in 
Registry");
+                 return null;
+             }
+         }
+         return null;
+     }
+ 
+     public Application getApplication (String applicationResourcePath) {
+         Object obj = retrieve(applicationResourcePath);
+ 
+         if (obj != null) {
+             if (obj instanceof Application) {
+                 return (Application) obj;
+             } else {
+                 log.warn("Expected object type not found for Application " + 
applicationResourcePath + " in Registry");
+                 return null;
+             }
+         }
+         return null;
+     }
+ 
+     public void removeApplication (String applicationId) {
+         delete(AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.APPLICATIONS_RESOURCE +
+                 "/" + applicationId);
+     }
+ 
+     public void persistServiceGroup(ServiceGroup servicegroup) {
+         if(servicegroup == null || 
StringUtils.isEmpty(servicegroup.getName())){
+             throw new  IllegalArgumentException("Service group or group name 
can not be null");
+         }
+         String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.SERVICE_GROUP + "/" + servicegroup.getName();
+         persist(servicegroup, resourcePath);
+         if(log.isDebugEnabled()) {
+             log.debug(String.format("Persisted service group %s at path %s", 
servicegroup.getName(), resourcePath));
+         }
+     }
+ 
+     public boolean serviceGroupExist(String serviceGroupName){
+         String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.SERVICE_GROUP + "/" + serviceGroupName;
+         return this.resourceExist(resourcePath);
+     }
+     
      private Object retrieve(String resourcePath) {
          try {
              Resource resource = registryService.get(resourcePath);
@@@ -286,99 -353,91 +357,138 @@@
          return depPolicyList;
      }
  
-     public void removeAutoscalerPolicy(AutoscalePolicy autoscalePolicy) {
-         String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.AS_POLICY_RESOURCE + "/" + autoscalePolicy.getId();
-         this.delete(resourcePath);
-         if (log.isDebugEnabled()) {
-             log.debug(String.format("Autoscaler policy deleted from registry: 
[id] %s [name] %s [description] %s",
-                     autoscalePolicy.getId(), 
autoscalePolicy.getDisplayName(), autoscalePolicy.getDescription()));
+     public ServiceGroup getServiceGroup(String name) throws Exception{
+         String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.SERVICE_GROUP + "/" + name;
+         Object serializedObj = registryManager.retrieve(resourcePath);
+         ServiceGroup group = null;
+         if (serializedObj != null) {
+ 
+                 Object dataObj = 
Deserializer.deserializeFromByteArray((byte[]) serializedObj);
+                 if (dataObj instanceof ServiceGroup) {
+                     group = (ServiceGroup) dataObj;
+                     if(log.isDebugEnabled()) {
+                         log.debug(group.toString());
+                     }
+                 } else {
+                     return null;
+                 }
          }
  
+         return group;
      }
  
-     public void removeDeploymentPolicy(DeploymentPolicy depPolicy) {
-         String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.DEPLOYMENT_POLICY_RESOURCE;
-         this.delete(resourcePath);
-         if (log.isDebugEnabled()) {
-             log.debug(String.format("Deployment policy deleted from registry: 
[id] %s",
-                     depPolicy.getId()));
+     public ServiceGroup removeServiceGroup(String name) throws Exception{
+         String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE +
+                                                     
AutoScalerConstants.SERVICE_GROUP + "/" + name;
+         Object serializedObj = registryManager.retrieve(resourcePath);
+         ServiceGroup group = null;
+         if (serializedObj != null) {
+             Object dataObj = Deserializer.deserializeFromByteArray((byte[]) 
serializedObj);
+             if (dataObj instanceof ServiceGroup) {
+                 group = (ServiceGroup) dataObj;
+                 if(log.isDebugEnabled()) {
+                     log.debug(group.toString());
+                 }
+             } else {
+                 return null;
+             }
          }
-     }
  
-     public void removeNetworkPartition(String networkPartition) {
-         String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.NETWORK_PARTITION_LB_HOLDER_RESOURCE;
-         this.delete(resourcePath);
-         if (log.isDebugEnabled()) {
-             log.debug(String.format("Network partition deleted from registry: 
[id] %s",
-                     networkPartition));
-         }
+         return group;
      }
  
+       public void removeAutoscalerPolicy(AutoscalePolicy autoscalePolicy) {
+                String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE 
+ AutoScalerConstants.AS_POLICY_RESOURCE + "/" + autoscalePolicy.getId();
+          this.delete(resourcePath);
+            if(log.isDebugEnabled()) {
+                 log.debug(String.format("Autoscaler policy deleted from 
registry: [id] %s [name] %s [description] %s",
+                           autoscalePolicy.getId(), 
autoscalePolicy.getDisplayName(), autoscalePolicy.getDescription()));
+            }
+               
+       }
+       
+       public void removeDeploymentPolicy(DeploymentPolicy depPolicy){
+               String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.DEPLOYMENT_POLICY_RESOURCE;
+               this.delete(resourcePath);
+               if(log.isDebugEnabled()) {
+                 log.debug(String.format("Deployment policy deleted from 
registry: [id] %s" ,
+                                 depPolicy.getId()));
+            }
+       }
+       
+       public void removeNetworkPartition(String networkPartition){
+               String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.NETWORK_PARTITION_LB_HOLDER_RESOURCE;
+               this.delete(resourcePath);
+               if(log.isDebugEnabled()) {
+                 log.debug(String.format("Network partition deleted from 
registry: [id] %s" ,
+                                 networkPartition));
+            }
+       }
 -      
  
 -      private void delete(String resourcePath) {
 -               try {
 -                  registryService.beginTransaction();
 -                  registryService.delete(resourcePath);                  
 -                  registryService.commitTransaction();
 -              } catch (RegistryException e) {
 -                  try {
 -                      registryService.rollbackTransaction();
 -                  } catch (RegistryException e1) {
 -                      if(log.isErrorEnabled()) {
 -                          log.error("Could not rollback transaction", e);
 -                      }
 -                  }
 -                  log.error("Could not delete resource at "+ resourcePath);
 -                  throw new AutoScalerException("Could not delete data in 
registry at " + resourcePath, e);
 -              }
 +    private void delete(String resourcePath) {
 +        try {
 +            registryService.beginTransaction();
 +            registryService.delete(resourcePath);
 +            registryService.commitTransaction();
 +        } catch (RegistryException e) {
 +            try {
 +                registryService.rollbackTransaction();
 +            } catch (RegistryException e1) {
 +                if (log.isErrorEnabled()) {
 +                    log.error("Could not rollback transaction", e);
 +                }
 +            }
 +            log.error("Could not delete resource at " + resourcePath);
 +            throw new AutoScalerException("Could not delete data in registry 
at " + resourcePath, e);
 +        }
 +
 +    }
  
 -      }
 +    public void persistKubernetesGroup(KubernetesGroup kubernetesGroup) {
 +        String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.KUBERNETES_RESOURCE
 +                + "/" + kubernetesGroup.getGroupId();
 +        persist(kubernetesGroup, resourcePath);
 +        if (log.isDebugEnabled()) {
 +            log.debug(String.format("KubernetesGroup written to registry: 
[id] %s ", kubernetesGroup.getGroupId()));
 +        }
 +    }
 +
 +    public List<KubernetesGroup> retrieveKubernetesGroups() {
 +        List<KubernetesGroup> kubernetesGroupList = new 
ArrayList<KubernetesGroup>();
 +        RegistryManager registryManager = RegistryManager.getInstance();
 +        String[] kubernetesGroupResourceList = (String[]) 
registryManager.retrieve(AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.KUBERNETES_RESOURCE);
 +
 +        if (kubernetesGroupResourceList != null) {
 +            KubernetesGroup kubernetesGroup;
 +            for (String resourcePath : kubernetesGroupResourceList) {
 +                Object serializedObj = registryManager.retrieve(resourcePath);
 +                if (serializedObj != null) {
 +                    try {
 +                        Object dataObj = 
Deserializer.deserializeFromByteArray((byte[]) serializedObj);
 +                        if (dataObj instanceof KubernetesGroup) {
 +                            kubernetesGroup = (KubernetesGroup) dataObj;
 +                            if (log.isDebugEnabled()) {
 +                                log.debug(kubernetesGroup.toString());
 +                            }
 +                            kubernetesGroupList.add(kubernetesGroup);
 +                        } else {
 +                            return null;
 +                        }
 +                    } catch (Exception e) {
 +                        String msg = "Unable to retrieve data from Registry. 
Hence, any historical Kubernetes groups deployments will not get reflected.";
 +                        log.warn(msg, e);
 +                    }
 +                }
 +            }
 +        }
 +        return kubernetesGroupList;
 +    }
 +
 +    public void removeKubernetesGroup(KubernetesGroup kubernetesGroup) {
 +        String resourcePath = AutoScalerConstants.AUTOSCALER_RESOURCE + 
AutoScalerConstants.KUBERNETES_RESOURCE + "/" + kubernetesGroup.getGroupId();
 +        this.delete(resourcePath);
 +        if (log.isDebugEnabled()) {
 +            log.debug(String.format("Kubernetes group deleted from registry: 
[id] %s", kubernetesGroup.getGroupId()));
 +        }
 +    }
  }

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
index 73d85f0,3586420..d828309
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
@@@ -23,9 -23,14 +23,15 @@@ import org.apache.commons.logging.LogFa
  import org.apache.stratos.autoscaler.AutoscalerContext;
  import org.apache.stratos.autoscaler.NetworkPartitionContext;
  import org.apache.stratos.autoscaler.PartitionContext;
+ import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
+ import 
org.apache.stratos.autoscaler.applications.topic.ApplicationsEventPublisher;
+ import 
org.apache.stratos.autoscaler.grouping.topic.ClusterStatusEventPublisher;
+ import org.apache.stratos.autoscaler.monitor.AbstractClusterMonitor;
 -import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor;
+ import org.apache.stratos.messaging.domain.applications.*;
 +import org.apache.stratos.autoscaler.grouping.topic.StatusEventPublisher;
 +import org.apache.stratos.autoscaler.monitor.cluster.VMClusterMonitor;
  import org.apache.stratos.messaging.domain.topology.*;
+ import 
org.apache.stratos.messaging.message.receiver.applications.ApplicationManager;
  import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
  
  import java.util.Map;

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java
index b68f16d,3587afe..f5fede9
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoScalerConstants.java
@@@ -39,18 -38,12 +39,21 @@@ public final class AutoScalerConstants 
        public static final String NETWORK_PARTITION_LB_HOLDER_RESOURCE = 
"/network-partitions";
        public static final String AS_POLICY_RESOURCE = 
"/policies/autoscalingPolicies";
        public static final String DEPLOYMENT_POLICY_RESOURCE = 
"/policies/deploymentPolicies";
- 
+     public static final String APPLICATIONS_RESOURCE = "/applications";
  
      /**
 -     * Configs
 +     * Cluster monitoring  interval
       */
+     public static final String AUTOSCALER_MONITOR_INTERVAL = 
"autoscaler.monitorInterval";
+ 
+     public static final String SERVICE_GROUP = "/groups";
 +    public static final String VMService_Cluster_MONITOR_INTERVAL = 
"autoscaler.monitorInterval.vm.service";
 +    public static final String VMLb_Cluster_MONITOR_INTERVAL = 
"autoscaler.monitorInterval.vm.lb";
 +    public static final String KubernetesService_Cluster_MONITOR_INTERVAL = 
"autoscaler.monitorInterval.kubernetes.service";
 +
 +    /**
 +     * PortRange min max
 +     */
 +    public static final int PORT_RANGE_MAX = 65535;
 +    public static final int PORT_RANGE_MIN = 1;
  }

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
index e7c16fe,835e284..93aa988
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
@@@ -27,8 -22,15 +27,16 @@@ import javax.xml.namespace.QName
  import org.apache.axiom.om.OMElement;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
+ import org.apache.stratos.autoscaler.registry.RegistryManager;
+ import org.apache.stratos.cloud.controller.stub.pojo.Property;
  import org.apache.stratos.cloud.controller.stub.pojo.Properties;
 +import org.apache.stratos.cloud.controller.stub.pojo.Property;
+ import org.apache.stratos.messaging.domain.applications.Application;
+ import org.apache.stratos.messaging.domain.applications.Applications;
+ 
+ 
+ import javax.xml.namespace.QName;
+ import java.util.*;
  
  /**
   * This class contains utility methods used by Autoscaler.

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/CloudControllerService.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java
index 604aed8,8aa3d4f..19efc44
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/internal/CloudControllerDSComponent.java
@@@ -79,20 -78,19 +78,25 @@@ public class CloudControllerDSComponen
              InstanceStatusEventMessageDelegator delegator = new 
InstanceStatusEventMessageDelegator();
              Thread tdelegator = new Thread(delegator);
              tdelegator.start();
 +            if(log.isInfoEnabled()) {
 +                log.info("Instance status message receiver thread started");
 +            }
  
 +            ApplicationStatusTopicReceiver applicationStatusTopicReceiver = 
new ApplicationStatusTopicReceiver();
 +            Thread appThread = new Thread(applicationStatusTopicReceiver);
+             clusterStatusTopicReceiver = new ClusterStatusTopicReceiver();
+             Thread appThread = new Thread(clusterStatusTopicReceiver);
              appThread.start();
 +            if(log.isInfoEnabled()) {
 +                log.info("Application status message receiver thread 
started");
+             if (log.isDebugEnabled()) {
+                 log.debug("Cluster status Receiver thread started");
              }
  
 -              
                // Register cloud controller service
              BundleContext bundleContext = context.getBundleContext();
-             
bundleContext.registerService(CloudControllerService.class.getName(), new 
CloudControllerServiceImpl(), null);
+             
bundleContext.registerService(CloudControllerService.class.getName(),
+                     new CloudControllerServiceImpl(), null);
  
              if(log.isInfoEnabled()) {
                  log.info("Scheduling tasks");

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java
index 662e481,0000000..3db9f71
mode 100644,000000..100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/payload/MetaDataHolder.java
@@@ -1,102 -1,0 +1,99 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *  http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
 +
 +package org.apache.stratos.cloud.controller.pojo.payload;
 +
- import java.io.Serializable;
 +import java.util.Properties;
 +
 +/**
 + * Holds payload/meta data related to a cluster
 + */
 +
- public class MetaDataHolder implements Serializable {
- 
-     private static final long serialVersionUID = -3015788285718847360L;
++public class MetaDataHolder {
 +
 +    private String appId;
 +
 +    private String groupName;
 +
 +    private String clusterId;
 +
 +    private Properties properties;
 +
 +    public MetaDataHolder (String appId, String clusterId) {
 +
 +        this.appId = appId;
 +        this.clusterId = clusterId;
 +    }
 +
 +    public MetaDataHolder(String appId, String groupName, String clusterId) {
 +
 +        this.appId = appId;
 +        this.groupName = groupName;
 +        this.clusterId = clusterId;
 +    }
 +
 +    public String getAppId() {
 +        return appId;
 +    }
 +
 +    public String getGroupName() {
 +        return groupName;
 +    }
 +
 +    public String getClusterId() {
 +        return clusterId;
 +    }
 +
 +    public boolean equals(Object other) {
 +
 +        if(other == null || !(other instanceof MetaDataHolder)) {
 +            return false;
 +        }
 +
 +        if(this == other) {
 +            return true;
 +        }
 +
 +        MetaDataHolder that = (MetaDataHolder)other;
 +
 +        if (this.groupName == null || that.groupName == null) {
 +            return this.appId.equals(that.appId) && 
this.clusterId.equals(that.clusterId);
 +        } else {
 +            return this.appId.equals(that.appId) && 
this.groupName.equals(that.groupName) &&
 +                    this.clusterId.equals(that.clusterId);
 +        }
 +    }
 +
 +    public int hashCode () {
 +
 +        if (this.getGroupName() == null) {
 +            return this.appId.hashCode() + this.clusterId.hashCode();
 +        } else {
 +            return this.appId.hashCode() + this.groupName.hashCode() + 
this.clusterId.hashCode();
 +        }
 +    }
 +
 +    public Properties getProperties() {
 +        return properties;
 +    }
 +
 +    public void setProperties(Properties properties) {
 +        this.properties = properties;
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
index 2c01be7,0ec8f01..eebc077
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
@@@ -23,16 -22,14 +23,15 @@@ import org.apache.commons.logging.Log
  import org.apache.commons.logging.LogFactory;
  import 
org.apache.stratos.cloud.controller.exception.InvalidCartridgeTypeException;
  import org.apache.stratos.cloud.controller.exception.InvalidMemberException;
- import org.apache.stratos.cloud.controller.pojo.*;
  import org.apache.stratos.cloud.controller.pojo.Cartridge;
- import org.apache.stratos.cloud.controller.pojo.payload.MetaDataHolder;
+ import org.apache.stratos.cloud.controller.pojo.*;
  import 
org.apache.stratos.cloud.controller.publisher.CartridgeInstanceDataPublisher;
- import org.apache.stratos.cloud.controller.registry.RegistryManager;
  import org.apache.stratos.cloud.controller.runtime.FasterLookUpDataHolder;
  import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 +import org.apache.stratos.common.constants.StratosConstants;
  import org.apache.stratos.messaging.domain.topology.*;
- import org.apache.stratos.messaging.event.application.status.*;
+ import 
org.apache.stratos.messaging.event.applications.ApplicationTerminatedEvent;
+ import org.apache.stratos.messaging.event.cluster.status.*;
  import 
org.apache.stratos.messaging.event.instance.status.InstanceActivatedEvent;
  import 
org.apache.stratos.messaging.event.instance.status.InstanceMaintenanceModeEvent;
  import 
org.apache.stratos.messaging.event.instance.status.InstanceReadyToShutdownEvent;
@@@ -57,10 -54,10 +56,10 @@@ public class TopologyBuilder 
          Service service;
          Topology topology = TopologyManager.getTopology();
          if (cartridgeList == null) {
 -            log.warn(String.format("Cartridge list is empty"));
 -            return;
 +              log.warn(String.format("Cartridge list is empty"));
 +              return;
          }
-         
+ 
          try {
  
              TopologyManager.acquireWriteLock();
@@@ -168,20 -229,10 +231,19 @@@
  
          } finally {
              TopologyManager.releaseWriteLock();
-         }
-         **/
+         }*/
      }
  
 -    public static void handleClusterRemoved(ClusterContext ctxt) {
 +
 +    private static void setKubernetesCluster(Cluster cluster) {  
 +      boolean isKubernetesCluster = 
(cluster.getProperties().getProperty(StratosConstants.KUBERNETES_CLUSTER_ID) != 
null);
 +              if (log.isDebugEnabled()) {
 +                      log.debug(" Kubernetes Cluster ["+ isKubernetesCluster 
+ "] ");
 +              }
 +              cluster.setKubernetesCluster(isKubernetesCluster);              
 +      }
 +
 +      public static void handleClusterRemoved(ClusterContext ctxt) {
          Topology topology = TopologyManager.getTopology();
          Service service = topology.getService(ctxt.getCartridgeType());
          String deploymentPolicy;
@@@ -545,122 -567,8 +607,118 @@@
          }
      }
  
-     public static synchronized void handleApplicationDeployed(Application 
application,
-                                                  
Set<ApplicationClusterContext> applicationClusterContexts,
-                                                  Set<MetaDataHolder> 
metaDataHolders) {
- 
- 
+     public static void 
handleClusterActivatedEvent(ClusterStatusClusterActivatedEvent 
clusterActivatedEvent) {
          Topology topology = TopologyManager.getTopology();
 +        try {
 +            TopologyManager.acquireWriteLock();
 +
 +            if 
(topology.applicationExists(application.getUniqueIdentifier())) {
 +                log.warn("Application with id [ " + 
application.getUniqueIdentifier() + " ] already exists in Topology");
 +                return;
 +            }
 +            List<Cluster> clusters = new ArrayList<Cluster>();
 +            for (ApplicationClusterContext applicationClusterContext : 
applicationClusterContexts) {
 +                Cluster cluster = new 
Cluster(applicationClusterContext.getCartridgeType(),
 +                        applicationClusterContext.getClusterId(), 
applicationClusterContext.getDeploymentPolicyName(),
 +                        applicationClusterContext.getAutoscalePolicyName(), 
application.getUniqueIdentifier());
 +                //cluster.setStatus(Status.Created);
 +                cluster.addHostName(applicationClusterContext.getHostName());
 +                
cluster.setTenantRange(applicationClusterContext.getTenantRange());
 +                cluster.setLbCluster(applicationClusterContext.isLbCluster());
 +                
cluster.setKubernetesCluster(applicationClusterContext.isKubernetesCluster());
 +                
cluster.setProperties(CloudControllerUtil.toJavaUtilProperties(applicationClusterContext.getProperties()));
 +                clusters.add(cluster);
 +
 +                Service service = 
topology.getService(applicationClusterContext.getCartridgeType());
 +                if (service != null) {
 +                    service.addCluster(cluster);
 +                    log.info("Added Cluster " + cluster.toString() + " to 
Topology for Application with id: " + application.getUniqueIdentifier());
 +                } else {
 +                    log.error("Service " + 
applicationClusterContext.getCartridgeType() + " not found");
 +                    return;
 +                }
 +            }
 +
 +            // add to Topology and update
 +            topology.addApplication(application);
 +            TopologyManager.updateTopology(topology);
 +
 +            log.info("Application with id [ " + 
application.getUniqueIdentifier() + " ] added to Topology successfully");
 +            
org.apache.stratos.messaging.event.topology.ApplicationCreatedEvent 
applicationCreatedEvent = new 
org.apache.stratos.messaging.event.topology.ApplicationCreatedEvent(application,
 clusters);
 +            
TopologyEventPublisher.sendApplicationCreatedEvent(applicationCreatedEvent);
 +
 +        } finally {
 +            TopologyManager.releaseWriteLock();
 +        }
 +    }
 +
 +    public static synchronized void handleApplicationUndeployed(String 
applicationId) {
 +
 +        Set<ClusterDataHolder> clusterData;
 +
 +        // update the Application and Cluster Statuses as 'Terminating'
 +        TopologyManager.acquireWriteLock();
 +
 +        try {
 +
 +            Topology topology = TopologyManager.getTopology();
 +
 +            if (!topology.applicationExists(applicationId)) {
 +                log.warn("Application with id [ " + applicationId + " ] 
doesn't exist in Topology");
 +                return;
 +            }
 +
 +            Application application = topology.getApplication(applicationId);
 +            // check and update application status to 'Terminating'
 +            if 
(!application.isStateTransitionValid(ApplicationStatus.Terminating)) {
 +                log.error("Invalid state transfer from " + 
application.getStatus() + " to " + ApplicationStatus.Terminating);
 +            }
 +            // for now anyway update the status forcefully
 +            application.setStatus(ApplicationStatus.Terminating);
 +
 +            // update all the Clusters' statuses to 'Terminating'
 +            clusterData = application.getClusterDataRecursively();
 +            for (ClusterDataHolder clusterDataHolder : clusterData) {
 +                Service service = 
topology.getService(clusterDataHolder.getServiceType());
 +                if (service != null) {
 +                    Cluster aCluster = 
service.getCluster(clusterDataHolder.getClusterId());
 +                    if (aCluster != null) {
 +                        // validate state transition
 +                        if 
(!aCluster.isStateTransitionValid(ClusterStatus.Terminating)) {
 +                            log.error("Invalid state transfer from " + 
aCluster.getStatus() + " to "
 +                                    + ClusterStatus.Terminating);
 +                        }
 +                        // for now anyway update the status forcefully
 +                        aCluster.setStatus(ClusterStatus.Terminating);
 +
 +                    } else {
 +                        log.warn("Unable to find Cluster with cluster id " + 
clusterDataHolder.getClusterId() +
 +                        " in Topology");
 +                    }
 +
 +                } else {
 +                    log.warn("Unable to remove cluster with cluster id: " + 
clusterDataHolder.getClusterId() + " from Topology, " +
 +                            " associated Service [ " + 
clusterDataHolder.getServiceType() + " ] not found");
 +                }
 +            }
 +
 +            // update all Group's statuses to 'Terminating'
 +            if (application.getGroups() != null) {
 +                updateGroupStatusesRecursively(GroupStatus.Terminating, 
application.getGroups());
 +            }
 +
 +            TopologyManager.updateTopology(topology);
 +
 +        } finally {
 +            TopologyManager.releaseWriteLock();
 +        }
 +
 +        TopologyEventPublisher.sendApplicationUndeployedEvent(applicationId, 
clusterData);
 +    }
 +
 +
 +    public static void 
handleClusterActivatedEvent(AppStatusClusterActivatedEvent 
clusterActivatedEvent) {
 +        Topology topology = TopologyManager.getTopology();
          Service service = 
topology.getService(clusterActivatedEvent.getServiceName());
          //update the status of the cluster
          if (service == null) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
index b561afe,3f58080..aff2b6d
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
@@@ -44,53 -43,57 +46,70 @@@ import java.util.Set
  public class TopologyEventPublisher {
      private static final Log log = 
LogFactory.getLog(TopologyEventPublisher.class);
  
 -
 -    public static void sendServiceCreateEvent(List<Cartridge> cartridgeList) {
 -        ServiceCreatedEvent serviceCreatedEvent;
 -        for(Cartridge cartridge : cartridgeList) {
 -            serviceCreatedEvent = new 
ServiceCreatedEvent(cartridge.getType(), (cartridge.isMultiTenant() ? 
ServiceType.MultiTenant : ServiceType.SingleTenant));
 -
 -            // Add ports to the event
 -            Port port;
 -            List<PortMapping> portMappings = cartridge.getPortMappings();
 -            for(PortMapping portMapping : portMappings) {
 -                port = new Port(portMapping.getProtocol(),
 -                        Integer.parseInt(portMapping.getPort()),
 -                        Integer.parseInt(portMapping.getProxyPort()));
 -                serviceCreatedEvent.addPort(port);
 -            }
 -
 -            if(log.isInfoEnabled()) {
 -                log.info(String.format("Publishing service created event: 
[service] %s", cartridge.getType()));
 -            }
 -            publishEvent(serviceCreatedEvent);
 -        }
 -    }
 -
 -    public static void sendServiceRemovedEvent(List<Cartridge> cartridgeList) 
{
 -        ServiceRemovedEvent serviceRemovedEvent;
 -        for(Cartridge cartridge : cartridgeList) {
 -            serviceRemovedEvent = new 
ServiceRemovedEvent(cartridge.getType());
 -            if(log.isInfoEnabled()) {
 -                log.info(String.format("Publishing service removed event: 
[service] %s", serviceRemovedEvent.getServiceName()));
 -            }
 -            publishEvent(serviceRemovedEvent);
 -        }
 -    }
 -
 +      public static void sendServiceCreateEvent(List<Cartridge> 
cartridgeList) {
 +              ServiceCreatedEvent serviceCreatedEvent;
 +              for (Cartridge cartridge : cartridgeList) {
 +                      serviceCreatedEvent = new 
ServiceCreatedEvent(cartridge.getType(),
 +                                      (cartridge.isMultiTenant() ? 
ServiceType.MultiTenant
 +                                                      : 
ServiceType.SingleTenant));
 +
 +                      // Add ports to the event
 +                      Port port;
 +                      List<PortMapping> portMappings = 
cartridge.getPortMappings();
 +                      for (PortMapping portMapping : portMappings) {
 +                              port = new Port(portMapping.getProtocol(),
 +                                              
Integer.parseInt(portMapping.getPort()),
 +                                              
Integer.parseInt(portMapping.getProxyPort()));
 +                              serviceCreatedEvent.addPort(port);
 +                      }
 +
 +                      if (log.isInfoEnabled()) {
 +                              log.info(String.format(
 +                                              "Publishing service created 
event: [service] %s",
 +                                              cartridge.getType()));
 +                      }
 +                      publishEvent(serviceCreatedEvent);
 +              }
 +      }
 +
 +      public static void sendServiceRemovedEvent(List<Cartridge> 
cartridgeList) {
 +              ServiceRemovedEvent serviceRemovedEvent;
 +              for (Cartridge cartridge : cartridgeList) {
 +                      serviceRemovedEvent = new 
ServiceRemovedEvent(cartridge.getType());
 +                      if (log.isInfoEnabled()) {
 +                              log.info(String.format(
 +                                              "Publishing service removed 
event: [service] %s",
 +                                              
serviceRemovedEvent.getServiceName()));
 +                      }
 +                      publishEvent(serviceRemovedEvent);
 +              }
 +      }
 +
 +      public static void sendClusterCreatedEvent(String appId, String 
serviceName, String clusterId) {
 +              ClusterCreatedEvent clusterCreatedEvent = new 
ClusterCreatedEvent(appId, serviceName, clusterId);
 +
 +              if (log.isInfoEnabled()) {
 +                      log.info("Publishing cluster created event: " + 
clusterId);
 +              }
 +              publishEvent(clusterCreatedEvent);
 +      }
+     public static void sendClusterResetEvent(String appId, String 
serviceName, String clusterId) {
+         ClusterResetEvent clusterResetEvent = new 
ClusterResetEvent(appId,serviceName, clusterId);
+ 
+         if(log.isInfoEnabled()) {
+             log.info("Publishing cluster reset event: " + clusterId);
+         }
+         publishEvent(clusterResetEvent);
+     }
+ 
+     public static void sendClusterCreatedEvent(Cluster cluster) {
+         ClusterCreatedEvent clusterCreatedEvent = new 
ClusterCreatedEvent(cluster);
+ 
+         if(log.isInfoEnabled()) {
+             log.info("Publishing cluster created event: " + 
cluster.getClusterId());
+         }
+         publishEvent(clusterCreatedEvent);
+     }
  
      public static void sendApplicationCreatedEvent (ApplicationCreatedEvent 
applicationCreatedEvent) {
  

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java
index c1f0df8,7e33897..27c1640
--- 
a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java
+++ 
b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/AutoscalerServiceClient.java
@@@ -24,14 -24,12 +24,19 @@@ import org.apache.axis2.context.Configu
  import org.apache.axis2.transport.http.HTTPConstants;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
 +import org.apache.stratos.autoscaler.stub.*;
 +import org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy;
 +import org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup;
 +import org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost;
 +import org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster;
 +import org.apache.stratos.autoscaler.stub.policy.model.AutoscalePolicy;
+ import 
org.apache.stratos.autoscaler.applications.pojo.stub.ApplicationContext;
+ import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+ import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+ import org.apache.stratos.autoscaler.stub.*;
+ import org.apache.stratos.autoscaler.stub.pojo.ServiceGroup;
  import 
org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
 +import org.apache.stratos.cloud.controller.stub.pojo.Properties;
  import org.apache.stratos.manager.internal.DataHolder;
  import org.apache.stratos.manager.utils.CartridgeConstants;
  
@@@ -220,64 -212,21 +225,83 @@@ public class AutoscalerServiceClient 
      }
  
  
+     public ServiceGroup getServiceGroup(String serviceGroupDefinitionName) 
throws RemoteException {
+         return stub.getServiceGroup(serviceGroupDefinitionName);
+     }
+ 
+     public void deployServiceGroup(ServiceGroup serviceGroup) throws 
AutoScalerServiceInvalidServiceGroupExceptionException, RemoteException {
+         stub.deployServiceGroup(serviceGroup);
+     }
+ 
+     public void deployApplication (ApplicationContext applicationContext) 
throws
+             AutoScalerServiceApplicationDefinitionExceptionException, 
RemoteException {
+         stub.deployApplicationDefinition(applicationContext);
+     }
+ 
+     public void undeployApplication (String applicationId, int tenantId, 
String tenantDomain) throws
+             AutoScalerServiceApplicationDefinitionExceptionException, 
RemoteException {
+         stub.unDeployApplicationDefinition(applicationId, tenantId, 
tenantDomain);
+     }
++
++
 +    public String getServiceLBClusterId(String serviceType, String 
deploymentPolicy) throws RemoteException {
 +        return stub.getServiceLBClusterId(serviceType, deploymentPolicy);
 +    }
 +
 +    public boolean deployKubernetesGroup(KubernetesGroup kubernetesGroup) 
throws RemoteException,
 +            AutoScalerServiceInvalidKubernetesGroupExceptionException {
 +        return stub.addKubernetesGroup(kubernetesGroup);
 +    }
 +
 +    public boolean deployKubernetesHost(String kubernetesGroupId, 
KubernetesHost kubernetesHost)
 +            throws RemoteException, 
AutoScalerServiceInvalidKubernetesHostExceptionException,
 +            AutoScalerServiceNonExistingKubernetesGroupExceptionException {
 +
 +        return stub.addKubernetesHost(kubernetesGroupId, kubernetesHost);
 +    }
 +
 +    public boolean updateKubernetesMaster(KubernetesMaster kubernetesMaster)
 +            throws RemoteException, 
AutoScalerServiceInvalidKubernetesMasterExceptionException,
 +            AutoScalerServiceNonExistingKubernetesMasterExceptionException {
 +        return stub.updateKubernetesMaster(kubernetesMaster);
 +    }
 +
 +    public KubernetesGroup[] getAvailableKubernetesGroups() throws 
RemoteException {
 +        return stub.getAllKubernetesGroups();
 +    }
 +
 +    public KubernetesGroup getKubernetesGroup(String kubernetesGroupId)
 +            throws RemoteException, 
AutoScalerServiceNonExistingKubernetesGroupExceptionException {
 +        return stub.getKubernetesGroup(kubernetesGroupId);
 +    }
 +
 +    public boolean undeployKubernetesGroup(String kubernetesGroupId)
 +            throws RemoteException, 
AutoScalerServiceNonExistingKubernetesGroupExceptionException {
 +        return stub.removeKubernetesGroup(kubernetesGroupId);
 +    }
 +
 +    public boolean undeployKubernetesHost(String kubernetesHostId)
 +            throws RemoteException, 
AutoScalerServiceNonExistingKubernetesHostExceptionException {
 +        return stub.removeKubernetesHost(kubernetesHostId);
 +    }
 +
 +    public KubernetesHost[] getKubernetesHosts(String kubernetesGroupId)
 +            throws RemoteException, 
AutoScalerServiceNonExistingKubernetesGroupExceptionException {
 +        return stub.getHostsForKubernetesGroup(kubernetesGroupId);
 +    }
 +
 +    public KubernetesMaster getKubernetesMaster(String kubernetesGroupId)
 +            throws RemoteException, 
AutoScalerServiceNonExistingKubernetesGroupExceptionException {
 +        return stub.getMasterForKubernetesGroup(kubernetesGroupId);
 +    }
 +
 +    public boolean updateKubernetesHost(KubernetesHost kubernetesHost)
 +            throws RemoteException, 
AutoScalerServiceInvalidKubernetesHostExceptionException,
 +            AutoScalerServiceNonExistingKubernetesHostExceptionException {
 +        return stub.updateKubernetesHost(kubernetesHost);
 +    }
 +    
 +    public void updateClusterMonitor(String clusterId, Properties properties) 
throws RemoteException, AutoScalerServiceInvalidArgumentExceptionException {
 +        stub.updateClusterMonitor(clusterId, properties);
 +    }
  }

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/client/CloudControllerServiceClient.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
index c16c248,38956be..c59dd74
--- 
a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
+++ 
b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/parser/DefaultCompositeApplicationParser.java
@@@ -24,10 -24,12 +24,9 @@@ import org.apache.commons.logging.Log
  import org.apache.commons.logging.LogFactory;
  import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException;
  import org.apache.stratos.manager.client.CloudControllerServiceClient;
 -import 
org.apache.stratos.manager.composite.application.beans.ApplicationDefinition;
 -import org.apache.stratos.manager.composite.application.beans.GroupDefinition;
 -import 
org.apache.stratos.manager.composite.application.beans.SubscribableDefinition;
 -import 
org.apache.stratos.manager.composite.application.beans.SubscribableInfo;
 +import org.apache.stratos.manager.composite.application.beans.*;
  import 
org.apache.stratos.manager.composite.application.structure.CompositeAppContext;
  import 
org.apache.stratos.manager.composite.application.structure.GroupContext;
- import 
org.apache.stratos.manager.composite.application.structure.StartupOrder;
  import 
org.apache.stratos.manager.composite.application.structure.SubscribableContext;
  import 
org.apache.stratos.manager.composite.application.utils.ApplicationUtils;
  import 
org.apache.stratos.manager.exception.CompositeApplicationDefinitionException;
@@@ -213,17 -215,8 +211,17 @@@ public class DefaultCompositeApplicatio
                startupOrders = startupOrderList.toArray(startupOrders);
                  compositeAppContext.setStartupOrders(startupOrders);
  
-                 
compositeAppContext.setKillBehaviour(compositeAppDefinition.getComponents().getDependencies().getKillBehaviour());
+                 
compositeAppContext.setKillBehaviour(compositeAppDefinition.getComponents().getDependencies().getTerminationBehaviour());
              }
 +
 +            // Set application properties
 +            if(compositeAppDefinition.getProperty() != null) {
 +                Properties properties = new Properties();
 +                for(PropertyBean propertyBean : 
compositeAppDefinition.getProperty()) {
 +                     properties.put(propertyBean.getName(), 
propertyBean.getValue());
 +                }
 +                compositeAppContext.setProperties(properties);
 +            }
          }
  
          return compositeAppContext;

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
index 0000000,3c2814f..0ede0f1
mode 000000,100644..100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
@@@ -1,0 -1,212 +1,212 @@@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  *  http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing,
+  * software distributed under the License is distributed on an
+  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  * KIND, either express or implied.  See the License for the
+  * specific language governing permissions and limitations
+  * under the License.
+  */
+ 
+ package org.apache.stratos.messaging.domain.applications;
+ 
+ import java.io.Serializable;
+ import java.util.*;
+ 
+ /**
+  * Abstraction for a an entity that can have child entities
 - * in an Application withing the Topology
++ * in an Application within the Topology
+  */
+ 
+ public abstract class ParentComponent implements Serializable {
+ 
+     // Dependency Order
+     private DependencyOrder dependencyOrder;
+     // Group Map, key = Group.alias
+     private Map<String, Group> aliasToGroupMap;
+     // Cluster Id map, key = subscription alias for the cartridge type
+     private Map<String, ClusterDataHolder> aliasToClusterDataMap;
+     // Application status
+ 
+     public ParentComponent () {
+         aliasToGroupMap = new HashMap<String, Group>();
+         aliasToClusterDataMap = new HashMap<String, ClusterDataHolder>();
+     }
+ 
+     /**
+      * This method should be implemented in each concrete child class
+      * to return the unique identifier for each implementation
+      * ex.: group alias for a Group, app id for an Application
+      *
+      * @return unique identifier String
+      */
+     public abstract String getUniqueIdentifier ();
+ 
+     /**
+      * Adds a group
+      *
+      * @param group Group instance to be added
+      */
+     public void addGroup(Group group) {
+         aliasToGroupMap.put(group.getUniqueIdentifier(), group);
+     }
+ 
+     /**
+      * Setter for Group alias to Group map
+      *
+      * @param groupAliasToGroup Map, key = alias given to the Group, value = 
Group
+      */
+     public void setGroups(Map<String, Group> groupAliasToGroup) {
+         aliasToGroupMap.putAll(groupAliasToGroup);
+     }
+ 
+     /**
+      * Get the Group for the given alias in the context of the parent entity.
+      * Will not search recursively in the nested levels.
+      *
+      * @param groupAlias alias of the Group
+      * @return Group, if exists for the given alias, else null
+      */
+     public Group getGroup(String groupAlias) {
+         return aliasToGroupMap.get(groupAlias);
+     }
+ 
+     /**
+      * Get the Group for the given alias in the context of the parent entity.
+      * Will search recursively in the nested levels.
+      *
+      * @param groupAlias alias of the Group
+      * @return Group, if exists for the given alias, else null
+      */
+     public Group getGroupRecursively(String groupAlias) {
+ 
+         return travereAndCheckRecursively(aliasToGroupMap, groupAlias);
+     }
+ 
+     private Group travereAndCheckRecursively (Map<String,Group> 
aliasToGroupMap, String groupAlias) {
+ 
+         if (aliasToGroupMap.containsKey(groupAlias)) {
+             synchronized (aliasToGroupMap) {
+                 if (aliasToGroupMap.containsKey(groupAlias)) {
+                     return aliasToGroupMap.get(groupAlias);
+                 }
+             }
+         } else {
+             for (Group group : aliasToGroupMap.values()) {
+                 return travereAndCheckRecursively(group.getAliasToGroupMap(), 
groupAlias);
+             }
+         }
+ 
+         return null;
+     }
+ 
+     /**
+      * Getter for alias to Group map
+      * Will not search recursively in the nested levels.
+      *
+      * @return Map, key = alias given to the Group, value = Group
+      */
+     public Map<String, Group> getAliasToGroupMap() {
+         return this.aliasToGroupMap;
+     }
+ 
+     /**
+      * Getter for cluster alias to ClusterData map for this level
+      *
+      * @return Map, key = alias given to the cluster, value =  ClusterData 
object
+      */
+     public Map<String, ClusterDataHolder> getClusterDataMap() {
+         return this.aliasToClusterDataMap;
+     }
+ 
+     /**
+      * Collection of Groups in this level
+      *
+      * @return Group Collection object, empty if no Groups are found
+      */
+     public Collection<Group> getGroups() {
+         return aliasToGroupMap.values();
+     }
+ 
+     /**
+      * Setter for Dependency Order
+      *
+      * @param dependencyOrder Dependency Order object
+      */
+     public void setDependencyOrder(DependencyOrder dependencyOrder) {
+         this.dependencyOrder = dependencyOrder;
+     }
+ 
+     /**
+      * Getter for Dependency Order for this level
+      *
+      * @return Dependency Order object
+      */
+     public DependencyOrder getDependencyOrder() {
+         return dependencyOrder;
+     }
+ 
+     /**
+      * Setter for alias to Cluster Data map
+      *
+      * @param aliasToClusterData Map, key = alias given to the cluster, value 
=  ClusterData object
+      */
+     public void setClusterData(Map<String, ClusterDataHolder> 
aliasToClusterData) {
+         this.aliasToClusterDataMap.putAll(aliasToClusterData);
+     }
+ 
+     /**
+      * Getter for Cluster Data instance for the given alias
+      * Will not search recursively in the nested levels.
+      *
+      * @param alias
+      * @return
+      */
+     public ClusterDataHolder getClusterData(String alias) {
+         return aliasToClusterDataMap.get(alias);
+     }
+ 
+     /**
+      * Collects the Cluster Data for the parent component and all the
+      * child components recursively
+      *
+      * @return Set of ClusterDataHolder objects if available, else null
+      */
+     public Set<ClusterDataHolder> getClusterDataRecursively () {
+ 
+         Set<ClusterDataHolder> appClusterData = new 
HashSet<ClusterDataHolder>();
+ 
+         // get top level Cluster Data
+         if (this.aliasToClusterDataMap != null && 
!this.aliasToClusterDataMap.isEmpty()) {
+             appClusterData.addAll(this.aliasToClusterDataMap.values());
+         }
+ 
+         // find other nested Cluster Data (in the Groups)
+         if (getGroups() != null) {
+             getClusterData(appClusterData, getGroups());
+         }
+ 
+         return appClusterData;
+     }
+ 
+     private void getClusterData (Set<ClusterDataHolder> clusterData, 
Collection<Group> groups) {
+ 
+         for (Group group : groups) {
+             if (group.getClusterDataMap() != null && 
!group.getClusterDataMap().isEmpty()) {
+                 clusterData.addAll(group.getClusterDataMap().values());
+                 if (group.getGroups() != null) {
+                     getClusterData(clusterData, group.getGroups());
+                 }
+             }
+         }
+     }
+ }

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/applications/ApplicationsEventMessageListener.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/applications/ApplicationsEventMessageListener.java
index 0000000,936c174..e53e083
mode 000000,100644..100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/applications/ApplicationsEventMessageListener.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/applications/ApplicationsEventMessageListener.java
@@@ -1,0 -1,54 +1,74 @@@
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one
+  * or more contributor license agreements.  See the NOTICE file
+  * distributed with this work for additional information
+  * regarding copyright ownership.  The ASF licenses this file
+  * to you under the Apache License, Version 2.0 (the
+  * "License"); you may not use this file except in compliance
+  * with the License.  You may obtain a copy of the License at
+  *
+  *  http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing,
+  * software distributed under the License is distributed on an
+  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  * KIND, either express or implied.  See the License for the
+  * specific language governing permissions and limitations
+  * under the License.
+  */
 -package org.apache.stratos.messaging.message.receiver.applications;
++package org.apache.stratos.messaging.message.receiver.application.status;
+ 
++import org.apache.activemq.command.ActiveMQTextMessage;
+ import org.apache.commons.logging.Log;
+ import org.apache.commons.logging.LogFactory;
++import org.apache.stratos.messaging.util.Constants;
++import org.apache.stratos.messaging.util.Util;
++import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
++import org.eclipse.paho.client.mqttv3.MqttCallback;
++import org.eclipse.paho.client.mqttv3.MqttMessage;
+ 
+ import javax.jms.JMSException;
+ import javax.jms.Message;
+ import javax.jms.MessageListener;
+ import javax.jms.TextMessage;
+ 
 -public class ApplicationsEventMessageListener implements MessageListener {
 -    private static final Log log = 
LogFactory.getLog(ApplicationsEventMessageListener.class);
++public class ApplicationStatusEventMessageListener implements MqttCallback {
++    private static final Log log = 
LogFactory.getLog(ApplicationStatusEventMessageListener.class);
+ 
 -    private ApplicationsEventMessageQueue messageQueue;
++    private ApplicationStatusEventMessageQueue messageQueue;
+ 
 -    public ApplicationsEventMessageListener(ApplicationsEventMessageQueue 
messageQueue) {
++    public 
ApplicationStatusEventMessageListener(ApplicationStatusEventMessageQueue 
messageQueue) {
+         this.messageQueue = messageQueue;
+     }
+ 
+     @Override
 -    public void onMessage(Message message) {
 -        if (message instanceof TextMessage) {
 -            TextMessage receivedMessage = (TextMessage) message;
 -            try {
 -                if (log.isDebugEnabled()) {
 -                    log.debug(String.format("Tenant message received: %s", 
((TextMessage) message).getText()));
 -                }
 -                // Add received message to the queue
 -                messageQueue.add(receivedMessage);
 -
 -            } catch (JMSException e) {
 -                log.error(e.getMessage(), e);
++    public void connectionLost(Throwable throwable) {
++        log.warn("Connection is lost", throwable);
++    }
++
++    @Override
++    public void deliveryComplete(IMqttDeliveryToken deliveryToken) {
++        if (log.isDebugEnabled()) {
++            log.debug(String.format("Message delivery is complete: %s",
++                    ((deliveryToken != null) ? deliveryToken.toString() : 
"")));
++        }
++    }
++
++    @Override
++    public void messageArrived(String topicName, MqttMessage message) throws 
Exception {
++        TextMessage textMessage = new ActiveMQTextMessage();
++        textMessage.setText(new String(message.getPayload()));
++        textMessage.setStringProperty(Constants.EVENT_CLASS_NAME, 
Util.getEventNameForTopic(topicName));
++
++        try {
++            if (log.isDebugEnabled()) {
++                log.debug(String.format("Tenant message received: %s", 
textMessage.getText()));
+             }
++            // Add received message to the queue
++            messageQueue.add(textMessage);
++
++        } catch (JMSException e) {
++            log.error(e.getMessage(), e);
+         }
+     }
+ }

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
index 172f252,cb7d9b3..212a5d0
--- 
a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
+++ 
b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
@@@ -20,16 -20,12 +20,20 @@@
  package org.apache.stratos.rest.endpoint.bean.util.converter;
  
  import org.apache.commons.lang.StringUtils;
 +import org.apache.stratos.autoscaler.stub.kubernetes.PropertiesE;
 +import org.apache.stratos.autoscaler.stub.kubernetes.PropertyE;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
 +import 
org.apache.stratos.cloud.controller.pojo.application.xsd.ApplicationContext;
 +import 
org.apache.stratos.cloud.controller.pojo.application.xsd.ComponentContext;
 +import 
org.apache.stratos.cloud.controller.pojo.application.xsd.DependencyContext;
 +import org.apache.stratos.cloud.controller.pojo.application.xsd.GroupContext;
 +import 
org.apache.stratos.cloud.controller.pojo.application.xsd.SubscribableContext;
 +import 
org.apache.stratos.cloud.controller.pojo.application.xsd.SubscribableInfoContext;
+ import org.apache.stratos.autoscaler.applications.pojo.stub.DependencyContext;
+ import org.apache.stratos.autoscaler.applications.pojo.stub.GroupContext;
+ import 
org.apache.stratos.autoscaler.applications.pojo.stub.SubscribableContext;
+ import 
org.apache.stratos.autoscaler.applications.pojo.stub.SubscribableInfoContext;
  import org.apache.stratos.cloud.controller.stub.pojo.*;
  import 
org.apache.stratos.manager.composite.application.beans.ApplicationDefinition;
  import org.apache.stratos.manager.composite.application.beans.GroupDefinition;
@@@ -725,177 -677,16 +729,177 @@@ public class PojoConverter 
          for (Service service : services) {
              
serviceDefinitionBeans.add(convertToServiceDefinitionBean(service));
          }
 -
          return serviceDefinitionBeans;
      }
 -    
 -      private static Log log = LogFactory.getLog(PojoConverter.class);
  
 -    public static 
org.apache.stratos.autoscaler.applications.pojo.stub.ApplicationContext
 -    convertApplicationBeanToApplicationContext (ApplicationDefinition 
compositeAppDefinition) {
 +    public static 
org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup 
convertToASKubernetesGroupPojo(KubernetesGroup kubernetesGroupBean) {
 +
 +        org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup 
kubernetesGroup = new
 +                
org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup();
 +
 +        kubernetesGroup.setGroupId(kubernetesGroupBean.getGroupId());
 +        kubernetesGroup.setDescription(kubernetesGroupBean.getDescription());
 +        
kubernetesGroup.setKubernetesMaster(convertToASKubernetesMasterPojo(kubernetesGroupBean.getKubernetesMaster()));
 +        
kubernetesGroup.setPortRange(convertToASPortRange(kubernetesGroupBean.getPortRange()));
 +        
kubernetesGroup.setKubernetesHosts(convertToASKubernetesHostsPojo(kubernetesGroupBean.getKubernetesHosts()));
 +        
kubernetesGroup.setProperties((getASProperties(kubernetesGroupBean.getProperty())));
 +
 +        return kubernetesGroup;
 +    }
 +
 +    private static 
org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[] 
convertToASKubernetesHostsPojo(List<KubernetesHost> kubernetesHosts) {
 +        if (kubernetesHosts == null || kubernetesHosts.isEmpty()) {
 +            return null;
 +        }
 +        int kubernetesHostCount = kubernetesHosts.size();
 +        org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[]
 +                kubernetesHostsArr = new 
org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[kubernetesHostCount];
 +        for (int i = 0; i < kubernetesHostCount; i++) {
 +            KubernetesHost kubernetesHostBean = kubernetesHosts.get(i);
 +            kubernetesHostsArr[i] = 
convertToASKubernetesHostPojo(kubernetesHostBean);
 +        }
 +        return kubernetesHostsArr;
 +    }
 +
 +
 +    private static org.apache.stratos.autoscaler.stub.kubernetes.PortRange 
convertToASPortRange(PortRange portRangeBean) {
 +        if (portRangeBean == null) {
 +            return null;
 +        }
 +        org.apache.stratos.autoscaler.stub.kubernetes.PortRange
 +                portRange = new 
org.apache.stratos.autoscaler.stub.kubernetes.PortRange();
 +        portRange.setLower(portRangeBean.getLower());
 +        portRange.setUpper(portRangeBean.getUpper());
 +        return portRange;
 +    }
 +
 +    public static 
org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost 
convertToASKubernetesHostPojo(KubernetesHost kubernetesHostBean) {
 +        if (kubernetesHostBean == null) {
 +            return null;
 +        }
 +
 +        org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost
 +                kubernetesHost = new 
org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost();
 +        kubernetesHost.setHostId(kubernetesHostBean.getHostId());
 +        
kubernetesHost.setHostIpAddress(kubernetesHostBean.getHostIpAddress());
 +        kubernetesHost.setHostname(kubernetesHostBean.getHostname());
 +        
kubernetesHost.setProperties(getASProperties(kubernetesHostBean.getProperty()));
 +
 +        return kubernetesHost;
 +    }
 +
 +    public static 
org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster 
convertToASKubernetesMasterPojo(KubernetesMaster kubernetesMasterBean) {
 +        if (kubernetesMasterBean == null) {
 +            return null;
 +        }
 +
 +        org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster
 +                kubernetesMaster = new 
org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster();
 +        kubernetesMaster.setHostId(kubernetesMasterBean.getHostId());
 +        
kubernetesMaster.setHostIpAddress(kubernetesMasterBean.getHostIpAddress());
 +        kubernetesMaster.setHostname(kubernetesMasterBean.getHostname());
 +        kubernetesMaster.setEndpoint(kubernetesMasterBean.getEndpoint());
 +        
kubernetesMaster.setProperties(getASProperties(kubernetesMasterBean.getProperty()));
 +
 +        return kubernetesMaster;
 +    }
 +
 +    public static KubernetesGroup[] 
populateKubernetesGroupsPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup[]
 kubernetesGroups) {
 +
 +        if (kubernetesGroups == null){
 +            return null;
 +        }
 +        KubernetesGroup[] kubernetesGroupsBean = new 
KubernetesGroup[kubernetesGroups.length];
 +        for (int i = 0; i < kubernetesGroups.length; i++){
 +            kubernetesGroupsBean[i] = 
populateKubernetesGroupPojo(kubernetesGroups[i]);
 +        }
 +        return kubernetesGroupsBean;
 +    }
 +
 +    public static KubernetesGroup 
populateKubernetesGroupPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesGroup
 kubernetesGroup) {
 +        if (kubernetesGroup == null){
 +            return null;
 +        }
 +        KubernetesGroup kubernetesGroupBean = new KubernetesGroup();
 +        kubernetesGroupBean.setGroupId(kubernetesGroup.getGroupId());
 +        kubernetesGroupBean.setDescription(kubernetesGroup.getDescription());
 +        
kubernetesGroupBean.setPortRange(populatePortRangePojo(kubernetesGroup.getPortRange()));
 +        
kubernetesGroupBean.setKubernetesHosts(populateKubernetesHostsPojo(kubernetesGroup.getKubernetesHosts()));
 +        
kubernetesGroupBean.setKubernetesMaster(populateKubernetesMasterPojo(kubernetesGroup.getKubernetesMaster()));
 +        
kubernetesGroupBean.setProperty(populateASProperties(kubernetesGroup.getProperties()));
 +        return kubernetesGroupBean;
 +    }
 +
 +    public static KubernetesMaster 
populateKubernetesMasterPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesMaster
 kubernetesMaster) {
 +        if (kubernetesMaster == null){
 +            return null;
 +        }
 +        KubernetesMaster kubernetesMasterBean = new KubernetesMaster();
 +        kubernetesMasterBean.setHostId(kubernetesMaster.getHostId());
 +        kubernetesMasterBean.setHostname(kubernetesMaster.getHostname());
 +        
kubernetesMasterBean.setHostIpAddress(kubernetesMaster.getHostIpAddress());
 +        
kubernetesMasterBean.setProperty(populateASProperties(kubernetesMaster.getProperties()));
 +        kubernetesMasterBean.setEndpoint(kubernetesMaster.getEndpoint());
 +        return kubernetesMasterBean;
 +    }
 +
 +    public static List<KubernetesHost> 
populateKubernetesHostsPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost[]
 kubernetesHosts) {
 +        if (kubernetesHosts == null){
 +            return null;
 +        }
 +        List<KubernetesHost> kubernetesHostList = new 
ArrayList<KubernetesHost>();
 +        for (int i = 0; i < kubernetesHosts.length; i++){
 +            
kubernetesHostList.add(populateKubernetesHostPojo(kubernetesHosts[i]));
 +        }
 +        return kubernetesHostList;
 +    }
 +
 +    private static KubernetesHost 
populateKubernetesHostPojo(org.apache.stratos.autoscaler.stub.kubernetes.KubernetesHost
 kubernetesHost) {
 +        if (kubernetesHost == null){
 +            return null;
 +        }
 +        KubernetesHost kubernetesHostBean = new KubernetesHost();
 +        kubernetesHostBean.setHostId(kubernetesHost.getHostId());
 +        kubernetesHostBean.setHostname(kubernetesHost.getHostname());
 +        
kubernetesHostBean.setHostIpAddress(kubernetesHost.getHostIpAddress());
 +        
kubernetesHostBean.setProperty(populateASProperties(kubernetesHost.getProperties()));
 +        return kubernetesHostBean;
 +    }
 +
 +    private static List<PropertyBean> populateASProperties(PropertiesE 
properties) {
 +        if (properties == null || properties.getProperties() == null){
 +            return null;
 +        }
 +        List<PropertyBean> propertyBeanList = new ArrayList<PropertyBean>();
 +        for (int i = 0; i < properties.getProperties().length; i++){
 +            
propertyBeanList.add(populateASProperty(properties.getProperties()[i]));
 +        }
 +        return propertyBeanList;
 +    }
 +
 +    private static PropertyBean populateASProperty(PropertyE propertyE) {
 +        if (propertyE == null){
 +            return null;
 +        }
 +        PropertyBean propertyBean = new PropertyBean();
 +        propertyBean.name = propertyE.getName();
 +        propertyBean.value = propertyE.getValue();
 +        return propertyBean;
 +    }
 +
 +    private static PortRange 
populatePortRangePojo(org.apache.stratos.autoscaler.stub.kubernetes.PortRange 
portRange) {
 +        if (portRange == null){
 +            return null;
 +        }
 +        PortRange portRangeBean = new PortRange();
 +        portRangeBean.setUpper(portRange.getUpper());
 +        portRangeBean.setLower(portRange.getLower());
 +        return portRangeBean;
 +    }
 +    
 +    public static ApplicationContext 
convertApplicationBeanToApplicationContext (ApplicationDefinition 
compositeAppDefinition) {
  
-         ApplicationContext applicationContext = new ApplicationContext();
+         
org.apache.stratos.autoscaler.applications.pojo.stub.ApplicationContext 
applicationContext = new 
org.apache.stratos.autoscaler.applications.pojo.stub.ApplicationContext();
          
applicationContext.setApplicationId(compositeAppDefinition.getApplicationId());
          applicationContext.setAlias(compositeAppDefinition.getAlias());
  

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
----------------------------------------------------------------------
diff --cc 
components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
index 97eda89,a7ab51b..38880d7
--- 
a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
+++ 
b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/services/ServiceUtils.java
@@@ -23,18 -23,16 +23,22 @@@ import org.apache.axis2.context.Configu
  import org.apache.commons.lang.StringUtils;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
 +import org.apache.stratos.autoscaler.stub.*;
 +import org.apache.stratos.autoscaler.stub.deployment.policy.DeploymentPolicy;
 +import 
org.apache.stratos.cloud.controller.pojo.application.xsd.ApplicationContext;
 +import 
org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException;
+ import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+ import 
org.apache.stratos.autoscaler.stub.AutoScalerServiceApplicationDefinitionExceptionException;
  import 
org.apache.stratos.autoscaler.stub.AutoScalerServiceInvalidPartitionExceptionException;
  import 
org.apache.stratos.autoscaler.stub.AutoScalerServiceInvalidPolicyExceptionException;
  import org.apache.stratos.cloud.controller.stub.*;
- import org.apache.stratos.cloud.controller.stub.pojo.*;
- import org.apache.stratos.cloud.controller.stub.pojo.Properties;
+ import org.apache.stratos.cloud.controller.stub.pojo.CartridgeConfig;
+ import org.apache.stratos.cloud.controller.stub.pojo.CartridgeInfo;
+ import org.apache.stratos.cloud.controller.stub.pojo.Property;
++import 
org.apache.stratos.cloud.controller.stub.pojo.application.ApplicationContext;
  import org.apache.stratos.manager.client.AutoscalerServiceClient;
  import org.apache.stratos.manager.client.CloudControllerServiceClient;
 +import org.apache.stratos.manager.deploy.cartridge.CartridgeDeploymentManager;
  import 
org.apache.stratos.manager.composite.application.beans.ApplicationDefinition;
  import org.apache.stratos.manager.deploy.service.Service;
  import org.apache.stratos.manager.deploy.service.ServiceDeploymentManager;
@@@ -135,26 -154,23 +144,27 @@@ public class ServiceUtils 
          applicationContext.setTenantDomain(tenantDomain);
          applicationContext.setTeantAdminUsername(userName);
  
 -//        try {
 -//            
CloudControllerServiceClient.getServiceClient().deployApplicationDefinition(applicationContext);
 -//
 -//        } catch (RemoteException e) {
 -//            throw new RestAPIException(e);
 -//        } catch 
(CloudControllerServiceInvalidIaasProviderExceptionException e) {
 -//            throw new RestAPIException(e);
 -//        } catch 
(CloudControllerServiceApplicationDefinitionExceptionException e) {
 -//            throw new RestAPIException(e);
 -//        }
 +        Properties properties = new Properties();
 +        if(appDefinition.getProperty() != null) {
 +            for 
(org.apache.stratos.manager.composite.application.beans.PropertyBean 
propertyBean : appDefinition.getProperty()) {
 +                Property property = new Property();
 +                property.setName(propertyBean.getName());
 +                property.setValue(propertyBean.getValue());
 +                properties.addProperties(property);
 +            }
 +            applicationContext.setProperties(properties);
 +        }
  
          try {
-             
CloudControllerServiceClient.getServiceClient().deployApplicationDefinition(applicationContext);
- 
+             
AutoscalerServiceClient.getServiceClient().deployApplication(applicationContext);
+         } catch (AutoScalerServiceApplicationDefinitionExceptionException e) {
+             throw new RestAPIException(e);
          } catch (RemoteException e) {
              throw new RestAPIException(e);
 +        } catch (CloudControllerServiceInvalidIaasProviderExceptionException 
e) {
 +            throw new RestAPIException(e);
 +        } catch 
(CloudControllerServiceApplicationDefinitionExceptionException e) {
 +            throw new RestAPIException(e);
          }
      }
  

http://git-wip-us.apache.org/repos/asf/stratos/blob/89fb37af/components/org.apache.stratos.rest.endpoint/src/main/webapp/stratos/WEB-INF/schemas/schema.xsd
----------------------------------------------------------------------

Reply via email to