diff --git a/src/common/org/apache/xmlbeans/impl/common/NameUtil.java b/src/common/org/apache/xmlbeans/impl/common/NameUtil.java
index 71d5ff6..6d0ff04 100644
--- a/src/common/org/apache/xmlbeans/impl/common/NameUtil.java
+++ b/src/common/org/apache/xmlbeans/impl/common/NameUtil.java
@@ -411,7 +411,7 @@
 
     private static String jls77String(String name)
     {
-        StringBuffer buf = new StringBuffer(name);
+        StringBuilder buf = new StringBuilder(name);
         for (int i = 0; i < name.length(); i++)
         {
             // We need to also make sure that our package names don't contain the
diff --git a/src/common/org/apache/xmlbeans/impl/common/XMLNameHelper.java b/src/common/org/apache/xmlbeans/impl/common/XMLNameHelper.java
index 505c76c..eceeec7 100644
--- a/src/common/org/apache/xmlbeans/impl/common/XMLNameHelper.java
+++ b/src/common/org/apache/xmlbeans/impl/common/XMLNameHelper.java
@@ -76,7 +76,7 @@
 
     public static String hexsafe(String s)
     {
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         for (int i = 0; i < s.length(); i++)
         {
             char ch = s.charAt(i);
diff --git a/src/store/org/apache/xmlbeans/impl/store/Path.java b/src/store/org/apache/xmlbeans/impl/store/Path.java
index 099ad7a..53863f5 100755
--- a/src/store/org/apache/xmlbeans/impl/store/Path.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Path.java
@@ -202,7 +202,7 @@
         }
         if (path == null)
         {
-            StringBuffer errMessage = new StringBuffer();
+            StringBuilder errMessage = new StringBuilder();
             if ((force & USE_XBEAN) != 0)
                 errMessage.append(" Trying XBeans path engine...");
             if ((force & USE_XQRL) != 0)
diff --git a/src/tools/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java b/src/tools/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java
index 48c7422..facf329 100644
--- a/src/tools/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java
+++ b/src/tools/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java
@@ -48,7 +48,7 @@
             XmlCursor xc = instance.newCursor();
             // xc on start doc
 
-            StringBuffer comment = new StringBuffer();
+            StringBuilder comment = new StringBuilder();
 
             while( !xc.isStart() )
             {
@@ -96,8 +96,8 @@
         Type elemType = Type.createUnnamedType(Type.SIMPLE_TYPE_SIMPLE_CONTENT); //assume simple, set later
         element.setType(elemType);
 
-        StringBuffer textBuff = new StringBuffer();
-        StringBuffer commentBuff = new StringBuffer();
+        StringBuilder textBuff = new StringBuilder();
+        StringBuilder commentBuff = new StringBuilder();
         List children = new ArrayList();
         List attributes = new ArrayList();
 
diff --git a/src/tools/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java b/src/tools/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java
index 708b4cf..f7be6ae 100644
--- a/src/tools/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java
+++ b/src/tools/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java
@@ -510,7 +510,7 @@
             fractionDigits = xmlD.getBigDecimalValue().intValue();
             if (fractionDigits > 0)
             {
-                StringBuffer sb = new StringBuffer("0.");
+                StringBuilder sb = new StringBuilder("0.");
                 for (int i = 1; i < fractionDigits; i++)
                     sb.append('0');
                 sb.append('1');
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
index e128f3b..af4ecc9 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
@@ -193,7 +193,7 @@
         if (charset == null)
             throw new IllegalStateException("Default character set is null!");
         CharsetEncoder cEncoder = charset.newEncoder();
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         int i;
         for (i = 0; i < s.length(); i++)
         {
@@ -1446,7 +1446,7 @@
     {
         String shortName = sType.getShortJavaImplName();
         String baseClass = getBaseClass(sType);
-        StringBuffer interfaces = new StringBuffer();
+        StringBuilder interfaces = new StringBuilder();
         interfaces.append(sType.getFullJavaName().replace('$', '.'));
 
         if (sType.getSimpleVariety() == SchemaType.UNION) {
@@ -2794,7 +2794,7 @@
 
     void printInterfaceMethodDecl(InterfaceExtension.MethodSignature method) throws IOException
     {
-        StringBuffer decl = new StringBuffer(60);
+        StringBuilder decl = new StringBuilder(60);
 
         decl.append("public ").append(method.getReturnType());
         decl.append(" ").append(method.getName()).append("(");
@@ -2818,7 +2818,7 @@
 
     void printInterfaceMethodImpl(String handler, InterfaceExtension.MethodSignature method) throws IOException
     {
-        StringBuffer impl = new StringBuffer(60);
+        StringBuilder impl = new StringBuilder(60);
 
         if (!method.getReturnType().equals("void"))
             impl.append("return ");
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java b/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java
index 99c8563..1f8d0c7 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java
@@ -143,7 +143,7 @@
         implements XMLStreamReader
     {
         private boolean _hasBufferedText;
-        private StringBuffer _buffer = new StringBuffer();
+        private StringBuilder _buffer = new StringBuilder();
         private int _textEventType;
 
         void init(XMLStreamReader xmlstream)
diff --git a/src/xmlcomp/org/apache/xmlbeans/impl/tool/CodeGenUtil.java b/src/xmlcomp/org/apache/xmlbeans/impl/tool/CodeGenUtil.java
index dc8d1e1..bbeefaa 100644
--- a/src/xmlcomp/org/apache/xmlbeans/impl/tool/CodeGenUtil.java
+++ b/src/xmlcomp/org/apache/xmlbeans/impl/tool/CodeGenUtil.java
@@ -152,7 +152,7 @@
 
         if (cp.length > 0)
         {
-            StringBuffer classPath = new StringBuffer();
+            StringBuilder classPath = new StringBuilder();
             // Add the output directory to the classpath.  We do this so that
             // javac will be able to find classes that were compiled
             // previously but are not in the list of sources this time.
@@ -230,8 +230,8 @@
 
             final Process proc = Runtime.getRuntime().exec(strArgs);
 
-            StringBuffer errorBuffer = new StringBuffer();
-            StringBuffer outputBuffer = new StringBuffer();
+            StringBuilder errorBuffer = new StringBuilder();
+            StringBuilder outputBuffer = new StringBuilder();
 
             ThreadedReader out = new ThreadedReader(proc.getInputStream(), outputBuffer);
             ThreadedReader err = new ThreadedReader(proc.getErrorStream(), errorBuffer);
@@ -319,8 +319,8 @@
 
             final Process proc = Runtime.getRuntime().exec(strArgs);
 
-            StringBuffer errorBuffer = new StringBuffer();
-            StringBuffer outputBuffer = new StringBuffer();
+            StringBuilder errorBuffer = new StringBuilder();
+            StringBuilder outputBuffer = new StringBuilder();
 
             ThreadedReader out = new ThreadedReader(proc.getInputStream(), outputBuffer);
             ThreadedReader err = new ThreadedReader(proc.getErrorStream(), errorBuffer);
@@ -400,7 +400,7 @@
      */
     static private class ThreadedReader
     {
-        public ThreadedReader(InputStream stream, final StringBuffer output)
+        public ThreadedReader(InputStream stream, final StringBuilder output)
         {
             final BufferedReader reader =
                 new BufferedReader(new InputStreamReader(stream));
diff --git a/src/xmlcomp/org/apache/xmlbeans/impl/tool/TypeHierarchyPrinter.java b/src/xmlcomp/org/apache/xmlbeans/impl/tool/TypeHierarchyPrinter.java
index cbca804..800f0bc 100644
--- a/src/xmlcomp/org/apache/xmlbeans/impl/tool/TypeHierarchyPrinter.java
+++ b/src/xmlcomp/org/apache/xmlbeans/impl/tool/TypeHierarchyPrinter.java
@@ -217,7 +217,7 @@
         // step 4: print the tree, starting from xs:anyType (i.e., XmlObject.type)
         List typesToPrint = new ArrayList();
         typesToPrint.add(XmlObject.type);
-        StringBuffer spaces = new StringBuffer();
+        StringBuilder spaces = new StringBuilder();
         while (!typesToPrint.isEmpty())
         {
             SchemaType sType = (SchemaType)typesToPrint.remove(typesToPrint.size() - 1);
diff --git a/test/perf/src/org/apache/xmlbeans/test/performance/utils/PerfUtil.java b/test/perf/src/org/apache/xmlbeans/test/performance/utils/PerfUtil.java
index d77d0b3..bf27e71 100644
--- a/test/perf/src/org/apache/xmlbeans/test/performance/utils/PerfUtil.java
+++ b/test/perf/src/org/apache/xmlbeans/test/performance/utils/PerfUtil.java
@@ -18,15 +18,13 @@
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.FileNotFoundException;
-import java.lang.StringBuffer;
-import java.lang.Math;
 
 public class PerfUtil
 {
 
   // TODO: add more flavors
   public char[] createXmlData(String flavor, int size){
-    StringBuffer buff = new StringBuffer(size);
+    StringBuilder buff = new StringBuilder(size);
     final String rootStart = "<r>";
     final String rootEnd = "</r>";
     final String childStart = "<c>";
@@ -91,7 +89,7 @@
   {
     char[] chars = createXmlData(flavor,size);
     System.gc();
-    StringBuffer buff = new StringBuffer(chars.length);
+    StringBuilder buff = new StringBuilder(chars.length);
     buff.append(chars);
     chars = null;
     System.gc();
@@ -115,7 +113,7 @@
   {
     BufferedInputStream bis = 
       new BufferedInputStream(new FileInputStream(filename));
-    StringBuffer buff = new StringBuffer();
+    StringBuilder buff = new StringBuilder();
     int c;
     while( (c=bis.read()) != -1){
       buff.append((char)c);
@@ -128,7 +126,7 @@
   {
     BufferedInputStream bis = 
       new BufferedInputStream(new FileInputStream(filename));
-    StringBuffer buff = new StringBuffer();
+    StringBuilder buff = new StringBuilder();
     int c;
     while( (c=bis.read()) != -1){
       buff.append((char)c);
@@ -139,7 +137,7 @@
 
   public String createString(int size)
   {
-    StringBuffer buff = new StringBuffer();
+    StringBuilder buff = new StringBuilder();
     for(int i=0; i<size; i++)
     {
       buff.append("z");
diff --git a/test/src/common/Common.java b/test/src/common/Common.java
index 3d04c82..27a47dd 100644
--- a/test/src/common/Common.java
+++ b/test/src/common/Common.java
@@ -199,7 +199,7 @@
             boolean isValid = x.validate(options);
 
             if (!isValid) {
-                StringBuffer errorTxt = new StringBuffer("Invalid doc, expected a valid doc: ");
+                StringBuilder errorTxt = new StringBuilder("Invalid doc, expected a valid doc: ");
                 errorTxt.append("Instance(" + i + "): ");
                 errorTxt.append(x.xmlText());
                 errorTxt.append("Errors: ");
diff --git a/test/src/misc/detailed/JiraRegression1_50Test.java b/test/src/misc/detailed/JiraRegression1_50Test.java
index 7cd9492..700f305 100644
--- a/test/src/misc/detailed/JiraRegression1_50Test.java
+++ b/test/src/misc/detailed/JiraRegression1_50Test.java
@@ -37,7 +37,7 @@
     */
     @Test
     public void test_jira_xmlbeans02() throws Exception {
-        StringBuffer xmlstringbuf = new StringBuffer("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        StringBuilder xmlstringbuf = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
         xmlstringbuf.append("<test>");
         xmlstringbuf.append("<testchild attr=\"abcd\"> Jira02 </testchild>");
         xmlstringbuf.append("</test>");
diff --git a/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/checkin/NameCollisionTest.java b/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/checkin/NameCollisionTest.java
index 4c63aa4..dda71c4 100755
--- a/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/checkin/NameCollisionTest.java
+++ b/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/checkin/NameCollisionTest.java
@@ -23,53 +23,54 @@
 
 import org.apache.xmlbeans.XmlString;
 
-public class NameCollisionTest extends TestCase{
+public class NameCollisionTest extends TestCase {
 
-    public NameCollisionTest(String s){
+    public NameCollisionTest(String s) {
         super(s);
     }
 
-    public void test(){
-        CompanyDocument poDoc ;
+    public void test() {
+        CompanyDocument poDoc;
 
-              poDoc= CompanyDocument.Factory.newInstance();
-              CompanyType po=poDoc.addNewCompany();
+        poDoc = CompanyDocument.Factory.newInstance();
+        CompanyType po = poDoc.addNewCompany();
 
 
-              int LEN=20;
+        int LEN = 20;
 
-             StringBuffer sExpected=new StringBuffer();
-              sExpected.append("<com:company xmlns:com=" +
-                      "\"interfaceFeature/xbean/methodNameCollision/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);
-                    it[i].setName4("BEAN Name"+i);
-                      sExpected.append("<consultant age=\"50\" name=\"BEAN Name"+i+"\"/>");
-              }
+        StringBuilder sExpected = new StringBuilder();
+        sExpected.append("<com:company xmlns:com=" +
+                "\"interfaceFeature/xbean/methodNameCollision/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);
+            it[i].setName4("BEAN Name" + i);
+            sExpected.append("<consultant age=\"50\" name=\"BEAN Name" + i + "\"/>");
+        }
 
-            sExpected.append("</departments></com:company>");
+        sExpected.append("</departments></com:company>");
 
-            int[][] ints = new int[2][3];
-            for (int i = 0; i < ints.length; i++)
-                for (int j = 0; j < ints[i].length; j++)
-                    ints[i][j] = (i+1) * (j+1);
+        int[][] ints = new int[2][3];
+        for (int i = 0; i < ints.length; i++)
+            for (int j = 0; j < ints[i].length; j++)
+                ints[i][j] = (i + 1) * (j + 1);
 
-            IFoo.Inner inner = new IFoo.Inner() {
-                public String getValue() { return "inner value"; }
-            };
+        IFoo.Inner inner = new IFoo.Inner() {
+            public String getValue() {
+                return "inner value";
+            }
+        };
 
-             assertEquals( sExpected.toString(), poDoc.xmlText());
-             assertTrue( poDoc.validate() );
-             assertEquals("Name0", it[0].getName());
-             assertEquals("Name2: [1, 2, 3, ], [2, 4, 6, ], ",it[0].getName2(ints));
-             assertEquals("Name3: inner value",it[0].getName3(inner));
-            assertEquals("BEAN Name0",it[0].getName4());
-
+        assertEquals(sExpected.toString(), poDoc.xmlText());
+        assertTrue(poDoc.validate());
+        assertEquals("Name0", it[0].getName());
+        assertEquals("Name2: [1, 2, 3, ], [2, 4, 6, ], ", it[0].getName2(ints));
+        assertEquals("Name3: inner value", it[0].getName3(inner));
+        assertEquals("BEAN Name0", it[0].getName4());
 
 
     }
diff --git a/test/src/xmlobject/extensions/interfaceFeature/multInterfaces/checkin/MultInterfacesTest.java b/test/src/xmlobject/extensions/interfaceFeature/multInterfaces/checkin/MultInterfacesTest.java
index 9dc0c74..48a1641 100755
--- a/test/src/xmlobject/extensions/interfaceFeature/multInterfaces/checkin/MultInterfacesTest.java
+++ b/test/src/xmlobject/extensions/interfaceFeature/multInterfaces/checkin/MultInterfacesTest.java
@@ -56,7 +56,7 @@
 
         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>"+i+"</pur:USPrice></pur:item>");
 
@@ -74,7 +74,7 @@
 
         poDoc.setMinPrice((double)price);
 
-        sbContent = new StringBuffer();
+        sbContent = new StringBuilder();
         for (int i = 0; i < LEN; i++)
            if( i< price )
             sbContent.append("<pur:item><pur:USPrice>"+price+"</pur:USPrice></pur:item>");
diff --git a/test/tools/src/tools/ant/BuildFileTest.java b/test/tools/src/tools/ant/BuildFileTest.java
index 9bd0ef8..0adb01f 100755
--- a/test/tools/src/tools/ant/BuildFileTest.java
+++ b/test/tools/src/tools/ant/BuildFileTest.java
@@ -74,10 +74,10 @@
 
     protected Project project;
 
-    private StringBuffer logBuffer;
-    private StringBuffer fullLogBuffer;
-    private StringBuffer outBuffer;
-    private StringBuffer errBuffer;
+    private StringBuilder logBuffer;
+    private StringBuilder fullLogBuffer;
+    private StringBuilder outBuffer;
+    private StringBuilder errBuffer;
     private BuildException buildException;
 
 
@@ -186,8 +186,8 @@
         return buildException;
     }
 
-    private String cleanBuffer(StringBuffer buffer) {
-        StringBuffer cleanedBuffer = new StringBuffer();
+    private String cleanBuffer(StringBuilder buffer) {
+        StringBuilder cleanedBuffer = new StringBuilder();
         boolean cr = false;
         for (int i = 0; i < buffer.length(); i++) {
             char ch = buffer.charAt(i);
@@ -215,8 +215,8 @@
      * @param  filename name of project file to run
      */
     protected void configureProject(String filename) throws BuildException {
-        logBuffer = new StringBuffer();
-        fullLogBuffer = new StringBuffer();
+        logBuffer = new StringBuilder();
+        fullLogBuffer = new StringBuilder();
         project = new Project();
         project.init();
         project.setUserProperty( "ant.file" , new File(filename).getAbsolutePath() );
@@ -236,14 +236,14 @@
         try {
             sysOut.flush();
             sysErr.flush();
-            outBuffer = new StringBuffer();
+            outBuffer = new StringBuilder();
             PrintStream out = new PrintStream(new AntOutputStream());
             System.setOut(out);
-            errBuffer = new StringBuffer();
+            errBuffer = new StringBuilder();
             PrintStream err = new PrintStream(new AntOutputStream());
             System.setErr(err);
-            logBuffer = new StringBuffer();
-            fullLogBuffer = new StringBuffer();
+            logBuffer = new StringBuilder();
+            fullLogBuffer = new StringBuilder();
             buildException = null;
             project.executeTarget(targetName);
         } finally {
