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;
