Index: applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java
===================================================================
--- applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java	(revision 532965)
+++ applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java	(working copy)
@@ -104,7 +104,7 @@
     private static int decimals = UtilNumber.getBigDecimalScale("invoice.decimals");
     private static int rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding");
     private static int taxDecimals = UtilNumber.getBigDecimalScale("salestax.calc.decimals");
-    private static int taxRounding = UtilNumber.getBigDecimalScale("salestax.rounding");
+    private static int taxRounding = UtilNumber.getBigDecimalRoundingMode("salestax.rounding");
     public static final int taxCalcScale = UtilNumber.getBigDecimalScale("salestax.calc.decimals");
     private static final int INVOICE_ITEM_SEQUENCE_ID_DIGITS = 5; // this is the number of digits used for invoiceItemSeqId: 00001, 00002...
 
@@ -510,7 +510,12 @@
                             // set decimals = 100 means we don't round this intermediate value, which is very important
                             amount = adj.getBigDecimal("amount").divide(originalOrderItem.getBigDecimal("quantity"), 100, rounding);
                             amount = amount.multiply(billingQuantity);
-                            amount = amount.setScale(decimals, rounding);
+                            // Tax needs to be rounded differently from other order adjustments
+                            if (adj.getString("orderAdjustmentTypeId").equals("SALES_TAX")) {
+                                amount = amount.setScale(taxDecimals, taxRounding);
+                            } else {
+                                amount = amount.setScale(decimals, rounding);
+                            }
                         }
                         else if (adj.get("sourcePercentage") != null) { 
                             // pro-rate the amount
@@ -566,7 +571,7 @@
                             }
 
                             // this adjustment amount
-                            BigDecimal thisAdjAmount = new BigDecimal(amount.doubleValue()).setScale(decimals, rounding);
+                            BigDecimal thisAdjAmount = new BigDecimal(amount.doubleValue());
     
                             // adjustments only apply to totals when they are not tax or shipping adjustments
                             if (!"SALES_TAX".equals(adj.getString("orderAdjustmentTypeId")) &&
Index: applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceWorker.java
===================================================================
--- applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceWorker.java	(revision 532965)
+++ applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceWorker.java	(working copy)
@@ -45,6 +45,8 @@
     private static BigDecimal ZERO = new BigDecimal("0");
     private static int decimals = UtilNumber.getBigDecimalScale("invoice.decimals");
     private static int rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding");
+    private static int taxDecimals = UtilNumber.getBigDecimalScale("salestax.calc.decimals");
+    private static int taxRounding = UtilNumber.getBigDecimalRoundingMode("salestax.rounding");
 
     /**
      * Method to return the total amount of an invoice
@@ -134,6 +136,7 @@
         
         public static BigDecimal getInvoiceTotalBd(GenericValue invoice) {
         BigDecimal invoiceTotal = ZERO;
+        BigDecimal invoiceTaxTotal = ZERO;
         List invoiceItems = null;
         try {
             invoiceItems = invoice.getRelated("InvoiceItem");
@@ -150,10 +153,14 @@
                     amount = ZERO;
                 if (quantity == null)
                     quantity = new BigDecimal("1");
-                invoiceTotal = invoiceTotal.add( amount.multiply(quantity)).setScale(decimals,rounding);
+                if ("ITM_SALES_TAX".equals(invoiceItem.get("invoiceItemTypeId"))) {
+                    invoiceTaxTotal = invoiceTaxTotal.add( amount.multiply(quantity)).setScale(taxDecimals, taxRounding);
+                } else {
+                    invoiceTotal = invoiceTotal.add( amount.multiply(quantity)).setScale(decimals,rounding);
+                }
             }
         }
-        return invoiceTotal;        
+        return invoiceTotal.add(invoiceTaxTotal).setScale(decimals, rounding);
     }
 
     /**
Index: applications/accounting/entitydef/entitymodel.xml
===================================================================
--- applications/accounting/entitydef/entitymodel.xml	(revision 532965)
+++ applications/accounting/entitydef/entitymodel.xml	(working copy)
@@ -1031,7 +1031,7 @@
       <field name="uomId" type="id"></field>
       <field name="taxableFlag" type="indicator"></field>
       <field name="quantity" type="floating-point"></field>
-      <field name="amount" type="currency-amount"></field>
+      <field name="amount" type="currency-precise"></field>
       <field name="description" type="description"></field>
       <field name="taxAuthPartyId" type="id-ne"/>
       <field name="taxAuthGeoId" type="id-ne"/>
Index: applications/order/src/org/ofbiz/order/order/OrderReadHelper.java
===================================================================
--- applications/order/src/org/ofbiz/order/order/OrderReadHelper.java	(revision 532965)
+++ applications/order/src/org/ofbiz/order/order/OrderReadHelper.java	(working copy)
@@ -2612,7 +2612,7 @@
         Iterator itemIter = UtilMisc.toIterator(orderItems);
 
         while (itemIter != null && itemIter.hasNext()) {
-            result = result.add(getOrderItemTotalBd((GenericValue) itemIter.next(), adjustments)).setScale(scale, rounding);
+            result = result.add(getOrderItemTotalBd((GenericValue) itemIter.next(), adjustments));
         }
         return result.setScale(scale,  rounding);
     }
@@ -2624,7 +2624,7 @@
 
     public static BigDecimal getOrderItemTotalBd(GenericValue orderItem, List adjustments) {
         // add tax and shipping to subtotal
-        return getOrderItemSubTotalBd(orderItem, adjustments).add(getOrderItemAdjustmentsTotalBd(orderItem, adjustments, false, true, true)).setScale(scale, rounding);
+        return getOrderItemSubTotalBd(orderItem, adjustments).add(getOrderItemAdjustmentsTotalBd(orderItem, adjustments, false, true, true));
     }
 
     /** @deprecated */
@@ -2675,7 +2675,7 @@
         Iterator itemIter = UtilMisc.toIterator(orderItems);
 
         while (itemIter != null && itemIter.hasNext()) {
-            result = result.add(getOrderItemAdjustmentsTotalBd((GenericValue) itemIter.next(), adjustments, includeOther, includeTax, includeShipping)).setScale(scale, rounding);
+            result = result.add(getOrderItemAdjustmentsTotalBd((GenericValue) itemIter.next(), adjustments, includeOther, includeTax, includeShipping));
         }
         return result;
     }
@@ -2728,7 +2728,7 @@
             while (adjIt.hasNext()) {
                 GenericValue orderAdjustment = (GenericValue) adjIt.next();
 
-                adjTotal = adjTotal.add(OrderReadHelper.calcItemAdjustmentBd(orderAdjustment, quantity, unitPrice)).setScale(scale, rounding);
+                adjTotal = adjTotal.add(OrderReadHelper.calcItemAdjustmentBd(orderAdjustment, quantity, unitPrice));
             }
         }
         return adjTotal;
@@ -2773,7 +2773,7 @@
             adjustment = adjustment.add(setScaleByType("SALES_TAX".equals(itemAdjustment.get("orderAdjustmentTypeId")), itemAdjustment.getBigDecimal("sourcePercentage").multiply(quantity).multiply(unitPrice).multiply(percentage)));
         }
         if (Debug.verboseOn()) Debug.logVerbose("calcItemAdjustment: " + itemAdjustment + ", quantity=" + quantity + ", unitPrice=" + unitPrice + ", adjustment=" + adjustment, module);
-        return adjustment.setScale(scale, rounding);
+        return adjustment;
     }
 
     public static BigDecimal calcItemAdjustmentRecurringBd(GenericValue itemAdjustment, BigDecimal quantity, BigDecimal unitPrice) {
Index: applications/order/webapp/ordermgr/entry/order/orderitems.ftl
===================================================================
--- applications/order/webapp/ordermgr/entry/order/orderitems.ftl	(revision 532965)
+++ applications/order/webapp/ordermgr/entry/order/orderitems.ftl	(working copy)
@@ -115,7 +115,7 @@
                 <td>&nbsp;</td>
                 <td>&nbsp;</td>
                 <td align="right">
-                  <div class="tabletext" style="font-size: xx-small;"><@ofbizCurrency amount=localOrderReadHelper.getOrderItemAdjustmentTotal(orderItem, orderItemAdjustment) isoCode=currencyUomId/></div>
+                  <div class="tabletext" style="font-size: xx-small;"><@ofbizCurrency amount=localOrderReadHelper.getOrderItemAdjustmentTotal(orderItem, orderItemAdjustment) isoCode=currencyUomId maxDecimals=10/></div>
                 </td>
                 <td>&nbsp;</td>
                 <td>&nbsp;</td>
@@ -130,28 +130,28 @@
           <tr><td colspan="8"><hr class="sepbar"/></td></tr>
           <tr>
             <td align="right" colspan="4"><div class="tabletext"><b>${uiLabelMap.OrderSubTotal}</b></div></td>
-            <td align="right" nowrap><div class="tabletext">&nbsp;<#if orderSubTotal?exists><@ofbizCurrency amount=orderSubTotal isoCode=currencyUomId/></#if></div></td>
+            <td align="right" nowrap><div class="tabletext">&nbsp;<#if orderSubTotal?exists><@ofbizCurrency amount=orderSubTotal isoCode=currencyUomId maxDecimals=10/></#if></div></td>
           </tr>              
           <#list headerAdjustmentsToShow?if_exists as orderHeaderAdjustment>
             <tr>
               <td align="right" colspan="4"><div class="tabletext"><b>${localOrderReadHelper.getAdjustmentType(orderHeaderAdjustment)}</b></div></td>
-              <td align="right" nowrap><div class="tabletext"><@ofbizCurrency amount=localOrderReadHelper.getOrderAdjustmentTotal(orderHeaderAdjustment) isoCode=currencyUomId/></div></td>
+              <td align="right" nowrap><div class="tabletext"><@ofbizCurrency amount=localOrderReadHelper.getOrderAdjustmentTotal(orderHeaderAdjustment) isoCode=currencyUomId maxDecimals=10/></div></td>
             </tr>
           </#list>                 
           <tr>
             <td align="right" colspan="4"><div class="tabletext"><b>${uiLabelMap.FacilityShippingAndHandling}</b></div></td>
-            <td align="right" nowrap><div class="tabletext"><#if orderShippingTotal?exists><@ofbizCurrency amount=orderShippingTotal isoCode=currencyUomId/></#if></div></td>
+            <td align="right" nowrap><div class="tabletext"><#if orderShippingTotal?exists><@ofbizCurrency amount=orderShippingTotal isoCode=currencyUomId maxDecimals=10/></#if></div></td>
           </tr>              
           <tr>
             <td align="right" colspan="4"><div class="tabletext"><b>${uiLabelMap.OrderSalesTax}</b></div></td>
-            <td align="right" nowrap><div class="tabletext"><#if orderTaxTotal?exists><@ofbizCurrency amount=orderTaxTotal isoCode=currencyUomId/></#if></div></td>
+            <td align="right" nowrap><div class="tabletext"><#if orderTaxTotal?exists><@ofbizCurrency amount=orderTaxTotal isoCode=currencyUomId maxDecimals=10/></#if></div></td>
           </tr>
           
           <tr><td colspan=2></td><td colspan="8"><hr class="sepbar"/></td></tr>
           <tr>
             <td align="right" colspan="4"><div class="tabletext"><b>${uiLabelMap.OrderGrandTotal}</b></div></td>
             <td align="right" nowrap>
-              <div class="tabletext"><#if orderGrandTotal?exists><@ofbizCurrency amount=orderGrandTotal isoCode=currencyUomId/></#if></div>
+              <div class="tabletext"><#if orderGrandTotal?exists><@ofbizCurrency amount=orderGrandTotal isoCode=currencyUomId maxDecimals=10/></#if></div>
             </td>
           </tr>
         </table>
Index: framework/widget/src/org/ofbiz/widget/form/ModelFormField.java
===================================================================
--- framework/widget/src/org/ofbiz/widget/form/ModelFormField.java	(revision 532965)
+++ framework/widget/src/org/ofbiz/widget/form/ModelFormField.java	(working copy)
@@ -1742,7 +1742,7 @@
                 }
                 try {
                     Double parsedRetVal = (Double) ObjectType.simpleTypeConvert(retVal, "Double", null, locale, false);
-                    retVal = UtilFormatOut.formatCurrency(parsedRetVal, isoCode, locale);
+                    retVal = UtilFormatOut.formatCurrency(parsedRetVal, isoCode, locale, 10);
                 } catch (GeneralException e) {
                     String errMsg = "Error formatting currency value [" + retVal + "]: " + e.toString();
                     Debug.logError(e, errMsg, module);
Index: framework/webapp/src/org/ofbiz/webapp/ftl/OfbizCurrencyTransform.java
===================================================================
--- framework/webapp/src/org/ofbiz/webapp/ftl/OfbizCurrencyTransform.java	(revision 532965)
+++ framework/webapp/src/org/ofbiz/webapp/ftl/OfbizCurrencyTransform.java	(working copy)
@@ -36,6 +36,7 @@
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilFormatOut;
 import org.ofbiz.base.util.UtilHttp;
+import org.ofbiz.base.util.UtilValidate;
 
 /**
  * OfbizCurrencyTransform - Freemarker Transform for content links
@@ -96,6 +97,12 @@
         final Double amount = OfbizCurrencyTransform.getAmount(args, "amount");
         final String isoCode = OfbizCurrencyTransform.getArg(args, "isoCode");
         final String locale = OfbizCurrencyTransform.getArg(args, "locale");
+        String maxDecimalsStr = OfbizCurrencyTransform.getArg(args, "maxDecimals");
+        int maxDecimalsTemp = -1;
+        if (UtilValidate.isNotEmpty(maxDecimalsStr) && UtilValidate.isInteger(maxDecimalsStr)){
+            maxDecimalsTemp = new Integer(maxDecimalsStr).intValue();
+        }
+        final int maxDecimals = maxDecimalsTemp;
 
         return new Writer(out) {
             public void write(char cbuf[], int off, int len) {
@@ -115,9 +122,9 @@
                         BeanModel req = (BeanModel) env.getVariable("request");
                         if (req != null) {
                             HttpServletRequest request = (HttpServletRequest) req.getWrappedObject();
-                            out.write(UtilFormatOut.formatCurrency(amount, isoCode, UtilHttp.getLocale(request)));
+                            out.write(UtilFormatOut.formatCurrency(amount, isoCode, UtilHttp.getLocale(request), maxDecimals));
                         } else {
-                            out.write(UtilFormatOut.formatCurrency(amount, isoCode, env.getLocale()));
+                            out.write(UtilFormatOut.formatCurrency(amount, isoCode, env.getLocale(), maxDecimals));
                         }
                     } else {
                         out.write(UtilFormatOut.formatCurrency(amount.doubleValue(), isoCode, new Locale(locale)));
