diff --git a/.classpath b/.classpath
index ed910ba..a98037f 100644
--- a/.classpath
+++ b/.classpath
@@ -29,6 +29,9 @@
     <classpathentry kind="lib" path="framework/base/lib/ical4j-1.0-rc2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/icu4j-52_1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/ivy-2.2.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/jackson-annotations-2.4.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/jackson-core-2.4.2.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/jackson-databind-2.4.2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/javolution-5.4.3.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/jdbm-1.0-SNAPSHOT.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/jdom-1.1.jar"/>
@@ -130,7 +133,6 @@
     <classpathentry kind="lib" path="framework/testtools/lib/org.springframework.core-3.1.0.M2.jar"/>
     <classpathentry kind="lib" path="framework/webapp/lib/ezmorph-0.9.1.jar"/>
     <classpathentry kind="lib" path="framework/webapp/lib/iText-2.1.7.jar"/>
-    <classpathentry kind="lib" path="framework/webapp/lib/json-lib-2.2.3-jdk15.jar"/>
     <classpathentry kind="lib" path="framework/webapp/lib/rome-0.9.jar"/>
     <classpathentry kind="lib" path="specialpurpose/googlecheckout/lib/checkout-sdk-0.8.8.jar"/>
     <classpathentry kind="lib" path="specialpurpose/ldap/lib/cas-server-core-3.3.jar"/>
@@ -157,7 +159,6 @@
     <classpathentry kind="src" path="applications/humanres/src"/>
     <classpathentry kind="src" path="applications/workeffort/src"/>
     <classpathentry kind="src" path="specialpurpose/appserver/src"/>
-    <classpathentry kind="src" path="framework/base/build/gen-src/javacc"/>
     <classpathentry excluding="org/ofbiz/base/config/CoberturaInstrumenter.java" kind="src" path="framework/base/src"/>
     <classpathentry kind="src" path="framework/bi/src"/>
     <classpathentry kind="src" path="specialpurpose/birt/src"/>
@@ -172,7 +173,6 @@
     <classpathentry kind="src" path="framework/security/src"/>
     <classpathentry kind="src" path="framework/service/src"/>
     <classpathentry kind="src" path="framework/sql/src"/>
-    <classpathentry kind="src" path="framework/sql/build/gen-src/javacc"/>
     <classpathentry kind="src" path="framework/start/src"/>
     <classpathentry kind="src" path="framework/testtools/src"/>
     <classpathentry excluding="org/ofbiz/webapp/view/JasperReportsPdfViewHandler.java|org/ofbiz/webapp/view/JasperReportsXmlViewHandler.java|org/ofbiz/webapp/view/JasperReportsJXlsViewHandler.java|org/ofbiz/webapp/view/JasperReportsPoiXlsViewHandler.java" kind="src" path="framework/webapp/src"/>
diff --git a/LICENSE b/LICENSE
index 3f55782..58ad29f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -23,6 +23,9 @@
 framework/base/lib/httpclient-cache-4.2.1.jar
 framework/base/lib/httpcore-4.2.1.jar
 framework/base/lib/ivy-2.2.0.jar
+framework/base/lib/jackson-annotations-2.4.0.jar
+framework/base/lib/jackson-core-2.4.2.jar
+framework/base/lib/jackson-databind-2.4.2.jar
 framework/base/lib/jakarta-regexp-1.5.jar
 framework/base/lib/jpim-0.1.jar
 framework/base/lib/juel-impl-2.2.7.jar
@@ -92,7 +95,6 @@
 framework/service/lib/XmlSchema-1.4.3.jar
 framework/webapp/lib/fop-1.1.jar
 framework/webapp/lib/xmlgraphics-commons-1.5.jar
-framework/webapp/lib/json-lib-2.2.3-jdk15.jar
 framework/webapp/lib/ezmorph-0.9.1.jar
 framework/webapp/lib/rome-0.9.jar
 framework/webapp/lib/serializer-2.7.0.jar
@@ -439,7 +441,6 @@
 framework/base/lib/hamcrest-all-1.2.jar
 framework/base/lib/httpunit-1.7.jar
 framework/base/lib/ical4j-1.0-rc2.jar
-lib/build/javacc/javacc.jar (5.0)
 framework/base/lib/javolution-5.4.3.jar
 framework/base/lib/xpp3-1.1.4c.jar
 framework/base/lib/xstream-1.4.6.jar
diff --git a/NOTICE b/NOTICE
index 565c28a..95d0ebb 100644
--- a/NOTICE
+++ b/NOTICE
@@ -253,12 +253,6 @@
 Java PIM Library (jpim)
 Copyright (c) 2001-2003 jpim development team.
 =========================================================================
-==  JavaCC Notice                                                      ==
-=========================================================================
-
-This product includes software developed by the javacc team
-(http://javacc.dev.java.net/).  The included version is 4.1.
-=========================================================================
 ==  XPP3   Notice                                                      ==
 =========================================================================
 
diff --git a/applications/humanres/src/org/ofbiz/humanres/HumanResEvents.java b/applications/humanres/src/org/ofbiz/humanres/HumanResEvents.java
index 0740f57..ae06790 100644
--- a/applications/humanres/src/org/ofbiz/humanres/HumanResEvents.java
+++ b/applications/humanres/src/org/ofbiz/humanres/HumanResEvents.java
@@ -18,18 +18,14 @@
  *******************************************************************************/
 package org.ofbiz.humanres;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import javolution.util.FastList;
 import javolution.util.FastMap;
-import net.sf.json.JSONObject;
 
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilValidate;
@@ -46,7 +42,7 @@
     
     // Please note : the structure of map in this function is according to the JSON data map of the jsTree
     @SuppressWarnings("unchecked")
-    public static void getChildHRCategoryTree(HttpServletRequest request, HttpServletResponse response){
+    public static String getChildHRCategoryTree(HttpServletRequest request, HttpServletResponse response){
         Delegator delegator = (Delegator) request.getAttribute("delegator");
         String partyId = request.getParameter("partyId");
         String onclickFunction = request.getParameter("onclickFunction");
@@ -54,7 +50,7 @@
         String hrefString = request.getParameter("hrefString");
         String hrefString2 = request.getParameter("hrefString2");
         
-        List categoryList = FastList.newInstance();
+        List categoryList = new ArrayList();
         List<GenericValue> childOfComs;
         //check employee position
         try {
@@ -107,11 +103,11 @@
                         
                         categoryList.add(josonMap);
                     }
-                    toJsonObjectList(categoryList,response);
                 }
             }
         } catch (Exception e) {
             e.printStackTrace();
+            return "error";
         }
         
         try {
@@ -235,41 +231,12 @@
                         categoryList.add(emplMap);
                     }
                 }
-                
-                toJsonObjectList(categoryList,response);
             }
         } catch (Exception e) {
             e.printStackTrace();
+            return "error";
         }
-    }
-    
-    @SuppressWarnings("unchecked")
-    public static void toJsonObjectList(List attrList, HttpServletResponse response){
-        String jsonStr = "[";
-        for (Object attrMap : attrList) {
-            JSONObject json = JSONObject.fromObject(attrMap);
-            jsonStr = jsonStr + json.toString() + ',';
-        }
-        jsonStr = jsonStr + "{ } ]";
-        if (UtilValidate.isEmpty(jsonStr)) {
-            Debug.logError("JSON Object was empty; fatal error!",module);
-        }
-        // set the X-JSON content type
-        response.setContentType("application/json");
-        // jsonStr.length is not reliable for unicode characters
-        try {
-            response.setContentLength(jsonStr.getBytes("UTF8").length);
-        } catch (UnsupportedEncodingException e) {
-            Debug.logError("Problems with Json encoding",module);
-        }
-        // return the JSON String
-        Writer out;
-        try {
-            out = response.getWriter();
-            out.write(jsonStr);
-            out.flush();
-        } catch (IOException e) {
-            Debug.logError("Unable to get response writer",module);
-        }
+        request.setAttribute("hrTree", categoryList);
+        return "success";
     }
 }
diff --git a/applications/humanres/webapp/humanres/WEB-INF/controller.xml b/applications/humanres/webapp/humanres/WEB-INF/controller.xml
index ff6c8a7..6c900f5 100644
--- a/applications/humanres/webapp/humanres/WEB-INF/controller.xml
+++ b/applications/humanres/webapp/humanres/WEB-INF/controller.xml
@@ -1051,7 +1051,8 @@
     <request-map uri="getHRChild">
         <security auth="false" https="true"/>
         <event type="java" path="org.ofbiz.humanres.HumanResEvents" invoke="getChildHRCategoryTree"/>
-        <response name="success" type="none"/>
+        <response name="success" type="request" value="json"/>
+        <response name="error" type="request" value="json"/>
     </request-map>
     <request-map uri="createInternalOrg">
         <security https="true" auth="true"/>
diff --git a/applications/humanres/webapp/humanres/humanres/category/CategoryTree.ftl b/applications/humanres/webapp/humanres/humanres/category/CategoryTree.ftl
index 38751b3..62a8ce4 100644
--- a/applications/humanres/webapp/humanres/humanres/category/CategoryTree.ftl
+++ b/applications/humanres/webapp/humanres/humanres/category/CategoryTree.ftl
@@ -69,7 +69,10 @@
                                 "hrefString" : "viewprofile?partyId=" ,
                                 "onclickFunction" : "callDocument"
                         }; 
-                    }
+                    },
+                              success : function(data) {
+                                  return data.hrTree;
+                              }
                 }
             },
             "types" : {
diff --git a/applications/product/src/org/ofbiz/product/category/CategoryServices.java b/applications/product/src/org/ofbiz/product/category/CategoryServices.java
index c0c3d18..90cb1c8 100644
--- a/applications/product/src/org/ofbiz/product/category/CategoryServices.java
+++ b/applications/product/src/org/ofbiz/product/category/CategoryServices.java
@@ -18,9 +18,6 @@
  *******************************************************************************/
 package org.ofbiz.product.category;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
 import java.sql.Timestamp;
 import java.util.List;
 import java.util.Locale;
@@ -31,7 +28,6 @@
 
 import javolution.util.FastList;
 import javolution.util.FastMap;
-import net.sf.json.JSONObject;
 
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
@@ -434,7 +430,7 @@
 
     // Please note : the structure of map in this function is according to the JSON data map of the jsTree
     @SuppressWarnings("unchecked")
-    public static void getChildCategoryTree(HttpServletRequest request, HttpServletResponse response){
+    public static String getChildCategoryTree(HttpServletRequest request, HttpServletResponse response){
         Delegator delegator = (Delegator) request.getAttribute("delegator");
         String productCategoryId = request.getParameter("productCategoryId");
         String isCatalog = request.getParameter("isCatalog");
@@ -528,42 +524,13 @@
                         categoryList.add(josonMap);
                     }
                     List<Map<Object, Object>> sortedCategoryList = UtilMisc.sortMaps(categoryList, sortList);
-                    toJsonObjectList(sortedCategoryList,response);
+                    request.setAttribute("treeData", sortedCategoryList);
                 }
             }
         } catch (GenericEntityException e) {
             e.printStackTrace();
+            return "error";
         }
-    }
-
-    public static void toJsonObjectList(List attrList, HttpServletResponse response){
-        StringBuilder jsonBuilder = new StringBuilder("[");
-        for (Object attrMap : attrList) {
-            JSONObject json = JSONObject.fromObject(attrMap);
-            jsonBuilder.append(json.toString());
-            jsonBuilder.append(',');
-        }
-        jsonBuilder.append("{ } ]");
-        String jsonStr = jsonBuilder.toString();
-        if (UtilValidate.isEmpty(jsonStr)) {
-            Debug.logError("JSON Object was empty; fatal error!",module);
-        }
-        // set the X-JSON content type
-        response.setContentType("application/json");
-        // jsonStr.length is not reliable for unicode characters
-        try {
-            response.setContentLength(jsonStr.getBytes("UTF8").length);
-        } catch (UnsupportedEncodingException e) {
-            Debug.logError("Problems with Json encoding",module);
-        }
-        // return the JSON String
-        Writer out;
-        try {
-            out = response.getWriter();
-            out.write(jsonStr);
-            out.flush();
-        } catch (IOException e) {
-            Debug.logError("Unable to get response writer",module);
-        }
+        return "success";
     }
 }
diff --git a/applications/product/src/org/ofbiz/product/imagemanagement/ImageManagementServices.java b/applications/product/src/org/ofbiz/product/imagemanagement/ImageManagementServices.java
index e1fb15a..586b29b 100644
--- a/applications/product/src/org/ofbiz/product/imagemanagement/ImageManagementServices.java
+++ b/applications/product/src/org/ofbiz/product/imagemanagement/ImageManagementServices.java
@@ -26,30 +26,17 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.RandomAccessFile;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
 import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
 
 import javolution.util.FastList;
 import javolution.util.FastMap;
-import net.sf.json.JSONObject;
-
-import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.FileUploadException;
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.jdom.JDOMException;
 import org.ofbiz.base.util.Debug;
-import org.ofbiz.base.util.FileUtil;
 import org.ofbiz.base.util.UtilDateTime;
 import org.ofbiz.base.util.UtilGenerics;
 import org.ofbiz.base.util.UtilMisc;
@@ -66,8 +53,6 @@
 import org.ofbiz.service.GenericServiceException;
 import org.ofbiz.service.LocalDispatcher;
 import org.ofbiz.service.ServiceUtil;
-import org.ofbiz.webapp.event.EventHandlerException;
-
 
 /**
  * Product Services
@@ -76,7 +61,6 @@
     
     public static final String module = ImageManagementServices.class.getName();
     public static final String resource = "ProductErrorUiLabels";
-    private static List<Map<String,Object>> josonMap = null;
     private static int imageCount = 0;
     private static String imagePath;
     
@@ -649,131 +633,7 @@
         result.put("scaleFactor", scaleFactor);
         return result;
     }
-    
-    public static String multipleUploadImage(HttpServletRequest request, HttpServletResponse response) throws IOException, JDOMException {
-        HttpSession session = request.getSession(true);
-        GenericValue userLogin = (GenericValue) session.getAttribute("userLogin");
-        LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
-        
-        Map<String, String> formInput = FastMap.newInstance();
-        ServletFileUpload fu = new ServletFileUpload(new DiskFileItemFactory(10240, FileUtil.getFile("runtime/tmp")));
-        List<FileItem> lst = null;
-        try {
-           lst = UtilGenerics.checkList(fu.parseRequest(request));
-        } catch (FileUploadException e4) {
-            return e4.getMessage();
-        }
-                
-        FileItem fi = null;
-        FileItem imageFi = null;
-        byte[] imageBytes = {};
-        for (int i=0; i < lst.size(); i++) {
-            fi = lst.get(i);
-            String fieldName = fi.getFieldName();
-            if (fi.isFormField()) {
-                String fieldStr = fi.getString();
-                formInput.put(fieldName, fieldStr);
-            } else if (fieldName.startsWith("imageData")) {
-                Map<String, Object> passedParams = FastMap.newInstance();
-                Map<String, Object> contentLength = FastMap.newInstance();
-                if(josonMap == null){
-                     josonMap = FastList.newInstance();
-                }
-                imageFi = fi;
-                String fileName = fi.getName();
-                String contentType = fi.getContentType();
-                imageBytes = imageFi.get();
-                ByteBuffer byteWrap = ByteBuffer.wrap(imageBytes);
-                passedParams.put("userLogin", userLogin);
-                passedParams.put("productId", formInput.get("productId"));
-                passedParams.put("productContentTypeId", "IMAGE");
-                passedParams.put("_uploadedFile_fileName", fileName);
-                passedParams.put("_uploadedFile_contentType", contentType);
-                passedParams.put("uploadedFile", byteWrap);
-                passedParams.put("imageResize", formInput.get("imageResize"));
-                contentLength.put("imageSize", imageFi.getSize());
-                josonMap.add(contentLength);
-                
-                if (passedParams.get("productId") != null) {
-                    try {
-                        dispatcher.runSync("addMultipleuploadForProduct", passedParams);
-                    } catch (GenericServiceException e) {
-                        Debug.logError(e, module);
-                        return e.getMessage();
-                    }
-                }
-                
-            }
-        }
-        return "success";
-    }
-    
-    public static String progressUploadImage(HttpServletRequest request, HttpServletResponse response) throws EventHandlerException{
-        toJsonObjectList(josonMap,response);
-        josonMap.clear();
-        return "success";
-    }
-    
-    public static void toJsonObject(Map<String,Object> attrMap, HttpServletResponse response){
-        JSONObject json = JSONObject.fromObject(attrMap);
-        String jsonStr = json.toString();
-        if (jsonStr == null) {
-            Debug.logError("JSON Object was empty; fatal error!",module);
-        }
-        // set the X-JSON content type
-        response.setContentType("application/json");
-        // jsonStr.length is not reliable for unicode characters
-        try {
-            response.setContentLength(jsonStr.getBytes("UTF8").length);
-        } catch (UnsupportedEncodingException e) {
-            Debug.logError("Problems with Json encoding",module);
-        }
-        // return the JSON String
-        Writer out;
-        try {
-            out = response.getWriter();
-            out.write(jsonStr);
-            out.flush();
-        } catch (IOException e) {
-            Debug.logError("Unable to get response writer",module);
-        }
-    }
-    
-    public static void toJsonObjectList(List<Map<String,Object>> list, HttpServletResponse response) throws EventHandlerException {
-        JSONObject json = null;
-        List<JSONObject> jsonList = new ArrayList<JSONObject>();
-        if (list != null) {
-            for (Map<String,Object> val : list) {
-                json = new JSONObject();
-                for (String rowKey: val.keySet()) {
-                    json.put(rowKey, val.get(rowKey));
-                }
-                jsonList.add(json);
-            }
-            String jsonStr = jsonList.toString();
-            if (jsonStr == null) {
-                throw new EventHandlerException("JSON Object was empty; fatal error!");
-            }
-            // set the X-JSON content type
-            response.setContentType("application/json");
-            // jsonStr.length is not reliable for unicode characters
-            try {
-                response.setContentLength(jsonStr.getBytes("UTF8").length);
-            } catch (UnsupportedEncodingException e) {
-                throw new EventHandlerException("Problems with Json encoding", e);
-            }
-            // return the JSON String
-            Writer out;
-            try {
-                out = response.getWriter();
-                out.write(jsonStr);
-                out.flush();
-            } catch (IOException e) {
-                throw new EventHandlerException("Unable to get response writer", e);
-            } 
-        }
-    }
-    
+
     public static File checkExistsImage(File file) {
         if (!file.exists()) {
             imageCount = 0;
diff --git a/applications/product/src/org/ofbiz/product/store/ProductStoreEvents.java b/applications/product/src/org/ofbiz/product/store/ProductStoreEvents.java
index 3acb8b6..7ccdd97 100644
--- a/applications/product/src/org/ofbiz/product/store/ProductStoreEvents.java
+++ b/applications/product/src/org/ofbiz/product/store/ProductStoreEvents.java
@@ -18,9 +18,6 @@
  *******************************************************************************/
 package org.ofbiz.product.store;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
 import java.util.List;
 import java.util.Map;
 
@@ -30,9 +27,6 @@
 import javolution.util.FastList;
 import javolution.util.FastMap;
 
-import net.sf.json.JSONObject;
-
-import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.entity.Delegator;
@@ -47,7 +41,7 @@
 
     // Please note : the structure of map in this function is according to the JSON data map of the jsTree
     @SuppressWarnings("unchecked")
-    public static void getChildProductStoreGroupTree(HttpServletRequest request, HttpServletResponse response){
+    public static String getChildProductStoreGroupTree(HttpServletRequest request, HttpServletResponse response){
         Delegator delegator = (Delegator) request.getAttribute("delegator");
         String parentGroupId = request.getParameter("parentGroupId");
         String onclickFunction = request.getParameter("onclickFunction");
@@ -92,41 +86,13 @@
                         productStoreGroupList.add(josonMap);
                     }
                     List<Map<Object, Object>> sortedProductStoreGroupList = UtilMisc.sortMaps(productStoreGroupList, sortList);
-                    toJsonObjectList(sortedProductStoreGroupList,response);
+                    request.setAttribute("storeGroupTree", sortedProductStoreGroupList);
                 }
             }
         } catch (GenericEntityException e) {
             e.printStackTrace();
+            return "error";
         }
-    }
-
-    @SuppressWarnings("unchecked")
-    public static void toJsonObjectList(List attrList, HttpServletResponse response){
-        String jsonStr = "[";
-        for (Object attrMap : attrList) {
-            JSONObject json = JSONObject.fromObject(attrMap);
-            jsonStr = jsonStr + json.toString() + ',';
-        }
-        jsonStr = jsonStr + "{ } ]";
-        if (UtilValidate.isEmpty(jsonStr)) {
-            Debug.logError("JSON Object was empty; fatal error!",module);
-        }
-        // set the X-JSON content type
-        response.setContentType("application/json");
-        // jsonStr.length is not reliable for unicode characters
-        try {
-            response.setContentLength(jsonStr.getBytes("UTF8").length);
-        } catch (UnsupportedEncodingException e) {
-            Debug.logError("Problems with Json encoding",module);
-        }
-        // return the JSON String
-        Writer out;
-        try {
-            out = response.getWriter();
-            out.write(jsonStr);
-            out.flush();
-        } catch (IOException e) {
-            Debug.logError("Unable to get response writer",module);
-        }
+        return "success";
     }
 }
diff --git a/applications/product/webapp/catalog/WEB-INF/controller.xml b/applications/product/webapp/catalog/WEB-INF/controller.xml
index 7b1a9af..767cfb4 100644
--- a/applications/product/webapp/catalog/WEB-INF/controller.xml
+++ b/applications/product/webapp/catalog/WEB-INF/controller.xml
@@ -1457,7 +1457,8 @@
     <request-map uri="getProductStoreGroupRollupHierarchy">
         <security auth="false" https="true"/>
         <event type="java" path="org.ofbiz.product.store.ProductStoreEvents" invoke="getChildProductStoreGroupTree"/>
-        <response name="success" type="none"/>
+        <response name="success" type="request" value="json"/>
+        <response name="error" type="request" value="json"/>
     </request-map>
     <request-map uri="AddProductStoreToGroup">
         <security auth="true" https="true"/>
@@ -2900,17 +2901,6 @@
         <response name="success" type="view" value="viewPreviewImage"/>
         <response name="error" type="view" value="viewPreviewImage"/>
     </request-map>
-    <request-map uri="multipleUploadImage">
-        <security https="true" auth="true"/>
-        <event type="java" path="org.ofbiz.product.imagemanagement.ImageManagementServices" invoke="multipleUploadImage"/>
-        <response name="success" type="view" value="ImageUpload"/>
-        <response name="error" type="view" value="ImageUpload"/>
-    </request-map>
-    <request-map uri="progressUploadImage">
-        <security https="true" auth="true"/>
-        <event type="java" path="org.ofbiz.virtualvillage.imagemanagement.ImageManagementServices" invoke="progressUploadImage"/>
-        <response name="success" type="view" value="main"/>
-    </request-map>
     <request-map uri="chooseFrameImage">
         <security https="true" auth="true"/>
         <event type="java" path="org.ofbiz.product.imagemanagement.FrameImage" invoke="chooseFrameImage"/>
@@ -3022,7 +3012,8 @@
     <request-map uri="getChild">
         <security auth="false" https="true"/>
         <event type="java" path="org.ofbiz.product.category.CategoryServices" invoke="getChildCategoryTree"/>
-        <response name="success" type="none"/>
+        <response name="success" type="request" value="json"/>
+        <response name="error" type="request" value="json"/>
     </request-map>
     <request-map uri="listMiniproduct">
         <security auth="false" https="true"/>
diff --git a/applications/product/webapp/catalog/category/CategoryTree.ftl b/applications/product/webapp/catalog/category/CategoryTree.ftl
index a075216..7b14c8c 100644
--- a/applications/product/webapp/catalog/category/CategoryTree.ftl
+++ b/applications/product/webapp/catalog/category/CategoryTree.ftl
@@ -62,20 +62,24 @@
             $.cookie('jstree_select', "<#if productCategoryId??>${productCategoryId}<#elseif prodCatalogId??>${prodCatalogId}<#elseif showProductCategoryId??>${showProductCategoryId}</#if>");
         </#if>
         jQuery("#tree").jstree({
-        "plugins" : [ "themes", "json_data","ui" ,"cookies", "types"],
+            "plugins" : [ "themes", "json_data","ui" ,"cookies", "types"],
             "json_data" : {
                 "data" : rawdata,
-                          "ajax" : { "url" : "<@ofbizUrl>getChild</@ofbizUrl>", "type" : "POST",
-                          "data" : function (n) {
-                            return { 
-                                "isCategoryType" :  n.attr ? n.attr("isCatalog").replace("node_","") : 1 ,
-                                "isCatalog" :  n.attr ? n.attr("isCatalog").replace("node_","") : 1 ,
-                                "productCategoryId" : n.attr ? n.attr("id").replace("node_","") : 1 ,
-                                "additionParam" : "','category" ,
-                                "hrefString" : "EditCategory?productCategoryId=" ,
-                                "onclickFunction" : "callDocument"
-                        }; 
-                    }
+                "ajax" : { "url" : "<@ofbizUrl>getChild</@ofbizUrl>",
+                           "type" : "POST",
+                           "data" : function (n) {
+                                        return {
+                                            "isCategoryType" :  n.attr ? n.attr("isCatalog").replace("node_","") : 1 ,
+                                            "isCatalog" :  n.attr ? n.attr("isCatalog").replace("node_","") : 1 ,
+                                            "productCategoryId" : n.attr ? n.attr("id").replace("node_","") : 1 ,
+                                            "additionParam" : "','category" ,
+                                            "hrefString" : "EditCategory?productCategoryId=" ,
+                                            "onclickFunction" : "callDocument"
+                                        };
+                                    },
+                           success : function(data) {
+                               return data.treeData;
+                           }
                 }
             },
             "types" : {
diff --git a/applications/product/webapp/catalog/store/ProductStoreGroupTree.ftl b/applications/product/webapp/catalog/store/ProductStoreGroupTree.ftl
index b9aaa6c..e416c1c 100644
--- a/applications/product/webapp/catalog/store/ProductStoreGroupTree.ftl
+++ b/applications/product/webapp/catalog/store/ProductStoreGroupTree.ftl
@@ -49,17 +49,21 @@
         "plugins" : [ "themes", "json_data","ui" ,"cookies", "types"],
             "json_data" : {
                 "data" : rawdata,
-                          "ajax" : { "url" : "<@ofbizUrl>getProductStoreGroupRollupHierarchy</@ofbizUrl>", "type" : "POST",
-                          "data" : function (n) {
-                            return { 
-                                "parentGroupId" :  n.attr ? n.attr("parentGroupId").replace("node_","") : 1,
-                                "onclickFunction" : "callDocument"
-                        }; 
-                    }
+                "ajax" : { "url" : "<@ofbizUrl>getProductStoreGroupRollupHierarchy</@ofbizUrl>",
+                           "type" : "POST",
+                           "data" : function (n) {
+                               return {
+                                   "parentGroupId" :  n.attr ? n.attr("parentGroupId").replace("node_","") : 1,
+                                   "onclickFunction" : "callDocument"
+                               };
+                           },
+                           success : function (data) {
+                               return data.storeGroupTree;
+                           }
                 }
             },
             "types" : {
-             "valid_children" : [ "root" ]
+                "valid_children" : [ "root" ]
             }
         });
     });
diff --git a/framework/base/ant-scripts/ofbiz-jjtree.groovy b/framework/base/ant-scripts/ofbiz-jjtree.groovy
deleted file mode 100644
index f3abbfd..0000000
--- a/framework/base/ant-scripts/ofbiz-jjtree.groovy
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-import org.apache.tools.ant.BuildException
-
-def resolveFile = { name, base ->
-    return project.resolveFile(project.replaceProperties(name), base)
-}
-
-def getAttribute = { name, defaultValue ->
-    def value = attributes[name]
-    if (value == null) {
-        if (!defaultValue) throw new BuildException("No default for attribute($name)")
-        value = defaultValue
-    }
-    return value
-}
-
-def uptodate = { left, right ->
-    def uptodateTask = project.createTask('uptodate')
-    uptodateTask.srcfile = left
-    uptodateTask.targetFile = right
-    return uptodateTask.eval()
-}
-
-def basedir = project.baseDir
-def ant = new AntBuilder(self)
-def javacchome = resolveFile('${ofbiz.home.dir}/framework/base/lib/javacc', basedir)
-def src = getAttribute('src', 'src')
-def dir = getAttribute('dir', basedir)
-def file = getAttribute('file', basedir)
-def srcfile = resolveFile("$src/$dir/${file}.jjt", basedir)
-def srcpaths = [
-    jjtree:     resolveFile(getAttribute('gendir', '${build.dir}/gen-src') + '/jjtree/', basedir),
-    javacc:     resolveFile(getAttribute('gendir', '${build.dir}/gen-src') + '/javacc/', basedir),
-]
-def dirs = [
-    jjtree:     resolveFile(dir, srcpaths.jjtree),
-    javacc:     resolveFile(dir, srcpaths.javacc),
-]
-def gen = [
-    jjfile:     new File(dirs.jjtree, project.replaceProperties("${file}.jj")),
-    javafile:   new File(dirs.javacc, project.replaceProperties("${file}.java")),
-]
-def srcpath = project.getReference('src-path')
-def foundpath = [
-    jjtree:     false,
-    javacc:     false,
-]
-srcpath.each {
-    foundpath.jjtree |= it.file == srcpaths.jjtree
-    foundpath.javacc |= it.file == srcpaths.javacc
-}
-if (!foundpath.jjtree) srcpath.append(ant.path{pathelement(location: srcpaths.jjtree)})
-if (!foundpath.javacc) srcpath.append(ant.path{pathelement(location: srcpaths.javacc)})
-
-if (!uptodate(srcfile, gen.jjfile)) {
-    ant.delete(dir:dirs.jjtree)
-    ant.mkdir(dir:dirs.jjtree)
-    ant.jjtree(
-        target:             srcfile,
-        javacchome:         javacchome,
-        outputdirectory:    dirs.jjtree,
-    )
-}
-if (!uptodate(gen.jjfile, gen.javafile)) {
-    ant.delete(dir:dirs.javacc)
-    ant.mkdir(dir:dirs.javacc)
-
-    ant.javacc(
-        target:             gen.jjfile,
-        javacchome:         javacchome,
-        outputdirectory:    dirs.javacc,
-    )
-    ant.delete(dir:resolveFile('${build.classes}/' + dir, basedir))
-}
diff --git a/framework/base/build.xml b/framework/base/build.xml
index 3518724..a4ec0cc 100644
--- a/framework/base/build.xml
+++ b/framework/base/build.xml
@@ -51,6 +51,7 @@
         <file name="org/ofbiz/base/conversion/test/TestBooleanConverters.java"/>
         <file name="org/ofbiz/base/conversion/test/DateTimeTests.java"/>
         <file name="org/ofbiz/base/conversion/test/MiscTests.java"/>
+        <file name="org/ofbiz/base/conversion/test/TestJSONConverters.java"/>
         <file name="org/ofbiz/base/util/test/UtilIOTests.java"/>
         <file name="org/ofbiz/base/test/BaseUnitTests.java"/>
         <file name="org/ofbiz/base/util/collections/test/GenericMapTest.java"/>
@@ -80,20 +81,6 @@
         </patternset>
     </target>
 
-    <target name="gen-src">
-        <ofbiz-javacc dir="org/ofbiz/base/json" file="JSON"/>
-    </target>
-
-    <target name="classes" depends="prepare,gen-src">
-        <javac17>
-            <sourcepath>
-                <dirset dir="build/gen-src">
-                    <include name="javacc"/>
-                </dirset>
-            </sourcepath>
-        </javac17>
-    </target>
-
     <target name="jar" depends="classes">
         <main-jar>
             <main-elements>
diff --git a/framework/base/lib/jackson-annotations-2.4.0.jar b/framework/base/lib/jackson-annotations-2.4.0.jar
new file mode 100644
index 0000000..0b55559
--- /dev/null
+++ b/framework/base/lib/jackson-annotations-2.4.0.jar
Binary files differ
diff --git a/framework/base/lib/jackson-core-2.4.2.jar b/framework/base/lib/jackson-core-2.4.2.jar
new file mode 100644
index 0000000..fad6f9b
--- /dev/null
+++ b/framework/base/lib/jackson-core-2.4.2.jar
Binary files differ
diff --git a/framework/base/lib/jackson-databind-2.4.2.jar b/framework/base/lib/jackson-databind-2.4.2.jar
new file mode 100644
index 0000000..ea95c53
--- /dev/null
+++ b/framework/base/lib/jackson-databind-2.4.2.jar
Binary files differ
diff --git a/framework/base/src/org/ofbiz/base/conversion/JSONConverters.java b/framework/base/src/org/ofbiz/base/conversion/JSONConverters.java
index dc4983c..28cebc0 100644
--- a/framework/base/src/org/ofbiz/base/conversion/JSONConverters.java
+++ b/framework/base/src/org/ofbiz/base/conversion/JSONConverters.java
@@ -18,124 +18,15 @@
  *******************************************************************************/
 package org.ofbiz.base.conversion;
 
-import java.util.Collection;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
-import javolution.util.FastSet;
-
-import org.ofbiz.base.json.JSON;
+import org.ofbiz.base.lang.JSON;
 import org.ofbiz.base.util.UtilGenerics;
 
 /** JSON Converter classes. */
 public class JSONConverters implements ConverterLoader {
-    public static class ObjectToJSONResultCreator<R extends JSONResult> implements ConverterCreator, ConverterLoader {
-        public void loadConverters() {
-            Converters.registerCreator(this);
-        }
-
-        public <S, T> Converter<S, T> createConverter(Class<S> sourceClass, Class<T> targetClass) {
-            if (!JSONResult.class.isAssignableFrom(targetClass)) {
-                return null;
-            }
-            if (Collection.class.isAssignableFrom(sourceClass)) {
-            } else if (Map.class.isAssignableFrom(sourceClass)) {
-            } else if (Byte.class == sourceClass) {
-            } else if (Character.class == sourceClass) {
-            } else if (Double.class == sourceClass) {
-            } else if (Float.class == sourceClass) {
-            } else if (Integer.class == sourceClass) {
-            } else if (Long.class == sourceClass) {
-            } else if (Short.class == sourceClass) {
-            } else {
-                return null;
-            }
-            return UtilGenerics.cast(new ObjectToJSONWriterResult<S, JSONResult>(sourceClass, UtilGenerics.<Class<JSONResult>>cast(targetClass)));
-        }
-    }
-
-    private static class ObjectToJSONWriterResult<S, T extends JSONResult> extends AbstractConverter<S, T> {
-        public ObjectToJSONWriterResult(Class<S> sourceClass, Class<T> targetClass) {
-            super(sourceClass, targetClass);
-        }
-
-        public T convert(S obj) throws ConversionException {
-            try {
-                T result = UtilGenerics.<T>cast(getTargetClass().newInstance());
-                result.getWriter().write(obj);
-                return result;
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
-                throw new ConversionException(e);
-            }
-        }
-    }
-
-    public static class JSONToByte extends AbstractConverter<JSON, Byte> {
-        public JSONToByte() {
-            super(JSON.class, Byte.class);
-        }
-
-        public Byte convert(JSON obj) throws ConversionException {
-            try {
-                return obj.JSONLong().byteValue();
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
-                throw new ConversionException(e);
-            }
-        }
-    }
-
-    public static class JSONToDouble extends AbstractConverter<JSON, Double> {
-        public JSONToDouble() {
-            super(JSON.class, Double.class);
-        }
-
-        public Double convert(JSON obj) throws ConversionException {
-            try {
-                return obj.JSONFloat();
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
-                throw new ConversionException(e);
-            }
-        }
-    }
-
-    public static class JSONToFloat extends AbstractConverter<JSON, Float> {
-        public JSONToFloat() {
-            super(JSON.class, Float.class);
-        }
-
-        public Float convert(JSON obj) throws ConversionException {
-            try {
-                return obj.JSONFloat().floatValue();
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
-                throw new ConversionException(e);
-            }
-        }
-    }
-
-    public static class JSONToInteger extends AbstractConverter<JSON, Integer> {
-        public JSONToInteger() {
-            super(JSON.class, Integer.class);
-        }
-
-        public Integer convert(JSON obj) throws ConversionException {
-            try {
-                return obj.JSONLong().intValue();
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
-                throw new ConversionException(e);
-            }
-        }
-    }
 
     public static class JSONToList extends AbstractConverter<JSON, List<Object>> {
         public JSONToList() {
@@ -144,26 +35,8 @@
 
         public List<Object> convert(JSON obj) throws ConversionException {
             try {
-                return obj.JSONArray();
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
-                throw new ConversionException(e);
-            }
-        }
-    }
-
-    public static class JSONToLong extends AbstractConverter<JSON, Long> {
-        public JSONToLong() {
-            super(JSON.class, Long.class);
-        }
-
-        public Long convert(JSON obj) throws ConversionException {
-            try {
-                return obj.JSONLong();
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
+                return UtilGenerics.<List<Object>>cast(obj.toObject(List.class));
+            } catch (IOException e) {
                 throw new ConversionException(e);
             }
         }
@@ -176,44 +49,36 @@
 
         public Map<String, Object> convert(JSON obj) throws ConversionException {
             try {
-                return obj.JSONObject();
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
+                return UtilGenerics.<Map<String, Object>>cast(obj.toObject(Map.class));
+            } catch (IOException e) {
                 throw new ConversionException(e);
             }
         }
     }
 
-    public static class JSONToShort extends AbstractConverter<JSON, Short> {
-        public JSONToShort() {
-            super(JSON.class, Short.class);
+    public static class ListToJSON extends AbstractConverter<List<Object>, JSON> {
+        public ListToJSON() {
+            super(List.class, JSON.class);
         }
 
-        public Short convert(JSON obj) throws ConversionException {
+        public JSON convert(List<Object> obj) throws ConversionException {
             try {
-                return obj.JSONLong().shortValue();
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
+                return JSON.from(obj);
+            } catch (IOException e) {
                 throw new ConversionException(e);
             }
         }
     }
 
-    public static class JSONToSet extends AbstractConverter<JSON, Set<Object>> {
-        public JSONToSet() {
-            super(JSON.class, Set.class);
+    public static class MapToJSON extends AbstractConverter<Map<String, Object>, JSON> {
+        public MapToJSON() {
+            super(Map.class, JSON.class);
         }
 
-        public Set<Object> convert(JSON obj) throws ConversionException {
+        public JSON convert(Map<String, Object> obj) throws ConversionException {
             try {
-                Set<Object> set = FastSet.newInstance();
-                set.addAll(obj.JSONArray());
-                return set;
-            } catch (RuntimeException e) {
-                throw e;
-            } catch (Exception e) {
+                return JSON.from(obj);
+            } catch (IOException e) {
                 throw new ConversionException(e);
             }
         }
diff --git a/framework/base/src/org/ofbiz/base/conversion/JSONResult.java b/framework/base/src/org/ofbiz/base/conversion/JSONResult.java
deleted file mode 100644
index 99a3785..0000000
--- a/framework/base/src/org/ofbiz/base/conversion/JSONResult.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.conversion;
-
-import java.io.StringWriter;
-
-import org.ofbiz.base.json.JSONWriter;
-
-public interface JSONResult {
-    JSONWriter getWriter();
-    String getResult();
-
-    public static class Indenting implements JSONResult {
-        private final StringWriter sw = new StringWriter();
-        private final JSONWriter writer = new JSONWriter(sw);
-
-        public JSONWriter getWriter() {
-            return writer;
-        }
-
-        public String getResult() {
-            return sw.toString();
-        }
-    }
-}
-
diff --git a/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java b/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java
index beed261..c4e40e2 100644
--- a/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java
+++ b/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java
@@ -21,7 +21,6 @@
 import java.math.BigDecimal;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -32,12 +31,10 @@
 import org.ofbiz.base.conversion.Converter;
 import org.ofbiz.base.conversion.ConverterLoader;
 import org.ofbiz.base.conversion.Converters;
-import org.ofbiz.base.conversion.JSONResult;
 import org.ofbiz.base.lang.SourceMonitored;
 import org.ofbiz.base.test.GenericTestCaseBase;
 import org.ofbiz.base.util.UtilGenerics;
 import org.ofbiz.base.util.UtilMisc;
-import org.ofbiz.base.util.collections.LRUMap;
 
 @SourceMonitored
 public class MiscTests extends GenericTestCaseBase {
@@ -46,12 +43,6 @@
         super(name);
     }
 
-    private static <S, T extends JSONResult.Indenting> void assertConversion(String label, String wanted, Class<T> targetClass, Object source, Class<S> sourceClass) throws Exception {
-        Converter<S, T> converter = Converters.getConverter(sourceClass, targetClass);
-        assertTrue(label + " can convert", converter.canConvert(sourceClass, targetClass));
-        assertEquals(label, wanted, converter.convert(UtilGenerics.<S>cast(source)).getResult());
-    }
-
     public void testStaticHelperClass() throws Exception {
         assertStaticHelperClass(Converters.class);
     }
@@ -66,22 +57,6 @@
         Converters.loadContainedConverters(MiscTests.class);
     }
 
-    public void testExtendsImplements() throws Exception {
-        List<String> arraysList = Arrays.asList("a", "b", "c");
-        assertConversion("", "[\n \"a\",\n \"b\",\n \"c\"\n]", JSONResult.Indenting.class, arraysList, arraysList.getClass());
-        Exception caught = null;
-        try {
-            Converters.getConverter(MiscTests.class, String.class);
-        } catch (ClassNotFoundException e) {
-            caught = e;
-        } finally {
-            assertNotNull("ClassNotFoundException thrown for MiscTests.class", caught);
-        }
-        LRUMap<String, String> map = new LRUMap<String, String>();
-        map.put("a", "1");
-        assertConversion("", "{\n \"a\": \"1\"\n}", JSONResult.Indenting.class, map, LRUMap.class);
-    }
-
     public static <S> void assertPassThru(Object wanted, Class<S> sourceClass) throws Exception {
         assertPassThru(wanted, sourceClass, sourceClass);
     }
diff --git a/framework/base/src/org/ofbiz/base/conversion/test/TestJSONConverters.java b/framework/base/src/org/ofbiz/base/conversion/test/TestJSONConverters.java
new file mode 100644
index 0000000..ec4ae09
--- /dev/null
+++ b/framework/base/src/org/ofbiz/base/conversion/test/TestJSONConverters.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.base.conversion.test;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.ofbiz.base.conversion.Converter;
+import org.ofbiz.base.conversion.ConverterLoader;
+import org.ofbiz.base.conversion.Converters;
+import org.ofbiz.base.conversion.JSONConverters;
+import org.ofbiz.base.lang.JSON;
+
+public class TestJSONConverters  extends TestCase {
+    public TestJSONConverters(String name) {
+        super(name);
+        ConverterLoader loader = new JSONConverters();
+        loader.loadConverters();
+    }
+
+    public void testJSONToMap() throws Exception {
+        Converter<JSON, Map> converter = Converters.getConverter(JSON.class, Map.class);
+        Map map, convertedMap;
+        map = new HashMap();
+        map.put("field1", "value1");
+        JSON json = JSON.from(map);
+        convertedMap = converter.convert(json);
+        assertEquals("JSON to Map", map, convertedMap);
+    }
+
+    public void testJSONToList() throws Exception {
+        Converter<JSON, List> converter = Converters.getConverter(JSON.class, List.class);
+        List list, convertedList;
+        list = new ArrayList();
+        list.add("field1");
+        list.add("field2");
+        JSON json = JSON.from(list);
+        convertedList = converter.convert(json);
+        assertEquals("JSON to List", list, convertedList);
+    }
+
+    public void testMapToJSON() throws Exception {
+        Converter<Map, JSON> converter = Converters.getConverter(Map.class, JSON.class);
+        JSON json;
+        Map map = new LinkedHashMap();
+        map.put("field1", "value1");
+        map.put("field2", new BigDecimal("3.7"));
+        json = converter.convert(map);
+        assertEquals("Map to JSON", "{\"field1\":\"value1\",\"field2\":3.7}", json.toString());
+    }
+
+    public void testListToJSON() throws Exception {
+        Converter<List, JSON> converter = Converters.getConverter(List.class, JSON.class);
+        JSON json;
+        List list = new ArrayList();
+        list.add("field1");
+        list.add("field2");
+        json = converter.convert(list);
+        assertEquals("List to JSON", "[\"field1\",\"field2\"]", json.toString());
+    }
+}
+
diff --git a/framework/base/src/org/ofbiz/base/json/JSON.jj b/framework/base/src/org/ofbiz/base/json/JSON.jj
deleted file mode 100644
index 4610ae4..0000000
--- a/framework/base/src/org/ofbiz/base/json/JSON.jj
+++ /dev/null
@@ -1,319 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-options {
-  ERROR_REPORTING = true;
-  STATIC = false;
-//  DEBUG_PARSER = true;
-//  DEBUG_LOOKAHEAD = true;
-//  DEBUG_TOKEN_MANAGER = true;
-  LOOKAHEAD = 1;
-//  CHOICE_AMBIGUITY_CHECK = 3;
-//  OTHER_AMBIGUITY_CHECK = 3;
-}
-
-PARSER_BEGIN(JSON)
-
-package org.ofbiz.base.json;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import javolution.util.FastMap;
-
-import org.ofbiz.base.util.UtilIO;
-
-public class JSON {
-    private boolean allowResolve;
-
-    public JSON(String fileName) {
-        this(System.in);
-        try { ReInit(new FileInputStream(new File(fileName))); }
-        catch(Exception e) { e.printStackTrace(); }
-//        allowed[TEXT] = 1;
-//        allowed[FIRST_COLUMN_TEXT] = 1;
-    }
-
-    public JSON allowResolve(boolean allowResolve) {
-        this.allowResolve = allowResolve;
-    token_source.SwitchTo(allowResolve ? RESOLVE : DEFAULT);
-    return this;
-    }
-}
-
-PARSER_END(JSON)
-TOKEN_MGR_DECLS: {
-    protected LinkedList<Integer> stateStack = new LinkedList<Integer>();
-    protected StringBuilder statePrefix = new StringBuilder();
-
-    protected void pushState(int state) {
-        //System.err.println(statePrefix + "push: " + lexStateNames[curLexState] + " -> " + lexStateNames[state]);
-        stateStack.add(curLexState);
-        statePrefix.append(' ');
-        SwitchTo(state);
-    }
-
-    protected void popState() {
-        int oldState = stateStack.removeLast();
-        statePrefix.setLength(statePrefix.length() - 1);
-        //System.err.println(statePrefix + "pop: " + lexStateNames[curLexState] + " -> " + lexStateNames[oldState]);
-        SwitchTo(oldState);
-    }
-}
-<DEFAULT,RESOLVE>
-TOKEN:
-{
-  <OBJECT_BEGIN: "{">
-| <OBJECT_END: "}">
-| <ARRAY_BEGIN: "[">
-| <ARRAY_END: "]">
-| <ITEM_SEP: ",">
-| <KEY_SEP: ":">
-| <TRUE: "true">
-| <FALSE: "false">
-| <NULL: "null">
-| <WHOLE_NUMBER:
-    <NUMBER_PREFIX>
-  >
-| <FLOAT_NUMBER:
-    <NUMBER_PREFIX>
-    ("." (["0"-"9"])*)?
-    (
-      ["e", "E"]
-      (["+", "-"])?
-      (["0"-"9"])+
-    )?
-  >
-| <#NUMBER_PREFIX:
-    (["-"])?
-    (
-      "0"
-    | ["1"-"9"] (["0"-"9"])*
-    )
-  >
-}
-
-<DEFAULT,RESOLVE,IN_RESOLVE_VALUE>
-TOKEN:
-{
-  <STRING_START: "\""> { pushState(IN_STRING); }
-}
-
-<IN_RESOLVE_VALUE>
-TOKEN:
-{
-  <CLOSE_PAREN: ")"> { popState(); }
-}
-
-<RESOLVE>
-TOKEN:
-{
-  <RESOLVE_BEGIN: "resolve("> { pushState(IN_RESOLVE_VALUE); }
-}
-
-<IN_STRING>
-TOKEN:
-{
-  <CHARACTER: (~["\"","\\","\u0000"-"\u001f"])+>
-| <STRING_END: "\""> { popState(); }
-| <CONTROL_CHAR: "\\" ["\"", "\\", "/", "b","f","n","r","t"]>
-| <UNICODE: "\\u"
-    ["a"-"f", "A"-"F", "0"-"9"]
-    ["a"-"f", "A"-"F", "0"-"9"]
-    ["a"-"f", "A"-"F", "0"-"9"]
-    ["a"-"f", "A"-"F", "0"-"9"]
-  >
-}
-
-<DEFAULT,RESOLVE>
-SKIP:
-{
-  <WHITESPACE: [" ", "\r", "\n", "\t"]>
-}
-
-<DEFAULT,RESOLVE>
-MORE:
-{
-  <COMMENT_START: "/*"> { if (curLexState != IN_COMMENT) pushState(IN_COMMENT); }
-}
-
-<IN_COMMENT>
-MORE:
-{
-  <(~[])>
-}
-
-<IN_COMMENT>
-MORE:
-{
-  <COMMENT_END: "*/"> { popState(); }
-}
-
-Object JSONValue():
-{ Object value; }
-{
-  value=JSONItem()
-  <EOF>
-  { return value; }
-}
-
-Object JSONItem():
-{ Object value; }
-{
-  (
-    value=JSONString()
-  | value=JSONLong()
-  | value=JSONFloat()
-  | value=JSONObject()
-  | value=JSONArray()
-  | value=True()
-  | value=False()
-  | value=Null()
-  | value=JSONResolve()
-  )
-  { return value; }
-}
-
-Object JSONResolve():
-{
-  String name, value;
-}
-{
-  <RESOLVE_BEGIN>
-  value=JSONString()
-  <CLOSE_PAREN>
-  {
-    try {
-      return UtilIO.readObject(value.toCharArray());
-    } catch (ClassNotFoundException e) {
-      throw generateParseException();
-    } catch (IOException e) {
-      throw generateParseException();
-    }
-  }
-}
-String JSONString():
-{
-  StringBuilder sb = new StringBuilder();
-}
-{
-  <STRING_START> (
-    <CHARACTER> { sb.append(getToken(0).image); }
-  | <CONTROL_CHAR> {
-    switch (getToken(0).image.charAt(1)) {
-      case '"': sb.append('"'); break;
-      case '\\': sb.append('\\'); break;
-      case '/': sb.append('/'); break;
-      case 'b': sb.append('\b'); break;
-      case 'f': sb.append('\f'); break;
-      case 'n': sb.append('\n'); break;
-      case 'r': sb.append('\r'); break;
-      case 't': sb.append('\t'); break;
-    }
-  }
-  | <UNICODE> {
-    int v = Integer.parseInt(getToken(0).image.substring(2), 16);
-    sb.append((char) v);
-  }
-  )*
-  <STRING_END>
-  { return sb.toString(); }
-}
-
-Long JSONLong():
-{}
-{
-  try {
-    <WHOLE_NUMBER> { return new Long(getToken(0).image); }
-  } catch (NumberFormatException e) {
-    throw generateParseException();
-  }
-}
-
-Double JSONFloat():
-{}
-{
-  try {
-    <FLOAT_NUMBER> { return new Double(getToken(0).image); }
-  } catch (NumberFormatException e) {
-    throw generateParseException();
-  }
-}
-
-Map<String, Object> JSONObject():
-{
-  Map<String, Object> map = FastMap.newInstance();
-}
-{
-  <OBJECT_BEGIN>
-  (JSONObjectEntry(map))? (<ITEM_SEP> (JSONObjectEntry(map))?)*
-  <OBJECT_END>
-  { return map; }
-}
-
-void JSONObjectEntry(Map<String, Object> map):
-{
-  String key;
-  Object value;
-}
-{
-  key=JSONString() <KEY_SEP> value=JSONItem()
-  { map.put(key, value); }
-}
-
-List<Object> JSONArray():
-{
-  ArrayList<Object> list = new ArrayList<Object>();
-  Object value;
-}
-{
-  <ARRAY_BEGIN>
-  (<ITEM_SEP>)*
-  (
-    value=JSONItem() { list.add(value); }
-    (
-      <ITEM_SEP>
-      (value=JSONItem() { list.add(value); })?
-    )*
-  )?
-  <ARRAY_END>
-  { return list; }
-}
-
-Boolean True():
-{}
-{
-  <TRUE> { return Boolean.TRUE; }
-}
-
-Boolean False():
-{}
-{
-  <FALSE> { return Boolean.FALSE; }
-}
-
-Object Null():
-{}
-{
-  <NULL> { return null; }
-}
diff --git a/framework/base/src/org/ofbiz/base/json/JSONWriter.java b/framework/base/src/org/ofbiz/base/json/JSONWriter.java
deleted file mode 100644
index 6243c0d..0000000
--- a/framework/base/src/org/ofbiz/base/json/JSONWriter.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.json;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.ofbiz.base.lang.SourceMonitored;
-import org.ofbiz.base.util.IndentingWriter;
-import org.ofbiz.base.util.UtilGenerics;
-import org.ofbiz.base.util.UtilIO;
-
-@SourceMonitored
-public class JSONWriter {
-    private final IndentingWriter writer;
-    private final FallbackHandler fallbackHandler;
-
-    public JSONWriter(IndentingWriter writer) {
-        this(writer, StandardFallbackHandler);
-    }
-
-    public JSONWriter(IndentingWriter writer, FallbackHandler fallbackHandler) {
-        this.writer = writer;
-        this.fallbackHandler = fallbackHandler;
-    }
-
-    public JSONWriter(Writer writer) {
-        this(IndentingWriter.makeIndentingWriter(writer));
-    }
-
-    public JSONWriter(Writer writer, FallbackHandler fallbackHandler) {
-        this(IndentingWriter.makeIndentingWriter(writer), fallbackHandler);
-    }
-
-    public IndentingWriter getWriter() {
-        return writer;
-    }
-
-    public JSONWriter close() throws IOException {
-        getWriter().close();
-        return this;
-    }
-
-    public JSONWriter write(byte b) throws IOException {
-        writer.write(Byte.toString(b));
-        return this;
-    }
-
-    public JSONWriter write(short s) throws IOException {
-        writer.write(Short.toString(s));
-        return this;
-    }
-
-    public JSONWriter write(int i) throws IOException {
-        writer.write(Integer.toString(i));
-        return this;
-    }
-
-    public JSONWriter write(long l) throws IOException {
-        writer.write(Long.toString(l));
-        return this;
-    }
-
-    public JSONWriter write(float f) throws IOException {
-        writer.write(Float.toString(f));
-        return this;
-    }
-
-    public JSONWriter write(double d) throws IOException {
-        writer.write(Double.toString(d));
-        return this;
-    }
-
-    public JSONWriter write(char c) throws IOException {
-        write(Character.toString(c));
-        return this;
-    }
-
-    public JSONWriter write(String s) throws IOException {
-        writer.write('"');
-        for (int i = 0; i < s.length(); i++) {
-            char c = s.charAt(i);
-            switch (c) {
-                case '\\':  writer.write("\\\\"); continue;
-                case '/':  writer.write("\\/"); continue;
-                case '"':  writer.write("\\\""); continue;
-                case '\b':  writer.write("\\b"); continue;
-                case '\f':  writer.write("\\f"); continue;
-                case '\n':  writer.write("\\n"); continue;
-                case '\r':  writer.write("\\r"); continue;
-                case '\t':  writer.write("\\t"); continue;
-            }
-            if (c >= 32 && c < 256) {
-                writer.write(c);
-            } else {
-                writer.write("\\u");
-                String n = Integer.toString(c, 16);
-                for (int j = 4 - n.length(); j > 0; j--) writer.write('0');
-                writer.write(n);
-            }
-        }
-        writer.write('"');
-        return this;
-    }
-
-    public <K, V> JSONWriter write(Map<K, V> m) throws IOException {
-        writer.write('{');
-        writer.push();
-        Iterator<Map.Entry<K, V>> it = m.entrySet().iterator();
-        if (it.hasNext()) writer.newline();
-        while (it.hasNext()) {
-            Map.Entry<K, V> entry = it.next();
-            write(entry.getKey());
-            writer.write(':');
-            writer.space();
-            write(entry.getValue());
-            if (it.hasNext()) writer.write(',');
-            writer.newline();
-        }
-        writer.pop();
-        writer.write('}');
-        return this;
-    }
-
-    public <E> JSONWriter write(Collection<E> c) throws IOException {
-        this.write(c.iterator());
-        return this;
-    }
-
-    public <E> JSONWriter write(Iterator<E> it) throws IOException {
-        writer.write('[');
-        writer.push();
-        if (it.hasNext()) writer.newline();
-        while (it.hasNext()) {
-            write(it.next());
-            if (it.hasNext()) writer.write(',');
-            writer.newline();
-        }
-        writer.pop();
-        writer.write(']');
-        return this;
-    }
-
-    public <T> JSONWriter write(T... o) throws IOException {
-        writer.write('[');
-        writer.push();
-        for (int i = 0; i < o.length; i++) {
-            if (i != 0) writer.write(',');
-            writer.newline();
-            write(o[i]);
-        }
-        if (o.length > 0) writer.newline();
-        writer.pop();
-        writer.write(']');
-        return this;
-    }
-
-    public JSONWriter write(Object o) throws IOException {
-        if (o == null) {
-            writer.write("null");
-            return this;
-        } else if (o instanceof Boolean) {
-            writer.write(((Boolean) o).booleanValue() ? "true" : "false");
-            return this;
-        } else if (o instanceof String) {
-            return write((String) o);
-        } else if (o instanceof Map<?, ?>) {
-            return write(UtilGenerics.<Map<?, ?>>cast(o));
-        } else if (o instanceof Collection<?>) {
-            return write(UtilGenerics.<Collection<?>>cast(o));
-        } else if (o instanceof Iterator<?>) {
-            return write(UtilGenerics.<Iterator<?>>cast(o));
-        } else if (o instanceof Byte) {
-            return write(((Byte) o).byteValue());
-        } else if (o instanceof Character) {
-            return write(((Character) o).charValue());
-        } else if (o instanceof Double) {
-            return write(((Double) o).doubleValue());
-        } else if (o instanceof Float) {
-            return write(((Float) o).floatValue());
-        } else if (o instanceof Integer) {
-            return write(((Integer) o).intValue());
-        } else if (o instanceof Long) {
-            return write(((Long) o).longValue());
-        } else if (o instanceof Short) {
-            return write(((Short) o).shortValue());
-        } else if (o.getClass().isArray()) {
-            return write((Object[]) o);
-        } else {
-            fallbackHandler.writeJSON(this, writer, o);
-            return this;
-        }
-    }
-
-    public interface FallbackHandler {
-        void writeJSON(JSONWriter json, Writer writer, Object o) throws IOException;
-    }
-
-    public static final FallbackHandler StandardFallbackHandler = new FallbackHandler() {
-        public void writeJSON(JSONWriter json, Writer writer, Object o) throws IOException {
-            throw new IOException("Can't write(" + o + ":" + o.getClass() + ")");
-        }
-    };
-
-    public static final FallbackHandler ResolvingFallbackHandler = new FallbackHandler() {
-        public void writeJSON(JSONWriter json, Writer writer, Object o) throws IOException {
-            StringBuilder sb = new StringBuilder();
-            UtilIO.writeObject(sb, o);
-            writer.write("resolve(");
-            json.write(sb.toString());
-            writer.write(")");
-        }
-    };
-}
diff --git a/framework/base/src/org/ofbiz/base/json/test/JSONTests.java b/framework/base/src/org/ofbiz/base/json/test/JSONTests.java
deleted file mode 100644
index 9436a3e..0000000
--- a/framework/base/src/org/ofbiz/base/json/test/JSONTests.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.json.test;
-
-import java.io.IOException;
-import java.io.ByteArrayOutputStream;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.OutputStreamWriter;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.ofbiz.base.json.JSON;
-import org.ofbiz.base.json.JSONConstants;
-import org.ofbiz.base.json.JSONWriter;
-import org.ofbiz.base.json.ParseException;
-import org.ofbiz.base.json.Token;
-import org.ofbiz.base.json.TokenMgrError;
-import org.ofbiz.base.lang.SourceMonitored;
-import org.ofbiz.base.test.GenericTestCaseBase;
-import org.ofbiz.base.util.IndentingWriter;
-
-@SourceMonitored
-public class JSONTests extends GenericTestCaseBase {
-    public JSONTests(String name) {
-        super(name);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    protected Object parseJSON(String value, boolean allowResolve) throws Exception {
-        return new JSON(new StringReader(value)).allowResolve(allowResolve).JSONValue();
-    }
-
-    protected String getJSON(Object object, boolean allowResolve) throws Exception {
-        StringWriter writer = new StringWriter();
-        JSONWriter jsonWriter;
-        if (allowResolve) {
-            jsonWriter = new JSONWriter(writer, JSONWriter.ResolvingFallbackHandler);
-        } else {
-            jsonWriter = new JSONWriter(writer);
-        }
-        assertTrue("writer is IndentingWriter", jsonWriter.getWriter() instanceof IndentingWriter);
-        jsonWriter.write(object);
-        return writer.toString();
-    }
-
-    protected void assertSimpleJSONByte(byte n, String json) throws Exception {
-        assertSimpleJSON("integer - byte", new Byte(n), json, new Long(n));
-        assertSimpleJSONShort(n, json);
-    }
-
-    protected void assertSimpleJSONShort(short n, String json) throws Exception {
-        assertSimpleJSON("integer - short", new Integer(n), json, new Long(n));
-        assertSimpleJSONInteger(n, json);
-    }
-
-    protected void assertSimpleJSONInteger(int n, String json) throws Exception {
-        assertSimpleJSON("integer - int", new Short((short) n), json, new Long(n));
-        assertSimpleJSONLong(n, json);
-    }
-
-    protected void assertSimpleJSONLong(long n, String json) throws Exception {
-        assertSimpleJSON("integer - long", new Long(n), json, new Long(n));
-    }
-
-    protected void assertSimpleJSONFloat(float n, String json) throws Exception {
-        assertSimpleJSON("float - float", new Float(n), json, new Double(n));
-        assertSimpleJSONDouble(n, json);
-    }
-
-    protected void assertSimpleJSONDouble(double n, String json) throws Exception {
-        assertSimpleJSON("float - double", new Double(n), json);
-    }
-
-    protected void assertSimpleJSON(String type, Object object, String json) throws Exception {
-        assertSimpleJSON(type, object, json, object);
-    }
-
-    protected void assertSimpleJSON(String type, Object before, String json, Object after) throws Exception {
-        assertEquals("write " + type, json, getJSON(before, false));
-        assertEquals("parse " + type, after, parseJSON(json, false));
-    }
-
-    protected void assertResolveJSON(String type, Object obj, String json) throws Exception {
-        assertEquals("write " + type, json, getJSON(obj, true));
-        assertEquals("parse " + type, obj, parseJSON(json, true));
-    }
-
-    public void testClose() throws Exception {
-        JSONWriter writer = new JSONWriter(new OutputStreamWriter(new ByteArrayOutputStream()));
-        writer.close();
-        IOException caught = null;
-        try {
-            writer.write("");
-        } catch (IOException e) {
-            caught = e;
-        } finally {
-            assertNotNull("write after close", caught);
-        }
-    }
-
-    public void testString() throws Exception {
-        StringBuilder wanted = new StringBuilder();
-        StringBuilder json = new StringBuilder().append('"');
-        for (int i = 0; i < 5120; i++) {
-            wanted.append((char) i);
-            if (i == '\b') {
-                json.append("\\b");
-            } else if (i == '\f') {
-                json.append("\\f");
-            } else if (i == '\t') {
-                json.append("\\t");
-            } else if (i == '\n') {
-                json.append("\\n");
-            } else if (i == '\r') {
-                json.append("\\r");
-            } else if (i == '"') {
-                json.append("\\\"");
-            } else if (i == '\\') {
-                json.append("\\\\");
-            } else if (i == '/') {
-                json.append("\\/");
-            } else if (i < 32 || i >= 256) {
-                json.append("\\u");
-                if (i < 16) json.append('0');
-                if (i < 256) json.append('0');
-                if (i < 4096) json.append('0');
-                json.append(Integer.toString(i, 16));
-            } else {
-                json.append((char) i);
-            }
-        }
-        json.append('"');
-        assertSimpleJSON("string", wanted.toString(), json.toString());
-    }
-
-    public void testParseBasicTypes() throws Exception {
-        assertSimpleJSON("character", new Character('c'), "\"c\"", "c");
-        assertSimpleJSON("false", Boolean.FALSE, "false");
-        assertSimpleJSON("null", null, "null");
-        assertSimpleJSON("true", Boolean.TRUE, "true");
-        assertSimpleJSON("simple string", "foo", "\"foo\"");
-        assertSimpleJSONByte((byte) 42, "42");
-        assertSimpleJSONFloat(Float.valueOf("1.0625"), "1.0625");
-        assertSimpleJSON(
-            "complex string",
-            "quote(\") backslash(\\) forwardslash(/) backspace(\b) formfeed(\f) newline(\n) carriagereturn(\r) tab(\t) trademark(\u2122)",
-            "\"quote(\\\") backslash(\\\\) forwardslash(\\/) backspace(\\b) formfeed(\\f) newline(\\n) carriagereturn(\\r) tab(\\t) trademark(\\u2122)\""
-        );
-    }
-
-    public void testParseComplexTypes() throws Exception {
-        assertEquals(
-            "parse simple array",
-            list(new Object[] {"foo", new Long(1234), new Double(5.678)}),
-            parseJSON("[, ,\t,\r,\n,\r\n,\"foo\", 1234, 5.678,]", false)
-        );
-        assertSimpleJSON(
-            "simple empty list",
-            list(new Object[] {}),
-            "[]"
-        );
-        assertSimpleJSON(
-            "simple empty array",
-            new Object[] {},
-            "[]",
-            list(new Object[] {})
-        );
-        assertSimpleJSON(
-            "simple array->list",
-            new Object[] {"foo", new Long(1234), new Double(5.678)},
-            "[\n \"foo\",\n 1234,\n 5.678\n]",
-            list(new Object[] {"foo", new Long(1234), new Double(5.678)})
-        );
-        assertSimpleJSON(
-            "simple array",
-            list(new Object[] {"foo", new Long(1234), new Double(5.678)}),
-            "[\n \"foo\",\n 1234,\n 5.678\n]",
-            list(new Object[] {"foo", new Long(1234), new Double(5.678)})
-        );
-        assertEquals(
-            "parse simple map",
-            map(new Object[] {"foo", new Long(1234), "bar", new Double(5.678)}),
-            parseJSON("{, ,\t,\r,\n,\r\n,\"foo\": 1234, \"bar\": 5.678,}", false)
-        );
-        assertSimpleJSON(
-            "parse map",
-            map(new Object[] {"foo", new Long(1234), "bar", new Double(5.678)}),
-            "{\n \"foo\": 1234,\n \"bar\": 5.678\n}"
-        );
-        assertSimpleJSON(
-            "parse empty map",
-            map(new Object[] {}),
-            "{}"
-        );
-        assertEquals(
-            "parse nested map",
-            map(new Object[] {
-                "string",       "this is a string",
-                "integer",      new Long(5000),
-                "double",       new Double(3.1415926),
-                "array",        new Object[] {
-                    "string",
-                    new Long(6000)
-                },
-                "list",         list(new Object[] {
-                    "nested string",
-                    "something",
-                }),
-                "empty-list",   new ArrayList<String>(),
-                "empty-array",  new String[0],
-                "empty-map",    new HashMap<String, Object>(),
-            }),
-            parseJSON("{\"string\": \"this is a string\", \"integer\": 5000, \"double\": 3.1415926, \"array\": [\"string\", 6000], \"list\": [\"nested string\", \"something\"], \"empty-list\": [], \"empty-array\": [], \"empty-map\": {}}", false)
-        );
-    }
-
-    public void testParseErrors() throws Exception {
-        for (char c = 1; c < 1024; c++) {
-            if (c == '\t') {
-                doWhitespaceExceptionTest(Character.toString(c), 8);
-            } else if (c == '\n' || c == '\r' || c == ' ') {
-                doWhitespaceExceptionTest(Character.toString(c), 1);
-            } else if (c == '"') {
-                doParseExceptionTest("\"", JSONConstants.EOF);
-            } else if (c == ',') {
-                doParseExceptionTest(",", JSONConstants.ITEM_SEP);
-            } else if (c == '-' || c == '.' || (c >= '0' && c <= '9')) {
-                // numbers
-            } else if (c == ':') {
-                doParseExceptionTest(":", JSONConstants.KEY_SEP);
-            } else if (c == '[') {
-                doParseExceptionTest("[:", JSONConstants.KEY_SEP);
-            } else if (c == ']') {
-                doParseExceptionTest("]", JSONConstants.ARRAY_END);
-            } else if (c == 't') {
-                doParseExceptionTest("true:", JSONConstants.KEY_SEP);
-            } else if (c == 'f') {
-                doParseExceptionTest("false:", JSONConstants.KEY_SEP);
-            } else if (c == 'n') {
-                doParseExceptionTest("null:", JSONConstants.KEY_SEP);
-            } else if (c == '{') {
-                doParseExceptionTest("{:", JSONConstants.KEY_SEP);
-            } else if (c == '}') {
-                doParseExceptionTest("}", JSONConstants.OBJECT_END);
-            } else {
-                doTokenMgrErrorTest(c);
-            }
-        }
-    }
-
-    protected void doWhitespaceExceptionTest(String s, int column) {
-        ParseException caught = null;
-        try {
-            new JSON(new StringReader(s)).JSONValue();
-        } catch (ParseException e) {
-            caught = e;
-        } finally {
-            assertNotNull("caught exception", caught);
-            assertNotNull("next token(" + s + ")", caught.currentToken);
-            Token next = caught.currentToken.next;
-            assertEquals("next token(" + s + ") is eof", 0, next.kind);
-            assertEquals("begin line(" + s + ")", 1, next.beginLine);
-            assertEquals("begin column(" + s + ")", column, next.beginColumn);
-        }
-    }
-
-    protected void doParseExceptionTest(String s, int nextKind) {
-        ParseException caught = null;
-        try {
-            new JSON(new StringReader(s)).JSONValue();
-        } catch (ParseException e) {
-            caught = e;
-        } finally {
-            assertNotNull("caught exception", caught);
-            assertNotNull("exception message(" + s + ")", caught.getMessage());
-            assertNotNull("next token(" + s + ")", caught.currentToken);
-            Token next = caught.currentToken.next;
-            assertEquals("next token(" + s + ") is correct", nextKind, next.kind);
-            assertEquals("begin line(" + s + ")", 1, next.beginLine);
-            assertEquals("begin column(" + s + ")", s.length(), next.beginColumn);
-        }
-    }
-
-    protected void doTokenMgrErrorTest(char c) throws Exception {
-        TokenMgrError caught = null;
-        try {
-            parseJSON(c + "\"string\"", false);
-        } catch (TokenMgrError e) {
-            caught = e;
-        } finally {
-            assertNotNull("No TokenMgrError thrown for character(" + ((int) c) + ")", caught);
-            // FIXME: maybe extend javacc to return more info in TokenMgrError
-        }
-    }
-
-    public void testResolve() throws Exception {
-        assertResolveJSON("url", new URL("http://ofbiz.apache.org"), "resolve(\"java.net.URL:http:\\/\\/ofbiz.apache.org\")");
-        IOException caught = null;
-        try {
-            getJSON(new URL("http://ofbiz.apache.org"), false);
-        } catch (IOException e) {
-            caught = e;
-        } finally {
-            assertNotNull("url not allowed", caught);
-        }
-    }
-}
diff --git a/framework/base/src/org/ofbiz/base/lang/JSON.java b/framework/base/src/org/ofbiz/base/lang/JSON.java
new file mode 100644
index 0000000..16a0143
--- /dev/null
+++ b/framework/base/src/org/ofbiz/base/lang/JSON.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.base.lang;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+
+import org.apache.commons.io.IOUtils;
+import org.ofbiz.base.util.Assert;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/** A JSON object. */
+@ThreadSafe
+public final class JSON {
+
+    // TODO: Find a generic way to modify mapper options
+    private static final ObjectMapper mapper = new ObjectMapper();
+
+    /**
+     * Creates a <code>JSON</code> instance from an <code>InputStream</code>.
+     * The method assumes the character set is UTF-8.
+     * 
+     * @param inStream
+     * @return a <code>JSON</code> instance
+     * @throws IOException
+     */
+    public static JSON from(InputStream inStream) throws IOException {
+        Assert.notNull("inStream", inStream);
+        String jsonString = IOUtils.toString(inStream, "UTF-8");
+        return from(jsonString);
+    }
+
+    /**
+     * Creates a <code>JSON</code> instance from an unknown data type.
+     * 
+     * @param object
+     * @return a <code>JSON</code> instance
+     * @throws IOException
+     */
+    public static JSON from(Object object) throws IOException {
+        Assert.notNull("object", object);
+        try {
+            return from(mapper.writeValueAsString(object));
+        } catch (Exception e) {
+            throw new IOException(e);
+        }
+    }
+
+    /**
+     * Creates a <code>JSON</code> instance from a <code>Reader</code>.
+     * 
+     * @param reader
+     * @return a <code>JSON</code> instance
+     * @throws IOException
+     */
+    public static JSON from(Reader reader) throws IOException {
+        Assert.notNull("reader", reader);
+        String jsonString = IOUtils.toString(reader);
+        return from(jsonString);
+    }
+
+    /**
+     * Creates a <code>JSON</code> instance from a <code>String</code>.
+     * 
+     * @param jsonString
+     * @return a <code>JSON</code> instance
+     */
+    public static JSON from(String jsonString) {
+        Assert.notNull("jsonString", jsonString);
+        // TODO: Validate String
+        return new JSON(jsonString);
+    }
+
+    private final String jsonString;
+
+    private JSON(String jsonString) {
+        this.jsonString = jsonString;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (obj instanceof JSON) {
+            return jsonString.equals(((JSON)obj).jsonString);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return jsonString.hashCode();
+    }
+
+    /**
+     * Converts this <code>JSON</code> object to the specified type.
+     * 
+     * @param targetClass
+     * @return an object of the specified type
+     * @throws IOException
+     */
+    public <T> T toObject(Class<T> targetClass) throws IOException {
+        Assert.notNull("targetClass", targetClass);
+        try {
+            return mapper.readValue(jsonString, targetClass);
+        } catch (IOException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new IOException(e);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return jsonString;
+    }
+}
diff --git a/framework/base/src/org/ofbiz/base/util/UtilIO.java b/framework/base/src/org/ofbiz/base/util/UtilIO.java
index 3e61434..ecbfee6 100644
--- a/framework/base/src/org/ofbiz/base/util/UtilIO.java
+++ b/framework/base/src/org/ofbiz/base/util/UtilIO.java
@@ -19,34 +19,20 @@
 package org.ofbiz.base.util;
 
 import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
 import java.io.Reader;
-import java.io.Serializable;
-import java.io.StringReader;
-import java.io.StringWriter;
 import java.io.Writer;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.ofbiz.base.conversion.Converter;
-import org.ofbiz.base.conversion.Converters;
-import org.ofbiz.base.json.JSON;
-import org.ofbiz.base.json.JSONWriter;
 
 public final class UtilIO {
     public static final Charset UTF8 = Charset.forName("UTF-8");
@@ -329,141 +315,4 @@
         writer.write(value.substring(r));
         writer.close();
     }
-
-    public static Object readObject(File file) throws ClassNotFoundException, IOException {
-        return readObject(new FileInputStream(file), false);
-    }
-
-    public static Object readObject(File file, boolean allowJsonResolve) throws ClassNotFoundException, IOException {
-        return readObject(new FileInputStream(file), allowJsonResolve);
-    }
-
-    public static Object readObject(InputStream in) throws ClassNotFoundException, IOException {
-        return readObject(in, false);
-    }
-
-    public static Object readObject(InputStream in, boolean allowJsonResolve) throws ClassNotFoundException, IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        IOUtils.copy(in, baos);
-        in.close();
-        byte[] bytes = baos.toByteArray();
-        try {
-            char[] buffer = StringUtils.chomp(readString(bytes)).toCharArray();
-            return parseObject(buffer, 0, buffer.length, allowJsonResolve);
-        } catch (Exception e) {
-        }
-        ObjectInputStream oin = new ObjectInputStream(new ByteArrayInputStream(bytes));
-        Serializable value = (Serializable) oin.readObject();
-        oin.close();
-        return value;
-    }
-
-    public static Object readObject(char[] buffer) throws ClassNotFoundException, IOException {
-        return parseObject(buffer, 0, buffer.length, false);
-    }
-
-    public static Object readObject(char[] buffer, int offset, int length) throws ClassNotFoundException, IOException {
-        return parseObject(buffer, offset, length, false);
-    }
-
-    private static <S, T> T convertObject(Class<S> sourceClass, S value, Class<T> targetClass) throws Exception {
-        Converter<S, T> converter = Converters.getConverter(sourceClass, targetClass);
-        return converter.convert(targetClass, value);
-    }
-
-    private static Object parseObject(char[] buffer, int offset, int length, boolean allowJsonResolve) throws ClassNotFoundException, IOException {
-        try {
-            int i;
-            for (i = offset; i < length && buffer[i] != ':'; i++);
-            if (i > offset && i < length) {
-                String className = new String(buffer, offset, i);
-                Class<?> type = Class.forName(className);
-                if (buffer[length - 1] == '\n') {
-                    length--;
-                }
-                if (buffer[length - 1] == '\r') {
-                    length--;
-                }
-                return convertObject(String.class, new String(buffer, i + 1, length - i - 1), type);
-            }
-        } catch (Exception e) {
-        }
-        try {
-            return new JSON(new StringReader(new String(buffer, offset, length))).allowResolve(allowJsonResolve).JSONValue();
-        } catch (Error e) {
-        } catch (Exception e) {
-        }
-        throw new IOException("Can't read (" + new String(buffer, offset, length) + ")");
-    }
-
-    public static void writeObject(File file, Object value) throws IOException {
-        writeObject(new FileOutputStream(file), value, false);
-    }
-
-    public static void writeObject(File file, Object value, boolean allowJsonResolve) throws IOException {
-        writeObject(new FileOutputStream(file), value, allowJsonResolve);
-    }
-
-    public static void writeObject(OutputStream out, Object value) throws IOException {
-        writeObject(out, value, false);
-    }
-
-    public static void writeObject(OutputStream out, Object value, boolean allowJsonResolve) throws IOException {
-        try {
-            PrintWriter writer = new PrintWriter(new OutputStreamWriter(out, UTF8));
-            if (encodeObject(writer, value, allowJsonResolve)) {
-                writer.println();
-                writer.close();
-                return;
-            }
-        } catch (Exception e) {
-        }
-        ObjectOutputStream oout = new ObjectOutputStream(out);
-        oout.writeObject(value);
-        oout.close();
-        out.close();
-    }
-
-    private static <T> boolean encodeObject(Writer writer, T value, boolean allowJsonResolve) throws Exception {
-        Converter<T, String> converter = UtilGenerics.cast(Converters.getConverter(value.getClass(), String.class));
-        if (converter != null) {
-            Class<?> clz = converter.getSourceClass();
-            String str = converter.convert(value);
-            if (clz != null) {
-                writer.write(clz.getName());
-            } else {
-                writer.write(value.getClass().getName());
-            }
-            writer.write(':');
-            writer.write(str);
-            return true;
-        } else {
-            StringWriter sw = new StringWriter();
-            IndentingWriter indenting = new IndentingWriter(writer, true, false);
-            JSONWriter jsonWriter;
-            if (allowJsonResolve) {
-                jsonWriter = new JSONWriter(indenting, JSONWriter.ResolvingFallbackHandler);
-            } else {
-                jsonWriter = new JSONWriter(indenting);
-            }
-            jsonWriter.write(value);
-            writer.write(sw.toString());
-            return true;
-        }
-    }
-
-    public static void writeObject(StringBuilder sb, Object value) throws IOException {
-        writeObject(sb, value, false);
-    }
-
-    public static void writeObject(StringBuilder sb, Object value, boolean allowJsonResolve) throws IOException {
-        try {
-            StringWriter writer = new StringWriter();
-            if (encodeObject(writer, value, allowJsonResolve)) {
-                sb.append(writer.toString());
-                return;
-            }
-        } catch (Exception e) {} //Empty catch because writeObject() calls encodeObject(), which *always* returns true, unless an error occurs.  
-        throw new IOException("Can't write (" + value + ")");            
-    }
 }
diff --git a/framework/base/src/org/ofbiz/base/util/test/UtilIOTests.java b/framework/base/src/org/ofbiz/base/util/test/UtilIOTests.java
index 9fa09e2..ea0b7b4 100644
--- a/framework/base/src/org/ofbiz/base/util/test/UtilIOTests.java
+++ b/framework/base/src/org/ofbiz/base/util/test/UtilIOTests.java
@@ -129,53 +129,4 @@
         UtilIO.writeString(baos, UtilIO.UTF8, toWrite);
         assertEquals("writeString UTF8:" + label, wanted, baos.toByteArray());
     }
-
-    protected void checkBasicReadObject(Object value, String text) throws Exception {
-        byte[] bytes = text.getBytes("UTF-8");
-        assertEquals("read bytes " + value.getClass().getName(), value, UtilIO.readObject(new ByteArrayInputStream(bytes)));
-        assertEquals("read chars " + value.getClass().getName(), value, UtilIO.readObject(text.toCharArray()));
-        assertEquals("read chars offset " + value.getClass().getName(), value, UtilIO.readObject(text.toCharArray(), 0, text.length()));
-    }
-
-    protected void checkBasicReadWriteObject(Object value, String text) throws Exception {
-        String lineEnding = System.getProperty("line.separator");
-        text = text.replaceAll("\n", lineEnding);
-        byte[] bytes = text.getBytes("UTF-8");
-        assertEquals("read bytes " + value.getClass().getName(), value, UtilIO.readObject(new ByteArrayInputStream(bytes)));
-        assertEquals("read chars " + value.getClass().getName(), value, UtilIO.readObject(text.toCharArray()));
-        assertEquals("read chars offset " + value.getClass().getName(), value, UtilIO.readObject(text.toCharArray(), 0, text.length()));
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        UtilIO.writeObject(baos, value);
-        assertEquals("write stream " + value.getClass().getName(), text, new String(baos.toByteArray(), "UTF-8"));
-        StringBuilder sb = new StringBuilder();
-        UtilIO.writeObject(sb, value);
-        sb.append(lineEnding);
-        assertEquals("write builder " + value.getClass().getName(), text, sb.toString());
-    }
-
-    public void testReadWriteObject() throws Exception {
-        checkBasicReadWriteObject(Boolean.TRUE, "java.lang.Boolean:true\n");
-        checkBasicReadWriteObject(Byte.valueOf("1"), "java.lang.Byte:1\n");
-        checkBasicReadWriteObject(Double.valueOf("1.0"), "java.lang.Double:1.0\n");
-        checkBasicReadWriteObject(Float.valueOf("1.0"), "java.lang.Float:1.0\n");
-        checkBasicReadWriteObject(Integer.valueOf("1"), "java.lang.Integer:1\n");
-        checkBasicReadWriteObject(Long.valueOf("1"), "java.lang.Long:1\n");
-        checkBasicReadWriteObject(Short.valueOf("1"), "java.lang.Short:1\n");
-        checkBasicReadWriteObject(BigDecimal.valueOf(500.5), "java.math.BigDecimal:500.5\n");
-        checkBasicReadWriteObject(BigInteger.valueOf(500), "java.math.BigInteger:500\n");
-        checkBasicReadWriteObject("1", "java.lang.String:1\n");
-        checkBasicReadObject(Arrays.asList(new Object[] {"a", UtilMisc.toMap("b", Long.valueOf(1))}), "[\n \"a\",\n {\n  \"b\": 1\n }\n]\n");
-        checkBasicReadWriteObject(MemoryType.HEAP, "java.lang.management.MemoryType:HEAP\n");
-        checkBasicReadWriteObject(MemoryType.NON_HEAP, "java.lang.management.MemoryType:NON_HEAP\n");
-        checkBasicReadWriteObject(UtilIO.UTF8, "java.nio.charset.Charset:UTF-8\n");
-        checkBasicReadWriteObject(InetAddress.getByAddress("localhost", new byte[] {127, 0, 0, 1}), "java.net.InetAddress:localhost\n");
-        //checkBasicReadWriteObject(Pattern.compile("^([a-z]{3}.*?):$"), "java.util.regex.Pattern:^([a-z]{3}.*?):$\n");
-        checkBasicReadWriteObject(Time.valueOf("12:34:56"), "java.sql.Time:12:34:56\n");
-        //checkBasicReadWriteObject(new Timestamp(1234567890), "java.sql.Timestamp:1234567890 00:00:00\n");
-        //checkBasicReadWriteObject(new java.util.Date(1234567890), "java.util.Date:1234567890\n");
-        checkBasicReadWriteObject(UUID.fromString("c3241927-9f77-43e1-be16-bd71d245ef64"), "java.util.UUID:c3241927-9f77-43e1-be16-bd71d245ef64\n");
-        checkBasicReadWriteObject(TimeZone.getTimeZone("America/Chicago"), "java.util.TimeZone:America/Chicago\n");
-        checkBasicReadWriteObject(new SimpleDateFormat("MM/dd/yyyy hh:mm a"), "java.text.SimpleDateFormat:MM/dd/yyyy hh:mm a\n");
-        checkBasicReadWriteObject(new Locale("en", "us"), "java.util.Locale:en_US\n");
-    }
 }
diff --git a/framework/base/testdef/basetests.xml b/framework/base/testdef/basetests.xml
index adfcf90..564c817 100644
--- a/framework/base/testdef/basetests.xml
+++ b/framework/base/testdef/basetests.xml
@@ -32,7 +32,8 @@
         <junit-test-suite class-name="org.ofbiz.base.util.cache.test.UtilCacheTests"/>
         <junit-test-suite class-name="org.ofbiz.base.conversion.test.DateTimeTests"/>
         <junit-test-suite class-name="org.ofbiz.base.conversion.test.MiscTests"/>
-        <junit-test-suite class-name="org.ofbiz.base.json.test.JSONTests"/>
+        <junit-test-suite class-name="org.ofbiz.base.conversion.test.TestBooleanConverters"/>
+        <junit-test-suite class-name="org.ofbiz.base.conversion.test.TestJSONConverters"/>
         <!--junit-test-suite class-name="org.ofbiz.base.util.test.UtilIOTests"/-->
         <junit-test-suite class-name="org.ofbiz.base.test.BaseUnitTests"/>
         <junit-test-suite class-name="org.ofbiz.base.util.test.UtilPropertiesTests"/>
diff --git a/framework/common/src/org/ofbiz/common/CommonEvents.java b/framework/common/src/org/ofbiz/common/CommonEvents.java
index b1b8f51..72c7b44 100644
--- a/framework/common/src/org/ofbiz/common/CommonEvents.java
+++ b/framework/common/src/org/ofbiz/common/CommonEvents.java
@@ -28,8 +28,8 @@
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
@@ -41,13 +41,10 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
-import net.sf.json.JSON;
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-import net.sf.json.JSONSerializer;
 
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.commons.lang.StringUtils;
+import org.ofbiz.base.lang.JSON;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.StringUtil;
 import org.ofbiz.base.util.UtilGenerics;
@@ -289,15 +286,16 @@
                 attrMap.remove(ignoreAttr);
             }
         }
-
-        // create a JSON Object for return
-        JSONObject json = JSONObject.fromObject(attrMap);
-        writeJSONtoResponse(json, request.getMethod(), response);
-
+        try {
+            JSON json = JSON.from(attrMap);
+            writeJSONtoResponse(json, request.getMethod(), response);
+        } catch (Exception e) {
+            return "error";
+        }
         return "success";
     }
 
-    private static void writeJSONtoResponse(JSON json, String httpMethod, HttpServletResponse response) {
+    private static void writeJSONtoResponse(JSON json, String httpMethod, HttpServletResponse response) throws UnsupportedEncodingException {
         String jsonStr = json.toString();
         if (jsonStr == null) {
             Debug.logError("JSON Object was empty; fatal error!", module);
@@ -307,21 +305,17 @@
         // This was added for security reason (OFBIZ-5409), you might need to remove the "//" prefix when handling the JSON response
         // Though normally you simply have to access the data you want, so should not be annoyed by the "//" prefix
         if ("GET".equalsIgnoreCase(httpMethod)) {
-            Debug.logWarning("for security reason (OFBIZ-5409) the the '//' prefix was added handling the JSON response.  " +
-                    "Normally you simply have to access the data you want, so should not be annoyed by the '//' prefix." +
-                    "You might need to remove it if you use Ajax GET responses (not recommended)." +
-                    "In case, the util.js scrpt is there to help you", module);
+            Debug.logWarning("for security reason (OFBIZ-5409) the the '//' prefix was added handling the JSON response.  "
+                    + "Normally you simply have to access the data you want, so should not be annoyed by the '//' prefix."
+                    + "You might need to remove it if you use Ajax GET responses (not recommended)."
+                    + "In case, the util.js scrpt is there to help you", module);
             jsonStr = "//" + jsonStr;
         }
 
         // set the X-JSON content type
         response.setContentType("application/x-json");
         // jsonStr.length is not reliable for unicode characters
-        try {
-            response.setContentLength(jsonStr.getBytes("UTF8").length);
-        } catch (UnsupportedEncodingException e) {
-            Debug.logError("Problems with Json encoding: " + e, module);
-        }
+        response.setContentLength(jsonStr.getBytes("UTF8").length);
 
         // return the JSON String
         Writer out;
@@ -334,81 +328,65 @@
         }
     }
 
-
-    public static String getJSONuiLabelArray(HttpServletRequest request, HttpServletResponse response) {
-        String requiredLabels = request.getParameter("requiredLabels");
-
-        JSONObject uiLabelObject = null;
-        if (UtilValidate.isNotEmpty(requiredLabels)) {
-            // Transform JSON String to Object
-            uiLabelObject = (JSONObject) JSONSerializer.toJSON(requiredLabels);
+    public static String getJSONuiLabelArray(HttpServletRequest request, HttpServletResponse response)
+            throws UnsupportedEncodingException, IOException {
+        // Format - {resource1 : [key1, key2 ...], resource2 : [key1, key2, ...], ...}
+        String jsonString = request.getParameter("requiredLabels");
+        Map<String, List<String>> uiLabelObject = null;
+        if (UtilValidate.isNotEmpty(jsonString)) {
+            JSON json = JSON.from(jsonString);
+            uiLabelObject = UtilGenerics.<Map<String, List<String>>> cast(json.toObject(Map.class));
         }
-
-        JSONObject jsonUiLabel = new JSONObject();
+        if (UtilValidate.isEmpty(uiLabelObject)) {
+            Debug.logError("No resource and labels found in JSON string: " + jsonString, module);
+            return "error";
+        }
         Locale locale = request.getLocale();
-        if(!uiLabelObject.isEmpty()) {
-            Set<String> resourceSet = UtilGenerics.checkSet(uiLabelObject.keySet());
-            // Iterate over the resouce set
-            for (String resource : resourceSet) {
-                JSONArray labels = uiLabelObject.getJSONArray(resource);
-                if (labels.isEmpty() || labels == null) {
-                    continue;
+        Map<String, List<String>> uiLabelMap = new HashMap<String, List<String>>();
+        Set<Map.Entry<String, List<String>>> entrySet = uiLabelObject.entrySet();
+        for (Map.Entry<String, List<String>> entry : entrySet) {
+            String resource = entry.getKey();
+            List<String> resourceKeys = entry.getValue();
+            if (resourceKeys != null) {
+                List<String> labels = new ArrayList<String>(resourceKeys.size());
+                for (String resourceKey : resourceKeys) {
+                    String label = UtilProperties.getMessage(resource, resourceKey, locale);
+                    labels.add(label);
                 }
-
-                // Iterate over the uiLabel List
-                Iterator<String> jsonLabelIterator = UtilGenerics.cast(labels.iterator());
-                JSONArray resourceLabelList = new JSONArray();
-                while(jsonLabelIterator.hasNext()) {
-                    String label = jsonLabelIterator.next();
-                    String receivedLabel = UtilProperties.getMessage(resource, label, locale);
-                    if (UtilValidate.isNotEmpty(receivedLabel)) {
-                        resourceLabelList.add(receivedLabel);
-                    }
-                }
-                jsonUiLabel.element(resource, resourceLabelList);
+                uiLabelMap.put(resource, labels);
             }
         }
-
-        writeJSONtoResponse(jsonUiLabel, request.getMethod(), response);
+        writeJSONtoResponse(JSON.from(uiLabelMap), request.getMethod(), response);
         return "success";
     }
 
-    public static String getJSONuiLabel(HttpServletRequest request, HttpServletResponse response) {
-        String requiredLabels = request.getParameter("requiredLabel");
-
-        JSONObject uiLabelObject = null;
-        if (UtilValidate.isNotEmpty(requiredLabels)) {
-            // Transform JSON String to Object
-            uiLabelObject = (JSONObject) JSONSerializer.toJSON(requiredLabels);
+    public static String getJSONuiLabel(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, IOException {
+        // Format - {resource : key}
+        String jsonString = request.getParameter("requiredLabel");
+        Map<String, String> uiLabelObject = null;
+        if (UtilValidate.isNotEmpty(jsonString)) {
+            JSON json = JSON.from(jsonString);
+            uiLabelObject = UtilGenerics.<Map<String, String>>cast(json.toObject(Map.class));
         }
-
-        JSONArray jsonUiLabel = new JSONArray();
+        if (UtilValidate.isEmpty(uiLabelObject)) {
+            Debug.logError("No resource and labels found in JSON string: " + jsonString, module);
+            return "error";
+        } else if (uiLabelObject.size() > 1) {
+            Debug.logError("More than one resource found, please use the method: getJSONuiLabelArray", module);
+            return "error";
+        }
         Locale locale = request.getLocale();
-        if(!uiLabelObject.isEmpty()) {
-            Set<String> resourceSet = UtilGenerics.checkSet(uiLabelObject.keySet());
-            // Iterate over the resource set
-            // here we need a keySet because we don't now which label resource to load
-            // the key set should have the size one, if greater or empty error should returned
-            if (UtilValidate.isEmpty(resourceSet)) {
-                Debug.logError("No resource and labels found", module);
-                return "error";
-            } else if (resourceSet.size() > 1) {
-                Debug.logError("More than one resource found, please use the method: getJSONuiLabelArray", module);
-                return "error";
-            }
-
-            for (String resource : resourceSet) {
-                String label = uiLabelObject.getString(resource);
-                if (UtilValidate.isEmail(label)) {
-                    continue;
-                }
-
-                String receivedLabel = UtilProperties.getMessage(resource, label, locale);
-                jsonUiLabel.add(receivedLabel);
+        Map<String, String> uiLabelMap = new HashMap<String, String>();
+        Set<Map.Entry<String, String>> entrySet = uiLabelObject.entrySet();
+        for (Map.Entry<String, String> entry : entrySet) {
+            String resource = entry.getKey();
+            String resourceKey = entry.getValue();
+            if (resourceKey != null) {
+                String label = UtilProperties.getMessage(resource, resourceKey, locale);
+                uiLabelMap.put(resource, label);
             }
         }
-
-        writeJSONtoResponse(jsonUiLabel, request.getMethod(), response);
+        writeJSONtoResponse(JSON.from(uiLabelMap), request.getMethod(), response);
         return "success";
     }
 
diff --git a/framework/entity/src/org/ofbiz/entity/sql/SQLUtil.java b/framework/entity/src/org/ofbiz/entity/sql/SQLUtil.java
deleted file mode 100644
index 44668ce..0000000
--- a/framework/entity/src/org/ofbiz/entity/sql/SQLUtil.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.ofbiz.entity.sql;
-
-import java.io.StringReader;
-
-import org.ofbiz.sql.OrderByItem;
-import org.ofbiz.sql.ParseException;
-import org.ofbiz.sql.Parser;
-
-public class SQLUtil {
-    private static final EntityPlanner planner = new EntityPlanner();
-
-    private static Parser updateParserFlags(Parser parser) {
-        return parser.deleteSupportsUsing(false).updateSupportsFrom(false);
-    }
-
-    public static EntitySelectPlan parseSelect(String sql) throws ParseException {
-       return planner.planSelect(updateParserFlags(new Parser(new StringReader(sql))).SelectStatement());
-    }
-
-    public static OrderByItem parseOrderByItem(String sql) throws ParseException {
-       return updateParserFlags(new Parser(new StringReader(sql))).OrderByItem();
-    }
-    /*
-    public static EntityCondition parseCondition(String condition) throws ParseException {
-        return new Parser(new StringReader(condition)).EntityCondition();
-    }
-    */
-}
diff --git a/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java b/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java
index fac34fb..e570452 100644
--- a/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java
+++ b/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java
@@ -37,7 +37,9 @@
 import javax.sql.rowset.serial.SerialBlob;
 
 import org.ofbiz.base.concurrent.ExecutionPool;
+import org.ofbiz.base.lang.JSON;
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.ObjectType;
 import org.ofbiz.base.util.Observable;
 import org.ofbiz.base.util.Observer;
 import org.ofbiz.base.util.UtilDateTime;
@@ -1209,6 +1211,23 @@
         assertTrue("One big transaction was not faster than several small ones", totalTimeOneTransaction < totalTimeSeveralSmallTransactions);
     }
 
+    public void testConverters() throws Exception {
+        // Must use the default delegator because the deserialized GenericValue can't
+        // find the randomized one.
+        Delegator localDelegator = DelegatorFactory.getDelegator("default");
+        GenericValue testValue = localDelegator.create("Testing", "testingId", "JSON_TEST", "testingTypeId", "TEST-UPDATE-1",
+                "description", "Testing JSON Converters", "testingSize", (long) 123, "testingDate",
+                new Timestamp(System.currentTimeMillis()));
+        assertNotNull("Created GenericValue not null", testValue);
+        JSON json = (JSON) ObjectType.simpleTypeConvert(testValue, "org.ofbiz.base.lang.JSON", null, null);
+        assertNotNull("JSON instance not null", json);
+        GenericValue convertedValue = (GenericValue) ObjectType.simpleTypeConvert(json, "org.ofbiz.entity.GenericValue", null,
+                null);
+        assertNotNull("GenericValue converted from JSON not null", convertedValue);
+        assertEquals("GenericValue converted from JSON equals original value", testValue, convertedValue);
+        testValue.remove();
+    }
+
     private final class TestObserver implements Observer {
         private Observable observable;
         private Object arg;
diff --git a/framework/entity/src/org/ofbiz/entity/util/Converters.java b/framework/entity/src/org/ofbiz/entity/util/Converters.java
index aabf825..cb269cd 100644
--- a/framework/entity/src/org/ofbiz/entity/util/Converters.java
+++ b/framework/entity/src/org/ofbiz/entity/util/Converters.java
@@ -18,19 +18,79 @@
  *******************************************************************************/
 package org.ofbiz.entity.util;
 
+import java.io.IOException;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.ofbiz.base.conversion.AbstractConverter;
 import org.ofbiz.base.conversion.ConversionException;
 import org.ofbiz.base.conversion.ConverterLoader;
+import org.ofbiz.base.lang.JSON;
+import org.ofbiz.base.util.ObjectType;
+import org.ofbiz.base.util.UtilGenerics;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.DelegatorFactory;
 import org.ofbiz.entity.GenericEntity;
 import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.model.ModelField;
+import org.ofbiz.entity.model.ModelFieldType;
 
 /** Entity Engine <code>Converter</code> classes. */
 public class Converters implements ConverterLoader {
+
+    public static class JSONToGenericValue extends AbstractConverter<JSON, GenericValue> {
+        public JSONToGenericValue() {
+            super(JSON.class, GenericValue.class);
+        }
+
+        public GenericValue convert(JSON obj) throws ConversionException {
+            Map<String, Object> fieldMap;
+            try {
+                fieldMap = UtilGenerics.<Map<String, Object>>cast(obj.toObject(Map.class));
+                String delegatorName = (String) fieldMap.remove("_DELEGATOR_NAME_");
+                String entityName = (String) fieldMap.remove("_ENTITY_NAME_");
+                if (delegatorName == null || entityName == null) {
+                    throw new ConversionException("Invalid JSON object");
+                }
+                Delegator delegator = DelegatorFactory.getDelegator(delegatorName);
+                GenericValue value = delegator.makeValue(entityName);
+                for (Map.Entry<String, Object> entry : fieldMap.entrySet()) {
+                    String fieldName = entry.getKey();
+                    Object fieldValue = entry.getValue();
+                    ModelField field = value.getModelEntity().getField(fieldName);
+                    ModelFieldType type = delegator.getEntityFieldType(value.getModelEntity(), field.getType());
+                    value.set(fieldName, ObjectType.simpleTypeConvert(fieldValue, type.getJavaType(), null, null));
+                }
+                return value;
+            } catch (ConversionException e) {
+                throw e;
+            } catch (Exception e) {
+                throw new ConversionException(e);
+            }
+        }
+    }
+
+    public static class GenericValueToJSON extends AbstractConverter<GenericValue, JSON> {
+        public GenericValueToJSON() {
+            super(GenericValue.class, JSON.class);
+        }
+
+        public JSON convert(GenericValue obj) throws ConversionException {
+            Map<String, Object> fieldMap = new HashMap<String, Object>(obj);
+            fieldMap.put("_DELEGATOR_NAME_", obj.getDelegator().getDelegatorName());
+            fieldMap.put("_ENTITY_NAME_", obj.getEntityName());
+            try {
+                return JSON.from(fieldMap);
+            } catch (IOException e) {
+                throw new ConversionException(e);
+            }
+        }
+    }
+
     public static class GenericValueToList extends AbstractConverter<GenericValue, List<GenericValue>> {
         public GenericValueToList() {
             super(GenericValue.class, List.class);
diff --git a/framework/sql/build.xml b/framework/sql/build.xml
index 6b5aef7..baa8300 100644
--- a/framework/sql/build.xml
+++ b/framework/sql/build.xml
@@ -45,11 +45,8 @@
         <file name="org/ofbiz/sql/test/ValuesTest.java"/>
         <file name="org/ofbiz/sql/test/ConditionsTest.java"/>
         <file name="org/ofbiz/sql/test/SelectTest.java"/>
-        <file name="org/ofbiz/sql/test/SQLTest.java"/>
     </filelist>
     <patternset id="cobertura-src-dirs">
-        <include name="build/gen-src/javacc"/>
-        <include name="build/gen-src/jjtree"/>
         <include name="src"/>
     </patternset>
 
@@ -57,21 +54,6 @@
     <!-- Compilation of the source files                                                                                                                         -->
     <!-- ================================================================== -->
 
-    <target name="gen-src">
-        <ofbiz-javacc dir="org/ofbiz/sql" file="Parser"/>
-    </target>
-
-    <target name="classes" depends="prepare,gen-src">
-        <javac17>
-            <sourcepath>
-                <dirset dir="build/gen-src">
-                    <include name="javacc"/>
-                    <include name="jjtree"/>
-                </dirset>
-            </sourcepath>
-        </javac17>
-    </target>
-
     <target name="jar" depends="classes">
         <main-jar/>
         <test-jar/>
@@ -83,10 +65,6 @@
 
     <target name="docs" depends="prepare-docs">
         <default-javadoc>
-            <fileset dir="build/gen-src/javacc" defaultexcludes="yes">
-                <patternset refid="src.inc.set"/>
-                <patternset refid="src.exc.set"/>
-            </fileset>
             <fileset dir="${src.dir}" defaultexcludes="yes">
                 <patternset refid="src.inc.set"/>
                 <patternset refid="src.exc.set"/>
diff --git a/framework/sql/src/org/ofbiz/sql/Main.java b/framework/sql/src/org/ofbiz/sql/Main.java
deleted file mode 100644
index c27e7ff..0000000
--- a/framework/sql/src/org/ofbiz/sql/Main.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.ofbiz.sql;
-
-import java.util.List;
-import java.util.Map;
-
-public final class Main {
-    public static void main(String[] args) throws Exception {
-        Planner<?, ?, ?, ?, ?, ?, ?> planner = new DebugPlanner();
-        List<SQLStatement<?>> statements = new Parser(System.in).SQLFile();
-        for (SQLStatement<?> statement: statements) {
-            run(statement, planner);
-        }
-    }
-
-    private static final void run(SQLStatement<?> statement, Planner<?, ?, ?, ?, ?, ?, ?> planner) {
-        System.err.println(statement);
-        SQLPlan<?> plan = planner.plan(statement);
-        System.err.println("\tplan=" + plan);
-    }
-
-    private final static class DebugPlanner extends Planner<DebugPlanner, DebugCondition, DebugDeletePlan, DebugInsertPlan, DebugSelectPlan, DebugUpdatePlan, DebugViewPlan> {
-        public DebugPlanner() {
-            super(new DebugConditionPlanner());
-        }
-
-        @Override
-        public DebugDeletePlan planDelete(SQLDelete deleteStatement) {
-            return null;
-        }
-
-        @Override
-        public DebugInsertPlan planInsert(SQLInsert insertStatement) {
-            return null;
-        }
-
-        @Override
-        public DebugSelectPlan planSelect(SQLSelect selectStatement) {
-            return null;
-        }
-
-        @Override
-        public DebugUpdatePlan planUpdate(SQLUpdate updateStatement) {
-            return null;
-        }
-
-        @Override
-        public DebugViewPlan planView(SQLView viewStatement) {
-            return null;
-        }
-    }
-
-    private final static class DebugConditionPlanner implements ConditionPlanner<DebugCondition> {
-        public DebugCondition parse(Condition originalCondition, Map<String, ? extends Object> params) throws ParameterizedConditionException {
-            return null;
-        }
-    }
-
-    private final static class DebugCondition {
-    }
-
-    private final static class DebugDeletePlan extends DeletePlan<DebugDeletePlan, DebugCondition> {
-        protected DebugDeletePlan(ConditionPlan<DebugCondition> wherePlan) {
-            super(wherePlan);
-        }
-    }
-
-    private final static class DebugInsertPlan extends InsertPlan<DebugInsertPlan> {
-    }
-
-    private final static class DebugSelectPlan extends SelectPlan<DebugSelectPlan, DebugCondition> {
-        protected DebugSelectPlan(ConditionPlan<DebugCondition> wherePlan, ConditionPlan<DebugCondition> havingPlan) {
-            super(wherePlan, havingPlan);
-        }
-    }
-
-    private final static class DebugUpdatePlan extends UpdatePlan<DebugUpdatePlan, DebugCondition> {
-        protected DebugUpdatePlan(ConditionPlan<DebugCondition> wherePlan) {
-            super(wherePlan);
-        }
-    }
-
-    private final static class DebugViewPlan extends ViewPlan<DebugViewPlan> {
-    }
-}
diff --git a/framework/sql/src/org/ofbiz/sql/Parser.jj b/framework/sql/src/org/ofbiz/sql/Parser.jj
deleted file mode 100644
index 19db7e7..0000000
--- a/framework/sql/src/org/ofbiz/sql/Parser.jj
+++ /dev/null
@@ -1,928 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-options {
-    JAVA_UNICODE_ESCAPE = false;
-    ERROR_REPORTING = true;
-    STATIC = false;
-//  MULTI = true;
-    JDK_VERSION = "1.5";
-//  VISITOR = true;
-//  BUILD_NODE_FILES = true;
-//  NODE_FACTORY = false;
-//  NODE_USES_PARSER = true;
-//  NODE_SCOPE_HOOK = true;
-//  NODE_PREFIX = "SQL";
-//  DEBUG_PARSER = true;
-//  DEBUG_LOOKAHEAD = true;
-//  DEBUG_TOKEN_MANAGER = true;
-    LOOKAHEAD = 1;
-//  CHOICE_AMBIGUITY_CHECK = 3;
-//  OTHER_AMBIGUITY_CHECK = 3;
-    IGNORE_CASE = true;
-}
-PARSER_BEGIN(Parser)
-
-package org.ofbiz.sql;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javolution.util.FastList;
-import javolution.util.FastMap;
-import javolution.util.FastSet;
-
-@SuppressWarnings("all")
-public final class Parser {
-    private boolean deleteSupportsUsing = true;
-    private boolean updateSupportsFrom = true;
-
-    public Parser deleteSupportsUsing(boolean value) {
-        deleteSupportsUsing = value;
-        return this;
-    }
-
-    public Parser updateSupportsFrom(boolean value) {
-        updateSupportsFrom = value;
-        return this;
-    }
-
-    private Condition reduce(List<Condition> conditions, Joiner joiner) {
-        if (conditions.size() == 1) {
-            return conditions.get(0);
-        }
-        return new ConditionList(joiner, conditions);
-    }
-}
-
-PARSER_END(Parser)
-TOKEN_MGR_DECLS: {
-    private final FastList<Integer> stack = new FastList<Integer>();
-
-    void pushState(int newState) {
-        stack.add(curLexState);
-        SwitchTo(newState);
-    }
-
-    void popState() {
-        SwitchTo(stack.removeLast());
-    }
-}
-
-TOKEN: {
-      <OPEN_PAREN: "(">
-    | <CLOSE_PAREN: ")">
-    | <AND: "AND">
-    | <OR: "OR">
-    | <PERIOD: ".">
-    | <JOIN: "JOIN">
-    | <LEFT: "LEFT">
-    | <AS: "AS">
-    | <COUNT: "COUNT">
-    | <MAX: "MAX">
-    | <MIN: "MIN">
-    | <SUM: "SUM">
-    | <AVG: "AVG">
-    | <DISTINCT: "DISTINCT">
-    | <WHERE: "WHERE">
-    | <HAVING: "HAVING">
-    | <GROUP: "GROUP">
-    | <ORDER: "ORDER">
-    | <INTERSECT: "INTERSECT">
-    | <EXCEPT: "EXCEPT">
-    | <UNION: "UNION">
-    | <ALL: "ALL">
-    | <BY: "BY">
-    | <ON: "ON">
-    | <USING: "USING">
-    | <LIMIT: "LIMIT">
-    | <OFFSET: "OFFSET">
-    | <SELECT: "SELECT">
-    | <DELETE: "DELETE">
-    | <UPDATE: "UPDATE">
-    | <INSERT: "INSERT">
-    | <INDEX: "INDEX">
-    | <UNIQUE: "UNIQUE">
-    | <RELATION: "RELATION">
-    | <EXCLUDE: "EXCLUDE">
-    | <TYPE: "TYPE">
-    | <TITLE: "TITLE">
-    | <SET: "SET">
-    | <FROM: "FROM">
-    | <SEMI: ";">
-    | <STAR: "*">
-    | <COMMA: ",">
-    | <PLUS: "+">
-    | <MINUS: "-">
-    | <DESC: "DESC">
-    | <ASC: "ASC">
-    | <EQUALS: "=">
-    | <BETWEEN: "BETWEEN">
-    | <INTO: "INTO">
-    | <VALUES: "VALUES">
-    | <CREATE: "CREATE">
-    | <VIEW: "VIEW">
-    | <IS: "IS">
-    | <NOT: "NOT">
-    | <NULL: "NULL">
-    | <MAP: "MAP">
-    | <NULLS: "NULLS">
-    | <FIRST: "FIRST">
-    | <LAST: "LAST">
-    | <START_DQUOTE: "\""> { pushState(IN_DQUOTE); }
-    | <START_SQUOTE: "'"> { pushState(IN_SQUOTE); }
-    | <INTEGER:
-        "0" (
-            "x" (["0"-"9","a"-"b"])+
-            | (["0"-"7"])+
-        )
-        | ["1"-"9"] (["0"-"9"])*
-    >
-    | <NAME: ["a"-"z"] (["a"-"z","0"-"9","_","-"])*>
-    | <PARAMETER: "?" (["a"-"z"])+>
-//  | <WORD: (~["'", "\"", "/", " ", "\f", "\n", "\r", "\t", "*"])+>
-}
-
-<DEFAULT>
-SKIP: {
-    <SPACE: " " | "\f" | "\n" | "\r" | "\t">
-}
-
-<*>
-MORE: {
-    <COMMENT_START: "/*"> { if (curLexState != IN_COMMENT) pushState(IN_COMMENT); }
-}
-
-<IN_COMMENT>
-MORE: {
-      <(~[])>
-    | <COMMENT_END: "*/"> { popState(); }
-}
-
-<IN_DQUOTE,IN_SQUOTE>
-TOKEN: {
-    <ESCAPED: "\\" ["r", "n", "b", "t", "f"]>
-}
-
-<IN_DQUOTE>
-TOKEN: {
-    <END_DQUOTE: "\""> { popState(); }
-}
-
-<IN_SQUOTE>
-TOKEN: {
-      <ESCAPE_SQUOTE: "''">
-    | <END_SQUOTE: "'"> { popState(); }
-}
-
-<DEFAULT,IN_DQUOTE,IN_SQUOTE>
-TOKEN: {
-    <TEXT: (~[])>
-}
-
-// -------------------
-
-public List<SQLStatement<?>> SQLFile(): {
-    List<SQLStatement<?>> list = FastList.newInstance();
-    SQLStatement<?> statement;
-} {
-    (
-        statement=Statement() ( <SEMI> )?
-        { list.add(statement); }
-    )*
-    <EOF>
-    { return list; }
-}
-
-public SQLStatement StandaloneStatement(): {
-    SQLStatement statement;
-} {
-    statement=Statement() ( <SEMI> )? <EOF>
-    { return statement; }
-}
-
-public SQLView ViewStatement(): {
-    SQLView sqlView;
-} {
-    <CREATE> <VIEW> sqlView=View() ( <SEMI> )? <EOF>
-    { return sqlView; }
-}
-
-public SQLSelect SelectStatement(): {
-    SQLSelect sqlSelect;
-} {
-    sqlSelect=Select() ( <SEMI> )? <EOF> { return sqlSelect; }
-}
-
-public SQLDelete DeleteStatement(): {
-    SQLDelete sqlDelete;
-} {
-    sqlDelete=Delete() ( <SEMI> )? <EOF> { return sqlDelete; }
-}
-
-public SQLUpdate UpdateStatement(): {
-    SQLUpdate sqlUpdate;
-} {
-    sqlUpdate=Update() ( <SEMI> )? <EOF> { return sqlUpdate; }
-}
-
-public SQLInsert InsertStatement(): {
-    SQLInsert sqlInsert;
-} {
-    sqlInsert=Insert() ( <SEMI> )? <EOF> { return sqlInsert; }
-}
-
-public Condition Condition(): {
-    Condition c;
-} {
-    c=ConditionExpression() <EOF> { return c; }
-}
-
-public FieldAll parse_FieldAll(): {
-    FieldAll fieldAll;
-} {
-    fieldAll=FieldAll() <EOF> { return fieldAll; }
-}
-
-public FieldDef parse_FieldDef(): {
-    FieldDef fieldDef;
-} {
-    fieldDef=FieldDef() <EOF> { return fieldDef; }
-}
-
-public OrderByItem parse_OrderByItem(): {
-    OrderByItem item;
-} {
-    item=OrderByItem() <EOF> { return item; }
-}
-
-private SQLStatement Statement(): {
-    SQLStatement statement;
-} {
-    (
-          statement=Select() { return statement; }
-        | statement=Delete() { return statement; }
-        | statement=Update() { return statement; }
-        | statement=Insert() { return statement; }
-        | statement=Creates() { return statement; }
-    )
-}
-
-private SQLStatement Creates(): {
-    SQLStatement statement;
-    boolean isUnique = false;
-} {
-    <CREATE> (
-          <VIEW> statement=View() { return statement; }
-        | ( <UNIQUE> { isUnique = true; } )?
-          <INDEX> statement=Index(isUnique) { return statement; }
-    )
-}
-
-private SQLView View(): {
-    String name;
-    SQLSelect sqlSelect;
-} {
-    name=NamePart() <AS> sqlSelect=Select() { return new SQLView(name, sqlSelect); }
-}
-
-private SelectGroup SelectGroup(): {
-    boolean isDistinct = false;
-    List<String> groupBy = null;
-    Map<String, FieldDef> fieldDefs = FastMap.newInstance();
-    List<FieldAll> fieldAlls = FastList.newInstance();
-    Set<String> fieldAllAliases = FastSet.newInstance();
-    Table table;
-    Condition whereCondition = null, havingCondition = null;
-} {
-    <SELECT> (<DISTINCT> { isDistinct = true; })? (
-        SelectField(fieldDefs, fieldAlls, fieldAllAliases)
-        ( <COMMA> SelectField(fieldDefs, fieldAlls, fieldAllAliases) )*
-    )
-    <FROM> table=Table()
-    ( <WHERE> whereCondition=ConditionExpression() )?
-    ( <HAVING> havingCondition=ConditionExpression() )?
-    ( <GROUP> <BY> groupBy=FieldList() )?
-    { return new SelectGroup(isDistinct, fieldAlls, fieldDefs, table, whereCondition, havingCondition, groupBy); }
-}
-
-private Unioned.Operator UnionOperator(): {
-} {
-      <UNION>
-      ( <ALL> { return Unioned.Operator.UNION_ALL; } )?
-      { return Unioned.Operator.UNION; }
-    | <INTERSECT>
-      ( <ALL> { return Unioned.Operator.INTERSECT_ALL; } )?
-      { return Unioned.Operator.INTERSECT; }
-    | <EXCEPT>
-      ( <ALL> { return Unioned.Operator.EXCEPT_ALL; } )?
-      { return Unioned.Operator.EXCEPT; }
-}
-
-private Unioned Unioned(): {
-    Unioned.Operator operator;
-    SelectGroup selectGroup;
-    Unioned next = null;
-} {
-    operator=UnionOperator() selectGroup=SelectGroup() ( next=Unioned() )?
-    { return new Unioned(operator, selectGroup, next); }
-}
-
-private SQLSelect Select(): {
-    boolean hadEarlyRelations = false;
-    Unioned unioned = null;
-    boolean isDistinct = false;
-    List<OrderByItem> orderBy = null;
-    List<String> groupBy = null;
-    Map<String, FieldDef> fieldDefs = FastMap.newInstance();
-    List<FieldAll> fieldAlls = FastList.newInstance();
-    Set<String> fieldAllAliases = FastSet.newInstance();
-    Table table;
-    Map<String, Relation> relations = FastMap.newInstance();
-    Condition whereCondition = null, havingCondition = null;
-    int offset = -1, limit = -1;
-} {
-    <SELECT> (<DISTINCT> { isDistinct = true; })? (
-        SelectField(fieldDefs, fieldAlls, fieldAllAliases)
-        ( <COMMA> SelectField(fieldDefs, fieldAlls, fieldAllAliases) )*
-    )
-    <FROM> table=Table()
-    ( LOOKAHEAD(1) <RELATION> Relation(relations) { hadEarlyRelations = true; } )*
-    ( <WHERE> whereCondition=ConditionExpression() )?
-    ( <HAVING> havingCondition=ConditionExpression() )?
-    ( <GROUP> <BY> groupBy=FieldList() )?
-    ( unioned=Unioned() )?
-    ( LOOKAHEAD(1, {!hadEarlyRelations}) <RELATION> Relation(relations) )*
-    ( <ORDER> <BY> orderBy=OrderByList() )?
-    ( <OFFSET> offset=Integer() )?
-    ( <LIMIT> limit=Integer() )?
-    { return new SQLSelect(new SelectGroup(isDistinct, fieldAlls, fieldDefs, table, whereCondition, havingCondition, groupBy), unioned, relations, orderBy, offset, limit); }
-}
-
-private void Relation(Map<String, Relation> relations): {
-    String type = null, title = null, entityName;
-    KeyMap keyMap;
-    List<KeyMap> keyMaps = FastList.newInstance();
-} {
-    ( <TYPE> type=NamePart() )?
-    ( <TITLE> title=NamePart() )?
-    <NAME> { entityName = getToken(0).image; }
-    <MAP> keyMap=PlainKeyMap() { keyMaps.add(keyMap); } (
-        <COMMA>
-        keyMap=PlainKeyMap() { keyMaps.add(keyMap); }
-    )*
-    {
-        Relation relation = new Relation(type, title, entityName, keyMaps);
-        if (relations.containsKey(relation.getName())) throw new ParseException("Duplicate relation: " + relation);
-        relations.put(relation.getName(), relation);
-    }
-}
-
-private KeyMap PlainKeyMap(): {
-    String left, right;
-} {
-    left=NamePart() (
-          <EQUALS> right=NamePart() { return new KeyMap(left, right); }
-        | { return new KeyMap(left, left); }
-    )
-}
-
-private SQLUpdate Update(): {
-    TableName tableName;
-    List<Table> tableList = null;
-    Condition whereCondition = null;
-    List<SetField> allSetFields = FastList.newInstance();
-    List<SetField> setFields;
-    Joined joined = null;
-} {
-    <UPDATE> tableName=TableName()
-    <SET>
-    setFields=SetField() { allSetFields.addAll(setFields); }
-    ( <COMMA> setFields=SetField() { allSetFields.addAll(setFields); } )*
-    ( LOOKAHEAD(<FROM>, {updateSupportsFrom}) <FROM> joined=JoinedRest(false, tableName) )?
-    ( <WHERE> whereCondition=ConditionExpression() )?
-    { return new SQLUpdate(new Table(tableName, joined), allSetFields, whereCondition); }
-}
-
-private SQLDelete Delete(): {
-    TableName tableName;
-    List<Table> tableList = null;
-    Condition whereCondition = null;
-    Joined joined = null;
-} {
-    <DELETE> <FROM> tableName=TableName()
-    ( LOOKAHEAD(<USING>, {deleteSupportsUsing}) <USING> joined=JoinedRest(false, tableName) )?
-    ( <WHERE> whereCondition=ConditionExpression() )?
-    { return new SQLDelete(new Table(tableName, joined), whereCondition); }
-}
-
-private SQLIndex Index(boolean isUnique): {
-    String name, table, using = null;
-    ConstantValue value;
-    List<ConstantValue> values = FastList.newInstance();
-} {
-    name=NamePart() <ON> table=NamePart()
-    ( <USING> using=NamePart() )?
-    <OPEN_PAREN>
-    value=ConstantValue() { values.add(value); }
-    ( <COMMA> value=ConstantValue() { values.add(value); } )*
-    <CLOSE_PAREN>
-    { return new SQLIndex(isUnique, name, table, using, values); }
-}
-
-private SQLInsert Insert(): {
-    TableName tableName;
-    List<String> columns = FastList.newInstance();
-    String n;
-    InsertSource source;
-} {
-    <INSERT> <INTO> tableName=TableName() (
-        <OPEN_PAREN>
-        n=NamePart() { columns.add(n); }
-        ( <COMMA> n=NamePart() { columns.add(n); } )*
-        <CLOSE_PAREN>
-    )?
-    ( source=InsertValues() | source=Select() )
-    { return new SQLInsert(tableName, source, columns); }
-}
-
-private InsertValues InsertValues(): {
-    List<InsertRow> list = FastList.newInstance();
-    InsertRow row;
-} {
-    <VALUES>
-    row=InsertRow() { list.add(row); }
-    ( <COMMA> row=InsertRow() { list.add(row); } )*
-    { return new InsertValues(list); }
-}
-
-private InsertRow InsertRow(): {
-    List<Value> list = FastList.newInstance();
-    Value v;
-} {
-    <OPEN_PAREN>
-    v=InsertValue() { list.add(v); }
-    ( <COMMA> v=InsertValue() { list.add(v); } )*
-    <CLOSE_PAREN>
-    { return new InsertRow(list); }
-}
-
-private Value InsertValue(): {
-    Value v;
-    Integer i;
-    String s;
-} {
-      v=ParameterValue() { return v; }
-    | i=Integer() { return new NumberValue<Integer>(i); }
-    | s=SQuoted() { return new StringValue(s); }
-}
-
-private List<SetField> SetField(): {
-    List<SetField> setFields = FastList.newInstance();
-    String n;
-    Value v;
-    List<String> columnList = FastList.newInstance();
-    List<Value> valueList = FastList.newInstance();
-} {
-    (
-          n=NamePart() <EQUALS> (
-              v=Value() { setFields.add(new SetField(n, v)); }
-            | v=MathValue() { setFields.add(new SetField(n, v)); }
-          )
-        | <OPEN_PAREN>
-          n=NamePart() { columnList.add(n); }
-          ( <COMMA> n=NamePart() { columnList.add(n); } )*
-          <CLOSE_PAREN>
-          <EQUALS>
-          <OPEN_PAREN>
-          ( v=Value() | v=MathValue() ) { valueList.add(v); }
-          ( <COMMA> (v=Value()|v=MathValue()) { valueList.add(v); } )*
-          <CLOSE_PAREN> {
-            if (columnList.size() != valueList.size()) throw new ParseException();
-            for (int i = 0; i < columnList.size(); i++) {
-                setFields.add(new SetField(columnList.get(i), valueList.get(i)));
-            }
-          }
-    )
-    { return setFields; }
-}
-
-private Table Table(): {
-    TableName tableName;
-    Joined joined = null;
-} {
-    tableName=TableName()
-    ( joined=Joined(tableName) )?
-    { return new Table(tableName, joined); }
-}
-
-private Joined Joined(TableName leftTableName): {
-    Boolean isOptional;
-    Joined joined = null;
-} {
-    isOptional=Joiner() joined=JoinedRest(isOptional, leftTableName)
-    { return joined; }
-}
-
-private Joined JoinedRest(boolean isOptional, TableName leftTableName): {
-    TableName rightTableName;
-    List<KeyMap> keyMaps;
-    Joined joined = null;
-} {
-    rightTableName=TableName()
-    keyMaps=KeyMaps(leftTableName.getAlias(), rightTableName.getAlias())
-    ( joined=Joined(rightTableName) )?
-    { return new Joined(isOptional, rightTableName, keyMaps, joined); }
-}
-
-private List<KeyMap> KeyMaps(String leftAlias, String rightAlias): {
-    List<KeyMap> keyMaps = FastList.newInstance();
-    String n;
-} {
-    (
-          <ON>
-          KeyMap(keyMaps, leftAlias, rightAlias)
-          ( <AND> KeyMap(keyMaps, leftAlias, rightAlias) )*
-        | <USING>
-          n=NamePart() { keyMaps.add(new KeyMap(n, n)); }
-          ( <COMMA> n=NamePart() { keyMaps.add(new KeyMap(n, n)); } )*
-    )
-    { return keyMaps; }
-}
-
-private void KeyMap(List<KeyMap> keyMaps, String leftAlias, String rightAlias): {
-    String alias1, field1;
-    String alias2, field2;
-} {
-    alias1=NamePart() <PERIOD> field1=NamePart()
-    <EQUALS>
-    alias2=NamePart() <PERIOD> field2=NamePart() {
-        if (alias1.equals(leftAlias)) {
-            if (!alias2.equals(rightAlias)) throw new ParseException("invalid right alias(" + alias2 + "), expected(" + rightAlias + ")");
-            keyMaps.add(new KeyMap(field1, field2));
-        } else if (alias1.equals(rightAlias)) {
-            if (!alias2.equals(leftAlias)) throw new ParseException("invalid left alias(" + alias2 + "), expected(" + leftAlias + ")");
-            keyMaps.add(new KeyMap(field2, field1));
-        } else {
-            throw new ParseException("invalid aliases, expected(" + leftAlias + " or " + rightAlias + ")");
-        }
-    }
-}
-
-private TableName TableName(): {
-    String tableName, alias = null;
-} {
-    tableName=NamePart()
-    ( ( <AS> )? alias=NamePart() )?
-    { return new TableName(tableName, alias); }
-}
-
-private Boolean Joiner(): {
-} {
-      <LEFT> <JOIN> { return Boolean.TRUE; }
-    | <JOIN> { return Boolean.FALSE; }
-}
-
-private void SelectField(Map<String, FieldDef> fieldDefs, List<FieldAll> fieldAlls, Set<String> fieldAllAliases): {
-    FieldAll fieldAll;
-    FieldDef fieldDef;
-} {
-      LOOKAHEAD(3) fieldAll=FieldAll() {
-        if (fieldAllAliases.contains(fieldAll.getAlias())) throw new ParseException("Duplicate aliasAll(" + fieldAll.getAlias() + ")");
-        fieldAlls.add(fieldAll); return;
-      }
-    | fieldDef=FieldDef() {
-        if (fieldDefs.containsKey(fieldDef.getDefaultName())) throw new ParseException("duplicate alias(" + fieldDef.getDefaultName() + ")");
-        fieldDefs.put(fieldDef.getDefaultName(), fieldDef);
-    }
-}
-
-private FieldAll FieldAll(): {
-    String n, exc;
-    Set<String> excludeList = FastSet.newInstance();
-} {
-    n=NamePart() <PERIOD> <STAR> (
-        <EXCLUDE> <OPEN_PAREN>
-        exc=NamePart() { excludeList.add(exc); }
-        ( <COMMA> exc=NamePart() { excludeList.add(exc); } )*
-        <CLOSE_PAREN>
-    )?
-    { return new FieldAll(n, excludeList); }
-}
-
-private StaticValue StaticValue(): {
-    StaticValue v;
-    String n, fieldName;
-} {
-    (
-          n=NamePart() (
-              <PERIOD> fieldName=NamePart() { v = new FieldValue(n, fieldName); }
-            | v=FunctionCallRest(n)
-            | { v = new FieldValue(null, n); }
-          )
-        | v=MathValue()
-        | LOOKAHEAD(5) v=CountAll()
-        | v=AggregateFunction()
-    ) { return v; }
-}
-
-private FieldDef FieldDef(): {
-    StaticValue v;
-    String fieldAlias = null;
-} {
-    v=StaticValue() ( <AS> fieldAlias=NamePart() )? {
-        return new FieldDef(v, fieldAlias);
-    }
-}
-
-private CountAllFunction CountAll(): {
-    String n;
-} {
-    <COUNT> <OPEN_PAREN> (
-          n=NamePart()
-        | { n = null; }
-    ) <PERIOD> <STAR> <CLOSE_PAREN>
-    { return new CountAllFunction(n); }
-}
-
-private StaticValue MathValue(): {
-    ConstantValue v;
-    List<ConstantValue> values = FastList.newInstance();
-    String operator = null, newOperator;
-} {
-    <OPEN_PAREN> v=ConstantValue() { values.add(v); } (
-        newOperator=MathOperator() v=ConstantValue() {
-            if (operator == null) {
-                operator = newOperator;
-            } else if (!newOperator.equals(operator)) {
-                throw new ParseException("Different operators in complex alias(" + operator + ":" + newOperator + ")");
-            }
-            values.add(v);
-        }
-    )*
-    <CLOSE_PAREN> {
-        if (values.size() == 1 && values.get(0) instanceof StaticValue) return (StaticValue) values.get(0);
-        return new MathValue(operator, values);
-    }
-}
-
-private AggregateFunction AggregateFunction(): {
-    StaticValue v;
-    String name, n, fieldName;
-    boolean isDistinct = false;
-} {
-    name=AggregateName() <OPEN_PAREN>
-    ( <DISTINCT> { isDistinct = true; } )? (
-          n=NamePart() (
-              <PERIOD> fieldName=NamePart() { v = new FieldValue(n, fieldName); }
-            | v=FunctionCallRest(n)
-            | { v = new FieldValue(null, n); }
-          )
-        | v=MathValue()
-    ) <CLOSE_PAREN>
-    { return new AggregateFunction(name, isDistinct, v); }
-}
-
-private FunctionCall FunctionCallRest(String name): {
-    Value arg;
-    List<Value> args = FastList.newInstance();
-} {
-    <OPEN_PAREN> (
-        arg=Value() { args.add(arg); }
-        ( <COMMA> arg=Value() { args.add(arg); } )*
-    )?
-    <CLOSE_PAREN>
-    { return new FunctionCall(name, args); }
-}
-
-private ConstantValue ConstantValue(): {
-    String n;
-    ConstantValue v;
-    int i;
-    String s;
-} {
-      n=NamePart() (
-          v=FunctionCallRest(n) { return v; }
-        | v=FieldValue(n) { return v; }
-      )
-    | i=Integer() { return new NumberValue<Integer>(i); }
-    | s=SQuoted() { return new StringValue(s); }
-    | v=MathValue() { return v; }
-}
-
-private String NamePart(): {
-} {
-      <NAME> { return getToken(0).image; }
-    | <TYPE> { return getToken(0).image; }
-}
-
-private String DQuoted(): {
-    StringBuilder sb = new StringBuilder();
-} {
-    <START_DQUOTE> (
-          <TEXT> { sb.append(getToken(0).image); }
-        | <ESCAPED> { sb.append(getToken(0).image); }
-    )* <END_DQUOTE>
-    { return sb.toString(); }
-}
-
-private String SQuoted(): {
-    StringBuilder sb = new StringBuilder();
-} {
-    <START_SQUOTE> (
-          <TEXT> { sb.append(getToken(0).image); }
-        | <ESCAPED> { sb.append(getToken(0).image); }
-        | <ESCAPE_SQUOTE> { sb.append("'"); }
-    )* <END_SQUOTE>
-    { return sb.toString(); }
-}
-
-private String Text(): {
-    StringBuilder sb = new StringBuilder();
-} {
-    ( <TEXT> { sb.append(getToken(0).image); } )+
-    { return sb.toString(); }
-}
-
-private List<String> FieldList(): {
-    List<String> list = FastList.newInstance();
-    String n;
-} {
-    n=NamePart() { list.add(n); }
-    ( <COMMA> n=NamePart() { list.add(n); } )*
-    { return list; }
-}
-
-private FieldValue FieldValue(String fieldName): {
-    String s;
-} {
-    ( <PERIOD> s=NamePart() { return new FieldValue(fieldName, s); } )?
-    { return new FieldValue(fieldName); }
-}
-
-private List<OrderByItem> OrderByList(): {
-    List<OrderByItem> orderBy = FastList.newInstance();
-    OrderByItem obi;
-} {
-    obi=OrderByItem() { orderBy.add(obi); }
-    ( <COMMA> obi=OrderByItem() { orderBy.add(obi); } )*
-    { return orderBy; }
-}
-
-public OrderByItem OrderByItem(): {
-    ConstantValue value;
-    OrderByItem.Order ordering = OrderByItem.Order.DEFAULT;
-    OrderByItem.Nulls nulls = OrderByItem.Nulls.DEFAULT;
-} {
-    (
-          (
-            (
-                  <PLUS> { ordering = OrderByItem.Order.ASCENDING; }
-                | <MINUS> { ordering = OrderByItem.Order.DESCENDING; }
-            )
-            value=ConstantValue()
-          )
-        | value=ConstantValue() (
-              <DESC> { ordering = OrderByItem.Order.DESCENDING; }
-            | <ASC> { ordering = OrderByItem.Order.ASCENDING; }
-          )?
-    )
-    (
-        <NULLS> (
-              <FIRST> { nulls = OrderByItem.Nulls.FIRST; }
-            | <LAST> { nulls = OrderByItem.Nulls.LAST; }
-        )
-    )?
-    { return new OrderByItem(ordering, nulls, value); }
-}
-
-private Integer Integer(): {
-} {
-    <INTEGER> { return Integer.decode(getToken(0).image); }
-}
-
-private Value Value(): {
-    String n;
-    Value v;
-    int i;
-    String s;
-} {
-      n=NamePart() (
-          v=FunctionCallRest(n) { return v; }
-        | v=FieldValue(n) { return v; }
-      )
-    | i=Integer() { return new NumberValue<Integer>(i); }
-    | s=SQuoted() { return new StringValue(s); }
-}
-
-private Condition ConditionExpression(): {
-    Condition c;
-} {
-    c=OrExpression() { return c; }
-}
-
-private Condition AndExpression(): {
-    List<Condition> list = FastList.newInstance();
-    Condition c;
-} {
-    c=BooleanExpression() { list.add(c); }
-    ( <AND> c=BooleanExpression() { list.add(c); } )*
-    { return reduce(list, Joiner.AND); }
-}
-
-private Condition OrExpression(): {
-    List<Condition> list = FastList.newInstance();
-    Condition c;
-} {
-    c=AndExpression() { list.add(c); }
-    ( <OR> c=AndExpression() { list.add(c); } )*
-    { return reduce(list, Joiner.OR); }
-}
-
-private Value RightValue(): {
-    Value v;
-} {
-      v=Value() { return v; }
-    | v=ParameterValue() { return v; }
-}
-
-private ParameterValue ParameterValue(): {
-} {
-    <PARAMETER> { return new ParameterValue(getToken(0).image.substring(1)); }
-}
-
-private Condition BooleanExpression(): {
-    Value v1, v2, v, r1, r2;
-    String op;
-    Condition c;
-    List<Value> list = FastList.newInstance();
-} {
-    v1=Value() (
-          <BETWEEN> r1=RightValue() <AND> r2=RightValue()
-          { return new BetweenCondition(v1, r1, r2); }
-        | <IS> (
-              <NULL> { op = "="; v2 = Value.NULL; }
-            | <NOT> <NULL> { op = "!="; v2 = Value.NULL; }
-        )
-    | op=ComparisonOperator() (
-          v2=RightValue()
-        | <OPEN_PAREN>
-          v=RightValue() { list.add(v); }
-          (
-            <COMMA> v=RightValue() { list.add(v); }
-          )*
-          <CLOSE_PAREN>
-          { return new ListCondition(v1, op, list); }
-        )
-      )
-      { return new BooleanCondition(v1, op, v2); }
-    | <OPEN_PAREN> c=ConditionExpression() <CLOSE_PAREN> { return c; }
-}
-
-private String ComparisonOperator(): {
-    StringBuilder sb = new StringBuilder();
-    String s;
-} {
-      s=Text() { sb.append(s); }
-      (
-        <EQUALS> { sb.append(getToken(0).image); }
-        ( s=Text() { sb.append(s); } )?
-      )*
-      { return sb.toString(); }
-    | <NAME> { return getToken(0).image; }
-    | <EQUALS> { return getToken(0).image; }
-}
-
-private String MathOperator(): {
-    String s;
-} {
-      s=Text() { return s; }
-    | <NAME> { return getToken(0).image; }
-}
-
-private String AggregateName(): {
-} {
-      <COUNT> { return getToken(0).image; }
-    | <MAX> { return getToken(0).image; }
-    | <MIN> { return getToken(0).image; }
-    | <SUM> { return getToken(0).image; }
-    | <AVG> { return getToken(0).image; }
-    | <FIRST> { return getToken(0).image; }
-    | <LAST> { return getToken(0).image; }
-}
diff --git a/framework/sql/src/org/ofbiz/sql/test/SQLTest.java b/framework/sql/src/org/ofbiz/sql/test/SQLTest.java
deleted file mode 100644
index 119d11f..0000000
--- a/framework/sql/src/org/ofbiz/sql/test/SQLTest.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.ofbiz.sql.test;
-
-import java.io.StringReader;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.ofbiz.base.test.GenericTestCaseBase;
-import org.ofbiz.sql.AggregateFunction;
-import org.ofbiz.sql.BetweenCondition;
-import org.ofbiz.sql.BooleanCondition;
-import org.ofbiz.sql.Condition;
-import org.ofbiz.sql.ConditionList;
-import org.ofbiz.sql.ConstantValue;
-import org.ofbiz.sql.FieldAll;
-import org.ofbiz.sql.FieldDef;
-import org.ofbiz.sql.FieldValue;
-import org.ofbiz.sql.FunctionCall;
-import org.ofbiz.sql.InsertRow;
-import org.ofbiz.sql.InsertValues;
-import org.ofbiz.sql.Joined;
-import org.ofbiz.sql.Joiner;
-import org.ofbiz.sql.KeyMap;
-import org.ofbiz.sql.ListCondition;
-import org.ofbiz.sql.MathValue;
-import org.ofbiz.sql.NumberValue;
-import org.ofbiz.sql.OrderByItem;
-import org.ofbiz.sql.ParameterValue;
-import org.ofbiz.sql.Parser;
-import org.ofbiz.sql.Relation;
-import org.ofbiz.sql.SQLDelete;
-import org.ofbiz.sql.SQLIndex;
-import org.ofbiz.sql.SQLInsert;
-import org.ofbiz.sql.SQLSelect;
-import org.ofbiz.sql.SQLStatement;
-import org.ofbiz.sql.SQLUpdate;
-import org.ofbiz.sql.SQLView;
-import org.ofbiz.sql.SetField;
-import org.ofbiz.sql.StringValue;
-import org.ofbiz.sql.Table;
-import org.ofbiz.sql.TableName;
-import org.ofbiz.sql.Value;
-
-public class SQLTest extends GenericTestCaseBase {
-    public SQLTest(String name) {
-        super(name);
-    }
-
-    private static Parser parser(SQLStatement<?> s) throws Exception {
-        return new Parser(new StringReader(s.toString()));
-    }
-
-    public void testParse() throws Exception {
-        List<SQLStatement<?>> statements = new Parser(getClass().getResourceAsStream("GoodParseAll.sql")).SQLFile();
-        for (SQLStatement<?> statement: statements) {
-            System.err.println(statement);
-        }
-        Iterator<SQLStatement<?>> stmtIt = statements.iterator();
-        assertTrue("has more statements", stmtIt.hasNext());
-
-        {
-            SQLSelect select = new SQLSelect(
-                false,
-                list(
-                    new FieldAll("a", Collections.<String>emptySet()),
-                    new FieldAll("b", set("partyId")),
-                    new FieldAll("c", set("partyId"))
-                ),
-                GenericTestCaseBase.<String, FieldDef>map(
-                    "roleTypeId", new FieldDef(new FieldValue("d", "roleTypeId"), null),
-                    "roleDescription", new FieldDef(new FieldValue("d", "description"), "roleDescription"),
-                    "SUM",  new FieldDef(new AggregateFunction("SUM", false, new FieldValue("a", "partyId")), null),
-                    "baz",  new FieldDef(new FunctionCall("FOO", GenericTestCaseBase.<Value>list(new FieldValue("a", "partyId"), new NumberValue<Integer>(Integer.valueOf(1)))), "baz"),
-                    "one",  new FieldDef(new MathValue("||", list(new FieldValue("a", "partyId"), new StringValue("-"), new FieldValue("a", "partyTypeId"))), "one"),
-                    "cnt1", new FieldDef(new AggregateFunction("COUNT", false, new FieldValue("a", "partyId")), "cnt1"),
-                    "cnt2", new FieldDef(new AggregateFunction("COUNT", false, new FieldValue(null, "partyId")), "cnt2"),
-                    "cnt3", new FieldDef(new AggregateFunction("COUNT", true, new FieldValue("a", "partyId")), "cnt3")
-                ),
-                new Table(
-                    new TableName("Party", "a"),
-                    new Joined(true, new TableName("Person", "b"), list(new KeyMap("partyId", "partyId")),
-                        new Joined(true, new TableName("PartyGroup", "c"), list(new KeyMap("partyId", "partyId")),
-                            new Joined(false, new TableName("PartyRole", "d"), list(new KeyMap("partyId", "partyId"), new KeyMap("partyId", "partyId")))
-                        )
-                    )
-                ),
-                GenericTestCaseBase.<String, Relation>map(
-                    "MainAPerson", new Relation("one", "MainA", "Person", list(new KeyMap("partyId", "partyId"))),
-                    "MainBPerson", new Relation(null, "MainB", "Person", list(new KeyMap("partyId", "partyId"))),
-                    "Person", new Relation("one", null, "Person", list(new KeyMap("partyId", "partyId"))),
-                    "PartyGroup", new Relation(null, null, "PartyGroup", list(new KeyMap("partyId", "partyId")))
-                ),
-                new ConditionList(
-                    Joiner.OR,
-                    GenericTestCaseBase.<Condition>list(
-                        new ConditionList(
-                            Joiner.AND,
-                            list(
-                                new BooleanCondition(new FieldValue("a", "partyTypeId"), "=", new StringValue("PERSON")),
-                                new BooleanCondition(new FieldValue("b", "lastName"), "LIKE", new ParameterValue("lastName")),
-                                new BetweenCondition(new FieldValue("b", "birthDate"), new StringValue("1974-12-01"), new StringValue("1974-12-31"))
-                            )
-                        ),
-                        new ConditionList(
-                            Joiner.AND,
-                            list(
-                                new ListCondition(new FieldValue("b", "partyId"), "IN", GenericTestCaseBase.<Value>list(
-                                    new StringValue("1"),
-                                    new StringValue("2"),
-                                    new StringValue("3"),
-                                    new StringValue("4")
-                                )),
-                                new BooleanCondition(new FieldValue("b", "gender"), "=", new StringValue("M"))
-                            )
-                        )
-                    )
-                ),
-                new BooleanCondition(new FieldValue("b", "firstName"), "LIKE", new StringValue("%foo%")),
-                null,
-                list(
-                    new OrderByItem(OrderByItem.Order.DEFAULT, OrderByItem.Nulls.DEFAULT, new FunctionCall("LOWER", GenericTestCaseBase.<Value>list(new FieldValue(null, "lastName")))),
-                    new OrderByItem(OrderByItem.Order.DEFAULT, OrderByItem.Nulls.DEFAULT, new FieldValue(null, "firstName")),
-                    new OrderByItem(OrderByItem.Order.DESCENDING, OrderByItem.Nulls.DEFAULT, new FieldValue(null, "birthDate"))
-                ),
-                5,
-                10
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("firstSelect", select, stmt);
-            assertEquals("firstSelect:parse", parser(select).SelectStatement(), parser(stmt).SelectStatement());
-        }
-        {
-            SQLInsert insert = new SQLInsert(
-                new TableName("Party", null),
-                new InsertValues(
-                    list(
-                        new InsertRow(GenericTestCaseBase.<Value>list(new StringValue("a"), new StringValue("PERSON"), new StringValue("PARTY_DISABLED"))),
-                        new InsertRow(list(new NumberValue<Integer>(Integer.valueOf(5)), new StringValue("PARTY_GROUP"), new ParameterValue("name")))
-                    )
-                ),
-                list("partyId", "partyTypeId", "statusId")
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("firstInsert", insert, stmt);
-            assertEquals("firstInsert:parse", parser(insert).InsertStatement(), parser(stmt).InsertStatement());
-        }
-        {
-            SQLInsert insert = new SQLInsert(
-                new TableName("Person", null),
-                new SQLSelect(
-                    false,
-                    null,
-                    GenericTestCaseBase.<String, FieldDef>map(
-                        "partyId", new FieldDef(new FieldValue(null, "partyId"), null),
-                        "firstName",  new FieldDef(new MathValue("||", list(new FieldValue(null, "partyId"), new StringValue("-auto"))), "firstName")
-                    ),
-                    new Table(new TableName("Party", null), null),
-                    null,
-                    new ListCondition(new FieldValue(null, "partyId"), "IN", GenericTestCaseBase.<Value>list(new StringValue("a"), new StringValue("b"))),
-                    null,
-                    null,
-                    null,
-                    -1,
-                    -1
-                ),
-                list("partyId", "firstName")
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("secondInsert", insert, stmt);
-            assertEquals("secondInsert:parse", parser(insert).InsertStatement(), parser(stmt).InsertStatement());
-        }
-        {
-            SQLUpdate update = new SQLUpdate(
-                new Table(new TableName("Person", null), null),
-                list(
-                    new SetField("lastName", new MathValue("||", list(new StringValue("auto-"), new FieldValue(null, "partyId"))))
-                ),
-                new ListCondition(new FieldValue(null, "partyId"), "IN", GenericTestCaseBase.<Value>list(new StringValue("a"), new StringValue("b")))
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("firstUpdate", update, stmt);
-            assertEquals("firstUpdate:parse", parser(update).UpdateStatement(), parser(stmt).UpdateStatement());
-        }
-        {
-            SQLUpdate update = new SQLUpdate(
-                new Table(new TableName("Person", null), null),
-                list(
-                    new SetField("lastName", new MathValue("||", list(new StringValue("auto-"), new FieldValue(null, "partyId")))),
-                    new SetField("height", new NumberValue<Integer>(Integer.valueOf(5))),
-                    new SetField("width", new NumberValue<Integer>(Integer.valueOf(7)))
-                ),
-                new ListCondition(new FieldValue(null, "partyId"), "IN", GenericTestCaseBase.<Value>list(new StringValue("a"), new StringValue("b")))
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("secondUpdate", update, stmt);
-            assertEquals("secondUpdate:parse", parser(update).UpdateStatement(), parser(stmt).UpdateStatement());
-        }
-        {
-            SQLUpdate update = new SQLUpdate(
-                new Table(new TableName("Person", null), null),
-                list(
-                    new SetField("lastName", new MathValue("||", list(new StringValue("auto-"), new FieldValue(null, "partyId")))),
-                    new SetField("height", new NumberValue<Integer>(Integer.valueOf(6))),
-                    new SetField("width", new NumberValue<Integer>(Integer.valueOf(5))),
-                    new SetField("nickname", new StringValue("a"))
-                ),
-                new ListCondition(new FieldValue(null, "partyId"), "IN", GenericTestCaseBase.<Value>list(new StringValue("a"), new StringValue("b")))
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("thirdUpdate", update, stmt);
-            assertEquals("thirdUpdate:parse", parser(update).UpdateStatement(), parser(stmt).UpdateStatement());
-        }
-        {
-            SQLDelete delete = new SQLDelete(
-                new Table(new TableName("Person", null), null),
-                new ListCondition(new FieldValue(null, "partyId"), "IN", GenericTestCaseBase.<Value>list(new StringValue("a"), new StringValue("b")))
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("firstDelete", delete, stmt);
-            assertEquals("firstDelete:parse", parser(delete).DeleteStatement(), parser(stmt).DeleteStatement());
-        }
-        {
-            SQLDelete delete = new SQLDelete(
-                new Table(new TableName("Party", null), null),
-                new ListCondition(new FieldValue(null, "partyId"), "IN", GenericTestCaseBase.<Value>list(new StringValue("a"), new StringValue("b")))
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("secondDelete", delete, stmt);
-            assertEquals("secondDelete:parse", parser(delete).DeleteStatement(), parser(stmt).DeleteStatement());
-        }
-        {
-            SQLView view = new SQLView(
-                "viewOne",
-                new SQLSelect(
-                    false,
-                    list(new FieldAll("a", Collections.<String>emptySet())),
-                    null,
-                    new Table(new TableName("Party", "a"), null),
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    -1,
-                    -1
-                )
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("firstView", view, stmt);
-            assertEquals("firstView:parse", parser(view).ViewStatement(), parser(stmt).ViewStatement());
-        }
-        {
-            SQLIndex index = new SQLIndex(
-                false,
-                "testIndex",
-                "Party",
-                "btree",
-                GenericTestCaseBase.<ConstantValue>list(
-                    new FieldValue(null, "partyId")
-                )
-            );
-            SQLStatement<?> stmt = stmtIt.next();
-            assertEquals("firstIndex", index, stmt);
-        }
-        assertFalse("has no more statements", stmtIt.hasNext());
-    }
-/*
-CREATE VIEW viewOne AS SELECT a.* FROM Party a;
-*/
-}
diff --git a/framework/sql/src/org/ofbiz/sql/test/SelectTest.java b/framework/sql/src/org/ofbiz/sql/test/SelectTest.java
index b269935..f5480b3 100644
--- a/framework/sql/src/org/ofbiz/sql/test/SelectTest.java
+++ b/framework/sql/src/org/ofbiz/sql/test/SelectTest.java
@@ -18,7 +18,6 @@
  */
 package org.ofbiz.sql.test;
 
-import java.io.StringReader;
 import java.util.Collections;
 import java.util.Set;
 
@@ -30,7 +29,6 @@
 import org.ofbiz.sql.FieldValue;
 import org.ofbiz.sql.FunctionCall;
 import org.ofbiz.sql.OrderByItem;
-import org.ofbiz.sql.Parser;
 import org.ofbiz.sql.StaticValue;
 import org.ofbiz.sql.Value;
 
@@ -44,10 +42,6 @@
         super(name);
     }
 
-    private static Parser parser(Object v) {
-        return new Parser(new StringReader(v.toString()));
-    }
-
     private static <V> void basicTest(String label, Class<V> clz, V v, V o, boolean matches) {
         assertNotEquals(label + ":not-equals-this", v, SelectTest.class);
         if (o != null) {
@@ -62,7 +56,6 @@
     private static void fieldAllTest(String label, FieldAll v, String alias, Set<String> exclude, FieldAll o, boolean matches) throws Exception {
         assertEquals(label + ":alias", alias, v.getAlias());
         assertEquals(label + ":exclude", exclude, set(v));
-        assertEquals(label + ":parse", v, parser(v).parse_FieldAll());
         basicTest(label, FieldAll.class, v, o, matches);
     }
 
@@ -83,7 +76,6 @@
         assertEquals(label + ":value", value, v.getValue());
         assertEquals(label + ":alias", alias, v.getAlias());
         assertEquals(label + ":default-name", defaultName, v.getDefaultName());
-        assertEquals(label + ":parse", v, parser(v).parse_FieldDef());
         basicTest(label, FieldDef.class, v, o, matches);
     }
 
@@ -104,7 +96,6 @@
         assertEquals(label + ":order", order, v.getOrder());
         assertEquals(label + ":nulls", nulls, v.getNulls());
         assertEquals(label + ":value", value, v.getValue());
-        assertEquals(label + ":parse", v, parser(v).parse_OrderByItem());
         basicTest(label, OrderByItem.class, v, o, matches);
     }
 
diff --git a/framework/webapp/lib/json-lib-2.2.3-jdk15.jar b/framework/webapp/lib/json-lib-2.2.3-jdk15.jar
deleted file mode 100644
index 8c92fab..0000000
--- a/framework/webapp/lib/json-lib-2.2.3-jdk15.jar
+++ /dev/null
Binary files differ
diff --git a/framework/webapp/src/org/ofbiz/webapp/event/JSONRequestBodyMapHandler.java b/framework/webapp/src/org/ofbiz/webapp/event/JSONRequestBodyMapHandler.java
new file mode 100644
index 0000000..f2318ec
--- /dev/null
+++ b/framework/webapp/src/org/ofbiz/webapp/event/JSONRequestBodyMapHandler.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.ofbiz.webapp.event;
+
+import org.ofbiz.base.lang.JSON;
+import org.ofbiz.base.util.UtilGenerics;
+
+import javax.servlet.ServletRequest;
+import java.io.IOException;
+import java.util.Map;
+
+/** An implementation of <code>RequestBodyMapHandler</code> that can extract a <code>Map<String, Object></code> from the JSON data in the request body */
+public class JSONRequestBodyMapHandler implements RequestBodyMapHandler {
+
+    public Map<String, Object> extractMapFromRequestBody(ServletRequest request) throws IOException {
+        return UtilGenerics.<Map<String, Object>>cast(JSON.from(request.getInputStream()).toObject(Map.class));
+    }
+}
diff --git a/framework/webapp/src/org/ofbiz/webapp/event/RequestBodyMapHandler.java b/framework/webapp/src/org/ofbiz/webapp/event/RequestBodyMapHandler.java
new file mode 100644
index 0000000..cc5cfce
--- /dev/null
+++ b/framework/webapp/src/org/ofbiz/webapp/event/RequestBodyMapHandler.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.ofbiz.webapp.event;
+
+import javax.servlet.ServletRequest;
+import java.io.IOException;
+import java.util.Map;
+
+/** An handler that can extract a Map (typically used as a service input map) from the data in the body of a <code>ServletRequest</code>. */
+public interface RequestBodyMapHandler {
+    /** Extracts from the data in the body of the <code>ServletRequest</code> an instance of <code>Map<String, Object></code>.
+     *
+     * @param request the request with the data in its body
+     * @return an instance of <code>Map<String, Object></code> that represents the data in the request body
+     */
+    public Map<String, Object> extractMapFromRequestBody(ServletRequest request) throws IOException;
+}
diff --git a/framework/webapp/src/org/ofbiz/webapp/event/RequestBodyMapHandlerFactory.java b/framework/webapp/src/org/ofbiz/webapp/event/RequestBodyMapHandlerFactory.java
new file mode 100644
index 0000000..819c081
--- /dev/null
+++ b/framework/webapp/src/org/ofbiz/webapp/event/RequestBodyMapHandlerFactory.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.webapp.event;
+
+import javax.servlet.ServletRequest;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Factory class that provides the proper <code>RequestBodyMapHandler</code> based on the content type of the <code>ServletRequest</code> */
+public class RequestBodyMapHandlerFactory {
+    private final static Map<String, RequestBodyMapHandler> requestBodyMapHandlers = new HashMap<String, RequestBodyMapHandler>();
+    static {
+        requestBodyMapHandlers.put("application/json", new JSONRequestBodyMapHandler());
+    }
+
+    public static RequestBodyMapHandler getRequestBodyMapHandler(ServletRequest request) {
+        return requestBodyMapHandlers.get(request.getContentType());
+    }
+
+    public static Map<String, Object> extractMapFromRequestBody(ServletRequest request) throws IOException {
+        Map<String, Object> outputMap = null;
+        RequestBodyMapHandler handler = getRequestBodyMapHandler(request);
+        if (handler != null) {
+            outputMap = handler.extractMapFromRequestBody(request);
+        }
+        return outputMap;
+    }
+}
diff --git a/framework/webapp/src/org/ofbiz/webapp/event/ServiceEventHandler.java b/framework/webapp/src/org/ofbiz/webapp/event/ServiceEventHandler.java
index b2143d3..5ca27d9 100644
--- a/framework/webapp/src/org/ofbiz/webapp/event/ServiceEventHandler.java
+++ b/framework/webapp/src/org/ofbiz/webapp/event/ServiceEventHandler.java
@@ -21,7 +21,9 @@
 import static org.ofbiz.base.util.UtilGenerics.checkList;
 
 import java.io.File;
+import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -233,6 +235,15 @@
 
         Map<String, Object> rawParametersMap = UtilHttp.getParameterMap(request, null, null);
         Set<String> urlOnlyParameterNames = UtilHttp.getUrlOnlyParameterMap(request).keySet();
+        Map<String, Object> requestBodyMap = null;
+        try {
+            requestBodyMap = RequestBodyMapHandlerFactory.extractMapFromRequestBody(request);
+        } catch (IOException ioe) {
+            Debug.logWarning(ioe, module);
+        }
+        if (requestBodyMap != null) {
+            rawParametersMap.putAll(requestBodyMap);
+        }
 
         // we have a service and the model; build the context
         Map<String, Object> serviceContext = FastMap.newInstance();
diff --git a/lib/build/javacc/javacc.jar b/lib/build/javacc/javacc.jar
deleted file mode 100644
index 2550727..0000000
--- a/lib/build/javacc/javacc.jar
+++ /dev/null
Binary files differ
diff --git a/macros.xml b/macros.xml
index bd7c50e..ab2dfe3 100644
--- a/macros.xml
+++ b/macros.xml
@@ -186,32 +186,6 @@
         <pathelement location="${ofbiz.home.dir}/framework/base/lib/ant/ant-contrib-1.0b3.jar"/>
     </classpath>
   </taskdef>
- <macrodef name="ofbiz-javacc">
-  <attribute name="dir"/>
-  <attribute name="file"/>
-  <attribute name="prefix" default=""/>
-  <sequential>
-   <if>
-     <not>
-      <uptodate
-       srcfile="@{prefix}src/@{dir}/@{file}.jj"
-       targetfile="@{prefix}build/gen-src/javacc/@{dir}/@{file}.java"/>
-     </not>
-     <then>
-       <delete dir="@{prefix}build/gen-src/javacc/@{dir}"/>
-       <mkdir dir="@{prefix}build/gen-src/javacc/@{dir}"/>
-       <javacc target="@{prefix}src/@{dir}/@{file}.jj"
-          javacchome="${ofbiz.home.dir}/lib/build/javacc"
-          outputdirectory="@{prefix}build/gen-src/javacc/@{dir}"/>
-       <replace token="public class" 
-           value='@SuppressWarnings("all") public class' 
-           dir="@{prefix}build/gen-src/javacc/@{dir}"
-           includes="*.java" />
-       <delete dir="@{prefix}build/classes/@{dir}"/>
-     </then>
-   </if>
-  </sequential>
- </macrodef>
 
  <presetdef name="externalsubant">
   <subant inheritall="false">
diff --git a/specialpurpose/ebaystore/src/org/ofbiz/ebaystore/EbayStoreOptions.java b/specialpurpose/ebaystore/src/org/ofbiz/ebaystore/EbayStoreOptions.java
index 21a6839..5f1c909 100644
--- a/specialpurpose/ebaystore/src/org/ofbiz/ebaystore/EbayStoreOptions.java
+++ b/specialpurpose/ebaystore/src/org/ofbiz/ebaystore/EbayStoreOptions.java
@@ -18,10 +18,6 @@
  */
 package org.ofbiz.ebaystore;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -32,7 +28,6 @@
 
 import javolution.util.FastList;
 import javolution.util.FastMap;
-import net.sf.json.JSONObject;
 
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilHttp;
@@ -116,7 +111,7 @@
                                     storeColorSchemeMap.put("storeFontTypeDescColor",storeFontType.getDescColor());
                                     storeColorSchemeMap.put("storeFontTypeFontDescValue",storeFontType.getDescFace().value());
                                     storeColorSchemeMap.put("storeDescSizeValue",storeFontType.getDescSize().value());
-                                    toJsonObject(storeColorSchemeMap,response);
+                                    request.setAttribute("storeColorSchemeMap", storeColorSchemeMap);
 
                                     break;
                                 }
@@ -137,63 +132,31 @@
         } catch (SdkException e) {
             e.printStackTrace();
             return "error";
-        } catch (EventHandlerException e) {
-            e.printStackTrace();
-            return "error";
         }
         return "success";
     }
 
-    public static void toJsonObject(Map<String,Object> attrMap, HttpServletResponse response) throws EventHandlerException {
-        JSONObject json = JSONObject.fromObject(attrMap);
-        String jsonStr = json.toString();
-        if (jsonStr == null) {
-            throw new EventHandlerException("JSON Object was empty; fatal error!");
-        }
-        // set the X-JSON content type
-        response.setContentType("application/json");
-        // jsonStr.length is not reliable for unicode characters
-        try {
-            response.setContentLength(jsonStr.getBytes("UTF8").length);
-        } catch (UnsupportedEncodingException e) {
-            throw new EventHandlerException("Problems with Json encoding", e);
-        }
-        // return the JSON String
-        Writer out;
-        try {
-            out = response.getWriter();
-            out.write(jsonStr);
-            out.flush();
-        } catch (IOException e) {
-            throw new EventHandlerException("Unable to get response writer", e);
-        }
-    }
-
     public static String retrieveItemTemplateByTemplateGroupId(HttpServletRequest request,HttpServletResponse response) {
         Map<String, Object> paramMap = UtilHttp.getCombinedMap(request);
-        try {
-            if (paramMap.get("productStoreId") != null) {
-                String temGroupId = (String)paramMap.get("templateGroupId");
-                Map<String,Object> addItemObj = EbayEvents.getAddItemListingObject(request, EbayEvents.getApiContext(request));
-                if (UtilValidate.isNotEmpty(addItemObj)) {
-                    String refName = "itemCateFacade_".concat((String) paramMap.get("pkCategoryId"));
-                    if (UtilValidate.isNotEmpty(addItemObj.get(refName))) {
-                        EbayStoreCategoryFacade cf = (EbayStoreCategoryFacade) addItemObj.get(refName);
-                        List<Map<String,Object>> theme = cf.getAdItemTemplates(temGroupId);
-                        if (theme.size() > 0) {
-                            toJsonObjectList(theme,response);
-                        }
+        if (paramMap.get("productStoreId") != null) {
+            String temGroupId = (String)paramMap.get("templateGroupId");
+            Map<String,Object> addItemObj = EbayEvents.getAddItemListingObject(request, EbayEvents.getApiContext(request));
+            if (UtilValidate.isNotEmpty(addItemObj)) {
+                String refName = "itemCateFacade_".concat((String) paramMap.get("pkCategoryId"));
+                if (UtilValidate.isNotEmpty(addItemObj.get(refName))) {
+                    EbayStoreCategoryFacade cf = (EbayStoreCategoryFacade) addItemObj.get(refName);
+                    List<Map<String,Object>> theme = cf.getAdItemTemplates(temGroupId);
+                    if (theme.size() > 0) {
+                        request.setAttribute("itemTemplates", theme);
                     }
                 }
             }
-        } catch (EventHandlerException e) {
-            Debug.logError(e.getMessage(), module);
         }
         return "success";
     }
 
     public static String retrieveEbayCategoryByParent(HttpServletRequest request, HttpServletResponse response) {
-        List<CategoryType> results = FastList.newInstance();
+        List<CategoryType> results;
         try {
             Map<String, Object> paramMap = UtilHttp.getCombinedMap(request);
             if (paramMap.get("productStoreId") != null) {
@@ -225,7 +188,7 @@
                         categories.add(context);
                     }
                     if (categories.size() > 0) {
-                        toJsonObjectList(categories,response);
+                        request.setAttribute("categories", categories);
                     }
                 }
             }
@@ -243,43 +206,8 @@
         return "success";
     }
 
-    public static void toJsonObjectList(List<Map<String,Object>> list, HttpServletResponse response) throws EventHandlerException {
-        JSONObject json = null;
-        List<JSONObject> jsonList = new ArrayList<JSONObject>();
-        if (list != null) {
-            for (Map<String,Object> val : list) {
-                json = new JSONObject();
-                for (String rowKey: val.keySet()) {
-                    json.put(rowKey, val.get(rowKey));
-                }
-                jsonList.add(json);
-            }
-            String jsonStr = jsonList.toString();
-            if (jsonStr == null) {
-                throw new EventHandlerException("JSON Object was empty; fatal error!");
-            }
-            // set the X-JSON content type
-            response.setContentType("application/json");
-            // jsonStr.length is not reliable for unicode characters
-            try {
-                response.setContentLength(jsonStr.getBytes("UTF8").length);
-            } catch (UnsupportedEncodingException e) {
-                throw new EventHandlerException("Problems with Json encoding", e);
-            }
-            // return the JSON String
-            Writer out;
-            try {
-                out = response.getWriter();
-                out.write(jsonStr);
-                out.flush();
-            } catch (IOException e) {
-                throw new EventHandlerException("Unable to get response writer", e);
-            } 
-        }
-    }
-    
     public static String retrieveEbayStoreCategoryByParent(HttpServletRequest request, HttpServletResponse response) {
-        List<StoreCustomCategoryType> results = FastList.newInstance();
+        List<StoreCustomCategoryType> results;
         try {
             Map<String, Object> paramMap = UtilHttp.getCombinedMap(request);
             if (paramMap.get("productStoreId") != null) {
@@ -312,12 +240,11 @@
                         } else {
                             isLeaf = "false";
                         }
-                        //String isLeaf = String.valueOf(category.getChildCategory().!= null ? "true" : "false");
                         context.put("IsLeafCategory", isLeaf);
                         categories.add(context);
                     }
                     if (categories.size() > 0) {
-                        toJsonObjectList(categories,response);
+                        request.setAttribute("categories", categories);
                     }
                 }
             }
diff --git a/specialpurpose/ebaystore/webapp/ebaystore/WEB-INF/controller.xml b/specialpurpose/ebaystore/webapp/ebaystore/WEB-INF/controller.xml
index 128cf0b..0c1ecce 100644
--- a/specialpurpose/ebaystore/webapp/ebaystore/WEB-INF/controller.xml
+++ b/specialpurpose/ebaystore/webapp/ebaystore/WEB-INF/controller.xml
@@ -92,8 +92,8 @@
     <request-map uri="retrieveThemeColorSchemeByThemeId">
         <security https="true" auth="true"/>
         <event type="java" path="org.ofbiz.ebaystore.EbayStoreOptions" invoke="retrieveThemeColorSchemeByThemeId"/>
-        <response name="success" type="view" value="ebayStoreDetail"/>
-        <response name="error" type="view" value="ebayStoreDetail"/>
+        <response name="success" type="request" value="json"/>
+        <response name="error" type="request" value="json"/>
     </request-map>
     <!-- Feedback -->
     <request-map uri="Feedback">
@@ -290,6 +290,7 @@
         <security https="true" auth="true"/>
         <event type="java" path="org.ofbiz.ebaystore.EbayStoreOptions" invoke="retrieveEbayCategoryByParent"/>
         <response name="success" type="request" value="json"/>
+        <response name="error" type="request" value="json"/>
     </request-map>
     <request-map uri="retrieveEbayStoreCategoryByParent">
         <security https="true" auth="true"/>
@@ -305,7 +306,8 @@
     <request-map uri="ebayAdItemTemplate">
         <security https="true" auth="true"/>
         <event type="java" path="org.ofbiz.ebaystore.EbayStoreOptions" invoke="retrieveItemTemplateByTemplateGroupId"/>
-        <response name="success" type="view" value="main"/>
+        <response name="success" type="request" value="json"/>
+        <response name="error" type="request" value="json"/>
     </request-map>
     <request-map uri="updateProductExportDetail">
         <security https="true" auth="true"/>
diff --git a/specialpurpose/ebaystore/webapp/ebaystore/store/StoreSetting.ftl b/specialpurpose/ebaystore/webapp/ebaystore/store/StoreSetting.ftl
index 2f66fe1..389c657 100644
--- a/specialpurpose/ebaystore/webapp/ebaystore/store/StoreSetting.ftl
+++ b/specialpurpose/ebaystore/webapp/ebaystore/store/StoreSetting.ftl
@@ -34,8 +34,8 @@
          data: pars,
          beforeStart: function() {document.getElementById('loading').innerHTML = ' ${uiLabelMap.CommonPleaseWait}';},
              success: function(data) {
-                if (data != null){
-                    var resp = eval("("+data+")");
+                if (data != null && data.storeColorSchemeMap){
+                    var resp = eval("("+data.storeColorSchemeMap+")");
                     if (resp.storeColorPrimary!=null) document.getElementById('storePrimaryColor').value =  resp.storeColorPrimary;
                     if (resp.storeColorAccent!=null) document.getElementById('storeSecondaryColor').value = resp.storeColorAccent;
                     if (resp.storeColorSecondary!=null) document.getElementById('storeAccentColor').value = resp.storeColorSecondary;
diff --git a/specialpurpose/ebaystore/webapp/ebaystore/store/productsearchExport.ftl b/specialpurpose/ebaystore/webapp/ebaystore/store/productsearchExport.ftl
index 28f1fce..1c456f1 100644
--- a/specialpurpose/ebaystore/webapp/ebaystore/store/productsearchExport.ftl
+++ b/specialpurpose/ebaystore/webapp/ebaystore/store/productsearchExport.ftl
@@ -81,9 +81,9 @@
             },
             success: function(data) {
                 document.getElementById('loading').innerHTML = '';
-                if (data) {
+                if (data && data.categories) {
                     removeOptions(id);
-                    var resp = eval(data);
+                    var resp = eval(data.categories);
                     var leng = resp.length;
                      if (leng) {
                         for (i=0;i<leng;i++) {
@@ -112,8 +112,8 @@
             success: function(data){
                 removeOptions('theme');
                 previewPic(":http://pics.ebay.com/aw/pics/vit/None2_sample_100x120.gif");
-                if(data!=null){
-                    var resp = eval(data);
+                if(data!=null && data.itemTemplates!=null){
+                    var resp = eval(data.itemTemplates);
                     var leng = resp.length;
                     var j = 0;
                     for (i=0;i<leng;i++) {
