using ApplicationHolder instead of ApplicationManager in autoscaler since it is the publisher to applications topic
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
index 7ca224e..66a35e7 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
@@ -35,98 +35,46 @@
     }
 
     public static void sendGroupCreatedEvent(String appId, String groupId) {
-        try {
-            ApplicationManager.acquireReadLockForApplication(appId);
-            Application application = ApplicationManager.getApplications().getApplication(appId);
-            if (application != null) {
-                Group group = application.getGroupRecursively(groupId);
-                if (group.isStateTransitionValid(GroupStatus.Created)) {
-                    if (log.isInfoEnabled()) {
-                        log.info("Publishing Group created event for [application]: " + appId +
-                                " [group]: " + groupId);
-                    }
-                    GroupResetEvent groupCreatedEvent =
-                            new GroupResetEvent(appId, groupId);
-
-                    publishEvent(groupCreatedEvent);
-                } else {
-                    log.warn("Created is not in the possible state list of [group] " + groupId);
-                }
-            }
-        } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Group created event for [application]: " + appId +
+                    " [group]: " + groupId);
         }
+        GroupResetEvent groupCreatedEvent =
+                new GroupResetEvent(appId, groupId);
+
+        publishEvent(groupCreatedEvent);
     }
 
     public static void sendGroupActivatedEvent(String appId, String groupId) {
-        try {
-            ApplicationManager.acquireReadLockForApplication(appId);
-            Application application = ApplicationManager.getApplications().getApplication(appId);
-            if (application != null) {
-                Group group = application.getGroupRecursively(groupId);
-                if (group.isStateTransitionValid(GroupStatus.Active)) {
-                    if (log.isInfoEnabled()) {
-                        log.info("Publishing Group activated event for [application]: " + appId +
-                                " [group]: " + groupId);
-                    }
-                    GroupActivatedEvent groupActivatedEvent =
-                            new GroupActivatedEvent(appId, groupId);
-
-                    publishEvent(groupActivatedEvent);
-                } else {
-                    log.warn("Active is not in the possible state list of [group] " + groupId);
-                }
-            }
-        } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Group activated event for [application]: " + appId +
+                    " [group]: " + groupId);
         }
+        GroupActivatedEvent groupActivatedEvent =
+                new GroupActivatedEvent(appId, groupId);
+
+        publishEvent(groupActivatedEvent);
     }
 
     public static void sendGroupInActivateEvent(String appId, String groupId) {
-        try {
-            ApplicationManager.acquireReadLockForApplication(appId);
-            Application application = ApplicationManager.getApplications().getApplication(appId);
-            if (application != null) {
-                Group group = application.getGroupRecursively(groupId);
-                if (group.isStateTransitionValid(GroupStatus.Inactive)) {
-                    if (log.isInfoEnabled()) {
-                        log.info("Publishing Group in-activate event for [application]: " + appId +
-                                " [group]: " + groupId);
-                    }
-                    AppStatusGroupInactivateEvent appStatusGroupInactivateEvent = new
-                            AppStatusGroupInactivateEvent(appId, groupId);
-
-                    publishEvent(appStatusGroupInactivateEvent);
-                } else {
-                    log.warn("InActive is not in the possible state list of [group] " + groupId);
-                }
-            }
-        } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Group in-activate event for [application]: " + appId +
+                    " [group]: " + groupId);
         }
+        AppStatusGroupInactivateEvent appStatusGroupInactivateEvent = new
+                AppStatusGroupInactivateEvent(appId, groupId);
+
+        publishEvent(appStatusGroupInactivateEvent);
     }
 
     public static void sendGroupTerminatingEvent(String appId, String groupId) {
-        try {
-            ApplicationManager.acquireReadLockForApplication(appId);
-            Application application = ApplicationManager.getApplications().getApplication(appId);
-            if (application != null) {
-                Group group = application.getGroupRecursively(groupId);
-                if (group.isStateTransitionValid(GroupStatus.Terminating)) {
-                    if (log.isInfoEnabled()) {
-                        log.info("Publishing Group terminating event for [application]: " + appId +
-                                " [group]: " + groupId);
-                    }
-                    GroupTerminatingEvent groupInTerminatingEvent =
-                            new GroupTerminatingEvent(appId, groupId);
-                    publishEvent(groupInTerminatingEvent);
-                } else {
-                    log.warn("Terminating is not in the possible state list of [group] " + groupId);
-                }
-            }
-        } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Group terminating event for [application]: " + appId +
+                    " [group]: " + groupId);
         }
+        GroupTerminatingEvent groupInTerminatingEvent =
+                new GroupTerminatingEvent(appId, groupId);
+        publishEvent(groupInTerminatingEvent);
     }
 
     public static void sendGroupTerminatedEvent(String appId, String groupId) {
@@ -135,111 +83,47 @@
             log.info("Publishing Group terminated event for [application]: " + appId +
                     " [group]: " + groupId);
         }
-
-        try {
-            ApplicationManager.acquireReadLockForApplication(appId);
-            Application application = ApplicationManager.getApplications().getApplication(appId);
-            if (application != null) {
-                Group group = application.getGroupRecursively(groupId);
-                if (group.isStateTransitionValid(GroupStatus.Terminated)) {
-                    GroupTerminatedEvent groupInTerminatedEvent =
-                            new GroupTerminatedEvent(appId, groupId);
-                    publishEvent(groupInTerminatedEvent);
-                } else {
-                    log.warn("Terminated is not in the possible state list of [group] " + groupId);
-                }
-            }
-        } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
-        }
-
-
+        GroupTerminatedEvent groupInTerminatedEvent =
+                new GroupTerminatedEvent(appId, groupId);
+        publishEvent(groupInTerminatedEvent);
     }
 
     public static void sendApplicationActivatedEvent(String appId) {
-        try {
-            ApplicationManager.acquireReadLockForApplication(appId);
-            Application application = ApplicationManager.getApplications().getApplication(appId);
-            if (application != null) {
-                if (application.isStateTransitionValid(ApplicationStatus.Active)) {
-                    if (log.isInfoEnabled()) {
-                        log.info("Publishing Application activated event for [application]: " + appId);
-                    }
-                    ApplicationActivatedEvent applicationActivatedEvent =
-                            new ApplicationActivatedEvent(appId);
-
-                    publishEvent(applicationActivatedEvent);
-                } else {
-                    log.warn("Active is not in the possible state list of [application] " + appId);
-                }
-            }
-        } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Application activated event for [application]: " + appId);
         }
+        ApplicationActivatedEvent applicationActivatedEvent =
+                new ApplicationActivatedEvent(appId);
+
+        publishEvent(applicationActivatedEvent);
     }
 
     public static void sendApplicationInactivatedEvent(String appId) {
         if (log.isInfoEnabled()) {
             log.info("Publishing Application In-activated event for [application]: " + appId);
         }
+        ApplicationInactivatedEvent applicationInActivatedEvent =
+                new ApplicationInactivatedEvent(appId);
+        publishEvent(applicationInActivatedEvent);
 
-        try {
-            ApplicationManager.acquireReadLockForApplication(appId);
-            Application application = ApplicationManager.getApplications().getApplication(appId);
-            if (application != null) {
-                if (application.isStateTransitionValid(ApplicationStatus.Inactive)) {
-                    ApplicationInactivatedEvent applicationInActivatedEvent =
-                            new ApplicationInactivatedEvent(appId);
-                    publishEvent(applicationInActivatedEvent);
-                } else {
-                    log.warn("Inactive is not in the possible state list of [application] " + appId);
-                }
-            }
-        } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
-        }
     }
 
     public static void sendApplicationTerminatingEvent(String appId) {
-        try {
-            ApplicationManager.acquireReadLockForApplication(appId);
-            Application application = ApplicationManager.getApplications().getApplication(appId);
-            if (application != null) {
-                if (application.isStateTransitionValid(ApplicationStatus.Terminating)) {
-                    if (log.isInfoEnabled()) {
-                        log.info("Publishing Application terminated event for [application]: " + appId);
-                    }
-                    ApplicationTerminatingEvent applicationTerminatingEvent =
-                            new ApplicationTerminatingEvent(appId);
-                    publishEvent(applicationTerminatingEvent);
-                } else {
-                    log.warn("Terminating is not in the possible state list of [application] " + appId);
-                }
-            }
-        } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Application terminated event for [application]: " + appId);
         }
+        ApplicationTerminatingEvent applicationTerminatingEvent =
+                new ApplicationTerminatingEvent(appId);
+        publishEvent(applicationTerminatingEvent);
     }
 
     public static void sendApplicationTerminatedEvent(String appId, Set<ClusterDataHolder> clusterData) {
-        try {
-            ApplicationManager.acquireReadLockForApplication(appId);
-            Application application = ApplicationManager.getApplications().getApplication(appId);
-            if (application != null) {
-                if (application.isStateTransitionValid(ApplicationStatus.Terminated)) {
-                    if (log.isInfoEnabled()) {
-                        log.info("Publishing Application terminated event for [application]: " + appId);
-                    }
-                    ApplicationTerminatedEvent applicationTerminatedEvent =
-                            new ApplicationTerminatedEvent(appId, clusterData);
-                    publishEvent(applicationTerminatedEvent);
-                } else {
-                    log.warn("Terminated is not in the possible state list of [application] " + appId);
-                }
-            }
-        } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Application terminated event for [application]: " + appId);
         }
+        ApplicationTerminatedEvent applicationTerminatedEvent =
+                new ApplicationTerminatedEvent(appId, clusterData);
+        publishEvent(applicationTerminatedEvent);
     }
 
     public static void publishEvent(Event event) {
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java
index 225dea1..fbd446e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java
@@ -104,10 +104,11 @@
             throws DependencyBuilderException,
             TopologyInConsistentException {
         GroupMonitor groupMonitor;
-        ApplicationManager.acquireReadLockForApplication(appId);
+        ApplicationHolder.acquireReadLock();
 
         try {
-            Group group = ApplicationManager.getApplications().getApplication(appId).getGroupRecursively(context.getId());
+            Group group = ApplicationHolder.getApplications().
+                    getApplication(appId).getGroupRecursively(context.getId());
             groupMonitor = new GroupMonitor(group, appId);
             groupMonitor.setAppId(appId);
             if(parentMonitor != null) {
@@ -128,7 +129,7 @@
             }
 
         } finally {
-            ApplicationManager.releaseReadLockForApplication(appId);
+            ApplicationHolder.releaseReadLock();
 
         }
         return groupMonitor;
diff --git 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
index 3586420..87e4d67 100644
--- 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,14 +23,15 @@
 import org.apache.stratos.autoscaler.AutoscalerContext;
 import org.apache.stratos.autoscaler.NetworkPartitionContext;
 import org.apache.stratos.autoscaler.PartitionContext;
+import org.apache.stratos.autoscaler.applications.ApplicationHolder;
 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.messaging.domain.topology.*;
-import org.apache.stratos.messaging.message.receiver.applications.ApplicationManager;
+import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.messaging.domain.topology.ClusterStatus;
+import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 
 import java.util.Map;
@@ -99,8 +100,8 @@
                         if (cluster != null) {
                             try {
 
-                                ApplicationManager.acquireReadLockForApplication(appId);
-                                Application application = ApplicationManager.getApplications().getApplication(appId);
+                                ApplicationHolder.acquireReadLock();
+                                Application application = ApplicationHolder.getApplications().getApplication(appId);
 
                                 if (!clusterMonitorHasMembers && cluster.getStatus() == ClusterStatus.Terminating) {
                                     if (application.getStatus() == ApplicationStatus.Terminating) {
@@ -124,7 +125,7 @@
                         }*/
                                 }
                             } finally {
-                                ApplicationManager.releaseReadLockForApplication(appId);
+                                ApplicationHolder.releaseReadLock();
                             }
                         }
                     }
@@ -234,22 +235,22 @@
         Runnable group = new Runnable() {
             public void run() {
                 try {
-                    ApplicationManager.acquireReadLockForApplication(appId);
+                    ApplicationHolder.acquireReadLock();
                     ParentComponent component;
                     if (groupId.equals(appId)) {
                         //it is an application
-                        component = ApplicationManager.getApplications().
+                        component = ApplicationHolder.getApplications().
                                 getApplication(appId);
                     } else {
                         //it is a group
-                        component = ApplicationManager.getApplications().
+                        component = ApplicationHolder.getApplications().
                                 getApplication(appId).getGroupRecursively(groupId);
                     }
                     Map<String, ClusterDataHolder> clusterIds = component.getClusterDataMap();
                     Map<String, Group> groups = component.getAliasToGroupMap();
                     updateChildStatus(appId, idOfChild, groups, clusterIds, component);
                 } finally {
-                    ApplicationManager.releaseReadLockForApplication(appId);
+                    ApplicationHolder.releaseReadLock();
 
                 }
 
@@ -287,12 +288,12 @@
             clusterStatus = getClusterStatus(clusterData);
             groupStatus = getGroupStatus(groups);
             try {
-                ApplicationManager.acquireReadLockForApplication(appId);
-                Application application = ApplicationManager.getApplications().getApplication(appId);
+                ApplicationHolder.acquireReadLock();
+                Application application = ApplicationHolder.getApplications().getApplication(appId);
 
-                if (groups.isEmpty() && getAllClusterInSameState(clusterData,ClusterStatus.Active) ||
+                if (groups.isEmpty() && getAllClusterInSameState(clusterData, ClusterStatus.Active) ||
                         clusterData.isEmpty() && getAllGroupInSameState(groups, GroupStatus.Active) ||
-                        getAllClusterInSameState(clusterData,ClusterStatus.Active) &&
+                        getAllClusterInSameState(clusterData, ClusterStatus.Active) &&
                                 getAllGroupInSameState(groups, GroupStatus.Active)) {
                     //send activation event
                     if (parent instanceof Application) {
@@ -324,9 +325,9 @@
                         log.info("sending group created : " + parent.getUniqueIdentifier());
                         ApplicationBuilder.handleGroupTerminatedEvent(appId, parent.getUniqueIdentifier());
                     }
-                } else if (groups.isEmpty() && getAllClusterInSameState(clusterData,ClusterStatus.Created) ||
+                } else if (groups.isEmpty() && getAllClusterInSameState(clusterData, ClusterStatus.Created) ||
                         clusterData.isEmpty() && getAllGroupInSameState(groups, GroupStatus.Created) ||
-                        getAllClusterInSameState(clusterData,ClusterStatus.Created) &&
+                        getAllClusterInSameState(clusterData, ClusterStatus.Created) &&
                                 getAllGroupInSameState(groups, GroupStatus.Created)) {
                     if (parent instanceof Application) {
                         log.info("[Application] " + appId + "couldn't change to Created, since it is" +
@@ -353,7 +354,7 @@
                     log.warn("Clusters/groups not found in this [component] " + appId);
                 }
             } finally {
-                ApplicationManager.releaseReadLockForApplication(appId);
+                ApplicationHolder.releaseReadLock();
             }
 
 
@@ -452,7 +453,7 @@
             }
         }
 
-        if(groups == null || groups != null && groups.isEmpty()) {
+        if (groups == null || groups != null && groups.isEmpty()) {
             groupActive = false;
             groupTerminated = false;
             groupCreated = false;
@@ -462,7 +463,7 @@
             status = GroupStatus.Active;
         } else if (groupTerminated) {
             status = GroupStatus.Terminated;
-        } else if(groupCreated) {
+        } else if (groupCreated) {
             status = GroupStatus.Created;
         }
         return status;
@@ -498,7 +499,7 @@
             }
         }
 
-        if(clusterData == null || clusterData != null && clusterData.isEmpty()) {
+        if (clusterData == null || clusterData != null && clusterData.isEmpty()) {
             clusterActive = false;
             clusterTerminated = false;
             clusterCreated = false;
@@ -508,7 +509,7 @@
             status = ClusterStatus.Active;
         } else if (clusterTerminated) {
             status = ClusterStatus.Terminated;
-        } else if(clusterCreated) {
+        } else if (clusterCreated) {
             status = ClusterStatus.Created;
         }
         return status;