diff --git a/src/org/openbravo/mobile/core/servercontroller/MobileMainServerCheck.java b/src/org/openbravo/mobile/core/servercontroller/MobileMainServerCheck.java
--- a/src/org/openbravo/mobile/core/servercontroller/MobileMainServerCheck.java
+++ b/src/org/openbravo/mobile/core/servercontroller/MobileMainServerCheck.java
@@ -9,10 +9,13 @@
 package org.openbravo.mobile.core.servercontroller;
 
 import org.apache.log4j.Logger;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
 import org.openbravo.base.exception.OBException;
 import org.openbravo.dal.core.OBContext;
 import org.openbravo.dal.service.OBDal;
 import org.openbravo.mobile.core.MobileServerDefinition;
+import org.openbravo.mobile.core.authenticate.MobileAuthenticationKeyUtils;
 
 /**
  * This class implements the thread which checks if the main servers and the external servers are
@@ -36,6 +39,7 @@
   private static final int FIVE_MINUTES = 5 * ONE_MINUTE;
   private static final int TEN_MINUTES = 10 * ONE_MINUTE;
   private static final int THIRTY_MINUTES = 30 * ONE_MINUTE;
+  private static final String SERVER_STATUS_PROPERTY_NAME = "serverStatus";
 
   public static boolean isThreadRunning() {
     return threadIsRunning;
@@ -108,7 +112,9 @@
             log.debug("Some offline checks have failed. Transition to offline will continue for "
                 + ((startTime + offlineWaitTime) - System.currentTimeMillis()) + " milliseconds");
           }
-          waitBeforeNextAttempt();
+          if (keepTransitioningToOffline) {
+            waitBeforeNextAttempt();
+          }
         } else {
           // all main and external servers are back online
           transitionToOnlineIfNeeded(thisServerDef);
@@ -157,16 +163,61 @@
         && !MobileServerState.OFFLINE.getValue().equals(thisServerDef.getStatus());
   }
 
-  private boolean executeOfflineChecks(MobileServerDefinition thisServerDef) {
+  private boolean executeOfflineChecks(MobileServerDefinition thisServerDef) throws Exception {
     boolean thereAreOfflineExternalServers = ServerStateBackground
         .checkOfflineHandlers(thisServerDef);
 
     boolean shouldGoOffline = thereAreOfflineExternalServers;
 
     if (MobileServerController.getInstance().isThisAStoreServer()) {
-      boolean centralServerIsOffline = ServerStateBackground.isCentralServerOffline(thisServerDef);
+      boolean centralServerIsOffline = !pingCentralServerIsOnline();
       shouldGoOffline |= centralServerIsOffline;
     }
     return shouldGoOffline;
   }
+  
+  private boolean pingCentralServerIsOnline() throws Exception {
+    try {
+      OBContext.setOBContext(obContext);
+      OBContext.setAdminMode();
+      final JSONObject parameters = new JSONObject();
+      parameters.put("organization", "0");
+      parameters.put("client", "0");
+      parameters.put("mobileServerKey", MobileServerController.getInstance().getMobileServerKey());
+      final String queryParams = MobileServerUtils.getAuthenticationQueryParams(
+          MobileServerController.getInstance().getThisServerDefinition().getClient().getId(), "0", "0", "100")
+          + "&"
+          + MobileAuthenticationKeyUtils.USE_USER_CACHE_PARAMETER + "=true";
+      MobileServerDefinition centralServer = MobileServerController.getInstance()
+          .getCentralServer();
+      final JSONObject resp = new JSONObject(MobileServerRequestExecutor.getInstance().request(centralServer,
+          MobileServerUtils.OBWSPATH + MobileServerStatusInformation.class.getName(),
+          queryParams, "POST", parameters)).getJSONObject("response");
+      final String newStatus = getStatusFromResponse(resp);
+      centralServer.setStatus(newStatus);
+      OBDal.getInstance().save(centralServer);
+      OBDal.getInstance().flush();
+      return MobileServerState.ONLINE.getValue().equals(newStatus);
+    } catch (Throwable t) {
+      // assume that any error means not available
+      return false;
+    } finally {
+      OBContext.restorePreviousMode();
+    }
+  }
+
+  private String getStatusFromResponse(JSONObject response) throws JSONException {
+    String newStatus = null;
+    if (response != null) {
+      if (response.has(SERVER_STATUS_PROPERTY_NAME)) {
+        newStatus = response.getString(SERVER_STATUS_PROPERTY_NAME);
+      } else {
+        newStatus = MobileServerState.ONLINE.getValue();
+      }
+    } else {
+      newStatus = MobileServerState.OFFLINE.getValue();
+    }
+    return newStatus;
+  }
+
 }
diff --git a/src/org/openbravo/mobile/core/servercontroller/MobileServerController.java b/src/org/openbravo/mobile/core/servercontroller/MobileServerController.java
--- a/src/org/openbravo/mobile/core/servercontroller/MobileServerController.java
+++ b/src/org/openbravo/mobile/core/servercontroller/MobileServerController.java
@@ -473,6 +473,8 @@
   public synchronized void transitionToOffline() {
     checkMultiServer();
 
+    log.info("Transition to offline called");
+    
     if (getThisMobileServerState().equals(MobileServerState.TRANSITION_TO_OFFLINE)) {
       log.debug("Already transitioning to offline");
       return;
@@ -550,6 +552,9 @@
 
   public synchronized void transitionToOnline() {
     checkMultiServer();
+
+    log.info("Transition to online called");
+
     if (isTransitioningToOnline) {
       // already here go away
       log.debug("Already transitioning to online");
@@ -622,7 +627,7 @@
         initializeOBContext();
 
         // first do a precheck
-        log.info("Checking if transition to offline can start");
+        log.info("Checking if transition to online can start");
         if (!canTransitionToOnline()) {
           log.info("Transition to online can not start, so cancelling it");
           return;
diff --git a/src/org/openbravo/mobile/core/servercontroller/MobileServerRequestExecutor.java b/src/org/openbravo/mobile/core/servercontroller/MobileServerRequestExecutor.java
--- a/src/org/openbravo/mobile/core/servercontroller/MobileServerRequestExecutor.java
+++ b/src/org/openbravo/mobile/core/servercontroller/MobileServerRequestExecutor.java
@@ -400,9 +400,13 @@
       return;
     }
 
+
     if (MobileServerController.getInstance().isThisAStoreServer()) {
-      // if offline-->online, then trigger an online transition
-      MobileServerController.getInstance().transitionToOnline();
+      final boolean notOnline = !MobileServerController.getInstance().getThisMobileServerState().equals(MobileServerState.ONLINE);
+      if (notOnline) {
+        // if offline-->online, then trigger an online transition
+        MobileServerController.getInstance().transitionToOnline();
+      }
     }
   }
 
