diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AbstractObjectDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AbstractObjectDescriptor.java
index 8a64c50..9c81bce 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AbstractObjectDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AbstractObjectDescriptor.java
@@ -18,6 +18,13 @@
 
 package org.apache.yoko.rmi.impl;
 
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
+
+import java.io.PrintWriter;
+
 class AbstractObjectDescriptor extends ValueDescriptor {
     protected AbstractObjectDescriptor(Class type, TypeRepository repository) {
         super(type, repository);
@@ -25,54 +32,43 @@
 
     @Override
     protected String genRepId() {
-        return String.format("IDL:%s:1.0", _java_class.getName().replace('.', '/'));
+        return String.format("IDL:%s:1.0", type.getName().replace('.', '/'));
     }
 
     /** Read an instance of this value from a CDR stream */
-    public Object read(org.omg.CORBA.portable.InputStream in) {
+    @Override
+    public Object read(InputStream in) {
         org.omg.CORBA_2_3.portable.InputStream _in = (org.omg.CORBA_2_3.portable.InputStream) in;
 
         return _in.read_abstract_interface();
     }
 
     /** Write an instance of this value to a CDR stream */
-    public void write(org.omg.CORBA.portable.OutputStream out, Object value) {
+    @Override
+    public void write(OutputStream out, Object value) {
         org.omg.CORBA_2_3.portable.OutputStream _out = (org.omg.CORBA_2_3.portable.OutputStream) out;
 
         _out.write_abstract_interface(value);
     }
 
-    /*
-     * public java.io.Serializable writeReplace (java.io.Serializable val) {
-     * return null; }
-     * 
-     * public void writeValue(org.omg.CORBA.portable.OutputStream out,
-     * java.io.Serializable value) { // skip // }
-     * 
-     * public java.io.Serializable readValue (org.omg.CORBA.portable.InputStream
-     * in, java.util.Map offsetMap) { return null; }
-     */
-
-    org.omg.CORBA.TypeCode getTypeCode() {
-        if (_type_code == null) {
-            org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();
-            _type_code = orb.create_abstract_interface_tc(getRepositoryID(),
-                    _java_class.getName());
-        }
-
-        return _type_code;
+    @Override
+    protected TypeCode genTypeCode() {
+        ORB orb = ORB.init();
+        return orb.create_abstract_interface_tc(getRepositoryID(), type.getName());
     }
 
+    @Override
     public long computeHashCode() {
         return 0L;
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         throw new IllegalStateException("not serializable " + value.getClass().getName());
     }
 
-    void writeMarshalValue(java.io.PrintWriter pw, String outName,
-            String paramName) {
+    @Override
+    void writeMarshalValue(PrintWriter pw, String outName, String paramName) {
         pw.print("javax.rmi.CORBA.Util.writeAbstractObject(");
         pw.print(outName);
         pw.print(',');
@@ -80,9 +76,9 @@
         pw.print(')');
     }
 
-    void writeUnmarshalValue(java.io.PrintWriter pw, String inName) {
+    @Override
+    void writeUnmarshalValue(PrintWriter pw, String inName) {
         pw.print(inName);
         pw.print(".read_abstract_interface()");
     }
-
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AnyDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AnyDescriptor.java
index faabb00..aad6973 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AnyDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/AnyDescriptor.java
@@ -18,6 +18,14 @@
 
 package org.apache.yoko.rmi.impl;
 
+import java.io.PrintWriter;
+
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.TCKind;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
+
 class AnyDescriptor extends TypeDescriptor {
     AnyDescriptor(Class type, TypeRepository rep) {
         super(type, rep);
@@ -25,30 +33,34 @@
 
     @Override
     protected String genRepId() {
-        return String.format("IDL:%s:1.0", _java_class.getName().replace('.', '/'));
+        return String.format("IDL:%s:1.0", type.getName().replace('.', '/'));
     }
 
     /** Read an instance of this value from a CDR stream */
-    public Object read(org.omg.CORBA.portable.InputStream in) {
+    @Override
+    public Object read(InputStream in) {
         return javax.rmi.CORBA.Util.readAny(in);
     }
 
     /** Write an instance of this value to a CDR stream */
-    public void write(org.omg.CORBA.portable.OutputStream out, Object val) {
+    @Override
+    public void write(OutputStream out, Object val) {
         javax.rmi.CORBA.Util.writeAny(out, val);
     }
 
-    org.omg.CORBA.TypeCode getTypeCode() {
-        org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();
-        return orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_any);
+    @Override
+    protected TypeCode genTypeCode() {
+        ORB orb = ORB.init();
+        return orb.get_primitive_tc(TCKind.tk_any);
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         throw new InternalError("cannot copy org.omg.CORBA.Any");
     }
 
-    void writeMarshalValue(java.io.PrintWriter pw, String outName,
-            String paramName) {
+    @Override
+    void writeMarshalValue(PrintWriter pw, String outName, String paramName) {
         pw.print("javax.rmi.CORBA.Util.writeAny(");
         pw.print(outName);
         pw.print(',');
@@ -56,10 +68,10 @@
         pw.print(')');
     }
 
-    void writeUnmarshalValue(java.io.PrintWriter pw, String inName) {
+    @Override
+    void writeUnmarshalValue(PrintWriter pw, String inName) {
         pw.print("javax.rmi.CORBA.Util.readAny(");
         pw.print(inName);
         pw.print(")");
     }
-
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java
index 1a5f7cb..2cedbfa 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java
@@ -18,41 +18,64 @@
 
 package org.apache.yoko.rmi.impl;
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.PrintWriter;
 import java.io.Serializable;
 import java.lang.reflect.Array;
+import java.rmi.Remote;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
 import java.util.Map;
+import java.util.Set;
 import java.util.logging.Logger;
 
 import org.omg.CORBA.MARSHAL;
 import org.omg.CORBA.ORB;
 import org.omg.CORBA.TypeCode;
 import org.omg.CORBA.ValueMember;
+import org.omg.CORBA.portable.IndirectionException;
 import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
 
 abstract class ArrayDescriptor extends ValueDescriptor {
-    protected int order;
+    final Class elementType;
+    final Class basicType;
+    private final int order;
 
-    protected Class basicType;
+    protected ArrayDescriptor(Class type, Class elemType, TypeRepository rep) {
+        super(type, rep);
+        logger.fine("Creating an array descriptor for type " + type.getName() + " holding elements of " + elemType.getName());
+        this.elementType = elemType;
 
-    protected Class elementType;
-    // repository ID for the contained elements
-    private volatile String _elementRepid = null;
+        int order = 1;
+        Class basicType = elemType;
+        while (basicType.isArray()) {
+            basicType = basicType.getComponentType();
+            order++;
+        }
+        this.basicType = basicType;
+        this.order = order;
+    }
 
     @Override
     protected String genRepId() {
         if (elementType.isPrimitive() || elementType == Object.class)
-            return String.format("RMI:%s:%016X", _java_class.getName(), 0);
+            return String.format("RMI:%s:%016X", type.getName(), 0);
 
         TypeDescriptor desc = repo.getDescriptor(elementType);
         String elemRep = desc.getRepositoryID();
         String hash = elemRep.substring(elemRep.indexOf(':', 4));
-        return String.format("RMI:%s:%s", _java_class.getName(), hash);
+        return String.format("RMI:%s:%s", type.getName(), hash);
     }
 
+    // repository ID for the contained elements
+    private volatile String _elementRepid = null;
     private final String genElemRepId() {
         if (elementType.isPrimitive() || elementType == Object.class) {
             // use the descriptor type past the array type marker
-            return String.format("RMI:%s:%016X", _java_class.getName().substring(1), 0);
+            return String.format("RMI:%s:%016X", type.getName().substring(1), 0);
         }
         return repo.getDescriptor(elementType).getRepositoryID();
     }
@@ -62,20 +85,8 @@
         return _elementRepid;
     }
 
-    protected ArrayDescriptor(Class type, Class elemType, TypeRepository rep) {
-        super(type, rep);
-        logger.fine("Creating an array descriptor for type " + type.getName() + " holding elements of " + elemType.getName()); 
-        this.elementType = elemType;
-
-        order = 1;
-        basicType = elemType;
-        while (basicType.isArray()) {
-            basicType = basicType.getComponentType();
-            order += 1;
-        }
-    }
-
-    public String getIDLName() {
+    @Override
+    protected final String genIDLName() {
         StringBuffer sb = new StringBuffer("org_omg_boxedRMI_");
 
         TypeDescriptor desc = repo.getDescriptor(basicType);
@@ -112,7 +123,7 @@
     }
 
     static ArrayDescriptor get(final Class type, TypeRepository rep) {
-        logger.fine("retrieving an array descriptor for class " + type.getName()); 
+        logger.fine("retrieving an array descriptor for class " + type.getName());
         if (!type.isArray()) {
             throw new IllegalArgumentException("type is not an array");
         }
@@ -120,7 +131,6 @@
         Class elemType = type.getComponentType();
 
         if (elemType.isPrimitive()) {
-
             if (elemType == Boolean.TYPE) {
                 return new BooleanArrayDescriptor(type, elemType, rep);
             } else if (elemType == Byte.TYPE) {
@@ -141,53 +151,51 @@
                 throw new RuntimeException("unknown array type " + type);
             }
         }
-        if (java.io.Serializable.class.equals(elemType) || 
-                java.io.Externalizable.class.equals(elemType) || Object.class.equals(elemType)) {
+        if (Serializable.class.equals(elemType) ||
+                Externalizable.class.equals(elemType) || Object.class.equals(elemType)) {
             return new ObjectArrayDescriptor(type, elemType, rep);
-
-        } else if (java.io.Serializable.class.isAssignableFrom(elemType)) {
-            return new ValueArrayDescriptor(type, elemType, rep);
-
-        } else if (java.rmi.Remote.class.isAssignableFrom(elemType)) {
+        } else if (Remote.class.isAssignableFrom(elemType)) {
             return new RemoteArrayDescriptor(type, elemType, rep);
-
+        } else if (Serializable.class.isAssignableFrom(elemType)) {
+            return new ValueArrayDescriptor(type, elemType, rep);
         } else {
             return new AbstractObjectArrayDescriptor(type, elemType, rep);
         }
-
     }
 
     /**
      * Read an instance of this value from a CDR stream. Overridden to provide a
      * specific type
      */
-    public Object read(org.omg.CORBA.portable.InputStream in) {
+    @Override
+    public Object read(InputStream in) {
         org.omg.CORBA_2_3.portable.InputStream _in = (org.omg.CORBA_2_3.portable.InputStream) in;
-        logger.fine("Reading an array value with repository id " + getRepositoryID() + " java class is " + _java_class);
-        
-        // if we have a resolved class, read using that, otherwise fall back on the 
-        // repository id. 
-        return ((null == _java_class) ? _in.read_value(getRepositoryID()) : _in.read_value(_java_class));
+        logger.fine("Reading an array value with repository id " + getRepositoryID() + " java class is " + type);
+
+        // if we have a resolved class, read using that, otherwise fall back on the
+        // repository id.
+        return ((null == type) ? _in.read_value(getRepositoryID()) : _in.read_value(type));
     }
 
     /** Write an instance of this value to a CDR stream */
-    public void write(org.omg.CORBA.portable.OutputStream out, Object value) {
+    @Override
+    public void write(OutputStream out, Object value) {
         org.omg.CORBA_2_3.portable.OutputStream _out = (org.omg.CORBA_2_3.portable.OutputStream) out;
 
-        _out.write_value((java.io.Serializable)value, getRepositoryID());
+        _out.write_value((Serializable)value, getRepositoryID());
     }
 
-    org.omg.CORBA.ValueMember[] getValueMembers() {
+    ValueMember[] getValueMembers() {
 
         if (_value_members == null) {
 
-            _value_members = new org.omg.CORBA.ValueMember[1];
+            _value_members = new ValueMember[1];
 
             TypeDescriptor elemDesc = repo.getDescriptor(elementType);
 
             String elemRepID = elemDesc.getRepositoryID();
 
-            ORB orb = org.omg.CORBA.ORB.init();
+            ORB orb = ORB.init();
             TypeCode memberTC = orb.create_sequence_tc(0, elemDesc
                     .getTypeCode());
 
@@ -200,10 +208,23 @@
         return _value_members;
     }
 
-    void addDependencies(java.util.Set classes) {
+    @Override
+    void addDependencies(Set classes) {
         repo.getDescriptor(basicType).addDependencies(classes);
     }
 
+    final CorbaObjectReader makeCorbaObjectReader(final InputStream in, final Map offsetMap, final Serializable obj)
+            throws IOException {
+        try {
+            return AccessController.doPrivileged(new PrivilegedExceptionAction<CorbaObjectReader>() {
+                public CorbaObjectReader run() throws IOException {
+                    return new CorbaObjectReader(in, offsetMap, obj);
+                }
+            });
+        } catch (PrivilegedActionException e) {
+            throw (IOException)e.getException();
+        }
+    }
 }
 
 class ObjectArrayDescriptor extends ArrayDescriptor {
@@ -213,15 +234,15 @@
         super(type, elemType, rep);
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
+    @Override
+    public void writeValue(OutputStream out, Serializable value) {
         // System.out.println ("ObjectArrayDescriptor::writeValue
         // "+getRepositoryID ());
 
         Object[] arr = (Object[]) value;
         out.write_long(arr.length);
 
-        logger.finer("writing " + _java_class.getName() + " size="
+        logger.finer("writing " + type.getName() + " size="
                 + arr.length);
 
         for (int i = 0; i < arr.length; i++) {
@@ -229,8 +250,9 @@
         }
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         try {
             ObjectReader reader = makeCorbaObjectReader(in, offsetMap, null);
@@ -240,7 +262,7 @@
 
             offsetMap.put(key, arr);
 
-            logger.fine("reading " + _java_class.getName() + " size="
+            logger.fine("reading " + type.getName() + " size="
                     + arr.length);
 
             for (int i = 0; i < length; i++) {
@@ -252,19 +274,20 @@
                     else {
                         logger.finer("Array item " + i + " is null"); 
                     }
-                } catch (org.omg.CORBA.portable.IndirectionException ex) {
+                } catch (IndirectionException ex) {
                     arr[i] = offsetMap.get(new Integer(ex.offset));
                     // reader.addValueBox (ex.offset, new ArrayBox (i, arr));
                 }
             }
-            return (java.io.Serializable) arr;
+            return arr;
 
-        } catch (java.io.IOException ex) {
+        } catch (IOException ex) {
             throw (MARSHAL)new MARSHAL(ex.getMessage()).initCause(ex);
         }
 
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         final Object[] orig = (Object[]) value;
         final Object[] result = new Object[orig.length];
@@ -287,7 +310,8 @@
         return result;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         Object[] arr = (Object[]) val;
         TypeDescriptor desc = repo.getDescriptor(elementType);
         pw.print("length=" + arr.length + "; ");
@@ -306,11 +330,9 @@
         super(type, elemType, rep);
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
-        // System.out.println ("RemoteArrayDescriptor::writeValue
-        // "+getRepositoryID ());
-
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         Object[] arr = (Object[]) value;
         out.write_long(arr.length);
         for (int i = 0; i < arr.length; i++) {
@@ -318,8 +340,9 @@
         }
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         try {
             ObjectReader reader = makeCorbaObjectReader(in, offsetMap, null);
@@ -331,20 +354,21 @@
             for (int i = 0; i < length; i++) {
                 try {
                     arr[i] = reader.readRemoteObject(elementType);
-                } catch (org.omg.CORBA.portable.IndirectionException ex) {
+                } catch (IndirectionException ex) {
                     arr[i] = offsetMap.get(new Integer(ex.offset));
                     // reader.addValueBox (ex.offset, new ArrayBox (i, arr));
                 }
             }
 
-            return (java.io.Serializable) arr;
+            return arr;
 
-        } catch (java.io.IOException ex) {
+        } catch (IOException ex) {
             throw (MARSHAL)new MARSHAL(ex.getMessage()).initCause(ex);
         }
 
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         final Object[] orig = (Object[]) value;
         final Object[] result = (Object[]) Array.newInstance(elementType,
@@ -368,7 +392,8 @@
         return result;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         Object[] arr = (Object[]) val;
         TypeDescriptor desc = repo.getDescriptor(elementType);
         pw.print("length=" + arr.length + "; ");
@@ -387,19 +412,19 @@
         super(type, elemType, rep);
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
-        // System.out.println ("ValueArrayDescriptor::writeValue
-        // "+getRepositoryID ());
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         Object[] arr = (Object[]) value;
         out.write_long(arr.length);
-        java.io.Serializable[] sarr = (java.io.Serializable[]) arr;
+        Serializable[] sarr = (Serializable[]) arr;
         org.omg.CORBA_2_3.portable.OutputStream _out = (org.omg.CORBA_2_3.portable.OutputStream) out;
         for (int i = 0; i < sarr.length; i++) {
             _out.write_value(sarr[i], getElementRepositoryID());
         }
     }
 
+    @Override
     public Serializable readValue(InputStream in, Map offsetMap, Integer key) {
         final int length = in.read_long();
         Object[] arr = (Object[]) Array.newInstance(elementType, length);
@@ -409,7 +434,7 @@
         for (int i = 0; i < length; i++) {
             try {
                 arr[i] = _in.read_value(elementType);
-            } catch (org.omg.CORBA.portable.IndirectionException ex) {
+            } catch (IndirectionException ex) {
                 arr[i] = offsetMap.get(new Integer(ex.offset));
             }
         }
@@ -417,6 +442,7 @@
         return arr;
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         Object[] orig = (Object[]) value;
         final Object[] result = (Object[]) Array.newInstance(value.getClass()
@@ -440,7 +466,8 @@
         return result;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         Object[] arr = (Object[]) val;
         TypeDescriptor desc = repo.getDescriptor(elementType);
         pw.print("length=" + arr.length + "; ");
@@ -459,10 +486,9 @@
         super(type, elemType, rep);
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
-        // System.out.println ("AbstractObjectArrayDescriptor::writeValue
-        // "+getRepositoryID ());
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
 
         Object[] arr = (Object[]) value;
         out.write_long(arr.length);
@@ -471,8 +497,9 @@
         }
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         try {
             ObjectReader reader = makeCorbaObjectReader(in, offsetMap, null);
@@ -485,19 +512,20 @@
             for (int i = 0; i < length; i++) {
                 try {
                     arr[i] = reader.readAbstractObject();
-                } catch (org.omg.CORBA.portable.IndirectionException ex) {
+                } catch (IndirectionException ex) {
                     arr[i] = offsetMap.get(new Integer(ex.offset));
                     // reader.addValueBox (ex.offset, new ArrayBox (i, arr));
                 }
             }
 
-            return (java.io.Serializable) arr;
+            return arr;
 
-        } catch (java.io.IOException ex) {
+        } catch (IOException ex) {
             throw (MARSHAL)new MARSHAL(ex.getMessage()).initCause(ex);
         }
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         final Object[] orig = (Object[]) value;
         final Object[] result = (Object[]) Array.newInstance(elementType,
@@ -521,7 +549,8 @@
         return result;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         Object[] arr = (Object[]) val;
         TypeDescriptor desc = repo.getDescriptor(elementType);
         pw.print("length=" + arr.length + "; ");
@@ -540,19 +569,21 @@
         super(type, elemType, rep);
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         boolean[] arr = new boolean[in.read_long()];
         offsetMap.put(key, arr);
         for (int i = 0; i < arr.length; i++) {
             arr[i] = in.read_boolean();
         }
-        return (java.io.Serializable) arr;
+        return arr;
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         boolean[] arr = (boolean[]) value;
         out.write_long(arr.length);
         for (int i = 0; i < arr.length; i++) {
@@ -560,6 +591,7 @@
         }
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         if (((boolean[]) value).length == 0)
             return value;
@@ -569,7 +601,8 @@
         return copy;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         boolean[] arr = (boolean[]) val;
         pw.print("length=" + arr.length + "; ");
         for (int i = 0; i < arr.length; i++) {
@@ -583,34 +616,32 @@
 }
 
 class ByteArrayDescriptor extends ArrayDescriptor {
-
     ByteArrayDescriptor(Class type, Class elemType, TypeRepository rep) {
         super(type, elemType, rep);
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         byte[] arr = new byte[in.read_long()];
         offsetMap.put(key, arr);
         for (int i = 0; i < arr.length; i++) {
             arr[i] = in.read_octet();
         }
-        return (java.io.Serializable) arr;
+        return arr;
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         byte[] arr = (byte[]) value;
         out.write_long(arr.length);
 
         out.write_octet_array(arr, 0, arr.length);
-
-        // for (int i = 0; i < arr.length; i++) {
-        // out.write_octet(arr[i]);
-        // }
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         if (((byte[]) value).length == 0)
             return value;
@@ -620,7 +651,8 @@
         return copy;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         byte[] arr = (byte[]) val;
         pw.print("length=" + arr.length + "; ");
         for (int i = 0; i < arr.length; i++) {
@@ -637,23 +669,26 @@
         super(type, elemType, rep);
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         int len = in.read_long();
         char[] arr = new char[len];
         offsetMap.put(key, arr);
         in.read_wchar_array(arr, 0, len);
-        return (java.io.Serializable) arr;
+        return arr;
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         char[] arr = (char[]) value;
         out.write_long(arr.length);
         out.write_wchar_array(arr, 0, arr.length);
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         if (((char[]) value).length == 0)
             return value;
@@ -663,7 +698,8 @@
         return copy;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         char[] arr = (char[]) val;
         pw.print("length=" + arr.length + "; ");
         for (int i = 0; i < arr.length; i++) {
@@ -680,19 +716,21 @@
         super(type, elemType, rep);
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         short[] arr = new short[in.read_long()];
         offsetMap.put(key, arr);
         for (int i = 0; i < arr.length; i++) {
             arr[i] = in.read_short();
         }
-        return (java.io.Serializable) arr;
+        return arr;
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         short[] arr = (short[]) value;
         out.write_long(arr.length);
         for (int i = 0; i < arr.length; i++) {
@@ -700,6 +738,7 @@
         }
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         if (((short[]) value).length == 0)
             return value;
@@ -709,7 +748,8 @@
         return copy;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         short[] arr = (short[]) val;
         pw.print("length=" + arr.length + "; ");
         for (int i = 0; i < arr.length; i++) {
@@ -726,19 +766,21 @@
         super(type, elemType, rep);
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         int[] arr = new int[in.read_long()];
         offsetMap.put(key, arr);
         for (int i = 0; i < arr.length; i++) {
             arr[i] = in.read_long();
         }
-        return (java.io.Serializable) arr;
+        return arr;
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         int[] arr = (int[]) value;
         out.write_long(arr.length);
         for (int i = 0; i < arr.length; i++) {
@@ -746,6 +788,7 @@
         }
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         if (((int[]) value).length == 0)
             return value;
@@ -755,7 +798,8 @@
         return copy;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         int[] arr = (int[]) val;
         pw.print("length=" + arr.length + "; ");
         for (int i = 0; i < arr.length; i++) {
@@ -772,19 +816,21 @@
         super(type, elemType, rep);
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         long[] arr = new long[in.read_long()];
         offsetMap.put(key, arr);
         for (int i = 0; i < arr.length; i++) {
             arr[i] = in.read_longlong();
         }
-        return (java.io.Serializable) arr;
+        return arr;
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         long[] arr = (long[]) value;
         out.write_long(arr.length);
         for (int i = 0; i < arr.length; i++) {
@@ -792,6 +838,7 @@
         }
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         if (((long[]) value).length == 0)
             return value;
@@ -801,7 +848,8 @@
         return copy;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         long[] arr = (long[]) val;
         pw.print("length=" + arr.length + "; ");
         for (int i = 0; i < arr.length; i++) {
@@ -819,19 +867,21 @@
         super(type, elemType, rep);
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         float[] arr = new float[in.read_long()];
         offsetMap.put(key, arr);
         for (int i = 0; i < arr.length; i++) {
             arr[i] = in.read_float();
         }
-        return (java.io.Serializable) arr;
+        return arr;
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         float[] arr = (float[]) value;
         out.write_long(arr.length);
         for (int i = 0; i < arr.length; i++) {
@@ -839,6 +889,7 @@
         }
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         if (((float[]) value).length == 0)
             return value;
@@ -848,7 +899,8 @@
         return copy;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         float[] arr = (float[]) val;
         pw.print("length=" + arr.length + "; ");
         for (int i = 0; i < arr.length; i++) {
@@ -865,19 +917,21 @@
         super(type, elemType, rep);
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.util.Map offsetMap,
+    @Override
+    public Serializable readValue(
+            InputStream in, Map offsetMap,
             Integer key) {
         double[] arr = new double[in.read_long()];
         offsetMap.put(key, arr);
         for (int i = 0; i < arr.length; i++) {
             arr[i] = in.read_double();
         }
-        return (java.io.Serializable) arr;
+        return arr;
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
+    @Override
+    public void writeValue(OutputStream out,
+            Serializable value) {
         double[] arr = (double[]) value;
         out.write_long(arr.length);
         for (int i = 0; i < arr.length; i++) {
@@ -885,6 +939,7 @@
         }
     }
 
+    @Override
     Object copyObject(Object value, CopyState state) {
         if (((double[]) value).length == 0)
             return value;
@@ -894,7 +949,8 @@
         return copy;
     }
 
-    void printFields(java.io.PrintWriter pw, java.util.Map recurse, Object val) {
+    @Override
+    void printFields(PrintWriter pw, Map recurse, Object val) {
         double[] arr = (double[]) val;
         pw.print("length=" + arr.length + "; ");
         for (int i = 0; i < arr.length; i++) {
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassBaseDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassBaseDescriptor.java
index debb1ec..708faea 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassBaseDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassBaseDescriptor.java
@@ -1,41 +1,47 @@
 package org.apache.yoko.rmi.impl;
 
+import org.omg.CORBA.MARSHAL;
+
+import javax.rmi.CORBA.ClassDesc;
 import java.lang.reflect.Field;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
-import javax.rmi.CORBA.ClassDesc;
-
-import org.omg.CORBA.MARSHAL;
-
 abstract class ClassBaseDescriptor extends ValueDescriptor {
 
     ClassBaseDescriptor(Class type, TypeRepository repository) {
         super(type, repository);
     }
 
-    @Override
-    public void init() {
-        super.init();
+    private volatile Field repidField = null;
+    private Field genRepIdField() {
+        return findField("repid");
+    }
+    final Field getRepidField() {
+        if (null == repidField) repidField = genRepIdField();
+        return repidField;
+    }
 
-        final Class<?> clz = ClassDesc.class;
+    private volatile Field cobebaseField = null;
+    private Field genCodebaseField() {
+        return findField("codebase");
+    }
+    final Field getCobebaseField() {
+        if (null == cobebaseField) cobebaseField = genCodebaseField();
+        return cobebaseField;
+    }
 
-        AccessController.doPrivileged(new PrivilegedAction<Void>() {
-            @Override
-            public Void run() {
+    private Field findField(final String fieldName) {
+        return AccessController.doPrivileged(new PrivilegedAction<Field>() {
+            public Field run() {
                 try {
-                    final Field repid_field = clz.getDeclaredField("repid");
-                    repid_field.setAccessible(true);
-                    final Field codebase_field = clz.getDeclaredField("codebase");
-                    codebase_field.setAccessible(true);
-                    init(repid_field, codebase_field);
-                } catch (NoSuchFieldException ex) {
-                    throw (MARSHAL)new MARSHAL("no such field: " + ex).initCause(ex);
+                    Field f = ClassDesc.class.getDeclaredField(fieldName);
+                    f.setAccessible(true);
+                    return f;
+                } catch (NoSuchFieldException e) {
+                    throw (MARSHAL)new MARSHAL("no such field: " + e).initCause(e);
                 }
-                return null;
             }
         });
     }
-
-    abstract void init(Field repid_field, Field codebase_field);
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassDescDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassDescDescriptor.java
index 1a93939..8106755 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassDescDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassDescDescriptor.java
@@ -16,19 +16,10 @@
 class ClassDescDescriptor extends ClassBaseDescriptor {
     private static final Logger logger = Logger.getLogger(ClassDescDescriptor.class.getName());
 
-    private Field repid_field;
-    private Field codebase_field;
-
     ClassDescDescriptor(TypeRepository repository) {
         super(ClassDesc.class, repository);
     }
 
-    @Override
-    void init(Field repid_field, Field codebase_field) {
-        this.repid_field = repid_field;
-        this.codebase_field = codebase_field;
-    }
-
     /** Read an instance of this value from a CDR stream */
     @Override
     public Serializable readResolve(final Serializable value) {
@@ -38,8 +29,8 @@
             public Class<?> run() {
                 String className = "<unknown>";
                 try {
-                    String repid = (String) repid_field.get(desc);
-                    String codebase = (String) codebase_field.get(desc);
+                    String repid = (String) getRepidField().get(desc);
+                    String codebase = (String) getCobebaseField().get(desc);
 
                     Class<?> result = RepIds.query(repid).codebase(codebase).toClass();
                     if (null != result) return result;
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassDescriptor.java
index d296aed..6389139 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ClassDescriptor.java
@@ -34,20 +34,11 @@
 class ClassDescriptor extends ClassBaseDescriptor {
     private static final Logger logger = Logger.getLogger(ClassDescriptor.class.getName());
 
-    private Field repid_field;
-    private Field codebase_field;
-
     ClassDescriptor(TypeRepository repository) {
         super(Class.class, repository);
     }
 
     @Override
-    void init(Field repid_field, Field codebase_field) {
-        this.repid_field = repid_field;
-        this.codebase_field = codebase_field;
-    }
-
-    @Override
     Object copyObject(Object orig, CopyState state) {
         state.put(orig, orig);
         return orig;
@@ -66,10 +57,10 @@
 
                             ValueHandler handler = Util.createValueHandler();
                             String repId = handler.getRMIRepositoryID(type);
-                            repid_field.set(desc, repId);
+                            getRepidField().set(desc, repId);
 
                             String codebase = Util.getCodebase(type);
-                            codebase_field.set(desc, codebase);
+                            getCobebaseField().set(desc, codebase);
 
                             return desc;
 
@@ -84,5 +75,4 @@
 
         return result;
     }
-
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/DateValueDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/DateValueDescriptor.java
index bfc500c..562312e 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/DateValueDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/DateValueDescriptor.java
@@ -43,5 +43,4 @@
         state.put(orig, result);
         return result;
     }
-
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumDescriptor.java
index 44e692c..84478ca 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumDescriptor.java
@@ -19,11 +19,9 @@
 package org.apache.yoko.rmi.impl;
 
 import org.apache.yoko.util.yasf.Yasf;
-import org.apache.yoko.util.yasf.YasfThreadLocal;
 
 import java.io.IOException;
 import java.io.Serializable;
-import java.util.Set;
 
 class EnumDescriptor extends ValueDescriptor {
     public EnumDescriptor(Class<?> type, TypeRepository repo) {
@@ -58,7 +56,6 @@
 
     @Override
     protected void defaultWriteValue(ObjectWriter writer, Serializable val) throws IOException {
-        checkInit();
         if ((writer.yasfSet != null) && !!!writer.yasfSet.contains(Yasf.ENUM_FIXED)) {
             // talking to an old yoko that expects an ordinal field to be written;
             ordinalField.write(writer, val);
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumSubclassDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumSubclassDescriptor.java
index 12c34c6..9ba2f4b 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumSubclassDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumSubclassDescriptor.java
@@ -18,14 +18,13 @@
 
 package org.apache.yoko.rmi.impl;
 
+import org.omg.CORBA.portable.IndirectionException;
+import org.omg.CORBA.portable.InputStream;
+
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.Map;
 
-import org.apache.yoko.rmi.util.StringUtil;
-import org.omg.CORBA.portable.IndirectionException;
-import org.omg.CORBA.portable.InputStream;
-
 class EnumSubclassDescriptor extends ValueDescriptor {
     @SuppressWarnings("rawtypes")
     private final Class enumType;
@@ -42,12 +41,6 @@
     }
 
     @Override
-    public final void init() {
-        super.init();
-        // Avoid doing anything that would cause the calculated classHash to change
-    }
-
-    @Override
     protected final long getSerialVersionUID() {
         return 0L;
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ExceptionDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ExceptionDescriptor.java
index 166a202..691a566 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ExceptionDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ExceptionDescriptor.java
@@ -26,7 +26,7 @@
     private volatile String ex_repid = null;
 
     private String genExceptionRepId() {
-        String name = _java_class.getName();
+        String name = type.getName();
         final String encname;
 
         if (name.endsWith("Exception")) {
@@ -38,7 +38,7 @@
         return String.format("IDL:%s:1.0", encname.replace('.', '/'));
     }
 
-    public final String getExceptionRepositoryID() {
+    final String getExceptionRepositoryID() {
         if (ex_repid == null) ex_repid = genExceptionRepId();
         return ex_repid;
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumDescriptor.java
index 9c7de4f..f6e42dc 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumDescriptor.java
@@ -46,7 +46,7 @@
     }
 
     @Override
-    TypeCode getTypeCode() {
+    protected TypeCode genTypeCode() {
         return fvd.type;
     }
 
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumSubclassDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumSubclassDescriptor.java
index 9d8f2c3..5b07d69 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumSubclassDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDEnumSubclassDescriptor.java
@@ -48,7 +48,7 @@
     }
 
     @Override
-    TypeCode getTypeCode() {
+    protected final TypeCode genTypeCode() {
         return fvd.type;
     }
 
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDValueDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDValueDescriptor.java
index ad379af..1b353be 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDValueDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/FVDValueDescriptor.java
@@ -18,16 +18,15 @@
 package org.apache.yoko.rmi.impl;
 
 import org.omg.CORBA.TypeCode;
-import org.omg.CORBA.ValueMember;
 import org.omg.CORBA.ValueDefPackage.FullValueDescription;
+import org.omg.CORBA.ValueMember;
 
 /**
  * @author krab
  */
 class FVDValueDescriptor extends ValueDescriptor {
-    FullValueDescription fvd;
-
-    String repid;
+    final FullValueDescription fvd;
+    final String repid;
 
     FVDValueDescriptor(FullValueDescription fvd, Class clazz,
             TypeRepository rep, String repid, ValueDescriptor super_desc) {
@@ -61,10 +60,10 @@
         _fields = new_fields;
     }
 
-    FieldDescriptor findField(ValueMember valueMember) {
+    private FieldDescriptor findField(ValueMember valueMember) {
         FieldDescriptor result = null;
 
-        for (Class c = _java_class; c != null; c = c.getSuperclass()) {
+        for (Class c = type; c != null; c = c.getSuperclass()) {
             TypeDescriptor td = repo.getDescriptor(c);
             if (td instanceof ValueDescriptor) {
                 ValueDescriptor vd = (ValueDescriptor) td;
@@ -90,26 +89,18 @@
         return repid;
     }
 
+    @Override
     org.omg.CORBA.ValueDefPackage.FullValueDescription getFullValueDescription() {
         return fvd;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.yoko.rmi.impl.TypeDescriptor#getTypeCode()
-     */
-    public TypeCode getTypeCode() {
+    @Override
+    protected final TypeCode genTypeCode() {
         return fvd.type;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.yoko.rmi.impl.TypeDescriptor#isCustomMarshalled()
-     */
+    @Override
     public boolean isCustomMarshalled() {
         return fvd.is_custom;
     }
-
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IDLEntityDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IDLEntityDescriptor.java
index 11dc546..c7949fe 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IDLEntityDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/IDLEntityDescriptor.java
@@ -18,111 +18,83 @@
 
 package org.apache.yoko.rmi.impl;
 
+import org.omg.CORBA.MARSHAL;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.ObjectImpl;
+import org.omg.CORBA.portable.OutputStream;
+
+import javax.rmi.CORBA.Util;
+import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-
-import org.omg.CORBA.MARSHAL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Map;
 
 class IDLEntityDescriptor extends ValueDescriptor {
-    Method _read_method;
-
-    Method _write_method;
-
-    Method _type_method;
-
-    boolean isAbstract = false;
-
-    boolean isCorba = false; 
+    private final boolean isCorba;
+    private final Class helperType;
 
     IDLEntityDescriptor(Class type, TypeRepository repository) {
         super(type, repository);
 
-        if (org.omg.CORBA.Object.class.isAssignableFrom(type)) {
-            isCorba = true; 
+        isCorba = org.omg.CORBA.Object.class.isAssignableFrom(type);
+        try {
+            final String helperName = type.getName() + "Helper";
+            helperType = Util.loadClass(helperName, null, type.getClassLoader());
+        } catch (ClassNotFoundException ex) {
+            throw new RuntimeException("cannot load IDL Helper class for "
+                    + type, ex);
         }
     }
 
-    public String getIDLName() {
-        return "org_omg_boxedIDL_" + super.getIDLName();
-    }
-
     @Override
-    public void init() {
-        super.init();
-
-        try {
-            final Class type = _java_class;
-            final String helperName = type.getName() + "Helper";
-            final Class helperClass = javax.rmi.CORBA.Util.loadClass(
-                    helperName, null, type.getClassLoader());
-
-            java.security.AccessController
-                    .doPrivileged(new java.security.PrivilegedAction() {
-                        public Object run() {
-
-                            try {
-                                Method _id_method = null;
-                                Method[] methods = helperClass
-                                        .getDeclaredMethods();
-                                for (int i = 0; i < methods.length; i++) {
-                                    String name = methods[i].getName();
-
-                                    if (name.equals("id"))
-                                        _id_method = methods[i];
-
-                                    else if (name.equals("read"))
-                                        _read_method = methods[i];
-
-                                    else if (name.equals("write"))
-                                        _write_method = methods[i];
-
-                                    else if (name.equals("type"))
-                                        _type_method = methods[i];
-                                }
-
-                                // _repid = (String)
-                                _id_method.invoke(null, new Object[0]);
-
-                            } catch (InvocationTargetException ex) {
-                                throw new RuntimeException(
-                                        "cannot initialize: " + ex.getCause(), ex.getCause());
-
-                            } catch (IllegalAccessException ex) {
-                                throw new RuntimeException(
-                                        "cannot initialize: " + ex, ex);
-                            }
-
-                            return null;
-                        }
-                    });
-
-        } catch (ClassNotFoundException ex) {
-            throw new RuntimeException("cannot load IDL Helper class for "
-                    + _java_class, ex);
-        }
-    }
-    
-    @Deprecated
-    public void initIDL() {
-    	init();
+    protected final String genIDLName() {
+        return "org_omg_boxedIDL_" + super.genIDLName();
     }
 
-    /*
-     * public String getRepositoryID () { return _repid; }
-     */
+    private volatile Method readMethod = null;
+    private Method getReadMethod() {
+        if (null == readMethod) readMethod = genHelperMethod("write");
+        return readMethod;
+    }
+
+    private volatile Method writeMethod = null;
+    private Method getWriteMethod() {
+        if (null == writeMethod) writeMethod = genHelperMethod("write");
+        return writeMethod;
+    }
+
+    private volatile Method typeMethod = null;
+    private Method getTypeMethod() {
+        if (null == typeMethod) typeMethod = genHelperMethod("type");
+        return typeMethod;
+    }
+
+    private Method genHelperMethod(final String name) {
+        return AccessController.doPrivileged(new PrivilegedAction<Method>() {
+            @Override
+            public Method run() {
+                for (Method m: helperType.getDeclaredMethods()) {
+                    if (m.getName().equals(name)) return m;
+                }
+                throw new RuntimeException("Unable to find " + name + " method for " + helperType.getName());
+            }
+        });
+    }
 
     /** Read an instance of this value from a CDR stream */
-    public Object read(org.omg.CORBA.portable.InputStream in) {
+    @Override
+    public Object read(InputStream in) {
         org.omg.CORBA_2_3.portable.InputStream _in = (org.omg.CORBA_2_3.portable.InputStream) in;
         
         // there are two ways we need to deal with IDLEntity classes.  Ones that also implement 
         // the CORBA Object interface are actual corba objects, and must be handled that way. 
         // Other IDLEntity classes are just transmitted by value. 
         if (isCorba) {
-            return _in.read_Object(_java_class);
-        }
-        else {
-
+            return _in.read_Object(type);
+        } else {
             // we directly call read_value() on the stream here, with the explicitly specified
             // repository ID.  The input stream will handle validating the value tag for us, and eventually
             // will call our readValue() method to deserialize the object.
@@ -130,80 +102,57 @@
         }
     }
 
-    public java.io.Serializable readValue(
-            final org.omg.CORBA.portable.InputStream in,
-            final java.util.Map offsetMap, final java.lang.Integer offset) {
-        final java.io.Serializable value = (java.io.Serializable) readValue(in);
-
-        offsetMap.put(offset, value);
-
-        return value;
-    }
-
-    public Object readValue(org.omg.CORBA.portable.InputStream in) {
-        if (isAbstract) {
-            throw new MARSHAL("IDL Entity " + _java_class.getName()
-                    + " is abstract");
-        }
-
+    @Override
+    public Serializable readValue(final InputStream in, final Map offsetMap, final Integer offset) {
         try {
-            return _read_method.invoke(null, new Object[] { in });
+            Serializable value = (Serializable) getReadMethod().invoke(null, new Object[]{in});
+            offsetMap.put(offset, value);
+            return value;
         } catch (InvocationTargetException ex) {
-            throw (org.omg.CORBA.MARSHAL)new org.omg.CORBA.MARSHAL(""+ex.getCause()).initCause(ex.getCause());
+            throw (MARSHAL)new MARSHAL(""+ex.getCause()).initCause(ex.getCause());
         } catch (IllegalAccessException ex) {
-            throw (org.omg.CORBA.MARSHAL)new org.omg.CORBA.MARSHAL(ex.getMessage()).initCause(ex);
+            throw (MARSHAL)new MARSHAL(ex.getMessage()).initCause(ex);
         }
     }
 
     /** Write an instance of this value to a CDR stream */
-    public void write(org.omg.CORBA.portable.OutputStream out, Object val) {
+    @Override
+    public void write(OutputStream out, Object val) {
         org.omg.CORBA_2_3.portable.OutputStream _out = (org.omg.CORBA_2_3.portable.OutputStream) out;
 
         
         // there are two ways we need to deal with IDLEntity classes.  Ones that also implement 
         // the CORBA Object interface are actual corba objects, and must be handled that way. 
         // Other IDLEntity classes are just transmitted by value. 
-        if (val instanceof org.omg.CORBA.portable.ObjectImpl) {
+        if (val instanceof ObjectImpl) {
             _out.write_Object((org.omg.CORBA.Object)val); 
-        }
-        else {
+        } else {
             // we directly call write_value() on the stream here, with the explicitly specified
             // repository ID.  the output stream will handle writing the value tag for us, and eventually
             // will call our writeValue() method to serialize the object.
-            _out.write_value((java.io.Serializable)val, getRepositoryID());
+            _out.write_value((Serializable)val, getRepositoryID());
         }
-
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out, java.io.Serializable val) {
-        if (isAbstract) {
-            throw new MARSHAL("IDL Entity " + _java_class.getName()
-                    + " is abstract");
-        }
-
+    @Override
+    public void writeValue(OutputStream out, Serializable val) {
         try {
-            _write_method.invoke(null, new Object[] { out, val });
+            getWriteMethod().invoke(null, new Object[] { out, val });
         } catch (InvocationTargetException ex) {
-            throw (org.omg.CORBA.MARSHAL)new org.omg.CORBA.MARSHAL(""+ ex.getCause()).initCause(ex.getCause());
+            throw (MARSHAL)new MARSHAL(""+ ex.getCause()).initCause(ex.getCause());
         } catch (IllegalAccessException ex) {
-            throw (org.omg.CORBA.MARSHAL)new org.omg.CORBA.MARSHAL(ex.getMessage()).initCause(ex);
+            throw (MARSHAL)new MARSHAL(ex.getMessage()).initCause(ex);
         }
     }
 
-    org.omg.CORBA.TypeCode getTypeCode() {
-        if (_type_code == null) {
-
-            try {
-                _type_code = (org.omg.CORBA.TypeCode) _type_method.invoke(null,
-                        new Object[0]);
-            } catch (InvocationTargetException ex) {
-                throw (org.omg.CORBA.MARSHAL)new org.omg.CORBA.MARSHAL(""+ex.getCause()).initCause(ex.getCause());
-            } catch (IllegalAccessException ex) {
-                throw (org.omg.CORBA.MARSHAL)new org.omg.CORBA.MARSHAL(ex.getMessage()).initCause(ex);
-            }
+    @Override
+    protected TypeCode genTypeCode() {
+        try {
+            return (TypeCode) getTypeMethod().invoke(null, new Object[0]);
+        } catch (InvocationTargetException ex) {
+            throw (MARSHAL)new MARSHAL(""+ex.getCause()).initCause(ex.getCause());
+        } catch (IllegalAccessException ex) {
+            throw (MARSHAL)new MARSHAL(ex.getMessage()).initCause(ex);
         }
-
-        return _type_code;
     }
-
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/MethodDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/MethodDescriptor.java
index 16f1a51..81a049b 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/MethodDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/MethodDescriptor.java
@@ -33,7 +33,7 @@
     static final Logger logger = Logger.getLogger(MethodDescriptor.class.getName());
 
     /** The refleced method object for this method */
-    java.lang.reflect.Method reflected_method;
+    final java.lang.reflect.Method reflected_method;
 
     java.lang.Object invocation_block_selector;
 
@@ -226,7 +226,7 @@
     public org.omg.CORBA.portable.OutputStream writeException(
             org.omg.CORBA.portable.ResponseHandler response, Throwable ex) {
         for (int i = 0; i < exception_types.length; i++) {
-            if (exception_types[i]._java_class.isInstance(ex)) {
+            if (exception_types[i].type.isInstance(ex)) {
                 org.omg.CORBA.portable.OutputStream out = response
                         .createExceptionReply();
                 org.omg.CORBA_2_3.portable.OutputStream out2 = (org.omg.CORBA_2_3.portable.OutputStream) out;
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
index a3fd62e..3f37c7b 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
@@ -21,26 +21,18 @@
 abstract class ModelElement {
     final TypeRepository repo;
     final String java_name;    // the java name of the type
-    private String idl_name;   // fully resolved package name
-    private volatile boolean notInit = true;
-
     protected ModelElement(TypeRepository repo, String java_name) {
         this.repo = repo;
         this.java_name = java_name;
     }
 
     protected void init() {
-        idl_name = genIDLName();
-        notInit = false;
     }
 
+    private volatile String idlName = null;   // fully resolved package name
     protected abstract String genIDLName();
-
-    final void checkInit() {
-        if (notInit) throw new IllegalStateException("Not initialized: " + java_name);
-    }
-    public String getIDLName() {
-        checkInit();
-        return idl_name;
+    public final String getIDLName() {
+        if (null == idlName) idlName = genIDLName();
+        return idlName;
     }
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/PortableRemoteObjectImpl.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/PortableRemoteObjectImpl.java
index 7de9c1a..e7ae51d 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/PortableRemoteObjectImpl.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/PortableRemoteObjectImpl.java
@@ -299,7 +299,7 @@
         }
 
         TypeRepository repository = state.getTypeRepository();
-        RemoteDescriptor desc = (RemoteDescriptor) repository.getRemoteDescriptor(type);
+        RemoteDescriptor desc = (RemoteDescriptor) repository.getRemoteInterface(type);
 
         MethodDescriptor[] mdesc = desc.getMethods();
         MethodDescriptor[] descriptors = new MethodDescriptor[mdesc.length + 1];
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
index e70afe6..7653afd 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
@@ -39,7 +39,7 @@
     byte[] _id;
 
     Class getJavaClass() {
-        return _descriptor._java_class;
+        return _descriptor.type;
     }
 
     RMIState getRMIState() {
@@ -178,7 +178,7 @@
             throw new IllegalArgumentException();
         }
 
-        _descriptor = _state.getTypeRepository().getRemoteDescriptor(target.getClass()).getRemoteInterface();
+        _descriptor = _state.getTypeRepository().getRemoteInterface(target.getClass()).getRemoteInterface();
 
         if (_descriptor == null) {
             throw new RuntimeException("remote classes not supported");
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStub.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStub.java
index e700e06..db41e66 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStub.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStub.java
@@ -19,7 +19,6 @@
 package org.apache.yoko.rmi.impl;
 
 import org.apache.yoko.rmi.api.PortableRemoteObjectExt;
-import org.omg.CORBA.ORB;
 import org.omg.CORBA.SystemException;
 import org.omg.CORBA.portable.Delegate;
 import org.omg.CORBA.portable.ServantObject;
@@ -40,7 +39,7 @@
         Class remote_interface = getClass().getInterfaces()[0];
 
         RMIState state = (RMIState) PortableRemoteObjectExt.getState();
-        Object o = state.getTypeRepository().getRemoteDescriptor(
+        Object o = state.getTypeRepository().getRemoteInterface(
                 remote_interface);
 
         _descriptor = (RemoteDescriptor) o;
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubDescriptor.java
index 4cd36cc..231981c 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubDescriptor.java
@@ -18,6 +18,8 @@
 
 package org.apache.yoko.rmi.impl;
 
+import java.io.IOException;
+
 class RMIStubDescriptor extends ValueDescriptor {
     RMIStubDescriptor(Class type, TypeRepository repository) {
         super(type, repository);
@@ -25,7 +27,7 @@
 
     @Override
     protected String genRepId() {
-        final Class[] ifaces = _java_class.getInterfaces();
+        final Class[] ifaces = type.getInterfaces();
         if (ifaces.length != 2 || ifaces[1] != org.apache.yoko.rmi.util.stub.Stub.class) {
             throw new RuntimeException("Unexpected RMIStub structure");
         }
@@ -41,14 +43,15 @@
     // state is written. This ensures that fields in the proxy are
     // not included on the wire.
     //
+    @Override
     protected void writeValue(ObjectWriter writer, java.io.Serializable val)
-            throws java.io.IOException {
+            throws IOException {
         _super_descriptor.writeValue(writer, val);
     }
 
+    @Override
     protected void readValue(ObjectReader reader, java.io.Serializable value)
-            throws java.io.IOException {
+            throws IOException {
         _super_descriptor.readValue(reader, value);
     }
-
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubHandler.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubHandler.java
index d0855be..07bb558 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubHandler.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStubHandler.java
@@ -42,7 +42,7 @@
     static final RMIStubHandler instance = new RMIStubHandler();
 
     public Object stubWriteReplace(RMIStub stub) {
-        Class type = stub._descriptor._java_class;
+        Class type = stub._descriptor.type;
     return new org.apache.yoko.rmi.impl.RMIPersistentStub(stub, type);
     }
     
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteClassDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteClassDescriptor.java
index c660417..4eb3ea3 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteClassDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteClassDescriptor.java
@@ -18,14 +18,26 @@
 
 package org.apache.yoko.rmi.impl;
 
-class RemoteClassDescriptor extends RemoteDescriptor {
+final class RemoteClassDescriptor extends RemoteDescriptor {
 
     @Override
     protected String genRepId() {
-        return String.format("IDL:%s:1.0", _java_class.getName().replace('.', '/'));
+        return String.format("IDL:%s:1.0", type.getName().replace('.', '/'));
     }
 
     RemoteClassDescriptor(Class type, TypeRepository repository) {
         super(type, repository);
     }
+
+    @Override
+    protected RemoteInterfaceDescriptor genRemoteInterface() {
+        Class[] remotes = collect_remote_interfaces(type);
+        if (remotes.length == 0) {
+            throw new RuntimeException(type.getName()
+                    + " has no remote interfaces");
+        }
+        Class most_specific_interface = remotes[0];
+
+        return repo.getDescriptor(most_specific_interface).getRemoteInterface();
+    }
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteDescriptor.java
index 5e91b4b..1c8b726 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteDescriptor.java
@@ -18,9 +18,19 @@
 
 package org.apache.yoko.rmi.impl;
 
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
+
+import java.io.IOException;
+import java.io.PrintWriter;
 import java.lang.reflect.Method;
+import java.rmi.Remote;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -45,31 +55,10 @@
 
     protected List super_descriptors;
 
-    public RemoteInterfaceDescriptor getRemoteInterface() {
-        RemoteInterfaceDescriptor result = super.getRemoteInterface();
-        if (result != null) { 
-            return result;
-        }
+    @Override
+    protected abstract RemoteInterfaceDescriptor genRemoteInterface();
 
-        if (this instanceof RemoteInterfaceDescriptor) {
-            result = (RemoteInterfaceDescriptor) this;
-        } else {
-            Class[] remotes = collect_remote_interfaces(_java_class);
-            if (remotes.length == 0) {
-                throw new RuntimeException(_java_class.getName()
-                        + " has no remote interfaces");
-            }
-            Class most_specific_interface = remotes[0];
-
-            result = (RemoteInterfaceDescriptor)repo.getDescriptor(most_specific_interface);
-        }
-
-        setRemoteInterface(result);
-
-        return result;
-    }
-
-    static final Class REMOTE_CLASS = java.rmi.Remote.class;
+    static final Class REMOTE_CLASS = Remote.class;
 
     static final Class OBJECT_CLASS = java.lang.Object.class;
 
@@ -79,7 +68,7 @@
 
     public String[] all_interfaces() {
         if (_ids == null) {
-            Class[] ifaces = collect_remote_interfaces(_java_class);
+            Class[] ifaces = collect_remote_interfaces(type);
             int len = ifaces.length;
             String[] ids = new String[len];
             for (int i = 0; i < len; i++) {
@@ -99,7 +88,7 @@
         }
 
         if (method_map == null) {
-            method_map = new java.util.HashMap();
+            method_map = new HashMap();
             for (int i = 0; i < operations.length; i++) {
                 method_map.put(operations[i].getIDLName(), operations[i]);
             }
@@ -110,7 +99,7 @@
 
     void debugMethodMap() {
         if (logger.isLoggable(Level.FINER)) {
-            logger.finer("METHOD MAP FOR " + _java_class.getName());
+            logger.finer("METHOD MAP FOR " + type.getName());
 
             Iterator it = method_map.keySet().iterator();
             while (it.hasNext()) {
@@ -127,7 +116,7 @@
         }
 
         if (refl_method_map == null) {
-            refl_method_map = new java.util.HashMap();
+            refl_method_map = new HashMap();
             for (int i = 0; i < operations.length; i++) {
                 refl_method_map.put(operations[i].getReflectedMethod(), operations[i]);
             }
@@ -165,7 +154,7 @@
         ArrayList method_list = new ArrayList();
 
         // first step is to build the helpers for any super classes
-        Class[] supers = _java_class.getInterfaces();
+        Class[] supers = type.getInterfaces();
         super_descriptors = new ArrayList();
 
         Map all_methods = new HashMap();
@@ -234,7 +223,7 @@
         }
 
         // init method map...
-        method_map = new java.util.HashMap();
+        method_map = new HashMap();
         for (int i = 0; i < method_list.size(); i++) {
             MethodDescriptor desc = (MethodDescriptor) method_list.get(i);
             logger.finer("Adding method " + desc.java_name + " to method map under " + desc.getIDLName());
@@ -266,7 +255,7 @@
     Method[] getLocalMethods() {
         ArrayList result = new ArrayList();
 
-        addNonRemoteInterfaceMethods(_java_class, result);
+        addNonRemoteInterfaceMethods(type, result);
 
         Method[] out = new Method[result.size()];
         result.toArray(out);
@@ -391,27 +380,26 @@
     }
 
     /** Read an instance of this value from a CDR stream */
-    public Object read(org.omg.CORBA.portable.InputStream in) {
-        return javax.rmi.PortableRemoteObject.narrow(in.read_Object(),
-                _java_class);
+    @Override
+    public Object read(InputStream in) {
+        return PortableRemoteObject.narrow(in.read_Object(),
+                type);
     }
 
     /** Write an instance of this value to a CDR stream */
-    public void write(org.omg.CORBA.portable.OutputStream out, Object val) {
+    @Override
+    public void write(OutputStream out, Object val) {
         javax.rmi.CORBA.Util.writeRemoteObject(out, val);
     }
 
-    org.omg.CORBA.TypeCode getTypeCode() {
-        if (_type_code == null) {
-            org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();
-            return orb.create_interface_tc(getRepositoryID(), _java_class
-                    .getName());
-        }
-
-        return _type_code;
+    @Override
+    protected final TypeCode genTypeCode() {
+        ORB orb = ORB.init();
+        return orb.create_interface_tc(getRepositoryID(), type.getName());
     }
 
-    void writeMarshalValue(java.io.PrintWriter pw, String outName,
+    @Override
+    void writeMarshalValue(PrintWriter pw, String outName,
             String paramName) {
         pw.print("javax.rmi.CORBA.Util.writeRemoteObject(");
         pw.print(outName);
@@ -420,16 +408,17 @@
         pw.print(')');
     }
 
-    void writeUnmarshalValue(java.io.PrintWriter pw, String inName) {
+    @Override
+    void writeUnmarshalValue(PrintWriter pw, String inName) {
         pw.print('(');
-        pw.print(_java_class.getName());
+        pw.print(type.getName());
         pw.print(')');
         pw.print(PortableRemoteObject.class.getName());
         pw.print(".narrow(");
         pw.print(inName);
         pw.print('.');
         pw.print("read_Object(),");
-        pw.print(_java_class.getName());
+        pw.print(type.getName());
         pw.print(".class)");
     }
 
@@ -468,9 +457,9 @@
         return pkgname + "._" + cplain + "_Stub";
     }
 
-    void writeStubClass(java.io.PrintWriter pw) {
+    void writeStubClass(PrintWriter pw) {
 
-        Class c = _java_class;
+        Class c = type;
         String cname = c.getName();
         String fullname = stubClassName(c);
         //String stubname = fullname.substring(fullname.lastIndexOf('.') + 1);
@@ -515,7 +504,7 @@
     }
 
     String getStubClassName() {
-        Class c = _java_class;
+        Class c = type;
         String cname = c.getName();
 
         String pkgname = null;
@@ -531,10 +520,11 @@
         return pkgname + "." + "_" + cplain + "_Stub";
     }
 
+    @Override
     void addDependencies(Set classes) {
-        Class c = _java_class;
+        Class c = type;
 
-        if (c == java.rmi.Remote.class || classes.contains(c))
+        if (c == Remote.class || classes.contains(c))
             return;
 
         classes.add(c);
@@ -556,6 +546,7 @@
         }
     }
 
+    @Override
     boolean copyInStub() {
         return false;
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteInterfaceDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteInterfaceDescriptor.java
index 72f8e91..c75478a 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteInterfaceDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RemoteInterfaceDescriptor.java
@@ -18,8 +18,13 @@
 
 package org.apache.yoko.rmi.impl;
 
-class RemoteInterfaceDescriptor extends RemoteDescriptor {
+final class RemoteInterfaceDescriptor extends RemoteDescriptor {
     RemoteInterfaceDescriptor(Class type, TypeRepository repository) {
         super(type, repository);
     }
+
+    @Override
+    protected RemoteInterfaceDescriptor genRemoteInterface() {
+        return this;
+    }
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/SimpleDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/SimpleDescriptor.java
index a30e822..f51ee0b 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/SimpleDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/SimpleDescriptor.java
@@ -18,6 +18,8 @@
 
 package org.apache.yoko.rmi.impl;
 
+import org.omg.CORBA.TypeCode;
+
 abstract class SimpleDescriptor extends TypeDescriptor {
     private final String idl_name;
     SimpleDescriptor(Class type, TypeRepository repository, String idl_name,
@@ -30,34 +32,37 @@
     }
 
     @Override
-    protected String genIDLName() {
+    protected final String genIDLName() {
         return idl_name;
     }
 
     @Override
-    protected String genPackageName() {
+    protected final String genPackageName() {
         return "";
     }
 
     @Override
-    protected String genTypeName() {
+    protected final String genTypeName() {
         return idl_name;
     }
 
-    org.omg.CORBA.TypeCode getTypeCode() {
+    @Override
+    protected final TypeCode genTypeCode() {
         return _type_code;
     }
 
+    @Override
     boolean copyInStub() {
         return false;
     }
 
+    @Override
     public boolean copyBetweenStates() {
         return false;
     }
 
+    @Override
     public boolean copyWithinState() {
         return false;
     }
-
 }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StringDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StringDescriptor.java
index 9d5c38b..f459794 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StringDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StringDescriptor.java
@@ -18,16 +18,25 @@
 
 package org.apache.yoko.rmi.impl;
 
+import org.omg.CORBA.MARSHAL;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.WStringValueHelper;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
+
+import java.io.Serializable;
+
 class StringDescriptor extends ValueDescriptor {
-    public String getIDLName() {
-        return "CORBA_WStringValue";
-    }
-    
     StringDescriptor(TypeRepository repository) {
         super(String.class, repository);
     }
 
     @Override
+    protected final String genIDLName() {
+        return "CORBA_WStringValue";
+    }
+
+    @Override
     protected String genPackageName() {
         return "CORBA";
     }
@@ -38,30 +47,28 @@
     }
 
     /** Read an instance of this value from a CDR stream */
-    public Object read(org.omg.CORBA.portable.InputStream in) {
-        return org.omg.CORBA.WStringValueHelper.read(in);
+    @Override
+    public Object read(InputStream in) {
+        return WStringValueHelper.read(in);
     }
 
     /** Write an instance of this value to a CDR stream */
-    public void write(org.omg.CORBA.portable.OutputStream out, Object value) {
-        org.omg.CORBA.WStringValueHelper.write(out, (String) value);
+    @Override
+    public void write(OutputStream out, Object value) {
+        WStringValueHelper.write(out, (String) value);
     }
 
-    public void writeValue(org.omg.CORBA.portable.OutputStream out,
-            java.io.Serializable value) {
-        throw new org.omg.CORBA.MARSHAL("internal error");
+    @Override
+    public void writeValue(OutputStream out, Serializable value) {
+        throw new MARSHAL("internal error");
     }
 
-    public java.io.Serializable readValue(
-            org.omg.CORBA.portable.InputStream in, java.io.Serializable value,
-            java.util.Map offsetMap) {
-        throw new org.omg.CORBA.MARSHAL("internal error");
+    @Override
+    protected final TypeCode genTypeCode() {
+        return WStringValueHelper.type();
     }
 
-    org.omg.CORBA.TypeCode getTypeCode() {
-        return org.omg.CORBA.WStringValueHelper.type();
-    }
-
+    @Override
     Object copyObject(Object value, CopyState state) {
         return value;
     }
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java
index 33730f3..3bbabf2 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java
@@ -18,43 +18,51 @@
 
 package org.apache.yoko.rmi.impl;
 
-import java.io.IOException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
+
+import java.io.PrintWriter;
+import java.rmi.Remote;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.logging.Logger;
 
-import org.omg.CORBA.portable.InputStream;
-
 abstract class TypeDescriptor extends ModelElement {
     static Logger logger = Logger.getLogger(TypeDescriptor.class.getName());
 
-    final Class _java_class;
+    final Class type;
 
-    private volatile String _repid;
+    private volatile String _repid = null;
 
-    protected RemoteInterfaceDescriptor remoteDescriptor;
-
-    private FullKey _key;
-
-    private String package_name;    // the package name qualifier (if any)
-    public String getPackageName() {
-        checkInit();
-        return package_name;
+    private volatile String packageName = null;    // the package name qualifier (if any)
+    protected String genPackageName() {
+        int idx = java_name.lastIndexOf('.');
+        return ((idx < 0) ? "" : java_name.substring(0, idx));
+    }
+    public final String getPackageName() {
+        if (null == packageName) packageName = genPackageName();
+        return packageName;
     }
 
-    private String type_name;       // the simple type name (minus package, if any)
-    public String getTypeName() {
-        checkInit();
-        return type_name;
+    private volatile String typeName = null;       // the simple type name (minus package, if any)
+    protected String genTypeName() {
+        int idx = java_name.lastIndexOf('.');
+        return ((idx < 0) ? java_name : java_name.substring(idx + 1));
+    }
+    public final String getTypeName() {
+        if (null == typeName) typeName = genTypeName();
+        return typeName;
     }
 
+    private volatile FullKey key = null;
+    private FullKey genKey() {
+        return new FullKey(getRepositoryID(), type);
+    }
     public final FullKey getKey() {
-        if (null == _key) {
-            _key = new FullKey(getRepositoryID(), _java_class);
-        }
-        return _key;
+        if (null == key) key = genKey();
+        return key;
     }
 
     public static class SimpleKey {
@@ -109,30 +117,13 @@
     @Override
     public String toString() {
         return String.format("%s{class=\"%s\",repId=\"%s\"}",
-                this.getClass().getName(), _java_class,
+                this.getClass().getName(), type,
                 getRepositoryID());
     }
 
     protected TypeDescriptor(Class type, TypeRepository repository) {
         super(repository, type.getName());
-        _java_class = type;
-    }
-
-    @Override
-    protected void init() {
-        package_name = genPackageName();
-        type_name = genTypeName();
-        super.init();
-    }
-
-    protected String genPackageName() {
-        int idx = java_name.lastIndexOf('.');
-        return ((idx < 0) ? "" : java_name.substring(0, idx));
-    }
-
-    protected String genTypeName() {
-        int idx = java_name.lastIndexOf('.');
-        return ((idx < 0) ? java_name : java_name.substring(idx + 1));
+        this.type = type;
     }
 
     @Override
@@ -141,61 +132,34 @@
     }
 
     protected String genRepId() {
-        return String.format("RMI:%s:%016X", _java_class.getName(), 0);
+        return String.format("RMI:%s:%016X", type.getName(), 0);
     }
-
     public final String getRepositoryID() {
         if (_repid == null) _repid = genRepId();
         return _repid;
     }
 
-    RemoteInterfaceDescriptor getRemoteInterface() {
-        return remoteDescriptor;
+    private volatile RemoteInterfaceDescriptor remoteInterface = null;
+    protected RemoteInterfaceDescriptor genRemoteInterface() {
+        throw new UnsupportedOperationException("class " + type + " does not implement " + Remote.class.getName());
+    }
+    final RemoteInterfaceDescriptor getRemoteInterface() {
+        if (null == remoteInterface) remoteInterface = genRemoteInterface();
+        return remoteInterface;
     }
 
-    void setRemoteInterface(RemoteInterfaceDescriptor desc) {
-        remoteDescriptor = desc;
-    }
+
 
     /** Read an instance of this value from a CDR stream */
-    public abstract Object read(org.omg.CORBA.portable.InputStream in);
+    public abstract Object read(InputStream in);
 
     /** Write an instance of this value to a CDR stream */
-    public abstract void write(org.omg.CORBA.portable.OutputStream out,
-            Object val);
+    public abstract void write(OutputStream out, Object val);
 
     public boolean isCustomMarshalled() {
         return false;
     }
 
-    static class WrappedIOException extends RuntimeException {
-        IOException wrapped;
-
-        WrappedIOException(IOException ex) {
-            super("wrapped IO exception");
-            this.wrapped = ex;
-        }
-    }
-
-    CorbaObjectReader makeCorbaObjectReader(final InputStream in,
-            final Map offsetMap, final java.io.Serializable obj)
-            throws IOException {
-        try {
-            return (CorbaObjectReader) AccessController
-                    .doPrivileged(new PrivilegedAction() {
-                        public Object run() {
-                            try {
-                                return new CorbaObjectReader(in, offsetMap, obj);
-                            } catch (IOException ex) {
-                                throw new WrappedIOException(ex);
-                            }
-                        }
-                    });
-        } catch (WrappedIOException ex) {
-            throw ex.wrapped;
-        }
-    }
-
     String makeSignature(Class type) {
         if (type.isPrimitive()) {
 
@@ -242,15 +206,20 @@
         return 0L;
     }
 
-    protected org.omg.CORBA.TypeCode _type_code = null;
+    protected TypeCode _type_code = null;
 
-    abstract org.omg.CORBA.TypeCode getTypeCode();
+    private volatile TypeCode typeCode = null;
+    protected abstract TypeCode genTypeCode();
+    final TypeCode getTypeCode() {
+        if (null == typeCode) typeCode = genTypeCode();
+        return typeCode;
+    }
 
     Object copyObject(Object value, CopyState state) {
         throw new InternalError("cannot copy " + value.getClass().getName());
     }
 
-    void writeMarshalValue(java.io.PrintWriter pw, String outName,
+    void writeMarshalValue(PrintWriter pw, String outName,
             String paramName) {
         pw.print(outName);
         pw.print('.');
@@ -261,7 +230,7 @@
         pw.print(')');
     }
 
-    void writeUnmarshalValue(java.io.PrintWriter pw, String inName) {
+    void writeUnmarshalValue(PrintWriter pw, String inName) {
         pw.print(inName);
         pw.print('.');
         pw.print("read_");
@@ -270,7 +239,7 @@
         pw.print(')');
     }
 
-    void addDependencies(java.util.Set<Class<?>> classes) {
+    void addDependencies(Set<Class<?>> classes) {
         return;
     }
 
@@ -278,7 +247,7 @@
         return true;
     }
 
-    void print(java.io.PrintWriter pw, java.util.Map<Object,Integer> recurse, Object val) {
+    void print(PrintWriter pw, Map<Object,Integer> recurse, Object val) {
         if (val == null) {
             pw.print("null");
         }
@@ -288,15 +257,11 @@
             pw.print("^" + old);
         } else {
             Integer key = new Integer(System.identityHashCode(val));
-            pw.println(_java_class.getName() + "@"
+            pw.println(type.getName() + "@"
                     + Integer.toHexString(key.intValue()));
         }
     }
 
-    synchronized TypeDescriptor getSelf() {
-        return this;
-    }
-
     /**
      * Method copyBetweenStates.
      * 
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
index 6ad6894..1ba4611 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
@@ -125,15 +125,15 @@
                     return ((enumType == type) ? new EnumSubclassDescriptor(type, repo) : get(enumType));
                 } else if (type.isArray()) {
                     return ArrayDescriptor.get(type, repo);
-                } else if (!type.isInterface()
-                        && Serializable.class.isAssignableFrom(type)) {
-                    return new ValueDescriptor(type, repo);
                 } else if (Remote.class.isAssignableFrom(type)) {
                     if (type.isInterface()) {
                         return new RemoteInterfaceDescriptor(type, repo);
                     } else {
                         return new RemoteClassDescriptor(type, repo);
                     }
+                } else if (!type.isInterface()
+                && Serializable.class.isAssignableFrom(type)) {
+                    return new ValueDescriptor(type, repo);
                 } else if (Object.class.isAssignableFrom(type)) {
                     if (isAbstractInterface(type)) {
                         logger.finer("encoding " + type + " as abstract interface");
@@ -267,33 +267,8 @@
         return getDescriptor(type).getRepositoryID();
     }
 
-    public RemoteInterfaceDescriptor getRemoteDescriptor(Class<?> type) {
-        TypeDescriptor td = getDescriptor(type);
-        RemoteInterfaceDescriptor result = td.getRemoteInterface();
-
-        if (result != null) {
-            return result;
-        }
-
-        RemoteDescriptor desc;
-
-        if (java.rmi.Remote.class.isAssignableFrom(type)) {
-            if (type.isInterface()) {
-                desc = new RemoteInterfaceDescriptor(type, this);
-            } else {
-                desc = new RemoteClassDescriptor(type, this);
-            }
-
-            desc.init();
-        } else {
-            throw new IllegalArgumentException("class " + type.toString()
-                    + " does not implement" + " java.rmi.Remote");
-        }
-
-        result = desc.getRemoteInterface();
-        td.setRemoteInterface(result);
-
-        return result;
+    public RemoteInterfaceDescriptor getRemoteInterface(Class<?> type) {
+        return getDescriptor(type).getRemoteInterface();
     }
 
     public TypeDescriptor getDescriptor(Class<?> type) {
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
index 6343381..8fe5335 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
@@ -715,7 +715,7 @@
     static Object copyRMIStub(RMIStub stub) throws RemoteException {
         ClassLoader loader = getContextClassLoader();
 
-        if (getClassLoader(stub._descriptor._java_class) == loader) {
+        if (getClassLoader(stub._descriptor.type) == loader) {
             return stub;
         }
 
@@ -724,7 +724,7 @@
         Class<?> targetClass;
 
         try {
-            targetClass = Util.loadClass(desc._java_class.getName(), stub
+            targetClass = Util.loadClass(desc.type.getName(), stub
                     ._get_codebase(), loader);
         } catch (ClassNotFoundException ex) {
             logger.log(Level.FINER, "copyRMIStub exception (current loader is: " + loader
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
index 65e6465..0d2a3e8 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
@@ -114,7 +114,7 @@
 
     @Override
     protected String genRepId() {
-        return String.format("RMI:%s:%016X:%016X", StringUtil.convertToValidIDLNames(_java_class.getName()),
+        return String.format("RMI:%s:%016X:%016X", StringUtil.convertToValidIDLNames(type.getName()),
                 _hash_code, getSerialVersionUID());
     }
 
@@ -136,7 +136,7 @@
                 // skip //
             }
         }
-        ObjectStreamClass serialForm = ObjectStreamClass.lookup(_java_class);
+        ObjectStreamClass serialForm = ObjectStreamClass.lookup(type);
 
         return (serialForm != null) ? serialForm.getSerialVersionUID() : 0L;
     }
@@ -156,7 +156,6 @@
     }
 
     private void init0() {
-        final Class<?> type = _java_class;
         final Class<?> superClass = type.getSuperclass();
 
         _is_rmi_stub = RMIStub.class.isAssignableFrom(type);
@@ -174,7 +173,7 @@
 
         }
 
-        AccessController.doPrivileged(new PrivilegedAction() {
+        AccessController.doPrivileged(new PrivilegedAction<Object>() {
             public Object run() {
 
                 for (Class<?> curr = type; curr != null; curr = curr.getSuperclass()) {
@@ -222,7 +221,7 @@
                 // validate readObject
                 //
                 if ((_write_object_method == null) || !Modifier.isPrivate(_write_object_method.getModifiers())
-                        || Modifier.isStatic(_write_object_method.getModifiers()) || (_write_object_method.getDeclaringClass() != _java_class)) {
+                        || Modifier.isStatic(_write_object_method.getModifiers()) || (_write_object_method.getDeclaringClass() != type)) {
 
                     _write_object_method = null;
 
@@ -492,7 +491,7 @@
     }
 
     protected void defaultWriteValue(ObjectWriter writer, Serializable val) throws IOException {
-        logger.finer("writing fields for " + _java_class);
+        logger.finer("writing fields for " + type);
         FieldDescriptor[] fields = _fields;
 
         if (fields == null) {
@@ -549,7 +548,7 @@
                 throw (UnknownException) new UnknownException(ex.getTargetException()).initCause(ex.getTargetException());
 
             } catch (NullPointerException ex) {
-                logger.log(Level.WARNING, "unable to create instance of " + _java_class.getName(), ex);
+                logger.log(Level.WARNING, "unable to create instance of " + type.getName(), ex);
                 logger.warning("constructor => " + _constructor);
 
                 throw ex;
@@ -602,7 +601,7 @@
             int key = System.identityHashCode(val);
             recurse.put(val, key);
 
-            pw.println(_java_class.getName() + "@" + Integer.toHexString(key) + "[");
+            pw.println(type.getName() + "@" + Integer.toHexString(key) + "[");
 
             printFields(pw, recurse, val);
 
@@ -638,7 +637,7 @@
             return;
         }
 
-        logger.fine("reading fields for " + _java_class.getName());
+        logger.fine("reading fields for " + type.getName());
 
         for (FieldDescriptor _field : _fields) {
 
@@ -661,7 +660,7 @@
             return Collections.EMPTY_MAP;
         }
 
-        logger.finer("reading fields for " + _java_class.getName());
+        logger.finer("reading fields for " + type.getName());
 
         Map map = new HashMap();
 
@@ -680,7 +679,7 @@
             return;
         }
 
-        logger.finer("writing fields for " + _java_class.getName());
+        logger.finer("writing fields for " + type.getName());
 
         for (FieldDescriptor _field : _fields) {
 
@@ -748,7 +747,7 @@
     }
 
     protected long computeHashCode() {
-        Class type = _java_class;
+        Class type = this.type;
 
         if (_is_externalizable) {
             return 1L;
@@ -837,26 +836,24 @@
         return _value_members;
     }
 
-    TypeCode getTypeCode() {
-        if (_type_code != null)
-            return _type_code;
-
+    @Override
+    protected TypeCode genTypeCode() {
         ORB orb = ORB.init();
-        _type_code = orb.create_recursive_tc(getRepositoryID());
+        TypeCode typeCode = orb.create_recursive_tc(getRepositoryID());
 
         TypeCode _base = ((_super_descriptor == null) ? null : _super_descriptor.getTypeCode());
 
-        Class javaClass = _java_class;
+        Class javaClass = type;
         if (javaClass.isArray()) {
             TypeDescriptor desc = repo.getDescriptor(javaClass.getComponentType());
-            _type_code = desc.getTypeCode();
-            _type_code = orb.create_sequence_tc(0, _type_code);
-            _type_code = orb.create_value_box_tc(getRepositoryID(), "Sequence", _type_code);
+            typeCode = desc.getTypeCode();
+            typeCode = orb.create_sequence_tc(0, typeCode);
+            typeCode = orb.create_value_box_tc(getRepositoryID(), "Sequence", typeCode);
         } else {
-            _type_code = orb.create_value_tc(getRepositoryID(), javaClass.getSimpleName(), VM_NONE.value, _base, getValueMembers());
+            typeCode = orb.create_value_tc(getRepositoryID(), javaClass.getSimpleName(), VM_NONE.value, _base, getValueMembers());
         }
 
-        return _type_code;
+        return typeCode;
     }
 
     private static final OperationDescription[] ZERO_OPERATIONS = {};
@@ -866,7 +863,7 @@
     
     FullValueDescription getFullValueDescription() {
         FullValueDescription fvd = new FullValueDescription();
-        fvd.name = _java_class.getName();
+        fvd.name = type.getName();
         fvd.id = getRepositoryID();
         fvd.is_abstract = false;
         fvd.is_custom = isCustomMarshalled();
@@ -902,7 +899,7 @@
         }
 
         ObjectDeserializer(FullValueDescription desc, RunTime runtime) throws IOException {
-            Class myClass = _java_class;
+            Class myClass = type;
             ValueMember[] members = desc.members;
             fields = new FieldDescriptor[members.length];
             for (int i = 0; i < members.length; i++) {
@@ -962,7 +959,7 @@
         } else {
             wdesc = (ValueDescriptor) repo.getDescriptor(oorig.getClass());
 
-            logger.finer("writeReplace -> " + _java_class.getName());
+            logger.finer("writeReplace -> " + type.getName());
         }
 
         return wdesc.copyObject2(oorig, state);
@@ -991,7 +988,7 @@
             writeValue(writer, oorig);
             return writer;
         } catch (IOException ex) {
-            String msg = String.format("%s writing %s", ex, _java_class.getName());
+            String msg = String.format("%s writing %s", ex, type.getName());
             throw (MARSHAL) new MARSHAL(msg).initCause(ex);
         }
     }
@@ -1002,7 +999,7 @@
             readValue(reader, copy);
             return readResolve(copy);
         } catch (IOException ex) {
-            String msg = String.format("%s reading instance of %s", ex, _java_class.getName());
+            String msg = String.format("%s reading instance of %s", ex, type.getName());
             throw (MARSHAL) new MARSHAL(msg).initCause(ex);
         }
     }
@@ -1021,7 +1018,7 @@
 
         pw.print(paramName);
         pw.print(',');
-        MethodDescriptor.writeJavaType(pw, _java_class);
+        MethodDescriptor.writeJavaType(pw, type);
         pw.print(".class)");
     }
 
@@ -1030,12 +1027,13 @@
         pw.print('.');
         pw.print("read_value");
         pw.print('(');
-        MethodDescriptor.writeJavaType(pw, _java_class);
+        MethodDescriptor.writeJavaType(pw, type);
         pw.print(".class)");
     }
 
+    @Override
     void addDependencies(Set<Class<?>> classes) {
-        Class c = _java_class;
+        Class c = type;
 
         if ((c == Object.class) || classes.contains(c))
             return;
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
index 7004c25..6bfb65a 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
@@ -172,7 +172,7 @@
         if (val instanceof RMIStub) {
 
             RMIStub stub = (RMIStub) val;
-            Class type = stub._descriptor._java_class;
+            Class type = stub._descriptor.type;
 
             RMIState state = RMIState.current();
             Stub result = state.getStaticStub(stub._get_codebase(), type);
