diff --git a/src-wad/src/org/openbravo/wad/javasource.javaxml b/src-wad/src/org/openbravo/wad/javasource.javaxml
--- a/src-wad/src/org/openbravo/wad/javasource.javaxml
+++ b/src-wad/src/org/openbravo/wad/javasource.javaxml
@@ -29,7 +29,7 @@
 import org.openbravo.erpCommon.ad_actionButton.*;
 </PARAMETER_TMP>
 
-
+import org.codehaus.jettison.json.JSONObject;
 import org.openbravo.erpCommon.utility.*;
 import org.openbravo.data.FieldProvider;
 import org.openbravo.utils.FormatUtilities;
@@ -613,6 +613,37 @@
         if (log4j.isDebugEnabled() &amp;&amp; myError!=null) log4j.debug(myError.getMessage());
         printPageClosePopUp(response, vars);
 </FIELDS_TMP>
+    } else if (vars.commandIn("SAVE_XHR")) {
+      <PARAMETER_TMP id="parent">String strP<PARENT_TMP id="keyParent">Almacen</PARENT_TMP> = vars.getGlobalVariable("inp<PARENT_TMP id="keyParentINP">Almacen</PARENT_TMP>", windowId + "|<PARENT_TMP id="keyParent">Almacen</PARENT_TMP>");</PARAMETER_TMP>
+      OBError myError = new OBError();
+      JSONObject result = new JSONObject();
+      String commandType = vars.getStringParameter("inpCommandType");
+      char saveType = "NEW".equals(commandType) ? 'I' : 'U';
+      try {
+        int total = saveRecord(vars, myError, saveType<PARAMETER_TMP id="parent">, strP<PARENT_TMP id="keyParent">Almacen</PARENT_TMP></PARAMETER_TMP>);
+        if (myError.isEmpty()) {
+          myError = Utility.translateError(this, vars, vars.getLanguage(), "@CODE=RowsUpdated");
+          myError.setMessage(total + " " + myError.getMessage());
+          myError.setType("Success");
+        }
+        result.put("oberror", myError.toHashMap());
+        result.put("tabid", vars.getStringParameter("tabID"));
+        result.put("redirect", strDireccion + request.getServletPath() + "?Command=" + commandType);
+      } catch (Exception e) {
+        log4j.error("Error saving record (XHR request): " + e.getMessage(), e);
+        try {
+          myError.setType("Error");
+          myError.setMessage(e.getMessage());
+        } catch (Exception e2) {
+          // Ignored
+        }
+      }
+
+      response.setContentType("application/json");
+      PrintWriter out = response.getWriter();
+      out.print(result.toString());
+      out.flush();
+      out.close();
     } else if (vars.getCommand().toUpperCase().startsWith("BUTTON") || vars.getCommand().toUpperCase().startsWith("SAVE_BUTTON")) {
       pageErrorPopUp(response);
     } else pageError(response);
diff --git a/src/org/openbravo/erpCommon/utility/OBError.java b/src/org/openbravo/erpCommon/utility/OBError.java
--- a/src/org/openbravo/erpCommon/utility/OBError.java
+++ b/src/org/openbravo/erpCommon/utility/OBError.java
@@ -18,6 +18,8 @@
  */
 package org.openbravo.erpCommon.utility;
 
+import java.util.HashMap;
+
 public class OBError {
   private String type = "";
   private String title = "";
@@ -75,4 +77,12 @@
   public boolean isConnectionAvailable() {
     return this.connectionAvailable;
   }
+
+  public HashMap<String, String> toHashMap() {
+    HashMap<String, String> o = new HashMap<String, String>();
+    o.put("title", title);
+    o.put("message", message);
+    o.put("type", type);
+    return o;
+  }
 }
