diff --git a/src-db/database/sourcedata/AD_COLUMN.xml b/src-db/database/sourcedata/AD_COLUMN.xml
--- a/src-db/database/sourcedata/AD_COLUMN.xml
+++ b/src-db/database/sourcedata/AD_COLUMN.xml
@@ -800,6 +800,8 @@
 <!--4FFE3405421B4551BE5C663AF9B52457-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
 <!--4FFE3405421B4551BE5C663AF9B52457-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
 <!--4FFE3405421B4551BE5C663AF9B52457-->  <NAME><![CDATA[Offline_Incoming_Errors]]></NAME>
+<!--4FFE3405421B4551BE5C663AF9B52457-->  <DESCRIPTION><![CDATA[Keeps track if there were incoming errors when the server goes offline.]]></DESCRIPTION>
+<!--4FFE3405421B4551BE5C663AF9B52457-->  <HELP><![CDATA[Keeps track if there were incoming errors when the server goes offline. Is set to true when the server goes offline and there are incoming errors, is set to false in other cases.]]></HELP>
 <!--4FFE3405421B4551BE5C663AF9B52457-->  <COLUMNNAME><![CDATA[Offline_Incoming_Errors]]></COLUMNNAME>
 <!--4FFE3405421B4551BE5C663AF9B52457-->  <AD_TABLE_ID><![CDATA[9A030632C0FC4C4AA8A58EC59BE2D116]]></AD_TABLE_ID>
 <!--4FFE3405421B4551BE5C663AF9B52457-->  <AD_REFERENCE_ID><![CDATA[20]]></AD_REFERENCE_ID>
diff --git a/src-db/database/sourcedata/AD_ELEMENT.xml b/src-db/database/sourcedata/AD_ELEMENT.xml
--- a/src-db/database/sourcedata/AD_ELEMENT.xml
+++ b/src-db/database/sourcedata/AD_ELEMENT.xml
@@ -293,6 +293,9 @@
 <!--C9BCAD956E664DC3B30BB5E722E7C5B1-->  <COLUMNNAME><![CDATA[Offline_Incoming_Errors]]></COLUMNNAME>
 <!--C9BCAD956E664DC3B30BB5E722E7C5B1-->  <NAME><![CDATA[Offline_Incoming_Errors]]></NAME>
 <!--C9BCAD956E664DC3B30BB5E722E7C5B1-->  <PRINTNAME><![CDATA[Offline_Incoming_Errors]]></PRINTNAME>
+<!--C9BCAD956E664DC3B30BB5E722E7C5B1-->  <DESCRIPTION><![CDATA[Keeps track if there were incoming errors when the server goes offline.]]></DESCRIPTION>
+<!--C9BCAD956E664DC3B30BB5E722E7C5B1-->  <HELP><![CDATA[Keeps track if there were incoming errors when the server goes offline. Is set to true when the server goes offline and there are incoming errors, is set to false in other cases.]]></HELP>
+<!--C9BCAD956E664DC3B30BB5E722E7C5B1-->  <PO_HELP><![CDATA[Keeps track if there were incoming errors when the server goes offline.]]></PO_HELP>
 <!--C9BCAD956E664DC3B30BB5E722E7C5B1-->  <AD_MODULE_ID><![CDATA[08943B85ADF64E708797A753E5B6AAEE]]></AD_MODULE_ID>
 <!--C9BCAD956E664DC3B30BB5E722E7C5B1-->  <ISGLOSSARY><![CDATA[N]]></ISGLOSSARY>
 <!--C9BCAD956E664DC3B30BB5E722E7C5B1--></AD_ELEMENT>
diff --git a/src/org/openbravo/mobile/core/process/JSONProcessSimple.java b/src/org/openbravo/mobile/core/process/JSONProcessSimple.java
--- a/src/org/openbravo/mobile/core/process/JSONProcessSimple.java
+++ b/src/org/openbravo/mobile/core/process/JSONProcessSimple.java
@@ -22,8 +22,6 @@
 import org.openbravo.dal.core.OBContext;
 import org.openbravo.mobile.core.MobileCoreKernelUtils;
 import org.openbravo.mobile.core.MobileStaticResourceComponent;
-import org.openbravo.mobile.core.servercontroller.MobileServerController;
-import org.openbravo.mobile.core.servercontroller.MobileServerUtils;
 
 public abstract class JSONProcessSimple extends SecuredJSONProcess {
 
@@ -44,19 +42,6 @@
 
   public void exec(Writer w, JSONObject jsonsent) throws IOException, ServletException {
 
-    // don't do any actions when transitioning
-    if (MobileServerUtils.isMultiServerEnabled()) {
-      // if the request has server status info then make use of it to update the
-      // server status
-      MobileServerUtils.updateServerStatusFromJSON(jsonsent);
-
-      if (!ignoreTransitioningStatus()
-          && MobileServerController.getInstance().serverHasTransitioningStatus()) {
-        MobileServerController.getInstance().writeServerStatusJSON(w);
-        return;
-      }
-    }
-
     try {
       String s = exec(jsonsent).toString();
       if (s.startsWith("{") && s.endsWith("}")) {
@@ -104,8 +89,7 @@
   }
 
   /**
-   * Return true if the logic of the subclass should be executed also in case of transitioning
-   * status. Default is false, so in case of transitioning status nothing is executed.
+   * @deprecated this method is not being used anymore
    */
   protected boolean ignoreTransitioningStatus() {
     return false;
diff --git a/src/org/openbravo/mobile/core/process/MobileService.java b/src/org/openbravo/mobile/core/process/MobileService.java
--- a/src/org/openbravo/mobile/core/process/MobileService.java
+++ b/src/org/openbravo/mobile/core/process/MobileService.java
@@ -50,7 +50,7 @@
 
   @Inject
   @Any
-  private Instance<MobileServiceRequestAllowedHandler> allowHandlers;
+  private Instance<MobileServiceRequestHandler> requestHandlers;
 
   public void init(ServletConfig config) {
     super.init(config);
@@ -107,10 +107,10 @@
     // Note: the call to the MobileServiceRequestAllowedHandler must be done
     // before the content of the request is retrieved as some MobileServiceRequestAllowedHandler
     // may also read the content to process the request independently
-    for (Iterator<MobileServiceRequestAllowedHandler> procIter = allowHandlers.iterator(); procIter
+    for (Iterator<MobileServiceRequestHandler> procIter = requestHandlers.iterator(); procIter
         .hasNext();) {
-      MobileServiceRequestAllowedHandler allowHandler = procIter.next();
-      if (!allowHandler.allowRequest(request, response)) {
+      MobileServiceRequestHandler handler = procIter.next();
+      if (handler.requestHandled(request, response)) {
         return;
       }
     }
@@ -289,16 +289,34 @@
   }
 
   /**
-   * Is used to control/check if a request is allowed to be handled and if not generates a response
-   * to send back to the client.
+   * Is used to control/check if a request is allowed to be handled and if not generates a response to send back to the client.
+   * 
+   * @deprecated use MobileServiceRequestHandler
+   * @author mtaal
+   */
+  public static abstract class MobileServiceRequestAllowedHandler extends
+      MobileServiceRequestHandler {
+    /**
+     * Return false if the request is not allowed to be processed further. In this case the callee can generate a response in the
+     * response object.
+     */
+    public abstract boolean allowRequest(HttpServletRequest request, HttpServletResponse response);
+
+    public boolean requestHandled(HttpServletRequest request, HttpServletResponse response) {
+      return !allowRequest(request, response);
+    }
+  }
+
+  /**
+   * Allows extra code to catch a request and handle it instead of the MobileService class.
    * 
    * @author mtaal
    */
-  public static abstract class MobileServiceRequestAllowedHandler {
+  public static abstract class MobileServiceRequestHandler {
     /**
-     * Return false if the request is not allowed to be processed further. In this case the callee
-     * can generate a response in the response object.
+     * Return true if the request is handled by the handler so not be further processed by the MobileService class. Return false
+     * if the mobile service class should handle the request.
      */
-    public abstract boolean allowRequest(HttpServletRequest request, HttpServletResponse response);
+    public abstract boolean requestHandled(HttpServletRequest request, HttpServletResponse response);
   }
 }
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
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2015-2016 Openbravo S.L.U.
+ * Copyright (C) 2015-2018 Openbravo S.L.U.
  * Licensed under the Openbravo Commercial License version 1.0
  * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
  * or in the legal folder of this module distribution.
@@ -101,7 +101,7 @@
     if (MobileServerUtils.isOpenbravoServer(server)) {
       wsPart = wsPart
           + (authenticationParams == null ? "" : (serviceName.contains("?") ? "&" : "?")
-          + authenticationParams);
+              + authenticationParams);
       if (MobileServerController.getInstance().isThisAStoreServer()) {
         wsPart += "&" + SOURCE_PROP + "=" + SOURCE_STORE;
       } else {
@@ -178,7 +178,7 @@
       JSONObject parameters) {
     int tries = 0;
     boolean readTimeoutOccurred = false;
-    
+
     JSONObject resp = new JSONObject();
     while (tries <= getMaxRetries()) {
       readTimeoutOccurred = false;
@@ -191,7 +191,8 @@
         }
         tries++;
         final String result = request(server, serviceName,
-            MobileServerUtils.getAuthenticationQueryParams(), parameters == null ? "GET" : "POST", parameters);
+            MobileServerUtils.getAuthenticationQueryParams(), parameters == null ? "GET" : "POST",
+            parameters);
         resp = new JSONObject(result).getJSONObject("response");
         if (resp.has("serverStatus")) {
           final String respStatus = resp.getString("serverStatus");
@@ -217,7 +218,7 @@
         readTimeoutOccurred = "Read timed out".equals(t.getMessage());
         log.error("Trying connection to " + server.getMobileServerKey() + " " + serviceName
             + " json: " + parameters, t);
-        
+
       }
     }
     if (!readTimeoutOccurred || doesReadTimeoutForceOffline()) {
@@ -413,9 +414,9 @@
       return;
     }
 
-
     if (MobileServerController.getInstance().isThisAStoreServer()) {
-      final boolean notOnline = !MobileServerController.getInstance().getThisMobileServerState().equals(MobileServerState.ONLINE);
+      final boolean notOnline = !MobileServerController.getInstance().getThisMobileServerState()
+          .equals(MobileServerState.ONLINE);
       if (notOnline) {
         // if offline-->online, then trigger an online transition
         MobileServerController.getInstance().transitionToOnline();
diff --git a/src/org/openbravo/mobile/core/servercontroller/MultiServerJSONProcess.java b/src/org/openbravo/mobile/core/servercontroller/MultiServerJSONProcess.java
--- a/src/org/openbravo/mobile/core/servercontroller/MultiServerJSONProcess.java
+++ b/src/org/openbravo/mobile/core/servercontroller/MultiServerJSONProcess.java
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2016 Openbravo S.L.U.
+ * Copyright (C) 2016-2018 Openbravo S.L.U.
  * Licensed under the Openbravo Commercial License version 1.0
  * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
  * or in the legal folder of this module distribution.
@@ -25,13 +25,11 @@
 import org.openbravo.base.provider.OBProvider;
 import org.openbravo.base.util.Check;
 import org.openbravo.base.weld.WeldUtils;
-import org.openbravo.client.kernel.RequestContext;
 import org.openbravo.dal.core.OBContext;
 import org.openbravo.dal.core.SessionHandler;
 import org.openbravo.dal.service.OBDal;
 import org.openbravo.erpCommon.utility.OBMessageUtils;
 import org.openbravo.erpCommon.utility.SequenceIdData;
-import org.openbravo.mobile.core.MobileServerDefinition;
 import org.openbravo.mobile.core.process.JSONProcessSimple;
 import org.openbravo.mobile.core.process.JSONRowConverter;
 import org.openbravo.mobile.core.utils.OBMOBCUtils;
@@ -46,54 +44,12 @@
 import org.openbravo.service.json.JsonConstants;
 
 /**
- * Handles many cases of WebPOS working together with central and store server. This class can
- * handle situations of a store being offline, central being offline or both being available.
- * 
- * If the json is sent from WebPOS and processed on the store server there are several options which
- * play a role:
- * <ul>
- * <li>_onlyDoCentralFromStore: if this json property has value true then the action is forwarded to
- * the central. If the central server is not available then an exception is returned.</li>
- * <li>_tryCentralFromStore: if this json property has true then first the central server is tried
- * before possibly executing locally. If the central server is not available then the action is
- * executed locally and no exception is thrown. If the central server is available and the action is
- * executed there then depending on the value of the _executeInOneServer property the action is
- * repeated on the store server:
- * <ul>
- * <li>true: the action is only executed on one server. So if the central server already executed
- * the action then it is not repeated on the store server.</li>
- * <li>false: the action is executed on both servers if possible. So if the central server already
- * executed the action then it is repeated on the store server by creating an import entry.</li>
- * </ul>
- * </li>
- * </ul>
+ * Supports creating import entries to easily replicate an action to another server. Also uses the import entry archive table to
+ * check for and handle duplicate requests. Errors are stored in import entries if needed.
  * 
- * If the json is sent from WebPOS and processed on the central server. Happens when WebPOS connects
- * to the central server because the store server is down. Then the logic will process locally in
- * central and create an import entry which is later replicated to the store server.
- * 
- * If the json is sent from the STORE in a webrequest then this is a direct call from the store
- * server, process in central but don't create import entry as the store already knows about the
- * action.
- * 
- * If the json is sent from the STORE to central not-in-a-webrequest then this is an import entry
- * replicated from the store. Set the import entry to processed after processing in central.
+ * Also supports pre and post processing actions/hooks.
  * 
- * If the json is sent from CENTRAL and processed in the store. Then this must be through an import
- * entry replicated from central. Process the json and set the import entry to processed.
- * 
- * The source of the sending of the json is obtained from the json itself.
- * 
- * Note, additional features: if the _executeInOneServer property is passed in the json then an
- * action is executed at most in one server, first central and if central is not available then in
- * the store. No import entries are created to be replicated, the assumption is that the
- * transactional tables are replicated.
- * 
- * This class also provides several protected methods which can be overridden to change the generic
- * behavior in the specific concrete subclass.
- * 
- * For more information see this wiki page:
- * http://wiki.openbravo.com/wiki/Retail:Store_Server#Synchronized_Transactions
+ * For more information see this wiki page: http://wiki.openbravo.com/wiki/Retail:Store_Server#Synchronized_Transactions
  * 
  * @author mtaal
  */
@@ -110,7 +66,7 @@
   /**
    * @deprecated use {@link MobileServerRequestExecutor#SOURCE_WEBPOS}
    */
-  public static final String SOURCE_WEBPOS = MobileServerRequestExecutor.SOURCE_WEBPOS;  
+  public static final String SOURCE_WEBPOS = MobileServerRequestExecutor.SOURCE_WEBPOS;
   /**
    * @deprecated use {@link MobileServerRequestExecutor#SOURCE_STORE}
    */
@@ -194,122 +150,51 @@
     executeProcessHooks(jsonSent);
     String messageId = null;
     try {
-      try {
-        // handle different cases
-        if (!jsonSent.has(MobileServerRequestExecutor.SOURCE_PROP)) {
-          jsonSent.put(MobileServerRequestExecutor.SOURCE_PROP, MobileServerRequestExecutor.SOURCE_WEBPOS);
-        }
+      // make sure the json has a message id so duplicates can be detected
+      if (!jsonSent.has("messageId")) {
+        jsonSent.put("messageId", SequenceIdData.getUUID());
+      }
+      messageId = jsonSent.getString("messageId");
 
-        // make sure the json has a message id so duplicates can be detected
-        if (!jsonSent.has("messageId")) {
-          jsonSent.put("messageId", SequenceIdData.getUUID());
-        }
-        messageId = jsonSent.getString("messageId");
+      // check if allowed to execute, if this is a store server
+      if (MobileServerController.getInstance().isThisAStoreServer()
+          && executeOnlyInCentral(jsonSent)) {
+        returnResult = OBMOBCUtils.createSimpleErrorJson("OBMOBC_MsgCentralServerNotAvailable");
+      } else {
+        // execute the action
+        returnResult = doExecute(jsonSent);
+      }
 
-        final String source = jsonSent.getString(SOURCE_PROP);
+      if (log.isDebugEnabled()) {
+        log.debug("Result (" + logTime + "): " + returnResult);
+      }
 
-        if (SOURCE_CENTRAL.equals(source)) {
-          // case 1: processing an import entry in the store which was processed before in the
-          // central server
-          returnResult = executeLocal(jsonSent);
+      // last checks, return is done at the end of the method
+      Check.isNotNull(returnResult, "Return result may not be null");
+      errorOccurred = isErrorJson(returnResult);
 
-          if (getImportEntryId() == null) {
-            // note: normal case is that we are processed from import entry
-            // anything else is not expected
-            // in future it can be the case that also central sends transactions
-            // directly to store using a webservice, at that time this line may go
-            throw new OBException("Source central is expected to go through import entry "
-                + jsonSent);
+      // set correct import entry status
+      if (!errorOccurred) {
+        OBContext.setAdminMode();
+        try {
+          if (getImportEntryId() != null
+              && !importEntryManager.isImportEntryError(getImportEntryId())) {
+            importEntryManager.setImportEntryProcessed(getImportEntryId());
           }
 
-        } else if (SOURCE_WEBPOS.equals(source)) {
-          if (MobileServerController.getInstance().isThisAStoreServer()) {
-            // case 2: if from webpos and this is store server
-            returnResult = executeFromWebPOSInStore(jsonSent);
-          } else if (MobileServerController.getInstance().isThisACentralServer()) {
-            // case 3: if from webpos and this is central server then we are called directly
-            // from webpos, happens when store server is down,
-            // the import entry should be created to synchronize
-            // back to the store server
-            returnResult = executeFromWebPOSInCentral(jsonSent);
-          } else {
-            // case 4 not a multi-server environment, process locally
-            returnResult = executeLocal(jsonSent);
+          if (getImportEntryId() == null) {
+            updateArchiveStatus(messageId, "Processed");
           }
-        } else if (SOURCE_STORE.equals(source)) {
-          // case 5: transaction received from store, we must be central then
-          if (MobileServerController.getInstance().isThisACentralServer()) {
-
-            // execute locally
-            returnResult = executeLocal(jsonSent);
-
-            if (isErrorJson(returnResult)) {
-              // don't do anything, will be handled in finally block
-            } else if (RequestContext.get().getRequest() != null) {
-              // case 5a: web request send from store, don't create import entry as this
-              // is done by store itself, only create archive
 
-              // be defensive
-              if (getImportEntryId() != null) {
-                throw new OBException("Illegal flow, did not expect import entry to be set "
-                    + jsonSent);
-              }
-
-            } else {
-              // case 5b: import entry received from store server, this flow happens
-              // when the store server can not reach central and processes transactions
-              // offline/in the store
-
-              // be defensive
-              if (getImportEntryId() == null) {
-                throw new OBException("Illegal flow, expect import entry to be set " + jsonSent);
-              }
-
-              // import entry is set to processed in finally block
-            }
-          } else {
-            // defensive, not expected flow
-            throw new OBException("Source of json is STORE but this is "
-                + "not a central server unsupported case " + jsonSent);
-          }
-        } else {
-          // defensive coding
-          throw new OBException("Source not supported, see json " + jsonSent);
+          OBDal.getInstance().commitAndClose();
+        } finally {
+          OBContext.restorePreviousMode();
         }
 
-        if (log.isDebugEnabled()) {
-          log.debug("Result (" + logTime + "): " + returnResult);
-        }
-
-        // last checks, return is done at the end of the method
-        Check.isNotNull(returnResult, "Return result may not be null");
-        errorOccurred = isErrorJson(returnResult);
-      } finally {
+        // kick the import entry thread to process right away
+        importEntryManager.notifyNewImportEntryCreated();
+      }
 
-        // note this finally block is inside another finally block
-        // because the commit here can again throw an exception
-        // which should be correctly handled.
-        if (!errorOccurred) {
-          OBContext.setAdminMode();
-          try {
-            if (getImportEntryId() != null
-                && !importEntryManager.isImportEntryError(getImportEntryId())) {
-              importEntryManager.setImportEntryProcessed(getImportEntryId());
-            }
-
-            if (getImportEntryId() == null) {
-              updateArchiveStatus(messageId, "Processed");
-            }
-
-            OBDal.getInstance().commitAndClose();
-          } finally {
-            OBContext.restorePreviousMode();
-          }
-
-          // kick the import entry thread to process right away
-          importEntryManager.notifyNewImportEntryCreated();
-        }
-      }
     } catch (Throwable t) {
       thrownError = t;
       log.error(t.getMessage() + " - " + (jsonSent != null ? jsonSent.toString() : "NULL"), t);
@@ -385,237 +270,69 @@
   /**
    * This method should do the real action, and return the json response.
    * 
-   * Any error situation should be handled by throwing an exception. This exception is handled in
-   * this class and returned to the caller of this class.
+   * Any error situation should be handled by throwing an exception. This exception is handled in this class and returned to the
+   * caller of this class.
    */
   protected abstract JSONObject execute(JSONObject json);
 
-  protected JSONObject executeFromWebPOSInCentral(JSONObject jsonSent) throws Exception {
-    // case 2: if from webpos and central server then we are called directly
-    // from webpos, the processed import entry should be created to synchronize
-    // back to the store server
+  private JSONObject doExecute(JSONObject jsonSent) throws Exception {
+
     final JSONObject result = executeLocal(jsonSent);
 
     if (!isErrorJson(result) && !executeInOneServer(jsonSent)) {
-      final JSONObject json = new JSONObject(jsonSent.toString());
-      // sent along from the central to store, set the source to CENTRAL
-      json.put(MobileServerRequestExecutor.SOURCE_PROP, MobileServerRequestExecutor.SOURCE_CENTRAL);
-      createImportEntry(jsonSent.getString("messageId"), json, result, null);
+      createImportEntry(jsonSent.getString("messageId"), jsonSent, result, null);
       // is set to processed to in finally block of main loop
     }
-
-    // return the result to the store server
     return result;
   }
 
-  protected JSONObject executeFromWebPOSInStore(JSONObject jsonSent) throws Exception {
-    final String messageId = jsonSent.getString("messageId");
-
-    // if only execute in central then forward to central, note if central is offline
-    // then an exception is thrown but no transition is happening
-    if (executeOnlyInCentral(jsonSent)) {
-      final JSONObject jsonToCentral = new JSONObject(jsonSent.toString());
-      // sent along from the store to central, set the source to STORE
-      jsonToCentral.put(MobileServerRequestExecutor.SOURCE_PROP, MobileServerRequestExecutor.SOURCE_STORE);
-      // prevent cycling around
-      jsonToCentral.remove(CALL_ONLY_CENTRAL_PROP);
-      JSONObject centralResult = null;
-      try {
-        centralResult = MobileServerRequestExecutor.getInstance().executeCentralRequest(
-            MobileServerUtils.OBWSPATH + this.getClass().getName(), jsonToCentral);
-      } catch (Throwable t) {
-        return handleCentralServerRequestException(t);
-      }
-      afterReturnFromCentral(jsonToCentral, centralResult);
-      return centralResult;
-    } else
-    // If store is online and central is online execute on central and create import entry to
-    // process
-    // locally. So in this flow the json results in processing in both central and store.
-    // Unless the executeInOneServer returns true then it is processed in one server
-    // only
-    // The store server processing is done in parallel by creating an import entry.
-    // In this execution flow transactional tables are not replicated. The import entry is
-    // potentially replicated. This all depends on the synchronized table setup.
-    if (MobileServerController.getInstance().getThisMobileServerState()
-        .equals(MobileServerState.ONLINE)
-        && executeFirstInCentral(jsonSent)
-        && MobileServerController.getInstance().isCentralServerOnline()) {
-      try {
-        JSONObject centralResult = null;
-        // execute in the central server
-        final JSONObject jsonToCentral = new JSONObject(jsonSent.toString());
-        try {
-          // sent along from the store to central, set the source to STORE
-          jsonToCentral.put(SOURCE_PROP, SOURCE_STORE);
-          // prevent cycling around
-          jsonToCentral.remove(CALL_CENTRAL_PROP);
-          centralResult = MobileServerRequestExecutor.getInstance().executeCentralRequest(
-              MobileServerUtils.OBWSPATH + this.getClass().getName(), jsonToCentral);
-        } catch (Exception e) {
-          return handleCentralServerRequestException(e);
-        }
-        // do after the catch block, so that a failure here does not force the system
-        // to go offline
-        afterReturnFromCentral(jsonToCentral, centralResult);
-
-        // central server is offline, check if transitioning
-        if (centralResult.has("serverStatus")
-            && !centralResult.get("serverStatus").equals(MobileServerState.ONLINE.getValue())) {
-
-          // if transitioning then don't do anything local anymore, return.
-          final MobileServerDefinition server = MobileServerController.getInstance()
-              .getThisServerDefinition();
-          if (MobileServerState.TRANSITION_TO_ONLINE.getValue().equals(server.getStatus())
-              || MobileServerState.TRANSITION_TO_OFFLINE.getValue().equals(server.getStatus())) {
-            final JSONObject result = new JSONObject();
-            result.put("serverStatusSignal", server.getStatus());
-            return result;
-          } else if (MobileServerState.OFFLINE.getValue().equals(server.getStatus())) {
-            // went offline along the way, execute local
-            final JSONObject result = executeLocal(jsonSent);
-            if (isErrorJson(result)) {
-              return result;
-            }
-            if (!executeInOneServer(jsonSent)) {
-              createImportEntry(messageId, jsonSent, result, null);
-              // processed is set in finally block of main loop
-            }
+  protected JSONObject executeLocal(JSONObject jsonSent) throws Exception {
 
-            return result;
-          }
-        }
-
-        // error in central, return the error and don't create local import entry
-        if (isErrorJson(centralResult)) {
-          return centralResult;
-        }
-
-        // a webrequest, create local copy for local processing
-        if (getImportEntryId() == null && !executeInOneServer(jsonSent)) {
-          // local copy
-          final JSONObject json = new JSONObject(jsonSent.toString());
-          // set the source to central has it already was processed there, so
-          // is the same as if the central sends it back to store
-          // this property is not overwritten in createImportEntry
-          json.put(SOURCE_PROP, SOURCE_CENTRAL);
-
-          // create local import entry which will be processed in parallel
-          // calls setImportEntryId
-          createImportEntry(messageId, json, centralResult, null);
-          // this is a special case, the created import entry should not be set to
-          // processed. This is accomplished by resetting the global import entry id to
-          // null. The createImportEntry will set it, so here we reset it.
-          setImportEntryId(null);
-        }
+    final JSONObject result = execute(jsonSent);
 
-        return centralResult;
-      } catch (Throwable t) {
-        throw new OBException(t);
-      }
-    } else if (MobileServerController.getInstance().serverHasTransitioningStatus()) {
-      final JSONObject result = new JSONObject();
-      MobileServerController.getInstance().setServerStatusJSON(result);
-      return result;
-    } else {
-      // store offline, execute local and if needed create processed import entry which will be
-      // replicated to the central server
-      final JSONObject result = executeLocal(jsonSent);
-      if (isErrorJson(result)) {
-        return result;
-      }
-      if (!executeInOneServer(jsonSent)) {
-        // import entry will be replicated to central to be executed there
-        createImportEntry(messageId, jsonSent, result, null);
-        // processed is set in finally block of main loop
-      }
-
-      return result;
-    }
-  }
-
-  private JSONObject handleCentralServerRequestException(Throwable t) throws Exception {
-    log.error(t.getMessage(), t);
-
-    OBContext.setAdminMode(false);
-    try {
-      // set the central server as not being reachable
-      final MobileServerDefinition centralServer = MobileServerController.getInstance()
-          .getCentralServer();
-      centralServer.setStatus(MobileServerState.OFFLINE.getValue());
-      OBDal.getInstance().save(centralServer);
-    } finally {
-      OBContext.restorePreviousMode();
-    }
-
-    if (!MobileServerState.TRANSITION_TO_OFFLINE.equals(MobileServerController.getInstance()
-        .getThisMobileServerState())) {
-      // transition to offline,
-      // which causes the next if to be executed
-      log.info("Could not communicate with the central server, starting transition to offline");
-      MobileServerController.getInstance().transitionToOffline();
-    }
-
-    if (MobileServerController.getInstance().serverHasTransitioningStatus()) {
-      final JSONObject result = new JSONObject();
-      MobileServerController.getInstance().setServerStatusJSON(result);
+    // error was returned here
+    if (isErrorJson(result)) {
       return result;
     }
 
-    // return a exception json, the transaction will be committed is fine
-    // as the central server will move to offline so database action
-    // happened
-    return OBMOBCUtils.createSimpleErrorJson("OBMOBC_MsgCentralServerNotAvailable");
+    return createSuccessResponse(jsonSent, result);
   }
 
   /**
-   * Method which is called after the logic has called central and received a response from central.
-   * 
-   * Is therefore only called when the current server is a store server
-   * 
-   * @param jsonSent
-   *          the json which was sent to central
-   * @param resultFromCentral
-   *          the result received back from central
-   */
-  protected void afterReturnFromCentral(JSONObject jsonSent, JSONObject resultFromCentral) {
-  }
-
-  /**
-   * Controls if when the request is being handled in the store it should forward to central and not
-   * do any local actions, so not create a local import entry.
+   * Controls if when the request is being handled in the store it will return an error json. Default is false.
    */
   protected boolean executeOnlyInCentral(JSONObject json) throws JSONException {
     return json.has(CALL_ONLY_CENTRAL_PROP) && json.getBoolean(CALL_ONLY_CENTRAL_PROP);
   }
 
   /**
-   * Execute the action in one server at most, assume that any transactions are replicated through
-   * other means than import entry.
+   * Execute the action in one server at most, assume that any transactions are replicated through other means than import entry.
    */
   protected boolean executeInOneServer(JSONObject json) throws JSONException {
     return json.has(EXECUTE_IN_ONE_SERVER) && json.getBoolean(EXECUTE_IN_ONE_SERVER);
   }
 
   /**
-   * Controls if the store should first call central and then create a local import entry for local
-   * transactions.
+   * Controls if the store should first call central and then create a local import entry for local transactions.
+   * 
+   * This method is not used anymore.
+   * 
+   * @deprecated
    */
   protected boolean executeFirstInCentral(JSONObject json) throws JSONException {
+    log.warn("The executeFirstInCentral method is not used anymore");
     return json.has(CALL_CENTRAL_PROP) && json.getBoolean(CALL_CENTRAL_PROP);
   }
 
   /**
    * Creates the import entry by combining the result json and the json which was sent in.
    * 
-   * Organization in which the import entry will be created can be passed in. This to allow
-   * distributing the import entry to other stores.
+   * Organization in which the import entry will be created can be passed in. This to allow distributing the import entry to other
+   * stores.
    * 
-   * If null is passed in for the organization then as a default the system will use the current
-   * organization of the user.
+   * If null is passed in for the organization then as a default the system will use the current organization of the user.
    * 
-   * Override this method and call the super implementation with a different organization if this is
-   * functionally relevant.
+   * Override this method and call the super implementation with a different organization if this is functionally relevant.
    */
   protected void createImportEntry(String messageId, JSONObject sentIn, JSONObject processResult,
       Organization organization) throws JSONException {
@@ -630,13 +347,6 @@
     setImportEntryId(messageId);
 
     final JSONObject result = new JSONObject(sentIn.toString());
-
-    // can already be set by caller
-    if (!result.has(MobileServerRequestExecutor.SOURCE_PROP)) {
-      result.put(MobileServerRequestExecutor.SOURCE_PROP,
-          (MobileServerController.getInstance().isThisACentralServer() ? MobileServerRequestExecutor.SOURCE_CENTRAL
-              : MobileServerRequestExecutor.SOURCE_STORE));
-    }
     result.put(RESULT_PROP, processResult);
 
     OBContext.setAdminMode(true);
@@ -785,18 +495,6 @@
     }
   }
 
-  protected JSONObject executeLocal(JSONObject jsonSent) throws Exception {
-
-    final JSONObject result = execute(jsonSent);
-
-    // error was returned here
-    if (isErrorJson(result)) {
-      return result;
-    }
-
-    return createSuccessResponse(jsonSent, result);
-  }
-
   private JSONObject createSuccessResponse(JSONObject jsonSent, JSONObject result) {
     try {
       final JSONObject response = new JSONObject();
diff --git a/src/org/openbravo/mobile/core/servercontroller/SynchronizedServerProcessCaller.java b/src/org/openbravo/mobile/core/servercontroller/SynchronizedServerProcessCaller.java
--- a/src/org/openbravo/mobile/core/servercontroller/SynchronizedServerProcessCaller.java
+++ b/src/org/openbravo/mobile/core/servercontroller/SynchronizedServerProcessCaller.java
@@ -29,14 +29,13 @@
 import org.openbravo.service.json.JsonConstants;
 
 /**
- * Handler which receives a json which calls other json processes in order and does one commit at
- * the end. Exceptions are returned directly to the client.
+ * Handler which receives a json which calls other json processes in order and does one commit at the end. Exceptions are returned
+ * directly to the client.
  * 
- * The class has a main flow logic which calls central server or processes locally depending on
- * being online or offline or being store or central server.
+ * The class has a main flow logic which calls central server or processes locally depending on being online or offline or being
+ * store or central server.
  * 
- * For more information see these wiki pages:
- * http://wiki.openbravo.com/wiki/Multi-Server_Process_Calls_Concept
+ * For more information see these wiki pages: http://wiki.openbravo.com/wiki/Multi-Server_Process_Calls_Concept
  * http://wiki.openbravo.com/wiki/Retail:Store_Server#Synchronized_Transactions
  * 
  * @author mtaal
