diff --git a/samples/SchemaEnum/src/org/apache/xmlbeans/samples/enumeration/SchemaEnum.java b/samples/SchemaEnum/src/org/apache/xmlbeans/samples/enumeration/SchemaEnum.java
index f48104b..50d6f50 100644
--- a/samples/SchemaEnum/src/org/apache/xmlbeans/samples/enumeration/SchemaEnum.java
+++ b/samples/SchemaEnum/src/org/apache/xmlbeans/samples/enumeration/SchemaEnum.java
@@ -163,13 +163,13 @@
         PriceSummaryDocument.PriceSummary summary = summaryDoc.getPriceSummary();
         PriceType[] priceElements = summary.getPriceArray();
 
-        StringBuffer responseBuffer = new StringBuffer();
+        StringBuilder responseBuffer = new StringBuilder();
 
         // Create string buffers to hold the sorted results of the values
         // retrieved.
-        StringBuffer zeroBuffer = new StringBuffer("\nItems under 10 dollars: \n");
-        StringBuffer tenBuffer = new StringBuffer("\nItems between 10 and 20 dollars: \n");
-        StringBuffer twentyBuffer = new StringBuffer("\nItems more than 20 dollars: \n");
+        StringBuilder zeroBuffer = new StringBuilder("\nItems under 10 dollars: \n");
+        StringBuilder tenBuffer = new StringBuilder("\nItems between 10 and 20 dollars: \n");
+        StringBuilder twentyBuffer = new StringBuilder("\nItems more than 20 dollars: \n");
 
         // Loop through the price elements, extracting the array of <item> child
         // elements in each.
diff --git a/src/common/org/apache/xmlbeans/impl/common/NameUtil.java b/src/common/org/apache/xmlbeans/impl/common/NameUtil.java
index 6d0ff04..85ac33f 100644
--- a/src/common/org/apache/xmlbeans/impl/common/NameUtil.java
+++ b/src/common/org/apache/xmlbeans/impl/common/NameUtil.java
@@ -654,7 +654,7 @@
         if (s.length() == 0 || Character.isUpperCase(s.charAt(0)))
             return s;
 
-        StringBuffer buf = new StringBuffer(s);
+        StringBuilder buf = new StringBuilder(s);
         buf.setCharAt(0, Character.toUpperCase(buf.charAt(0)));
         return buf.toString();
     }
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/regex/REUtil.java b/src/typeimpl/org/apache/xmlbeans/impl/regex/REUtil.java
index 089fe88..80a3dc7 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/regex/REUtil.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/regex/REUtil.java
@@ -101,7 +101,7 @@
     }
 
     static final String createOptionString(int options) {
-        StringBuffer sb = new StringBuffer(9);
+        StringBuilder sb = new StringBuilder(9);
         if ((options & RegularExpression.PROHIBIT_FIXED_STRING_OPTIMIZATION) != 0)
             sb.append((char)'F');
         if ((options & RegularExpression.PROHIBIT_HEAD_CHARACTER_OPTIMIZATION) != 0)
@@ -129,7 +129,7 @@
 
     static String stripExtendedComment(String regex) {
         int len = regex.length();
-        StringBuffer buffer = new StringBuffer(len);
+        StringBuilder buffer = new StringBuilder(len);
         int offset = 0;
         while (offset < len) {
             int ch = regex.charAt(offset++);
@@ -298,12 +298,12 @@
      */
     public static String quoteMeta(String literal) {
         int len = literal.length();
-        StringBuffer buffer = null;
+        StringBuilder buffer = null;
         for (int i = 0;  i < len;  i ++) {
             int ch = literal.charAt(i);
             if (".*+?{[()|\\^$".indexOf(ch) >= 0) {
                 if (buffer == null) {
-                    buffer = new StringBuffer(i+(len-i)*2);
+                    buffer = new StringBuilder(i+(len-i)*2);
                     if (i > 0)  buffer.append(literal.substring(0, i));
                 }
                 buffer.append((char)'\\');
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscChecker.java b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscChecker.java
index ebcf979..caf6ceb 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscChecker.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscChecker.java
@@ -1635,7 +1635,7 @@
     
     private static String printParticles(SchemaParticle[] parts, int start, int end)
     {
-        StringBuffer buf = new StringBuffer(parts.length * 30);
+        StringBuilder buf = new StringBuilder(parts.length * 30);
         for (int i = start; i < end; )
         {
             buf.append(printParticle(parts[i]));
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java
index 7a7299e..ae275d5 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java
@@ -596,7 +596,7 @@
                     // Error! Circular redefinition
                     if (!errorReported)
                     {
-                        StringBuffer fileNameList = new StringBuffer();
+                        StringBuilder fileNameList = new StringBuilder();
                         XmlObject location = null;
                         for (int i = 0; i < n; i++)
                             if (specificRedefines[i] != null)
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java b/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java
index afc6307..e2075be 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java
@@ -194,7 +194,7 @@
         int begin = (value.signum() < 0) ? 1 : 0;
         int delta = scale;
         // We take space for all digits, plus a possible decimal point, plus 'scale'
-        StringBuffer result = new StringBuffer(intStr.length() + 1 + Math.abs(scale));
+        StringBuilder result = new StringBuilder(intStr.length() + 1 + Math.abs(scale));
 
         if (begin == 1)
         {
@@ -765,7 +765,7 @@
         } */
 
         // Per XMLSchema spec allow spaces inside URIs
-        StringBuffer s = new StringBuffer(lexical_value.toString());
+        StringBuilder s = new StringBuilder(lexical_value.toString());
         for (int ic = 0; ic<URI_CHARS_TO_BE_REPLACED.length; ic++)
         {
             int i = 0;
diff --git a/src/xmlpublic/org/apache/xmlbeans/XmlValidationError.java b/src/xmlpublic/org/apache/xmlbeans/XmlValidationError.java
index 74a6776..518f70d 100644
--- a/src/xmlpublic/org/apache/xmlbeans/XmlValidationError.java
+++ b/src/xmlpublic/org/apache/xmlbeans/XmlValidationError.java
@@ -235,7 +235,7 @@
         if (_fieldQName != null)
         {
             String msg = super.getMessage();
-            StringBuffer sb = new StringBuffer(msg.length() + 100);
+            StringBuilder sb = new StringBuilder(msg.length() + 100);
 
             sb.append(msg);
 
diff --git a/test/src/scomp/common/BaseCase.java b/test/src/scomp/common/BaseCase.java
index 161d60f..8430ab0 100644
--- a/test/src/scomp/common/BaseCase.java
+++ b/test/src/scomp/common/BaseCase.java
@@ -59,15 +59,14 @@
                            
            return false;
         }
-        StringBuffer errMessage=
-                new StringBuffer();
+        StringBuilder errMessage = new StringBuilder();
         for (int i = 0; i < errorList.size(); i++) {
             XmlError error = (XmlError) errorList.get(i);
             if ( error.getErrorCode() == null )
               errMessage.append("Kevin needs a code here "+error.getMessage()+"\n");
 
             if (!expected[i].equals(error.getErrorCode())){
-                if (errMessage.length() >0)
+                if (errMessage.length() > 0)
                     System.err.println(errMessage);
                 ArrayList exp=new ArrayList();
 
@@ -80,7 +79,7 @@
 
     public String stringOfCodes(String[] errorCodes, ArrayList actual_errorCodes)
     {
-        StringBuffer res=new StringBuffer();
+        StringBuilder res = new StringBuilder();
         res.append("\n Expected codes:\n");
         int i=0;
         for (;i < errorCodes.length; i++ )
diff --git a/test/src/xmlcursor/checkin/StoreTests.java b/test/src/xmlcursor/checkin/StoreTests.java
index 2480a52..3e074aa 100755
--- a/test/src/xmlcursor/checkin/StoreTests.java
+++ b/test/src/xmlcursor/checkin/StoreTests.java
@@ -315,7 +315,7 @@
             return _sb.toString();
         }
 
-        private StringBuffer _sb = new StringBuffer();
+        private StringBuilder _sb = new StringBuilder();
     }
 
     private void doTestSaxSaver(String xml)
diff --git a/test/src/xmlobject/extensions/interfaceFeature/readOnlyBean/checkin/ReadOnlyTest.java b/test/src/xmlobject/extensions/interfaceFeature/readOnlyBean/checkin/ReadOnlyTest.java
index c223075..c9399e4 100755
--- a/test/src/xmlobject/extensions/interfaceFeature/readOnlyBean/checkin/ReadOnlyTest.java
+++ b/test/src/xmlobject/extensions/interfaceFeature/readOnlyBean/checkin/ReadOnlyTest.java
@@ -15,44 +15,46 @@
 package xmlobject.extensions.interfaceFeature.readOnlyBean.checkin;
 
 
-import interfaceFeature.xbean.readOnlyBean.purchaseOrder.PurchaseOrderDocument ;
+import interfaceFeature.xbean.readOnlyBean.purchaseOrder.PurchaseOrderDocument;
 import interfaceFeature.xbean.readOnlyBean.purchaseOrder.PurchaseOrderType;
 import interfaceFeature.xbean.readOnlyBean.purchaseOrder.Items;
 
 
 import java.math.BigDecimal;
+
 import junit.framework.*;
 
-public class ReadOnlyTest extends TestCase{
+public class ReadOnlyTest extends TestCase {
 
 
-      public  ReadOnlyTest(String s){
-            super(s);
+    public ReadOnlyTest(String s) {
+        super(s);
+    }
+
+    public void test() {
+
+        PurchaseOrderDocument poDoc;
+
+        poDoc = PurchaseOrderDocument.Factory.newInstance();
+        PurchaseOrderType po = poDoc.addNewPurchaseOrder();
+        int LEN = 20;
+
+        Items.Item[] it = new Items.Item[LEN];
+        for (int i = 0; i < LEN; i++) {
+            it[i] = Items.Item.Factory.newInstance();
+            it[i].setUSPrice(new BigDecimal("" + 4));
         }
-    public void test(){
+        Items items = Items.Factory.newInstance();
+        items.setItemArray(it);
+        po.setItems(items);
 
-         PurchaseOrderDocument poDoc ;
-
-         poDoc= PurchaseOrderDocument.Factory.newInstance();
-         PurchaseOrderType po=poDoc.addNewPurchaseOrder();
-         int LEN=20;
-
-         Items.Item[] it= new Items.Item[LEN];
-         for (int i=0; i< LEN; i++){
-                it[i]=Items.Item.Factory.newInstance();
-                it[i].setUSPrice(new BigDecimal(""+ 4 ));
-         }
-         Items items= Items.Factory.newInstance();
-            items.setItemArray(it);
-         po.setItems(items);
-
-         StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder();
         sb.append(
                 "<pur:purchaseOrder xmlns:pur=\"http://xbean.interface_feature/readOnlyBean/PurchaseOrder\">");
 
         sb.append("<pur:items>");
 
-        StringBuffer sbContent = new StringBuffer();
+        StringBuilder sbContent = new StringBuilder();
         for (int i = 0; i < LEN; i++)
             sbContent.append("<pur:item><pur:USPrice>4</pur:USPrice></pur:item>");
 
@@ -63,18 +65,18 @@
                 sbContent.toString() +
                 sb.subSequence(pos, sb.length());
 
-        assertEquals( sExpected, poDoc.xmlText());
+        assertEquals(sExpected, poDoc.xmlText());
 
-        try{
+        try {
             poDoc.setPrice(10);
 
-        }catch (Exception t){
+        } catch (Exception t) {
             t.printStackTrace(System.err);
             System.exit(-1);
         }
 
 
-       assertTrue ( !poDoc.validate() );
+        assertTrue(!poDoc.validate());
     }
-   
+
 }
diff --git a/test/src/xmlobject/extensions/prePostFeature/ValueRestriction/checkin/ValueRestrictionTest.java b/test/src/xmlobject/extensions/prePostFeature/ValueRestriction/checkin/ValueRestrictionTest.java
index c4ab0fe..e84b714 100755
--- a/test/src/xmlobject/extensions/prePostFeature/ValueRestriction/checkin/ValueRestrictionTest.java
+++ b/test/src/xmlobject/extensions/prePostFeature/ValueRestriction/checkin/ValueRestrictionTest.java
@@ -19,53 +19,54 @@
 import org.apache.xmlbeans.XmlString;
 
 
-public class ValueRestrictionTest extends TestCase{
+public class ValueRestrictionTest extends TestCase {
 
-      public  ValueRestrictionTest(String s){
-            super(s);
+    public ValueRestrictionTest(String s) {
+        super(s);
+    }
+
+    public void test() throws Exception {
+
+        CompanyDocument poDoc;
+
+        poDoc = CompanyDocument.Factory.newInstance();
+        CompanyType po = poDoc.addNewCompany();
+
+
+        int LEN = 20;
+
+        StringBuilder sExpected = new StringBuilder();
+        sExpected.append("<com:company xmlns:com=\"http://xbean.prePostFeature/ValueRestriction/company\"><departments>");
+        DepartmentType dept = po.addNewDepartments();
+        ConsultantType[] it = new ConsultantType[LEN];
+        for (int i = 0; i < LEN; i++) {
+            it[i] = dept.addNewConsultant();
+            XmlString s = XmlString.Factory.newInstance();
+            it[i].setAge(50);
+            sExpected.append("<consultant age=\"50\"/>");
         }
-    public void test() throws Exception{
 
-         CompanyDocument poDoc ;
+        sExpected.append("</departments></com:company>");
 
-         poDoc= CompanyDocument.Factory.newInstance();
-         CompanyType po=poDoc.addNewCompany();
+        assertEquals(sExpected.toString(), poDoc.xmlText());
+        assertTrue(poDoc.validate());
 
 
-         int LEN=20;
-
-        StringBuffer sExpected=new StringBuffer();
-         sExpected.append("<com:company xmlns:com=\"http://xbean.prePostFeature/ValueRestriction/company\"><departments>");
-        DepartmentType dept=po.addNewDepartments();
-        ConsultantType[] it= new ConsultantType[LEN];
-         for (int i=0; i < LEN; i++){
-                it[i]=dept.addNewConsultant();
-                XmlString s= XmlString.Factory.newInstance();
-                it[i].setAge(50);
-                 sExpected.append("<consultant age=\"50\"/>");
-         }
-
-       sExpected.append("</departments></com:company>");
-
-        assertEquals( sExpected.toString(), poDoc.xmlText());
-        assertTrue( poDoc.validate() );
+        xmlobject.extensions.prePostFeature.ValueRestriction.existing.SetterHandler.bReady = true;
 
 
-       xmlobject.extensions.prePostFeature.ValueRestriction.existing.SetterHandler.bReady=true;
+        for (int i = 0; i < LEN; i++) {
+            it[i].setAge(150);
+        }
 
+        assertEquals(sExpected.toString(), poDoc.xmlText());
+        assertTrue(poDoc.validate());
 
-         for (int i=0; i< LEN; i++){
-                it[i].setAge(150);
-         }
-
-        assertEquals( sExpected.toString(), poDoc.xmlText());
-        assertTrue( poDoc.validate() );
-
-        for (int i=0; i< LEN; i++){
-                it[i].setEmployeeAge(150);
-         }
-       assertTrue( sExpected.toString().equals(poDoc.xmlText()) );
-       assertTrue ( poDoc.validate() );
+        for (int i = 0; i < LEN; i++) {
+            it[i].setEmployeeAge(150);
+        }
+        assertTrue(sExpected.toString().equals(poDoc.xmlText()));
+        assertTrue(poDoc.validate());
     }
 
 }
diff --git a/test/tools/src/tools/JUnit/SimpleResultFormatter.java b/test/tools/src/tools/JUnit/SimpleResultFormatter.java
index be0be96..36da245 100755
--- a/test/tools/src/tools/JUnit/SimpleResultFormatter.java
+++ b/test/tools/src/tools/JUnit/SimpleResultFormatter.java
@@ -109,7 +109,7 @@
      */
     public void endTestSuite(JUnitTest suite) throws BuildException {
         String newLine = System.getProperty("line.separator");
-        StringBuffer sb = new StringBuffer("Testsuite: ");
+        StringBuilder sb = new StringBuilder("Testsuite: ");
         sb.append(suite.getName());
         sb.append(newLine);
         sb.append("Tests run: ");
diff --git a/test/tools/src/tools/JUnit/XmlResultFormatter.java b/test/tools/src/tools/JUnit/XmlResultFormatter.java
index 3c97e8f..133811a 100755
--- a/test/tools/src/tools/JUnit/XmlResultFormatter.java
+++ b/test/tools/src/tools/JUnit/XmlResultFormatter.java
@@ -316,7 +316,7 @@
             if (index < 0) index = exp.length();
             exo.setErrorname(exp.substring(0, index));
         }
-        StringBuffer output = new StringBuffer();
+        StringBuilder output = new StringBuilder();
         String eol = System.getProperty("line.separator");
         output.append("[STDOUT]").append(eol);
         output.append(rec.getSysout()).append(eol);
diff --git a/test/tools/src/tools/JUnit/XmlResultFormatterImpl.java b/test/tools/src/tools/JUnit/XmlResultFormatterImpl.java
index 88c2185..4d8bf66 100755
--- a/test/tools/src/tools/JUnit/XmlResultFormatterImpl.java
+++ b/test/tools/src/tools/JUnit/XmlResultFormatterImpl.java
@@ -529,7 +529,7 @@
             exo.setErrorname(exp.substring(0, index));
         }
 
-        StringBuffer output = new StringBuffer();
+        StringBuilder output = new StringBuilder();
         String eol = System.getProperty("line.separator");
         output.append("[STDOUT]").append(eol);
         output.append(rec.getSysout()).append(eol);
diff --git a/test/tools/src/tools/util/Util.java b/test/tools/src/tools/util/Util.java
index b5de8af..3b74fc9 100755
--- a/test/tools/src/tools/util/Util.java
+++ b/test/tools/src/tools/util/Util.java
@@ -78,7 +78,7 @@
     {
         try
         {
-            StringBuffer sb = new StringBuffer(_charBuffer.length);
+            StringBuilder sb = new StringBuilder(_charBuffer.length);
             int amount = 0;
 
             while (true)
@@ -736,7 +736,7 @@
             hexStringFromBytes(byte[] bytes)
     {
         String hex = "0123456789abcdef";
-        StringBuffer buf = new StringBuffer(2 * bytes.length);
+        StringBuilder buf = new StringBuilder(2 * bytes.length);
 
         for (int i = 0; i < bytes.length; i++)
         {
@@ -805,7 +805,7 @@
         int lenIn = sIn.length();
         int iIn;
 
-        StringBuffer outBuf = new StringBuffer(lenIn + lenIn / 4);  // Plenty of room for extra characters
+        StringBuilder outBuf = new StringBuilder(lenIn + lenIn / 4);  // Plenty of room for extra characters
         char c;
 
         for (iIn = 0; iIn < lenIn; ++iIn)
@@ -1054,7 +1054,7 @@
         if (map == null)
             return str;
 
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
 
         int pos = 0;
         int open = -1;
@@ -1165,7 +1165,7 @@
     public static String escapeProperty(String s)
     {
         int len = s.length();
-        StringBuffer buf = new StringBuffer(len * 2);
+        StringBuilder buf = new StringBuilder(len * 2);
 
         for (int i = 0; i < len; ++i)
         {
diff --git a/test/tools/src/tools/xml/XmlComparator.java b/test/tools/src/tools/xml/XmlComparator.java
index bed1b23..2a5d1ee 100755
--- a/test/tools/src/tools/xml/XmlComparator.java
+++ b/test/tools/src/tools/xml/XmlComparator.java
@@ -24,24 +24,24 @@
 {
     public static class Diagnostic
     {
-        private StringBuffer message = null;
+        private StringBuilder message = null;
 
         private void add(String s)
         {
-            if (message==null)
-                 message = new StringBuffer();
+            if (message == null)
+                 message = new StringBuilder();
 
             message.append(s).append("\n");
         }
 
         public boolean hasMessage()
         {
-            return message!=null;
+            return message != null;
         }
 
         public String toString()
         {
-            return (message==null ? null : message.toString());
+            return (message == null ? null : message.toString());
         }
 
         public static void add(Diagnostic diag, String s)
