Further rmi-impl refactoring
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);