diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
index fdfb7e0..bb868dd 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
@@ -768,7 +768,6 @@
         BCMethod method = _pc.declareMethod(PRE + "AttributeIndexToFieldName",
             String.class, new Class[] { int.class });
         method.makePublic();
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // switch (val)
@@ -1212,7 +1211,6 @@
         BCMethod method = _pc.declareMethod(PRE + "ClearFields", void.class,
             null);
         method.makeProtected();
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // super.pcClearFields ()
@@ -1273,7 +1271,6 @@
             (oid) ? new Class[]{ SMTYPE, Object.class, boolean.class }
                 : new Class[]{ SMTYPE, boolean.class };
         BCMethod method = _pc.declareMethod(PRE + "NewInstance", PCTYPE, args);
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // if the type is abstract, throw a UserException
@@ -1329,7 +1326,6 @@
         // protected static int pcGetManagedFieldCount ()
         BCMethod method = _pc.declareMethod(PRE + "GetManagedFieldCount",
             int.class, null);
-        method.setSynthetic(true);
         method.setStatic(true);
         method.makeProtected();
         Code code = method.getCode(true);
@@ -1363,7 +1359,6 @@
         // public void pcProvideField (int fieldNumber)
         BCMethod method = _pc.declareMethod(PRE + "ProvideField", void.class,
             new Class[]{ int.class });
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // adds everything through the switch ()
@@ -1415,7 +1410,6 @@
         // public void pcReplaceField (int fieldNumber)
         BCMethod method = _pc.declareMethod(PRE + "ReplaceField", void.class,
             new Class[]{ int.class });
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // adds everything through the switch ()
@@ -1482,7 +1476,6 @@
             void.class.getName(),
             new String[]{ _managedType.getName(), int.class.getName() });
         method.makeProtected();
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // adds everything through the switch ()
@@ -1588,8 +1581,8 @@
         // public void <method>s (int[] fields)
         Class[] args = (copy) ? new Class[]{ Object.class, int[].class }
             : new Class[]{ int[].class };
-        BCMethod method = _pc.declareMethod(single.getName() + "s", void.class, args);
-        method.setSynthetic(true);
+        BCMethod method = _pc.declareMethod(single.getName() + "s",
+            void.class, args);
         Code code = method.getCode(true);
 
         int fieldNumbers = 0;
@@ -1739,8 +1732,8 @@
                         SMTYPE, "dirty", new Class[]{ String.class })), false);
 
             // pcGetStateManager
-            BCMethod meth = _pc.declareMethod(PRE + "GetStateManager", StateManager.class, null);
-            meth.setSynthetic(true);
+            BCMethod meth = _pc.declareMethod(PRE + "GetStateManager",
+                StateManager.class, null);
             Code code = meth.getCode(true);
             loadManagedInstance(code, false);
             code.getfield().setField(SM, StateManager.class);
@@ -1767,7 +1760,6 @@
 
         // add the method to the pc
         BCMethod method = _pc.declareMethod(name, returnType, params);
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // if (pcStateManager == null) return <default>;
@@ -1812,7 +1804,6 @@
         throws NoSuchMethodException {
         BCMethod method = _pc.declareMethod(PRE + "GetVersion", Object.class,
             null);
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // if (pcStateManager == null)
@@ -1881,8 +1872,8 @@
      */
     private void addReplaceStateManagerMethod() {
         // public void pcReplaceStateManager (StateManager sm)
-        BCMethod method = _pc.declareMethod(PRE + "ReplaceStateManager", void.class, new Class[]{ SMTYPE });
-        method.setSynthetic(true);
+        BCMethod method = _pc.declareMethod(PRE + "ReplaceStateManager",
+            void.class, new Class[]{ SMTYPE });
         method.getExceptions(true).addException(SecurityException.class);
         Code code = method.getCode(true);
 
@@ -1925,7 +1916,6 @@
         // 	Object oid)
         BCMethod method = _pc.declareMethod(PRE + "CopyKeyFieldsToObjectId",
             void.class, new Class[]{ OIDFSTYPE, Object.class });
-        method.setSynthetic(true);
         Code code = method.getCode(true);
         code.vreturn();
         code.calculateMaxLocals();
@@ -1933,7 +1923,6 @@
         // public void pcCopyKeyFieldsToObjectId (Object oid)
         method = _pc.declareMethod(PRE + "CopyKeyFieldsToObjectId",
             void.class, new Class[]{ Object.class });
-        method.setSynthetic(true);
         code = method.getCode(true);
         code.vreturn();
         code.calculateMaxLocals();
@@ -1942,7 +1931,6 @@
         //	Object oid)
         method = _pc.declareMethod(PRE + "CopyKeyFieldsFromObjectId",
             void.class, new Class[]{ OIDFCTYPE, Object.class });
-        method.setSynthetic(true);
         code = method.getCode(true);
         code.vreturn();
         code.calculateMaxLocals();
@@ -1950,7 +1938,6 @@
         // public void pcCopyKeyFieldsFromObjectId (Object oid)
         method = _pc.declareMethod(PRE + "CopyKeyFieldsFromObjectId",
             void.class, new Class[]{ Object.class });
-        method.setSynthetic(true);
         code = method.getCode(true);
         code.vreturn();
         code.calculateMaxLocals();
@@ -1958,7 +1945,6 @@
         // public Object pcNewObjectIdInstance ()
         method = _pc.declareMethod(PRE + "NewObjectIdInstance",
             Object.class, null);
-        method.setSynthetic(true);
         code = method.getCode(true);
         code.constant().setNull();
         code.areturn();
@@ -1968,7 +1954,6 @@
         // public Object pcNewObjectIdInstance (Object obj)
         method = _pc.declareMethod(PRE + "NewObjectIdInstance",
             Object.class, new Class[]{ Object.class });
-        method.setSynthetic(true);
         code = method.getCode(true);
         code.constant().setNull();
         code.areturn();
@@ -1989,7 +1974,6 @@
             : new String[]{ Object.class.getName() };
         BCMethod method = _pc.declareMethod(PRE + "CopyKeyFieldsToObjectId",
             void.class.getName(), args);
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // single field identity always throws exception
@@ -2485,7 +2469,6 @@
             : new String[]{ Object.class.getName() };
         BCMethod method = _pc.declareMethod(PRE + "CopyKeyFieldsFromObjectId",
             void.class.getName(), args);
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         // call superclass method
@@ -2741,7 +2724,6 @@
         Class[] args = (obj) ? new Class[]{ Object.class } : null;
         BCMethod method = _pc.declareMethod(PRE + "NewObjectIdInstance",
             Object.class, args);
-        method.setSynthetic(true);
         Code code = method.getCode(true);
 
         Boolean usesClsString = usesClassStringIdConstructor();
@@ -2963,38 +2945,19 @@
      * </ul>
      */
     private void addFields() {
-        BCField field;
-        field = _pc.declareField(INHERIT, int.class);
-        field.setStatic(true);
-        field.setSynthetic(true);
-
-        field = _pc.declareField(PRE + "FieldNames", String[].class);
-        field.setStatic(true);
-        field.setSynthetic(true);
-
-        field = _pc.declareField(PRE + "FieldTypes", Class[].class);
-        field.setStatic(true);
-        field.setSynthetic(true);
-
-        field = _pc.declareField(PRE + "FieldFlags", byte[].class);
-        field.setStatic(true);
-        field.setSynthetic(true);
-
-
-        field = _pc.declareField(SUPER, Class.class);
-        field.setSynthetic(true);
-        field.setStatic(true);
-
+        _pc.declareField(INHERIT, int.class).setStatic(true);
+        _pc.declareField(PRE + "FieldNames", String[].class).setStatic(true);
+        _pc.declareField(PRE + "FieldTypes", Class[].class).setStatic(true);
+        _pc.declareField(PRE + "FieldFlags", byte[].class).setStatic(true);
+        _pc.declareField(SUPER, Class.class).setStatic(true);
         if (_addVersionInitFlag && _meta.getVersionField() != null) {
             // protected transient boolean pcVersionInit;
-            field = _pc.declareField(VERSION_INIT_STR, boolean.class);
-            field.setSynthetic(true);
+            BCField field = _pc.declareField(VERSION_INIT_STR, boolean.class);
             field.makeProtected();
             field.setTransient(true);
         }
         if (_meta.getPCSuperclass() == null || getCreateSubclass()) {
-            field = _pc.declareField(SM, SMTYPE);
-            field.setSynthetic(true);
+            BCField field = _pc.declareField(SM, SMTYPE);
             field.makeProtected();
             field.setTransient(true);
         }
@@ -3181,7 +3144,6 @@
             // private void writeObject (ObjectOutputStream out)
             write = _pc.declareMethod("writeObject", void.class,
                 new Class[]{ ObjectOutputStream.class });
-            write.setSynthetic(true);
             write.getExceptions(true).addException(IOException.class);
             write.makePrivate();
         }
@@ -3195,7 +3157,6 @@
             // private void readObject (ObjectInputStream in)
             read = _pc.declareMethod("readObject", void.class,
                 new Class[]{ ObjectInputStream.class });
-            read.setSynthetic(true);
             read.getExceptions(true).addException(IOException.class);
             read.getExceptions(true).addException
                 (ClassNotFoundException.class);
@@ -3211,7 +3172,6 @@
 
         // private Object writeReplace() throws ObjectStreamException
         BCMethod method = _pc.declareMethod("writeReplace", Object.class, null);
-        method.setSynthetic(true);
         method.getExceptions(true).addException(ObjectStreamException.class);
         Code code = method.getCode(true);
 
@@ -3300,7 +3260,7 @@
 
     /**
      * Adds a custom readObject method that delegates to the
-     * {@link ObjectInputStream#readObject()} method.
+     * {@link ObjectInputStream#readObject} method.
      */
     private void modifyReadObjectMethod(BCMethod method, boolean full) {
         Code code = method.getCode(true);
@@ -3337,7 +3297,6 @@
         // public boolean pcIsDetached()
         BCMethod method = _pc.declareMethod(PRE + "IsDetached",
             Boolean.class, null);
-        method.setSynthetic(true);
         method.makePublic();
         Code code = method.getCode(true);
         boolean needsDefinitiveMethod = writeIsDetachedMethod(code);
@@ -3350,8 +3309,8 @@
         //   return false;
         // auxilliary enhancers may change the return value of this method
         // if their specs consider detached state definitive
-        method = _pc.declareMethod(ISDETACHEDSTATEDEFINITIVE, boolean.class, null);
-        method.setSynthetic(true);
+        method = _pc.declareMethod(ISDETACHEDSTATEDEFINITIVE, boolean.class,
+            null);
         method.makePrivate();
         code = method.getCode(true);
         code.constant().setValue(false);
@@ -3664,7 +3623,6 @@
             // add clone method
             // protected Object clone () throws CloneNotSupportedException
             clone = _pc.declareMethod("clone", Object.class, null);
-            clone.setSynthetic(true);
             if (!setVisibilityToSuperMethod(clone))
                 clone.makeProtected();
             clone.getExceptions(true).addException
@@ -3767,8 +3725,8 @@
         throws NoSuchMethodException {
         Class propType = fmd.getDeclaredType();
         String setterName = getSetterName(fmd);
-        BCMethod setter = _pc.declareMethod(setterName, void.class, new Class[] { propType });
-        setter.setSynthetic(true);
+        BCMethod setter = _pc.declareMethod(setterName, void.class,
+            new Class[] { propType });
         setVisibilityToSuperMethod(setter);
         Code code = setter.getCode(true);
 
@@ -3826,8 +3784,8 @@
         String methName = "get" + StringUtil.capitalize(fmd.getName());
         if (_managedType.getMethods(methName, new Class[0]).length == 0)
             methName = "is" + StringUtil.capitalize(fmd.getName());
-        BCMethod getter = _pc.declareMethod(methName, fmd.getDeclaredType(), null);
-        getter.setSynthetic(true);
+        BCMethod getter = _pc.declareMethod(methName, fmd.getDeclaredType(),
+            null);
         setVisibilityToSuperMethod(getter);
         getter.makePublic();
         Code code = getter.getCode(true);
@@ -4004,7 +3962,6 @@
             name = PRE + "DetachedState";
             declarer = _pc.getName();
             BCField field = _pc.declareField(name, Object.class);
-            field.setSynthetic(true);
             field.makePrivate();
             field.setTransient(true);
         } else if (impl) {
@@ -4013,8 +3970,8 @@
         }
 
         // public Object pcGetDetachedState ()
-        BCMethod method = _pc.declareMethod(PRE + "GetDetachedState", Object.class, null);
-        method.setSynthetic(true);
+        BCMethod method = _pc.declareMethod(PRE + "GetDetachedState",
+            Object.class, null);
         method.setStatic(false);
         method.makePublic();
         int access = method.getAccessFlags();
@@ -4034,7 +3991,6 @@
         // public void pcSetDetachedState (Object state)
         method = _pc.declareMethod(PRE + "SetDetachedState",
             void.class, new Class []{ Object.class });
-        method.setSynthetic(true);
         method.setAccessFlags(access);
         code = method.getCode(true);
         if (impl) {
@@ -4227,7 +4183,6 @@
         throws NoSuchMethodException {
         Class[] inargs = new Class[]{ ObjectInput.class };
         BCMethod meth = _pc.declareMethod("readExternal", void.class, inargs);
-        meth.setSynthetic(true);
         Exceptions exceps = meth.getExceptions(true);
         exceps.addException(IOException.class);
         exceps.addException(ClassNotFoundException.class);
@@ -4286,7 +4241,6 @@
     private void addReadExternalFields() throws NoSuchMethodException {
         Class<?>[] inargs = new Class[]{ ObjectInput.class };
         BCMethod meth = _pc.declareMethod("readExternalFields", void.class, inargs);
-        meth.setSynthetic(true);
         meth.setAccessFlags(Constants.ACCESS_PROTECTED);
         Exceptions exceps = meth.getExceptions(true);
         exceps.addException(IOException.class);
@@ -4321,8 +4275,8 @@
     private void addReadUnmanaged(Collection unmgd, boolean parentDetachable)
         throws NoSuchMethodException {
         Class[] inargs = new Class[]{ ObjectInput.class };
-        BCMethod meth = _pc.declareMethod(PRE + "ReadUnmanaged", void.class, inargs);
-        meth.setSynthetic(true);
+        BCMethod meth = _pc.declareMethod(PRE + "ReadUnmanaged", void.class,
+            inargs);
         meth.makeProtected();
         Exceptions exceps = meth.getExceptions(true);
         exceps.addException(IOException.class);
@@ -4407,7 +4361,6 @@
         throws NoSuchMethodException {
         Class[] outargs = new Class[]{ ObjectOutput.class };
         BCMethod meth = _pc.declareMethod("writeExternal", void.class, outargs);
-        meth.setSynthetic(true);
         Exceptions exceps = meth.getExceptions(true);
         exceps.addException(IOException.class);
         Code code = meth.getCode(true);
@@ -4479,7 +4432,6 @@
         throws NoSuchMethodException {
         Class<?>[] outargs = new Class[]{ ObjectOutput.class };
         BCMethod meth = _pc.declareMethod("writeExternalFields", void.class, outargs);
-        meth.setSynthetic(true);
         meth.setAccessFlags(Constants.ACCESS_PROTECTED);
         Exceptions exceps = meth.getExceptions(true);
         exceps.addException(IOException.class);
@@ -4513,8 +4465,8 @@
     private void addWriteUnmanaged(Collection unmgd, boolean parentDetachable)
         throws NoSuchMethodException {
         Class[] outargs = new Class[]{ ObjectOutput.class };
-        BCMethod meth = _pc.declareMethod(PRE + "WriteUnmanaged", void.class, outargs);
-        meth.setSynthetic(true);
+        BCMethod meth = _pc.declareMethod(PRE + "WriteUnmanaged", void.class,
+            outargs);
         meth.makeProtected();
         Exceptions exceps = meth.getExceptions(true);
         exceps.addException(IOException.class);
@@ -4710,7 +4662,6 @@
             BCField field = _pc.getDeclaredField(fmd.getName());
             getter = _pc.declareMethod(PRE + "Get" + fmd.getName(), fmd.
                 getDeclaredType().getName(), new String[]{ _pc.getName() });
-            getter.setSynthetic(true);
             getter.setAccessFlags(field.getAccessFlags()
                 & ~Constants.ACCESS_TRANSIENT & ~Constants.ACCESS_VOLATILE);
             getter.setStatic(true);
@@ -4726,7 +4677,6 @@
             meth.getParameterTypes());
         BCMethod newgetter = _pc.declareMethod(PRE + meth.getName(),
             meth.getReturnType(), meth.getParameterTypes());
-        newgetter.setSynthetic(true);
         newgetter.setAccessFlags(getter.getAccessFlags());
         newgetter.makeProtected();
         transferCodeAttributes(getter, newgetter);
@@ -4744,7 +4694,6 @@
             BCField field = _pc.getDeclaredField(fmd.getName());
             setter = _pc.declareMethod(PRE + "Set" + fmd.getName(), void.class,
                 new Class[]{ getType(_meta), fmd.getDeclaredType() });
-            setter.setSynthetic(true);
             setter.setAccessFlags(field.getAccessFlags()
                 & ~Constants.ACCESS_TRANSIENT & ~Constants.ACCESS_VOLATILE);
             setter.setStatic(true);
@@ -4759,7 +4708,6 @@
             new Class[]{ fmd.getDeclaredType() });
         BCMethod newsetter = _pc.declareMethod(PRE + setter.getName(),
             setter.getReturnName(), setter.getParamNames());
-        newsetter.setSynthetic(true);
         newsetter.setAccessFlags(setter.getAccessFlags());
         newsetter.makeProtected();
         transferCodeAttributes(setter, newsetter);
@@ -4768,8 +4716,8 @@
 
     private void addGetEnhancementContractVersionMethod() {
         // public int getEnhancementContractVersion()
-        BCMethod method = _pc.declareMethod(PRE + "GetEnhancementContractVersion", int.class, null);
-        method.setSynthetic(true);
+        BCMethod method = _pc.declareMethod(PRE +
+                "GetEnhancementContractVersion", int.class, null);
         method.makePublic();
         Code code = method.getCode(true);
         code.constant().setValue(ENHANCER_VERSION);
@@ -4998,8 +4946,8 @@
     }
 
     private void addGetIDOwningClass() throws NoSuchMethodException {
-        BCMethod method = _pc.declareMethod(PRE + "GetIDOwningClass", Class.class, null);
-        method.setSynthetic(true);
+        BCMethod method = _pc.declareMethod(PRE + "GetIDOwningClass",
+            Class.class, null);
         Code code = method.getCode(true);
 
         code.classconstant().setClass(getType(_meta));
