diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/adc/GitHookTestCase.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/adc/GitHookTestCase.java
index 5e3ff70..3f708db 100644
--- a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/adc/GitHookTestCase.java
+++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/adc/GitHookTestCase.java
@@ -26,14 +26,14 @@
 import org.apache.stratos.integration.common.RestConstants;
 import org.apache.stratos.integration.common.TopologyHandler;
 import org.apache.stratos.integration.tests.StratosIntegrationTest;
-import org.apache.stratos.messaging.domain.application.ApplicationStatus;
 import org.apache.stratos.messaging.event.Event;
 import org.apache.stratos.messaging.listener.instance.notifier.ArtifactUpdateEventListener;
 import org.apache.stratos.messaging.message.receiver.instance.notifier.InstanceNotifierEventReceiver;
 import org.testng.annotations.Test;
 
-import java.net.URI;
+import java.io.File;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
@@ -42,24 +42,26 @@
 /**
  * Test case to test the /repo/notify endpoint
  */
+@Test(groups = { "adc" })
 public class GitHookTestCase extends StratosIntegrationTest {
 
     private static Log log = LogFactory.getLog(GitHookTestCase.class);
-    private static final String RESOURCES_PATH = "/git-hook-test";
-    private int artifactUpdateEvents = 0;
+    private static final String RESOURCES_PATH = File.separator + "git-hook-test";
+    private AtomicInteger artifactUpdateEventCount = new AtomicInteger(0);
     private static final String autoscalePolicyId = "autoscaling-policy-git-hook-test";
     private static final String cartridgeId = "c1-git-hook-test";
     private static final String networkPartitionId = "network-partition-git-hook-test";
     private static final String depPolicyId = "deployment-policy-git-hook-test";
     private static final String applicationId = "git-hook-test";
     private static final String appPolicyId = "application-policy-git-hook-test";
+    private static final String GIT_HOOK_ARTIFACT_FILENAME = "hook-req.json";
+    private static final int ARTIFACT_UPDATED_EXPECTED_COUNT = 2;
+    private ExecutorService eventListenerExecutorService = StratosThreadPool
+            .getExecutorService("stratos.integration.test.git.thread.pool", 5);
 
-    @Test(timeOut = GLOBAL_TEST_TIMEOUT, groups = {"adc", "smoke"})
+    @Test(timeOut = DEFAULT_TEST_TIMEOUT)
     public void sendRepoNotify() throws Exception {
         deployArtifacts();
-        ExecutorService eventListenerExecutorService = StratosThreadPool.getExecutorService(
-                                                                            "stratos.integration.test.git.thread.pool",
-                                                                            5);
         final InstanceNotifierEventReceiver instanceNotifierEventReceiver = new InstanceNotifierEventReceiver();
         eventListenerExecutorService.submit(new Runnable() {
             @Override
@@ -71,57 +73,48 @@
         ArtifactUpdateEventListener artifactUpdateEventListener = new ArtifactUpdateEventListener() {
             @Override
             protected void onEvent(Event event) {
-                artifactUpdateEvents++;
+                artifactUpdateEventCount.addAndGet(1);
             }
         };
 
         instanceNotifierEventReceiver.addEventListener(artifactUpdateEventListener);
+        restClient.addEntity(RESOURCES_PATH + File.separator + GIT_HOOK_ARTIFACT_FILENAME, RestConstants.REPO_NOTIFY,
+                RestConstants.REPO_NOTIFY_NAME);
 
-        String gitHookFile = "hook-req.json";
-        restClient.doPost(
-                new URI(stratosBackendURL + RestConstants.REPO_NOTIFY),
-                restClient.getJsonStringFromFile(RESOURCES_PATH + "/" + gitHookFile));
-
-        while (artifactUpdateEvents < 2) {
-            log.info("Waiting till artifact updated comes in... ");
+        while (artifactUpdateEventCount.get() < ARTIFACT_UPDATED_EXPECTED_COUNT) {
+            log.info("Waiting until artifact updated event is received...");
             Thread.sleep(1000);
         }
-
-        log.info("Waiting for application status to become ACTIVE...");
-        TopologyHandler.getInstance().assertApplicationStatus(applicationId, ApplicationStatus.Active);
-
+        TopologyHandler.getInstance().assertApplicationActiveStatus(applicationId);
+        instanceNotifierEventReceiver.terminate();
+        eventListenerExecutorService.shutdownNow();
         undeployArtifacts();
     }
 
     private void deployArtifacts() throws Exception {
-        boolean autoscalePolicyAdded = restClient.addEntity(
-                RESOURCES_PATH + RestConstants.AUTOSCALING_POLICIES_PATH + "/" + autoscalePolicyId + ".json",
-                RestConstants.AUTOSCALING_POLICIES,
-                RestConstants.AUTOSCALING_POLICIES_NAME);
+        boolean autoscalePolicyAdded = restClient
+                .addEntity(RESOURCES_PATH + RestConstants.AUTOSCALING_POLICIES_PATH + "/" + autoscalePolicyId + ".json",
+                        RestConstants.AUTOSCALING_POLICIES, RestConstants.AUTOSCALING_POLICIES_NAME);
         assertTrue(autoscalePolicyAdded);
 
-        boolean cartridgeAdded = restClient.addEntity(
-                RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + cartridgeId + ".json",
-                RestConstants.CARTRIDGES,
-                RestConstants.CARTRIDGES_NAME);
+        boolean cartridgeAdded = restClient
+                .addEntity(RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + cartridgeId + ".json",
+                        RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME);
         assertTrue(cartridgeAdded);
 
-        boolean networkPartitionAdded = restClient.addEntity(
-                RESOURCES_PATH + RestConstants.NETWORK_PARTITIONS_PATH + "/" + networkPartitionId + ".json",
-                RestConstants.NETWORK_PARTITIONS,
-                RestConstants.NETWORK_PARTITIONS_NAME);
+        boolean networkPartitionAdded = restClient
+                .addEntity(RESOURCES_PATH + RestConstants.NETWORK_PARTITIONS_PATH + "/" + networkPartitionId + ".json",
+                        RestConstants.NETWORK_PARTITIONS, RestConstants.NETWORK_PARTITIONS_NAME);
         assertTrue(networkPartitionAdded);
 
-        boolean deploymentPolicyAdded = restClient.addEntity(
-                RESOURCES_PATH + RestConstants.DEPLOYMENT_POLICIES_PATH + "/" + depPolicyId + ".json",
-                RestConstants.DEPLOYMENT_POLICIES,
-                RestConstants.DEPLOYMENT_POLICIES_NAME);
+        boolean deploymentPolicyAdded = restClient
+                .addEntity(RESOURCES_PATH + RestConstants.DEPLOYMENT_POLICIES_PATH + "/" + depPolicyId + ".json",
+                        RestConstants.DEPLOYMENT_POLICIES, RestConstants.DEPLOYMENT_POLICIES_NAME);
         assertTrue(deploymentPolicyAdded);
 
-        boolean applicationAdded = restClient.addEntity(
-                RESOURCES_PATH + RestConstants.APPLICATIONS_PATH + "/" + applicationId + ".json",
-                RestConstants.APPLICATIONS,
-                RestConstants.APPLICATIONS_NAME);
+        boolean applicationAdded = restClient
+                .addEntity(RESOURCES_PATH + RestConstants.APPLICATIONS_PATH + "/" + applicationId + ".json",
+                        RestConstants.APPLICATIONS, RestConstants.APPLICATIONS_NAME);
         assertTrue(applicationAdded);
 
         ApplicationBean bean = (ApplicationBean) restClient
@@ -129,19 +122,18 @@
                         RestConstants.APPLICATIONS_NAME);
         assertEquals(bean.getApplicationId(), applicationId);
 
-        boolean appPolicyAdded = restClient.addEntity(
-                RESOURCES_PATH + RestConstants.APPLICATION_POLICIES_PATH + "/" + appPolicyId + ".json",
-                RestConstants.APPLICATION_POLICIES,
-                RestConstants.APPLICATION_POLICIES_NAME);
+        boolean appPolicyAdded = restClient
+                .addEntity(RESOURCES_PATH + RestConstants.APPLICATION_POLICIES_PATH + "/" + appPolicyId + ".json",
+                        RestConstants.APPLICATION_POLICIES, RestConstants.APPLICATION_POLICIES_NAME);
         assertTrue(appPolicyAdded);
 
         boolean appDeployed = restClient.deployEntity(
-                RestConstants.APPLICATIONS + "/" + applicationId + RestConstants.APPLICATIONS_DEPLOY + "/" + appPolicyId,
-                RestConstants.APPLICATIONS_NAME);
+                RestConstants.APPLICATIONS + "/" + applicationId + RestConstants.APPLICATIONS_DEPLOY + "/"
+                        + appPolicyId, RestConstants.APPLICATIONS_NAME);
         assertTrue(appDeployed);
     }
 
-    private void undeployArtifacts() throws Exception{
+    private void undeployArtifacts() throws Exception {
         log.info(String.format("Un-deploying the application [application id] %s", applicationId));
         String resourcePathUndeploy = RestConstants.APPLICATIONS + "/" + applicationId +
                 RestConstants.APPLICATIONS_UNDEPLOY;
@@ -158,12 +150,13 @@
                     RestConstants.APPLICATIONS_UNDEPLOY + "?force=true", RestConstants.APPLICATIONS);
 
             boolean forceUndeployed = TopologyHandler.getInstance().assertApplicationUndeploy(applicationId);
-            assertTrue(String.format("Forceful undeployment failed for the application %s", applicationId), forceUndeployed);
+            assertTrue(String.format("Forceful undeployment failed for the application %s", applicationId),
+                    forceUndeployed);
         }
 
         log.info("Removing the application [application id] sample-application-startup-test");
-        boolean removedApp = restClient.removeEntity(RestConstants.APPLICATIONS, applicationId,
-                RestConstants.APPLICATIONS_NAME);
+        boolean removedApp = restClient
+                .removeEntity(RestConstants.APPLICATIONS, applicationId, RestConstants.APPLICATIONS_NAME);
         assertTrue(removedApp);
 
         ApplicationBean beanRemoved = (ApplicationBean) restClient
@@ -173,13 +166,12 @@
 
         log.info(String.format("Removing the application policy [application policy id] %s", appPolicyId));
         boolean removeAppPolicy = restClient
-                .removeEntity(RestConstants.APPLICATION_POLICIES, appPolicyId,
-                        RestConstants.APPLICATION_POLICIES_NAME);
+                .removeEntity(RestConstants.APPLICATION_POLICIES, appPolicyId, RestConstants.APPLICATION_POLICIES_NAME);
         assertTrue(removeAppPolicy);
 
         log.info(String.format("Removing the cartridge [cartridge type] %s", cartridgeId));
-        boolean removedC1 = restClient.removeEntity(RestConstants.CARTRIDGES, cartridgeId,
-                RestConstants.CARTRIDGES_NAME);
+        boolean removedC1 = restClient
+                .removeEntity(RestConstants.CARTRIDGES, cartridgeId, RestConstants.CARTRIDGES_NAME);
         assertTrue(removedC1);
 
         log.info(String.format("Removing the autoscaling policy [autoscaling policy id] %s", autoscalePolicyId));
@@ -189,14 +181,12 @@
 
         log.info(String.format("Removing the deployment policy [deployment policy id] %s", depPolicyId));
         boolean removedDep = restClient
-                .removeEntity(RestConstants.DEPLOYMENT_POLICIES, depPolicyId,
-                        RestConstants.DEPLOYMENT_POLICIES_NAME);
+                .removeEntity(RestConstants.DEPLOYMENT_POLICIES, depPolicyId, RestConstants.DEPLOYMENT_POLICIES_NAME);
         assertTrue(removedDep);
 
         log.info(String.format("Removing the network partition [network partition id] %s", networkPartitionId));
-        boolean removedNet = restClient
-                .removeEntity(RestConstants.NETWORK_PARTITIONS, networkPartitionId,
-                        RestConstants.NETWORK_PARTITIONS_NAME);
+        boolean removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, networkPartitionId,
+                RestConstants.NETWORK_PARTITIONS_NAME);
         assertTrue(removedNet);
     }
 }
