diff --git a/jaxb-ri/pom.xml b/jaxb-ri/pom.xml
index 2adfc55..57ce5cd 100644
--- a/jaxb-ri/pom.xml
+++ b/jaxb-ri/pom.xml
@@ -328,11 +328,6 @@
                         </dependency>
                     </dependencies>
                 </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-failsafe-plugin</artifactId>
-                    <version>3.0.0-M5</version>
-                </plugin>
             </plugins>
         </pluginManagement>
 
diff --git a/jaxb-ri/runtime/impl/pom.xml b/jaxb-ri/runtime/impl/pom.xml
index 71532da..3553a3d 100644
--- a/jaxb-ri/runtime/impl/pom.xml
+++ b/jaxb-ri/runtime/impl/pom.xml
@@ -157,37 +157,6 @@
                     <reuseForks>true</reuseForks>
                 </configuration>
             </plugin>
-
-            <!-- Run tests on multi-release jar -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-failsafe-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>integration-test</goal>
-                            <goal>verify</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <trimStackTrace>false</trimStackTrace>
-                    <systemProperties>
-                        <property>
-                            <name>java.util.logging.config.file</name>
-                            <value>logging.properties</value>
-                        </property>
-                    </systemProperties>
-                    <argLine>
-                        --add-opens java.base/java.lang=org.glassfish.runtime
-                        --add-opens org.glassfish.jaxb.runtime/org.glassfish.jaxb.runtime.v2=jakarta.xml.bind
-                        --add-opens org.glassfish.jaxb.runtime/org.glassfish.jaxb.runtime.v2.schemagen=jakarta.xml.bind
-                    </argLine>
-                    <includes>
-                        <include>**/*TestMultiRelease.java</include>
-                    </includes>
-                </configuration>
-            </plugin>
         </plugins>
     </build>
 </project>
diff --git a/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/AccessorInjector.java b/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/AccessorInjector.java
deleted file mode 100644
index 03615f4..0000000
--- a/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/AccessorInjector.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.v2.runtime.reflect.opt;
-
-/**
- * Stub version of {@link AccessorInjector} for java versions >= 9
- *
- * @author Daniel Kec
- */
-class AccessorInjector {
-
-    protected static final boolean noOptimize = true;
-
-    public static Class<?> prepare(
-            Class beanClass, String templateClassName, String newClassName, String... replacements) {
-        return null;
-    }
-
-}
diff --git a/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/Injector.java b/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/Injector.java
deleted file mode 100644
index d7fcaed..0000000
--- a/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/Injector.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.v2.runtime.reflect.opt;
-
-/**
- * Stub version of {@link Injector} for java versions >= 9
- *
- * @author Daniel Kec
- */
-final class Injector {
-
-    /**
-     * Injects a new class into the given class loader.
-     *
-     * @return null
-     * if it fails to inject.
-     */
-    static Class inject(ClassLoader cl, String className, byte[] image) {
-        return null;
-    }
-
-    /**
-     * Returns the already injected class, or null.
-     */
-    static Class find(ClassLoader cl, String className) {
-        return null;
-    }
-}
diff --git a/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedAccessorFactory.java b/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedAccessorFactory.java
deleted file mode 100644
index 84b4213..0000000
--- a/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedAccessorFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.v2.runtime.reflect.opt;
-
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.Accessor;
-
-import java.util.logging.Logger;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Field;
-
-/**
- * Stub version of {@link org.glassfish.jaxb.runtime.v2.runtime.reflect.opt.OptimizedAccessorFactory} for java versions >= 9
- *
- * @author Daniel Kec
- */
-public abstract class OptimizedAccessorFactory {
-    private OptimizedAccessorFactory() {} // no instantiation please
-
-    private static final Logger logger = Logger.getLogger(org.glassfish.jaxb.runtime.v2.runtime.reflect.opt.OptimizedAccessorFactory.class.getName());
-
-
-    public static <B, V> Accessor<B, V> get(Method param1, Method param2) {
-        return getStub();
-    }
-
-    public static <B, V> Accessor<B, V> get(Field param) {
-        return getStub();
-    }
-
-    private static <B, V> Accessor<B, V> getStub(){
-        logger.finer("Optimization is not available since java 9");
-        return null;
-    }
-
-}
diff --git a/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedTransducedAccessorFactory.java b/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedTransducedAccessorFactory.java
deleted file mode 100644
index dabb5f7..0000000
--- a/jaxb-ri/runtime/impl/src/main/java-mr/9/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedTransducedAccessorFactory.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.v2.runtime.reflect.opt;
-
-import org.glassfish.jaxb.runtime.v2.model.runtime.RuntimePropertyInfo;
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.TransducedAccessor;
-
-import java.util.logging.Logger;
-
-/**
- * Stub version of {@link org.glassfish.jaxb.runtime.v2.runtime.reflect.opt.OptimizedTransducedAccessorFactory} for java versions >= 9
- *
- * @author Daniel Kec
- */
-public abstract class OptimizedTransducedAccessorFactory {
-    private OptimizedTransducedAccessorFactory() {} // no instantiation please
-
-    private static final Logger logger = Logger.getLogger(org.glassfish.jaxb.runtime.v2.runtime.reflect.opt.OptimizedTransducedAccessorFactory.class.getName());
-
-    public static final TransducedAccessor get(RuntimePropertyInfo prop) {
-        logger.finer("Optimization is not available since java 9");
-        return null;
-    }
-}
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java
index 45826e6..760ac58 100644
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java
+++ b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java
@@ -95,10 +95,6 @@
         return false;
     }
 
-    public final boolean isDefault() {
-        return true;
-    }
-
     public void declareNamespace(T o, XMLSerializer w) throws AccessorException {
     }
 
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeClassInfoImpl.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeClassInfoImpl.java
index 7e87f84..fb85e4c 100644
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeClassInfoImpl.java
+++ b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeClassInfoImpl.java
@@ -330,10 +330,6 @@
             return xacc.useNamespace();
         }
 
-        public boolean isDefault() {
-            return false;
-        }
-
         public void declareNamespace(BeanT bean, XMLSerializer w) throws AccessorException {
             try {
                 xacc.declareNamespace(bean,w);
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeEnumLeafInfoImpl.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeEnumLeafInfoImpl.java
index 9ddb376..11f7af1 100644
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeEnumLeafInfoImpl.java
+++ b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/model/impl/RuntimeEnumLeafInfoImpl.java
@@ -93,10 +93,6 @@
         return new QName[]{getTypeName()};
     }
 
-    public boolean isDefault() {
-        return false;
-    }
-
     @Override
     public Class getClazz() {
         return clazz;
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/FilterTransducer.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/FilterTransducer.java
index 8ac3ab4..5b2ee93 100644
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/FilterTransducer.java
+++ b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/FilterTransducer.java
@@ -1,5 +1,9 @@
 /*
+<<<<<<< HEAD:jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/FilterTransducer.java
  * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
+=======
+ * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+>>>>>>> parent of 263e92e (Revert optimization removal (#1352)):jaxb-ri/runtime/impl/src/main/java/com/sun/xml/bind/v2/runtime/FilterTransducer.java
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -30,12 +34,6 @@
         this.core = core;
     }
 
-    public final boolean isDefault() {
-        // this must be used as a decorating transducer,
-        // so it may never be default.
-        return false;
-    }
-
     public boolean useNamespace() {
         return core.useNamespace();
     }
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/Transducer.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/Transducer.java
index ce6c54b..12c382f 100644
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/Transducer.java
+++ b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/Transducer.java
@@ -12,8 +12,7 @@
 
 import com.sun.istack.NotNull;
 import org.glassfish.jaxb.runtime.api.AccessorException;
-import org.glassfish.jaxb.runtime.v2.model.runtime.RuntimePropertyInfo;
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.opt.OptimizedTransducedAccessorFactory;
+
 import jakarta.xml.bind.annotation.XmlValue;
 import org.xml.sax.SAXException;
 
@@ -22,7 +21,6 @@
 import javax.xml.stream.XMLStreamException;
 import java.io.IOException;
 
-
 /**
  * Responsible for converting a Java object to a lexical representation
  * and vice versa.
@@ -38,14 +36,6 @@
 public interface Transducer<ValueT> {
 
     /**
-     * If this {@link Transducer} is the default transducer for the <code>ValueT</code>,
-     * this method returns true.
-     *
-     * Used exclusively by {@link OptimizedTransducedAccessorFactory#get(RuntimePropertyInfo)}
-     */
-    boolean isDefault();
-
-    /**
      * If true, this {@link Transducer} doesn't declare any namespace,
      * and therefore {@link #declareNamespace(Object, XMLSerializer)} is no-op.
      *
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/Accessor.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/Accessor.java
index 48df4fc..60a7f1a 100644
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/Accessor.java
+++ b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/Accessor.java
@@ -16,7 +16,6 @@
 import org.glassfish.jaxb.core.v2.model.core.Adapter;
 import org.glassfish.jaxb.runtime.v2.model.impl.RuntimeModelBuilder;
 import org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl;
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.opt.OptimizedAccessorFactory;
 import org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader;
 import org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Receiver;
 import org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext;
@@ -242,14 +241,6 @@
 
         @Override
         public Accessor<BeanT, ValueT> optimize(JAXBContextImpl context) {
-            if (context != null && context.fastBoot) {
-                // let's not waste time on doing this for the sake of faster boot.
-                return this;
-            }
-            Accessor<BeanT, ValueT> acc = OptimizedAccessorFactory.get(f);
-            if (acc != null) {
-                return acc;
-            }
             return this;
         }
     }
@@ -356,20 +347,6 @@
 
         @Override
         public Accessor<BeanT, ValueT> optimize(JAXBContextImpl context) {
-            if (getter == null || setter == null) {
-                // if we aren't complete, OptimizedAccessor won't always work
-                return this;
-            }
-            if (context != null && context.fastBoot) {
-                // let's not waste time on doing this for the sake of faster boot.
-                return this;
-            }
-
-            Accessor<BeanT, ValueT> acc = OptimizedAccessorFactory.get(getter, setter);
-            if (acc != null) {
-                return acc;
-            }
-
             return this;
         }
     }
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/TransducedAccessor.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/TransducedAccessor.java
index 12927ab..0cce148 100644
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/TransducedAccessor.java
+++ b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/TransducedAccessor.java
@@ -23,7 +23,6 @@
 import org.glassfish.jaxb.runtime.v2.runtime.Name;
 import org.glassfish.jaxb.runtime.v2.runtime.Transducer;
 import org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer;
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.opt.OptimizedTransducedAccessorFactory;
 import org.glassfish.jaxb.core.v2.runtime.unmarshaller.LocatorEx;
 import org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Patcher;
 import org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext;
@@ -132,13 +131,6 @@
         if(prop.id()==ID.IDREF)
             return new IDREFTransducedAccessorImpl(prop.getAccessor());
 
-        if (xducer.isDefault() && context != null && !context.fastBoot) {
-            TransducedAccessor xa = OptimizedTransducedAccessorFactory.get(prop);
-            if (xa != null) {
-                return xa;
-            }
-        }
-
         if(xducer.useNamespace())
             return new CompositeContextDependentTransducedAccessorImpl( context, xducer, prop.getAccessor() );
         else
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/AccessorInjector.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/AccessorInjector.java
index 4447c10..c3f72b0 100644
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/AccessorInjector.java
+++ b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/AccessorInjector.java
@@ -14,7 +14,6 @@
 import org.glassfish.jaxb.runtime.v2.bytecode.ClassTailor;
 
 import java.io.InputStream;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
@@ -33,41 +32,6 @@
     }
 
     /**
-     * Loads the optimized class and returns it.
-     *
-     * @return null
-     *      if it fails for some reason.
-     */
-    public static Class<?> prepare(
-            Class beanClass, String templateClassName, String newClassName, String... replacements ) {
-
-        if(noOptimize)
-            return null;
-
-        try {
-            ClassLoader cl = SecureLoader.getClassClassLoader(beanClass);
-            if(cl==null)    return null;    // how do I inject classes to this "null" class loader? for now, back off.
-
-            Class c = Injector.find(cl,newClassName);
-            if (c==null) {
-                byte[] image = tailor(templateClassName,newClassName,replacements);
-                if (image==null) {
-                    return null;
-                }
-                c = Injector.inject(cl,newClassName,image);
-                if (c == null) {
-                    Injector.find(cl, newClassName);
-                }
-            }
-            return c;
-        } catch(SecurityException e) {
-            // we don't have enough permission to do this
-            logger.log(Level.INFO,"Unable to create an optimized TransducedAccessor ",e);
-            return null;
-        }
-    }
-
-    /**
      * Customizes a class file by replacing constant pools.
      *
      * @param templateClassName
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedAccessorFactory.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedAccessorFactory.java
deleted file mode 100644
index 39c6cf4..0000000
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedAccessorFactory.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 1997, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.v2.runtime.reflect.opt;
-
-import org.glassfish.jaxb.core.v2.runtime.RuntimeUtil;
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.Accessor;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import static org.glassfish.jaxb.runtime.v2.bytecode.ClassTailor.toVMClassName;
-import static org.glassfish.jaxb.runtime.v2.bytecode.ClassTailor.toVMTypeName;
-
-/**
- * @author Kohsuke Kawaguchi
- */
-public abstract class OptimizedAccessorFactory {
-    private OptimizedAccessorFactory() {} // no instanciation please
-
-    public static final boolean noOptimization = Boolean.getBoolean(OptimizedAccessorFactory.class.getName()+".noOptimization");
-
-    private static final Logger logger = Logger.getLogger(OptimizedAccessorFactory.class.getName());
-
-    private static final String fieldTemplateName;
-    private static final String methodTemplateName;
-
-    static {
-        String s = FieldAccessor_Byte.class.getName();
-        fieldTemplateName = s.substring(0,s.length()-"Byte".length()).replace('.','/');
-
-        s = MethodAccessor_Byte.class.getName();
-        methodTemplateName = s.substring(0,s.length()-"Byte".length()).replace('.','/');
-    }
-
-    /**
-     * Gets the optimized {@link Accessor} that accesses the given getter/setter.
-     *
-     * @return null
-     *      if for some reason it fails to create an optimized version.
-     */
-    public static final <B,V> Accessor<B,V> get(Method getter, Method setter) {
-        if(noOptimization){
-            return null;
-        }
-
-        // make sure the method signatures are what we expect
-        if(getter.getParameterTypes().length!=0)
-            return null;
-        Class<?>[] sparams = setter.getParameterTypes();
-        if(sparams.length!=1)
-            return null;
-        if(sparams[0]!=getter.getReturnType())
-            return null;
-        if(setter.getReturnType()!=Void.TYPE)
-            return null;
-        if(getter.getDeclaringClass()!=setter.getDeclaringClass())
-            return null;
-        if(Modifier.isPrivate(getter.getModifiers()) || Modifier.isPrivate(setter.getModifiers()))
-            // we can't access private fields
-            return null;
-
-        Class t = sparams[0];
-        String typeName = t.getName().replace('.','_');
-        if (t.isArray()) {
-            typeName = "AOf_";
-            String compName = t.getComponentType().getName().replace('.','_');
-            while (compName.startsWith("[L")) {
-                compName = compName.substring(2);
-                typeName += "AOf_";
-            }
-            typeName = typeName + compName;
-        }
-
-        String newClassName = toVMClassName(getter.getDeclaringClass())+"$JaxbAccessorM_"+getter.getName()+'_'+setter.getName()+'_'+typeName;
-        Class opt;
-
-        if(t.isPrimitive())
-            opt = AccessorInjector.prepare( getter.getDeclaringClass(),
-                    methodTemplateName+RuntimeUtil.primitiveToBox.get(t).getSimpleName(),
-                    newClassName,
-                    toVMClassName(Bean.class),
-                    toVMClassName(getter.getDeclaringClass()),
-                    "get_"+t.getName(),
-                    getter.getName(),
-                    "set_"+t.getName(),
-                    setter.getName());
-        else
-            opt = AccessorInjector.prepare( getter.getDeclaringClass(),
-                    methodTemplateName+"Ref",
-                    newClassName,
-                    toVMClassName(Bean.class),
-                    toVMClassName(getter.getDeclaringClass()),
-                    toVMClassName(Ref.class),
-                    toVMClassName(t),
-                    "()"+toVMTypeName(Ref.class),
-                    "()"+toVMTypeName(t),
-                    '('+toVMTypeName(Ref.class)+")V",
-                    '('+toVMTypeName(t)+")V",
-                    "get_ref",
-                    getter.getName(),
-                    "set_ref",
-                    setter.getName());
-
-        if(opt==null)
-            return null;
-
-        Accessor<B,V> acc = instanciate(opt);
-        if (acc!=null) {
-            if (logger.isLoggable(Level.FINE)) {
-                logger.log(Level.FINE, "Using optimized Accessor for {0} and {1}", new Object[]{getter, setter});
-            }
-        }
-        return acc;
-    }
-
-
-    /**
-     * Gets the optimized {@link Accessor} that accesses the given field.
-     *
-     * @return null
-     *      if for some reason it fails to create an optimized version.
-     */
-    public static final <B,V> Accessor<B,V> get(Field field) {
-        if(noOptimization){
-            return null;
-        }
-
-        int mods = field.getModifiers();
-        if(Modifier.isPrivate(mods) || Modifier.isFinal(mods))
-            // we can't access private fields
-            return null;
-
-        String newClassName = toVMClassName(field.getDeclaringClass())+"$JaxbAccessorF_"+field.getName();
-
-        Class opt;
-
-        if(field.getType().isPrimitive())
-            opt = AccessorInjector.prepare( field.getDeclaringClass(),
-                    fieldTemplateName+RuntimeUtil.primitiveToBox.get(field.getType()).getSimpleName(),
-                    newClassName,
-                    toVMClassName(Bean.class),
-                    toVMClassName(field.getDeclaringClass()),
-                    "f_"+field.getType().getName(),
-                    field.getName() );
-        else
-            opt = AccessorInjector.prepare( field.getDeclaringClass(),
-                    fieldTemplateName+"Ref",
-                    newClassName,
-                    toVMClassName(Bean.class),
-                    toVMClassName(field.getDeclaringClass()),
-                    toVMClassName(Ref.class),
-                    toVMClassName(field.getType()),
-                    toVMTypeName(Ref.class),
-                    toVMTypeName(field.getType()),
-                    "f_ref",
-                    field.getName() );
-
-        if(opt==null)
-            return null;
-
-        Accessor<B,V> acc = instanciate(opt);
-        if (acc!=null) {
-            if (logger.isLoggable(Level.FINE)) {
-                logger.log(Level.FINE, "Using optimized Accessor for {0}", field);
-            }
-        }
-        return acc;
-    }
-
-    private static <B,V> Accessor<B,V> instanciate(Class opt) {
-        try {
-            return (Accessor<B,V>)opt.newInstance();
-        } catch (InstantiationException e) {
-            logger.log(Level.INFO,"failed to load an optimized Accessor",e);
-        } catch (IllegalAccessException e) {
-            logger.log(Level.INFO,"failed to load an optimized Accessor",e);
-        } catch (SecurityException e) {
-            logger.log(Level.INFO,"failed to load an optimized Accessor",e);
-        } catch (ClassCastException e) {
-            logger.log(Level.FINE,"failed to cast optimized Accessor " +
-                    "created by repackaged jaxb "+opt,e);
-        }
-        return null;
-    }
-}
diff --git a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedTransducedAccessorFactory.java b/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedTransducedAccessorFactory.java
deleted file mode 100644
index e66a891..0000000
--- a/jaxb-ri/runtime/impl/src/main/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizedTransducedAccessorFactory.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.v2.runtime.reflect.opt;
-
-import org.glassfish.jaxb.core.v2.model.core.TypeInfo;
-import org.glassfish.jaxb.runtime.v2.model.runtime.RuntimeClassInfo;
-import org.glassfish.jaxb.runtime.v2.model.runtime.RuntimePropertyInfo;
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.Accessor;
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.TransducedAccessor;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import static org.glassfish.jaxb.runtime.v2.bytecode.ClassTailor.toVMClassName;
-
-/**
- * Prepares optimized {@link TransducedAccessor} from templates.
- *
- * @author Kohsuke Kawaguchi
- */
-public abstract class OptimizedTransducedAccessorFactory {
-    private OptimizedTransducedAccessorFactory() {} // no instantiation please
-
-    // http://java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#75929
-    // "same runtime package"
-
-    private static final Logger logger = Logger.getLogger(OptimizedTransducedAccessorFactory.class.getName());
-
-    private static final String fieldTemplateName;
-    private static final String methodTemplateName;
-
-    static {
-        String s = TransducedAccessor_field_Byte.class.getName();
-        fieldTemplateName = s.substring(0,s.length()-"Byte".length()).replace('.','/');
-
-        s = TransducedAccessor_method_Byte.class.getName();
-        methodTemplateName = s.substring(0,s.length()-"Byte".length()).replace('.','/');
-    }
-
-    /**
-     * Gets the optimized {@link TransducedAccessor} if possible.
-     *
-     * @return null
-     *      if for some reason it fails to create an optimized version.
-     */
-    public static final TransducedAccessor get(RuntimePropertyInfo prop) {
-        if(OptimizedAccessorFactory.noOptimization){
-            return null;
-        }
-
-        Accessor acc = prop.getAccessor();
-
-        // consider using an optimized TransducedAccessor implementations.
-        Class opt=null;
-
-        TypeInfo<Type,Class> parent = prop.parent();
-        if(!(parent instanceof RuntimeClassInfo))
-            return null;
-        
-        Class dc = ((RuntimeClassInfo)parent).getClazz();
-        String newClassName = toVMClassName(dc)+"_JaxbXducedAccessor_"+prop.getName();
-
-
-        if(acc instanceof Accessor.FieldReflection) {
-            // TODO: we also need to make sure that the default xducer is used.
-            Accessor.FieldReflection racc = (Accessor.FieldReflection) acc;
-            Field field = racc.f;
-
-            int mods = field.getModifiers();
-            if(Modifier.isPrivate(mods) || Modifier.isFinal(mods))
-                // we can't access private fields.
-                // TODO: think about how to improve this case
-                return null;
-
-            Class<?> t = field.getType();
-            if(t.isPrimitive())
-                opt = AccessorInjector.prepare( dc,
-                    fieldTemplateName+suffixMap.get(t),
-                    newClassName,
-                    toVMClassName(Bean.class),
-                    toVMClassName(dc),
-                    "f_"+t.getName(),
-                    field.getName() );
-        }
-
-        if(acc.getClass()==Accessor.GetterSetterReflection.class) {
-            Accessor.GetterSetterReflection gacc = (Accessor.GetterSetterReflection) acc;
-
-            if(gacc.getter==null || gacc.setter==null)
-                return null;    // incomplete
-
-            Class<?> t = gacc.getter.getReturnType();
-
-            if(Modifier.isPrivate(gacc.getter.getModifiers())
-            || Modifier.isPrivate(gacc.setter.getModifiers()))
-                // we can't access private methods.
-                return null;
-
-
-            if(t.isPrimitive())
-                opt = AccessorInjector.prepare( dc,
-                    methodTemplateName+suffixMap.get(t),
-                    newClassName,
-                    toVMClassName(Bean.class),
-                    toVMClassName(dc),
-                    "get_"+t.getName(),
-                    gacc.getter.getName(),
-                    "set_"+t.getName(),
-                    gacc.setter.getName());
-        }
-
-        if(opt==null)
-            return null;
-
-        logger.log(Level.FINE,"Using optimized TransducedAccessor for "+prop.displayName());
-
-
-        try {
-            return (TransducedAccessor)opt.newInstance();
-        } catch (InstantiationException e) {
-            logger.log(Level.INFO,"failed to load an optimized TransducedAccessor",e);
-        } catch (IllegalAccessException e) {
-            logger.log(Level.INFO,"failed to load an optimized TransducedAccessor",e);
-        } catch (SecurityException e) {
-            logger.log(Level.INFO,"failed to load an optimized TransducedAccessor",e);
-        }
-        return null;
-    }
-
-    private static final Map<Class,String> suffixMap = new HashMap<Class, String>();
-
-    static {
-        suffixMap.put(Byte.TYPE,"Byte");
-        suffixMap.put(Short.TYPE,"Short");
-        suffixMap.put(Integer.TYPE,"Integer");
-        suffixMap.put(Long.TYPE,"Long");
-        suffixMap.put(Boolean.TYPE,"Boolean");
-        suffixMap.put(Float.TYPE,"Float");
-        suffixMap.put(Double.TYPE,"Double");
-    }
-
-}
diff --git a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/test/AbstractTestMultiRelease.java b/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/test/AbstractTestMultiRelease.java
deleted file mode 100644
index 7dee033..0000000
--- a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/test/AbstractTestMultiRelease.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.test;
-
-import org.junit.Assume;
-import org.junit.Rule;
-import org.junit.rules.TestWatcher;
-import org.junit.runner.Description;
-
-/**
- * Tools for testing multi-release jar, makes possible to skip tests marked for java version above current one.
- *
- * @author Daniel Kec
- * @see SinceJava9
- */
-public abstract class AbstractTestMultiRelease {
-
-    @Rule
-    public TestWatcher javaVersionWatcher = new TestWatcher() {
-        @Override
-        protected void starting(Description description) {
-            if (description.getAnnotation(SinceJava9.class) != null) {
-                if (!isAboveOrEqualJava9()) {
-                    Assume.assumeTrue("Skipping, test is applicable since java 9 and higher.", false);
-                }
-            }
-            super.starting(description);
-        }
-    };
-
-    protected boolean isAboveOrEqualJava9() {
-        try {
-            //Runtime#version is available since java 9
-            Runtime.class.getMethod("version");
-        } catch (NoSuchMethodException e) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/test/SinceJava9.java b/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/test/SinceJava9.java
deleted file mode 100644
index 6cd66ad..0000000
--- a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/test/SinceJava9.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.test;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Marker for test methods which are assumed to be tested only on Java 9 and higher
- *
- * @see AbstractTestMultiRelease
- * @author Daniel Kec
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD})
-public @interface SinceJava9 {
-
-}
diff --git a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/ForeignAccessorTest.java b/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/ForeignAccessorTest.java
deleted file mode 100644
index a718754..0000000
--- a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/ForeignAccessorTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.v2.runtime.reflect.opt;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import jakarta.xml.bind.annotation.XmlAccessType;
-import jakarta.xml.bind.annotation.XmlAccessorType;
-import jakarta.xml.bind.annotation.XmlRootElement;
-import org.glassfish.jaxb.runtime.v2.bytecode.ClassTailor;
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.Accessor;
-import org.junit.Test;
-
-public class ForeignAccessorTest {
-
-    /**
-     * Foreign accessor shouldn't throw ClassCastException, just skip optimization.
-     */
-    @Test
-    public void foreignAccessor() throws NoSuchFieldException{
-        String newClassName = EntityWithForeignAccessor.class.getName().replace('.','/') + "$JaxbAccessorF_author";
-        Class<?> foreignAccessor = AccessorInjector.prepare(EntityWithForeignAccessor.class,
-                ClassTailor.toVMClassName(ForeignAccessorTest.FieldAccessor_Ref.class),
-                newClassName);
-        assertNotNull(foreignAccessor);
-
-        Accessor<Object, Object> accessor = OptimizedAccessorFactory.get(EntityWithForeignAccessor.class.getDeclaredField("author"));
-        assertNull(accessor);
-    }
-    
-    @Test
-    public void knownAccessor() throws NoSuchFieldException {
-        Accessor<Object, Object> accessor = OptimizedAccessorFactory.get(EntityWithKnownAccessor.class.getDeclaredField("author"));
-        assertNotNull(accessor);
-    }
-
-    @XmlRootElement
-    @XmlAccessorType(XmlAccessType.FIELD)
-    static class EntityWithKnownAccessor {
-        String author;
-    }
-
-    @XmlRootElement
-    @XmlAccessorType(XmlAccessType.FIELD)
-    static class EntityWithForeignAccessor {
-        String author;
-    }
-
-    /**
-     * Test template doesn't extend accessor intentionally.
-     */
-    public static class FieldAccessor_Ref /*extends Accessor*/ {
-        public FieldAccessor_Ref() {
-           // super(Ref.class);
-        }
-
-        public Object get(Object bean) {
-            return ((Bean)bean).f_ref;
-        }
-
-        public void set(Object bean, Object value) {
-            ((Bean)bean).f_ref = (Ref)value;
-        }
-    }
-}
diff --git a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizationTest.java b/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizationTest.java
deleted file mode 100644
index e8cda9a..0000000
--- a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizationTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.v2.runtime.reflect.opt;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import jakarta.xml.bind.JAXBContext;
-import jakarta.xml.bind.JAXBException;
-import jakarta.xml.bind.Unmarshaller;
-import jakarta.xml.bind.annotation.XmlRootElement;
-import jakarta.xml.bind.annotation.XmlTransient;
-import java.io.StringReader;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.VarHandle;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-
-/**
- * Test flag for disabling optimization
- * org.glassfish.jaxb.runtime.v2.runtime.reflect.opt.OptimizedAccessorFactory.noOptimization=true/false
- *
- * @author Daniel Kec
- */
-public class OptimizationTest {
-
-    private static final String EXPECTED_ACCESSOR_CLASS_REF = Book.class.getName() + "$JaxbAccessorM_getAuthor_setAuthor_java_lang_String";
-    private static final String OPTIMIZATION_ON = "AUTHOR_EXPECTING_OPTIMIZATION_ON";
-    private static final String OPTIMIZATION_OFF = "AUTHOR_EXPECTING_OPTIMIZATION_OFF";
-    private static final VarHandle MODIFIERS;
-
-    static {
-        try {
-            MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(Field.class, MethodHandles.lookup());
-            MODIFIERS = lookup.findVarHandle(Field.class, "modifiers", int.class);
-        } catch (IllegalAccessException | NoSuchFieldException ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    @Test
-    public void checkNoOptimizationFlagFalse() throws JAXBException {
-        Book book = unmarshal(OPTIMIZATION_ON);
-        Assert.assertTrue(book.errorMessage, book.errorMessage == null);
-        Assert.assertEquals(OPTIMIZATION_ON, book.getAuthor());
-    }
-
-    @Test
-    public void checkNoOptimizationFlagTrue() throws JAXBException, NoSuchFieldException, IllegalAccessException {
-        try {
-            setNoOptimizationFlag(true);
-            Book book = unmarshal(OPTIMIZATION_OFF);
-            Assert.assertTrue(book.errorMessage, book.errorMessage == null);
-            Assert.assertEquals(OPTIMIZATION_OFF, book.getAuthor());
-        } finally {
-            setNoOptimizationFlag(false);
-        }
-    }
-
-    private Book unmarshal(String autor) throws JAXBException {
-        JAXBContext context = JAXBContext.newInstance(Book.class);
-        Unmarshaller unmarshaller = context.createUnmarshaller();
-        return (Book) unmarshaller.unmarshal(new StringReader(
-                String.format("<book><author>%s</author></book>", autor)));
-    }
-
-    private void setNoOptimizationFlag(boolean flag) throws NoSuchFieldException, IllegalAccessException {
-        Field noOptimizationField = OptimizedAccessorFactory.class.getField("noOptimization");
-        noOptimizationField.setAccessible(true);
-        if (Modifier.isFinal(noOptimizationField.getModifiers())) {
-            MODIFIERS.set(noOptimizationField, noOptimizationField.getModifiers() & ~Modifier.FINAL);
-        }
-        noOptimizationField.setBoolean(OptimizedAccessorFactory.class, true);
-    }
-
-    @XmlRootElement
-    static class Book {
-        private String author;
-
-        @XmlTransient
-        String errorMessage = null;
-
-        public String getAuthor() {
-            return author;
-        }
-
-        public void setAuthor(String author) {
-            String artificialInnerClass = null;
-            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
-            for (StackTraceElement el : stackTrace) {
-                System.out.println(el.toString());
-                if (el.getClassName().equals(EXPECTED_ACCESSOR_CLASS_REF)) {
-                    artificialInnerClass = el.getClassName();
-                    break;
-                }
-            }
-
-            if (author.equals(OPTIMIZATION_OFF) && artificialInnerClass != null) {
-                this.errorMessage = String.format("Artificial accessor class detected %s", artificialInnerClass);
-            } else if (author.equals(OPTIMIZATION_ON) && artificialInnerClass == null) {
-                this.errorMessage = String.format("Expected artificial accessor class not found: %s", EXPECTED_ACCESSOR_CLASS_REF);
-            }
-            this.author = author;
-        }
-    }
-}
diff --git a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizationTestMultiRelease.java b/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizationTestMultiRelease.java
deleted file mode 100644
index 39931fc..0000000
--- a/jaxb-ri/runtime/impl/src/test/java/org/glassfish/jaxb/runtime/v2/runtime/reflect/opt/OptimizationTestMultiRelease.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.glassfish.jaxb.runtime.v2.runtime.reflect.opt;
-
-import org.glassfish.jaxb.runtime.test.AbstractTestMultiRelease;
-import org.glassfish.jaxb.runtime.test.SinceJava9;
-import org.glassfish.jaxb.runtime.v2.model.runtime.RuntimePropertyInfo;
-import org.glassfish.jaxb.runtime.v2.runtime.reflect.TransducedAccessor;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.lang.reflect.Field;
-
-/**
- * Test multi release for optimization feature,
- * Feature needs to be disabled since java 9.
- *
- * @author Daniel Kec
- */
-public class OptimizationTestMultiRelease extends AbstractTestMultiRelease {
-
-    @SuppressWarnings("WeakerAccess")
-    public static String TEST_FIELD = "TEST_FIELD";
-
-    @Test
-    @SinceJava9
-    public void testStubbedAccessorInjector() {
-        //Stubbed version doesn't mind null param
-        Assert.assertNull("Injector should always return null since Java 9",
-                AccessorInjector.prepare(null, null, null, null));
-    }
-
-    @Test
-    @SinceJava9
-    public void testStubbedInjector() {
-        //Stubbed version doesn't mind null param
-        Assert.assertNull("Injector should always return null since Java 9",
-                Injector.find(null, null));
-    }
-
-    @Test
-    @SinceJava9
-    public void testStubbedOptimizedAccessorFactory() throws NoSuchFieldException {
-        Field field = this.getClass().getDeclaredField(TEST_FIELD);
-        Assert.assertNull("OptimizedAccessorFactory should always return null since Java 9", OptimizedAccessorFactory.get(field));
-    }
-
-    @Test
-    @SinceJava9
-    @SuppressWarnings("ConstantConditions")
-    public void testStubbedOptimizedTransducedAccessorFactory() throws NoSuchFieldException {
-        final String errMessage = "OptimizedTransducedAccessorFactory should always return null since Java 9";
-        try {
-            //Stubbed version doesn't mind null param
-            TransducedAccessor accessor = OptimizedTransducedAccessorFactory.get((RuntimePropertyInfo) null);
-            Assert.assertNull(errMessage, accessor);
-        } catch (NullPointerException npe) {
-            Assert.fail(errMessage);
-        }
-    }
-
-}
diff --git a/jaxb-ri/tools/config/copyright-exclude b/jaxb-ri/tools/config/copyright-exclude
index 79c07a7..eed5c68 100644
--- a/jaxb-ri/tools/config/copyright-exclude
+++ b/jaxb-ri/tools/config/copyright-exclude
@@ -1,7 +1,6 @@
 /MANIFEST.MF
 /META-INF/services/
 /README
-.iml
 .gif
 .jpg
 .png
