diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/OB/Client.java b/yoko-core/src/main/java/org/apache/yoko/orb/OB/Client.java
index 5cc1af9..3cab63b 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/OB/Client.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/OB/Client.java
@@ -119,7 +119,7 @@
     //
     // Checks whether this client is equal to another client
     //
-    public abstract boolean equal(Client clt);
+    public abstract boolean matches(Client clt);
 
     //
     // Force connection establishment
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/OB/ClientManager.java b/yoko-core/src/main/java/org/apache/yoko/orb/OB/ClientManager.java
index 20e6405..644ba01 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/OB/ClientManager.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/OB/ClientManager.java
@@ -16,16 +16,14 @@
  */
 
 package org.apache.yoko.orb.OB;
- 
-import java.util.logging.Level;
+
+import java.util.Arrays;
+import java.util.Vector;
 import java.util.logging.Logger;
 
-import org.apache.yoko.orb.OB.CONNECTION_REUSE_POLICY_ID;
-import org.apache.yoko.orb.OB.ConnectionReusePolicy;
-import org.apache.yoko.orb.OB.ConnectionReusePolicyHelper;
-import org.apache.yoko.orb.OB.PROTOCOL_POLICY_ID;
-import org.apache.yoko.orb.OB.ProtocolPolicy;
-import org.apache.yoko.orb.OB.ProtocolPolicyHelper;
+import org.apache.yoko.orb.OCI.ConnectorInfo;
+import org.omg.CORBA.Policy;
+import org.omg.IOP.IOR;
 import org.omg.PortableServer.POAManagerPackage.State;
 
 public final class ClientManager {
@@ -40,12 +38,12 @@
     //
     // All clients
     //
-    private java.util.Vector allClients_ = new java.util.Vector();
+    private Vector<Client> allClients_ = new Vector<>();
 
     //
     // All reusable clients
     //
-    private java.util.Vector reusableClients_ = new java.util.Vector();
+    private Vector<Client> reusableClients_ = new Vector<>();
 
     //
     // The concurrency model with which new Clients are created
@@ -84,11 +82,7 @@
         //
         // Destroy all clients
         //
-        java.util.Enumeration e = allClients_.elements();
-        while (e.hasMoreElements()) {
-            Client client = (Client) e.nextElement();
-            client.destroy(false);
-        }
+        for (Client c : allClients_) c.destroy(false);
 
         //
         // Reset internal data
@@ -114,8 +108,7 @@
     //
     // Get a list of ClientProfilePairs for an IOR and a list of policies
     //
-    public synchronized java.util.Vector getClientProfilePairs(
-            org.omg.IOP.IOR ior, org.omg.CORBA.Policy[] policies) {
+    public synchronized Vector<ClientProfilePair> getClientProfilePairs(IOR ior, Policy[] policies) {
         Assert._OB_assert(ior.type_id != null);
 
         //
@@ -135,18 +128,15 @@
                     org.apache.yoko.orb.OB.MinorCodes.MinorORBDestroyed,
                     org.omg.CORBA.CompletionStatus.COMPLETED_NO);
         }
-            
+
 
         //
         // Find out whether private clients are requested
         //
         boolean privateClients = false;
-        for (int i = 0; i < policies.length; i++) {
-            if (policies[i].policy_type() == CONNECTION_REUSE_POLICY_ID.value) {
-                ConnectionReusePolicy p = ConnectionReusePolicyHelper.narrow(policies[i]);
-                if (p.value() == false) {
-                    privateClients = true;
-                }
+        for (Policy pol : policies) {
+            if (pol.policy_type() == CONNECTION_REUSE_POLICY_ID.value) {
+                privateClients = !!!(ConnectionReusePolicyHelper.narrow(pol).value());
                 break;
             }
         }
@@ -155,9 +145,9 @@
         // Get the protocol policy, if any
         //
         ProtocolPolicy protocolPolicy = null;
-        for (int i = 0; i < policies.length; i++) {
-            if (policies[i].policy_type() == PROTOCOL_POLICY_ID.value) {
-                protocolPolicy = ProtocolPolicyHelper.narrow(policies[i]);
+        for (Policy pol : policies) {
+            if (pol.policy_type() == PROTOCOL_POLICY_ID.value) {
+                protocolPolicy = ProtocolPolicyHelper.narrow(pol);
                 break;
             }
         }
@@ -166,44 +156,39 @@
         // check whether the BiDir policy is enabled
         //
         boolean enableBidir = false;
-        for (int i = 0; i < policies.length; i++) {
-            if (policies[i].policy_type() == org.omg.BiDirPolicy.BIDIRECTIONAL_POLICY_TYPE.value) {
+        for (Policy pol : policies) {
+            if (pol.policy_type() == org.omg.BiDirPolicy.BIDIRECTIONAL_POLICY_TYPE.value) {
                 org.omg.BiDirPolicy.BidirectionalPolicy p = org.omg.BiDirPolicy.BidirectionalPolicyHelper
-                        .narrow(policies[i]);
+                        .narrow(pol);
                 if (p.value() == org.omg.BiDirPolicy.BOTH.value) {
                     enableBidir = true;
                 }
             }
         }
 
-        java.util.Vector pairs = new java.util.Vector();
+        Vector<ClientProfilePair> pairs = new Vector<>();
 
         //
         // First try to create CollocatedClients
         //
         org.apache.yoko.orb.OBPortableServer.POAManagerFactory pmFactory = orbInstance_.getPOAManagerFactory();
-        org.omg.PortableServer.POAManager[] managers = pmFactory.list();
-
-        for (int i = 0; i < managers.length; i++) {
+        for (org.omg.PortableServer.POAManager mgr : pmFactory.list()) {
             try {
-                org.apache.yoko.orb.OCI.Acceptor[] acceptors = ((org.apache.yoko.orb.OBPortableServer.POAManager) managers[i])
-                        .get_acceptors();
-
                 boolean local = false;
-                for (int j = 0; j < acceptors.length && !local; j++) {
-                    org.apache.yoko.orb.OCI.ProfileInfo[] localProfileInfos = acceptors[j].get_local_profiles(ior);
+                for (org.apache.yoko.orb.OCI.Acceptor acceptor : ((org.apache.yoko.orb.OBPortableServer.POAManager)mgr).get_acceptors()) {
+                    org.apache.yoko.orb.OCI.ProfileInfo[] localProfileInfos = acceptor.get_local_profiles(ior);
                     if (localProfileInfos.length > 0) {
                         local = true;
                     }
                 }
 
-                // we can get into hang situations if we return a collocated server for an 
-                // inactive POA.  This can happen with the RootPOA, which is generally not activated. 
-                if (local && managers[i].get_state() == State.ACTIVE) {
+                // we can get into hang situations if we return a collocated server for an
+                // inactive POA.  This can happen with the RootPOA, which is generally not activated.
+                if (local && mgr.get_state() == State.ACTIVE) {
                     //
                     // Retrieve the CollocatedServer from the POAManager
                     //
-                    org.apache.yoko.orb.OBPortableServer.POAManager_impl manager = (org.apache.yoko.orb.OBPortableServer.POAManager_impl) managers[i];
+                    org.apache.yoko.orb.OBPortableServer.POAManager_impl manager = (org.apache.yoko.orb.OBPortableServer.POAManager_impl) mgr;
                     CollocatedServer collocatedServer = manager._OB_getCollocatedServer();
 
                     //
@@ -215,11 +200,10 @@
                     Client client = new CollocatedClient(collocatedServer, concModel_, conv);
                     allClients_.addElement(client);
 
-                    org.apache.yoko.orb.OCI.ProfileInfo[] profileInfos = client.getUsableProfiles(ior, policies);
-                    for (int j = 0; j < profileInfos.length; j++) {
+                    for (org.apache.yoko.orb.OCI.ProfileInfo profileInfo : client.getUsableProfiles(ior, policies)) {
                         ClientProfilePair pair = new ClientProfilePair();
                         pair.client = client;
-                        pair.profile = profileInfos[j];
+                        pair.profile = profileInfo;
                         pairs.addElement(pair);
                     }
 
@@ -227,8 +211,7 @@
                     // TODO: Introduce reusable CollocatedClients?
                     //
                 }
-            } catch (org.omg.PortableServer.POAManagerPackage.AdapterInactive ex) {
-                // Ignore
+            } catch (org.omg.PortableServer.POAManagerPackage.AdapterInactive ignored) {
             }
         }
 
@@ -237,8 +220,7 @@
         // clients which are usable for the given IOR and policies
         //
         if (!privateClients) {
-            for (int i = 0; i < reusableClients_.size(); i++) {
-                Client reusableClient = (Client) reusableClients_.elementAt(i);
+            for (Client reusableClient : reusableClients_) {
 
                 //
                 // Skip any client whose protocol is not present in the
@@ -246,19 +228,15 @@
                 //
                 if (protocolPolicy != null) {
                     org.apache.yoko.orb.OCI.ConnectorInfo info = reusableClient.connectorInfo();
-                    if (info != null) {
-                        if (!protocolPolicy.contains(info.id())) {
-                            continue;
-                        }
+                    if (info != null && !protocolPolicy.contains(info.id())) {
+                        continue;
                     }
                 }
 
-                org.apache.yoko.orb.OCI.ProfileInfo[] profileInfos = reusableClient
-                        .getUsableProfiles(ior, policies);
-                for (int j = 0; j < profileInfos.length; j++) {
+                for (org.apache.yoko.orb.OCI.ProfileInfo profileInfo : reusableClient.getUsableProfiles(ior, policies)) {
                     ClientProfilePair pair = new ClientProfilePair();
                     pair.client = reusableClient;
-                    pair.profile = profileInfos[j];
+                    pair.profile = profileInfo;
                     pairs.addElement(pair);
                 }
             }
@@ -267,30 +245,22 @@
         //
         // Finally, create new GIOPClients for all connectors we can get
         //
-        org.apache.yoko.orb.OCI.ConFactoryRegistry conFactoryRegistry = orbInstance_
-                .getConFactoryRegistry();
-        org.apache.yoko.orb.OCI.ConFactory[] factories = conFactoryRegistry
-                .get_factories();
-        for (int i = 0; i < factories.length; i++) {
-            org.apache.yoko.orb.OCI.Connector[] connectors = factories[i]
-                    .create_connectors(ior, policies);
-            for (int j = 0; j < connectors.length; j++) {
+        org.apache.yoko.orb.OCI.ConFactoryRegistry conFactoryRegistry = orbInstance_.getConFactoryRegistry();
+        for (org.apache.yoko.orb.OCI.ConFactory factory : conFactoryRegistry.get_factories()) {
+            for (org.apache.yoko.orb.OCI.Connector connector : factory.create_connectors(ior, policies)) {
                 //
                 // Skip any connector whose protocol is not present in the
                 // protocol list
                 //
-                if (protocolPolicy != null)
-                {
-                    if (!protocolPolicy.contains(connectors[j].id())) {
-                        continue;
-                    }
+                if (protocolPolicy != null && !protocolPolicy.contains(connector.id())) {
+                    continue;
                 }
 
                 //
                 // Get all usable profiles
                 //
-                org.apache.yoko.orb.OCI.ProfileInfo[] profileInfos = connectors[j].get_usable_profiles(ior, policies);
-                Assert._OB_assert(profileInfos.length >= 1);
+                org.apache.yoko.orb.OCI.ProfileInfo[] profileInfos = connector.get_usable_profiles(ior, policies);
+                Assert._OB_assert(profileInfos.length != 0);
 
                 //
                 // Create a new GIOPClient for each usable profile, and set
@@ -298,25 +268,23 @@
                 // clients that are equivalent to other clients we already
                 // have.
                 //
-                for (int k = 0; k < profileInfos.length; k++) {
-                    CodeConverters conv = CodeSetUtil.getCodeConverters(
-                            orbInstance_, profileInfos[k]);
+                for (org.apache.yoko.orb.OCI.ProfileInfo profileInfo: profileInfos) {
+                    CodeConverters conv = CodeSetUtil.getCodeConverters(orbInstance_, profileInfo);
 
-                    Client client = new GIOPClient(orbInstance_, connectors[j],
-                            concModel_, conv, enableBidir);
+                    Client newClient = new GIOPClient(orbInstance_, connector, concModel_, conv, enableBidir);
 
                     if (!pairs.isEmpty()) {
-                        int l;
+                        boolean matched = false;
 
-                        for (l = 0; l < pairs.size(); l++) {
-                            ClientProfilePair pair = (ClientProfilePair) pairs.elementAt(l);
-                            if (pair.client.equal(client)) {
+                        for (ClientProfilePair pair : pairs) {
+                            if (pair.client.matches(newClient)) {
+                                matched = true;
                                 break;
                             }
                         }
 
-                        if (l != pairs.size()) {
-                            client.destroy(false);
+                        if (matched) {
+                            newClient.destroy(false);
                             continue;
                         }
                     }
@@ -324,17 +292,15 @@
                     //
                     // Add the new client to the list of all clients
                     //
-                    allClients_.addElement(client);
+                    allClients_.addElement(newClient);
 
                     //
                     // Add client/profile pairs
                     //
-                    org.apache.yoko.orb.OCI.ProfileInfo[] clientProfileInfos = client
-                            .getUsableProfiles(ior, policies);
-                    for (int l = 0; l < clientProfileInfos.length; l++) {
+                    for (org.apache.yoko.orb.OCI.ProfileInfo clientProfileInfo : newClient.getUsableProfiles(ior, policies)) {
                         ClientProfilePair pair = new ClientProfilePair();
-                        pair.client = client;
-                        pair.profile = clientProfileInfos[l];
+                        pair.client = newClient;
+                        pair.profile = clientProfileInfo;
                         pairs.addElement(pair);
                     }
 
@@ -343,7 +309,7 @@
                     // client to the list of existing reusable clients
                     //
                     if (!privateClients) {
-                        reusableClients_.addElement(client);
+                        reusableClients_.addElement(newClient);
                     }
                 }
             }
@@ -359,15 +325,13 @@
         if (!pairs.isEmpty() && protocolPolicy != null) {
             String[] protocols = protocolPolicy.value();
 
-            java.util.Vector newPairs = new java.util.Vector();
+            Vector<ClientProfilePair> newPairs = new Vector<>();
 
             //
             // First, add any pairs whose clients do not have ConnectorInfo
             //
-            for (int i = 0; i < pairs.size(); i++) {
-                ClientProfilePair pair = (ClientProfilePair) pairs.elementAt(i);
-                org.apache.yoko.orb.OCI.ConnectorInfo info = pair.client.connectorInfo();
-                if (info == null) {
+            for (ClientProfilePair pair : pairs) {
+                if (pair.client.connectorInfo() == null) {
                     newPairs.addElement(pair);
                 }
             }
@@ -375,14 +339,11 @@
             //
             // Next, add the pairs in the order specified by the policy
             //
-            for (int i = 0; i < protocols.length; i++) {
-                for (int j = 0; j < pairs.size(); j++) {
-                    ClientProfilePair pair = (ClientProfilePair) pairs.elementAt(j);
-                    org.apache.yoko.orb.OCI.ConnectorInfo info = pair.client.connectorInfo();
-                    if (info != null) {
-                        if (protocols[i].equals(info.id())) {
-                            newPairs.addElement(pair);
-                        }
+            for (String protocol : protocols) {
+                for (ClientProfilePair pair : pairs) {
+                    ConnectorInfo info = pair.client.connectorInfo();
+                    if (info != null && protocol.equals(info.id())) {
+                        newPairs.addElement(pair);
                     }
                 }
             }
@@ -405,8 +366,7 @@
         //
         // Increment the usage count on all clients
         //
-        for (int i = 0; i < pairs.size(); i++) {
-            ClientProfilePair pair = (ClientProfilePair) pairs.elementAt(i);
+        for (ClientProfilePair pair : pairs) {
             pair.client.incUsage();
         }
         return pairs;
@@ -437,37 +397,21 @@
         boolean inUse = client.decUsage();
 
         if (!inUse) {
-            int i;
+            reusableClients_.remove(client);
 
-            for (i = 0; i < reusableClients_.size(); i++) {
-                Client c = (Client) reusableClients_.elementAt(i);
-                if (c == client) {
-                    reusableClients_.removeElementAt(i);
-                    break;
-                }
+            if (allClients_.remove(client)) {
+                client.destroy(terminate);
+            } else {
+                Assert._OB_assert("Release called on unknown client");
             }
-
-            for (i = 0; i < allClients_.size(); i++) {
-                Client c = (Client) allClients_.elementAt(i);
-                if (c == client) {
-                    client.destroy(terminate);
-                    allClients_.removeElementAt(i);
-                    return;
-                }
-            }
-
-            Assert._OB_assert("Release called on unknown client");
         }
     }
 
     public boolean equivalent(org.omg.IOP.IOR ior1, org.omg.IOP.IOR ior2) {
-        org.apache.yoko.orb.OCI.ConFactoryRegistry conFactoryRegistry = orbInstance_
-                .getConFactoryRegistry();
+        org.apache.yoko.orb.OCI.ConFactoryRegistry conFactoryRegistry = orbInstance_.getConFactoryRegistry();
 
-        org.apache.yoko.orb.OCI.ConFactory[] factories = conFactoryRegistry
-                .get_factories();
-        for (int i = 0; i < factories.length; i++) {
-            if (!factories[i].equivalent(ior1, ior2)) {
+        for (org.apache.yoko.orb.OCI.ConFactory factory : conFactoryRegistry.get_factories()) {
+            if (!!!factory.equivalent(ior1, ior2)) {
                 return false;
             }
         }
@@ -475,14 +419,6 @@
     }
 
     public int hash(org.omg.IOP.IOR ior, int maximum) {
-        org.apache.yoko.orb.OCI.ConFactoryRegistry conFactoryRegistry = orbInstance_
-                .getConFactoryRegistry();
-
-        org.apache.yoko.orb.OCI.ConFactory[] factories = conFactoryRegistry.get_factories();
-        int hash = 0;
-        for (int i = 0; i < factories.length; i++) {
-            hash ^= factories[i].hash(ior, maximum);
-        }
-        return hash % (maximum + 1);
+        return Arrays.hashCode(orbInstance_.getConFactoryRegistry().get_factories());
     }
 }
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/OB/CollocatedClient.java b/yoko-core/src/main/java/org/apache/yoko/orb/OB/CollocatedClient.java
index 8abd5fa..d3f26d4 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/OB/CollocatedClient.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/OB/CollocatedClient.java
@@ -88,18 +88,10 @@
     //
     // Checks whether this client is equal to another client
     //
-    public boolean equal(Client cl) {
-        CollocatedClient client = null;
-        try {
-            client = (CollocatedClient) cl;
-        } catch (ClassCastException ex) {
-            return false;
-        }
-
-        if (server_ != client.server_)
-            return false;
-
-        return true;
+    public boolean matches(Client other) {
+        if (!!!(other instanceof CollocatedClient)) return false;
+        CollocatedClient that = (CollocatedClient) other;
+        return (this.server_ == that.server_);
     }
 
     //
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/OB/DowncallStub.java b/yoko-core/src/main/java/org/apache/yoko/orb/OB/DowncallStub.java
index 9f720af..ad989ce 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/OB/DowncallStub.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/OB/DowncallStub.java
@@ -19,11 +19,50 @@
  
 import static org.apache.yoko.orb.OCI.GiopVersion.GIOP1_2;
 
+import java.util.Vector;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import org.apache.yoko.orb.OB.RETRY_ALWAYS;
-import org.apache.yoko.orb.OCI.GiopVersion;
+import org.omg.CORBA.BAD_INV_ORDER;
+import org.omg.CORBA.BooleanHolder;
+import org.omg.CORBA.COMM_FAILURE;
+import org.omg.CORBA.CompletionStatus;
+import org.omg.CORBA.ExceptionList;
+import org.omg.CORBA.NO_RESPONSE;
+import org.omg.CORBA.NVList;
+import org.omg.CORBA.NamedValue;
+import org.omg.CORBA.OBJECT_NOT_EXIST;
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.Policy;
+import org.omg.CORBA.SystemException;
+import org.omg.CORBA.TRANSIENT;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.UserException;
+import org.omg.CORBA.portable.ApplicationException;
+import org.omg.CORBA.portable.OutputStream;
+import org.omg.CORBA.portable.RemarshalException;
+import org.omg.GIOP.MessageHeader_1_1;
+import org.omg.GIOP.MessageHeader_1_2Helper;
+import org.omg.GIOP.MsgType_1_1;
+import org.omg.GIOP.RequestHeader_1_2;
+import org.omg.GIOP.RequestHeader_1_2Helper;
+import org.omg.IOP.INVOCATION_POLICIES;
+import org.omg.IOP.IOR;
+import org.omg.IOP.ServiceContext;
+import org.omg.IOP.ServiceContextListHolder;
+import org.omg.MessageRouting.MessageBody;
+import org.omg.MessageRouting.PersistentRequest;
+import org.omg.MessageRouting.PersistentRequestRouter;
+import org.omg.MessageRouting.ReplyDestination;
+import org.omg.MessageRouting.ReplyDisposition;
+import org.omg.MessageRouting.RequestInfo;
+import org.omg.MessageRouting.RequestMessage;
+import org.omg.MessageRouting.Router;
+import org.omg.MessageRouting.RouterListHolder;
+import org.omg.Messaging.PolicyValue;
+import org.omg.Messaging.PolicyValueSeqHelper;
+import org.omg.Messaging.PolicyValueSeqHolder;
+import org.omg.Messaging.ReplyHandler;
 
 //
 // DowncallStub is equivalent to the C++ class OB::MarshalStubImpl
@@ -38,9 +77,9 @@
     //
     // The IOR and the original IOR
     //
-    private org.omg.IOP.IOR IOR_;
+    private IOR IOR_;
 
-    private org.omg.IOP.IOR origIOR_;
+    private IOR origIOR_;
 
     //
     // The list of policies
@@ -50,7 +89,7 @@
     //
     // All client/profile pairs
     //
-    private java.util.Vector clientProfilePairs_;
+    private Vector<ClientProfilePair> clientProfilePairs_;
 
     //
     // We need a class to carry the DowncallStub and Downcall across
@@ -66,8 +105,7 @@
     // Private and protected member implementations
     // ------------------------------------------------------------------
 
-    private synchronized Client getClientProfilePair(
-            org.apache.yoko.orb.OCI.ProfileInfoHolder profileInfo)
+    private synchronized Client getClientProfilePair(org.apache.yoko.orb.OCI.ProfileInfoHolder profileInfo)
             throws FailureException {
         //
         // Lazy initialization of the client/profile pairs
@@ -90,10 +128,7 @@
                 logger.fine("retry: no profiles available");
             }
 
-            throw new FailureException(new org.omg.CORBA.TRANSIENT(org.apache.yoko.orb.OB.MinorCodes
-                    .describeTransient(org.apache.yoko.orb.OB.MinorCodes.MinorNoUsableProfileInIOR),
-                    org.apache.yoko.orb.OB.MinorCodes.MinorNoUsableProfileInIOR,
-                    org.omg.CORBA.CompletionStatus.COMPLETED_NO));
+            throw new FailureException(new TRANSIENT(org.apache.yoko.orb.OB.MinorCodes.describeTransient(org.apache.yoko.orb.OB.MinorCodes.MinorNoUsableProfileInIOR), org.apache.yoko.orb.OB.MinorCodes.MinorNoUsableProfileInIOR, CompletionStatus.COMPLETED_NO));
         }
 
         ClientProfilePair clientProfilePair = (ClientProfilePair) clientProfilePairs_.elementAt(0);
@@ -108,9 +143,7 @@
         ClientManager clientManager = orbInstance_.getClientManager();
 
         if (clientManager != null && clientProfilePairs_ != null) {
-            for (int i = 0; i < clientProfilePairs_.size(); i++) {
-                ClientProfilePair pair = (ClientProfilePair) clientProfilePairs_
-                        .elementAt(i);
+            for (ClientProfilePair pair: clientProfilePairs_) {
                 clientManager.releaseClient(pair.client, terminate);
             }
         }
@@ -128,8 +161,7 @@
     // Public member implementations
     // ------------------------------------------------------------------
 
-    public DowncallStub(ORBInstance orbInstance, org.omg.IOP.IOR ior,
-            org.omg.IOP.IOR origIOR, RefCountPolicyList policies) {
+    public DowncallStub(ORBInstance orbInstance, IOR ior, IOR origIOR, RefCountPolicyList policies) {
         clientProfilePairs_ = null;
 
         //
@@ -163,8 +195,7 @@
 
         PIManager piManager = orbInstance_.getPIManager();
         if (piManager.haveClientInterceptors()) {
-            return new PIDowncall(orbInstance_, client, profile.value,
-                    policies_, op, resp, IOR_, origIOR_, piManager);
+            return new PIDowncall(orbInstance_, client, profile.value, policies_, op, resp, IOR_, origIOR_, piManager);
         } else {
             return new Downcall(orbInstance_, client, profile.value, policies_, op, resp);
         }
@@ -181,47 +212,35 @@
         return new Downcall(orbInstance_, client, profile.value, policies_, "_locate", true);
     }
 
-    public Downcall createPIArgsDowncall(String op, boolean resp,
-            ParameterDesc[] argDesc, ParameterDesc retDesc,
-            org.omg.CORBA.TypeCode[] exceptionTC) throws FailureException {
+    public Downcall createPIArgsDowncall(String op, boolean resp, ParameterDesc[] argDesc, ParameterDesc retDesc, TypeCode[] exceptionTC) throws FailureException {
         org.apache.yoko.orb.OCI.ProfileInfoHolder profile = new org.apache.yoko.orb.OCI.ProfileInfoHolder();
         Client client = getClientProfilePair(profile);
         Assert._OB_assert(client != null);
 
         if (!policies_.interceptor)
-            return new Downcall(orbInstance_, client, profile.value, policies_,
-                    op, resp);
+            return new Downcall(orbInstance_, client, profile.value, policies_, op, resp);
 
         PIManager piManager = orbInstance_.getPIManager();
         if (piManager.haveClientInterceptors()) {
-            return new PIArgsDowncall(orbInstance_, client, profile.value,
-                    policies_, op, resp, IOR_, origIOR_, piManager, argDesc,
-                    retDesc, exceptionTC);
+            return new PIArgsDowncall(orbInstance_, client, profile.value, policies_, op, resp, IOR_, origIOR_, piManager, argDesc, retDesc, exceptionTC);
         } else {
-            return new Downcall(orbInstance_, client, profile.value, policies_,
-                    op, resp);
+            return new Downcall(orbInstance_, client, profile.value, policies_, op, resp);
         }
     }
 
-    public Downcall createPIDIIDowncall(String op, boolean resp,
-            org.omg.CORBA.NVList args, org.omg.CORBA.NamedValue result,
-            org.omg.CORBA.ExceptionList exceptions) throws FailureException {
+    public Downcall createPIDIIDowncall(String op, boolean resp, NVList args, NamedValue result, ExceptionList exceptions) throws FailureException {
         org.apache.yoko.orb.OCI.ProfileInfoHolder profile = new org.apache.yoko.orb.OCI.ProfileInfoHolder();
         Client client = getClientProfilePair(profile);
         Assert._OB_assert(client != null);
 
         if (!policies_.interceptor)
-            return new Downcall(orbInstance_, client, profile.value, policies_,
-                    op, resp);
+            return new Downcall(orbInstance_, client, profile.value, policies_, op, resp);
 
         PIManager piManager = orbInstance_.getPIManager();
         if (piManager.haveClientInterceptors()) {
-            return new PIDIIDowncall(orbInstance_, client, profile.value,
-                    policies_, op, resp, IOR_, origIOR_, piManager, args,
-                    result, exceptions);
+            return new PIDIIDowncall(orbInstance_, client, profile.value, policies_, op, resp, IOR_, origIOR_, piManager, args, result, exceptions);
         } else {
-            return new Downcall(orbInstance_, client, profile.value, policies_,
-                    op, resp);
+            return new Downcall(orbInstance_, client, profile.value, policies_, op, resp);
         }
     }
 
@@ -229,18 +248,15 @@
     // Marshalling interception points
     //
 
-    public org.apache.yoko.orb.CORBA.OutputStream preMarshal(Downcall down)
-            throws LocationForward, FailureException {
+    public org.apache.yoko.orb.CORBA.OutputStream preMarshal(Downcall down) throws LocationForward, FailureException {
         return down.preMarshal();
     }
 
-    public void marshalEx(Downcall down, org.omg.CORBA.SystemException ex)
-            throws LocationForward, FailureException {
+    public void marshalEx(Downcall down, SystemException ex) throws LocationForward, FailureException {
         down.marshalEx(ex);
     }
 
-    public void postMarshal(Downcall down) throws LocationForward,
-            FailureException {
+    public void postMarshal(Downcall down) throws LocationForward, FailureException {
         down.postMarshal();
     }
 
@@ -260,13 +276,11 @@
         down.oneway();
     }
 
-    public void deferred(Downcall down) throws LocationForward,
-            FailureException {
+    public void deferred(Downcall down) throws LocationForward, FailureException {
         down.deferred();
     }
 
-    public void response(Downcall down) throws LocationForward,
-            FailureException {
+    public void response(Downcall down) throws LocationForward, FailureException {
         down.response();
     }
 
@@ -278,26 +292,21 @@
     // Unmarshalling interception points
     //
 
-    public org.apache.yoko.orb.CORBA.InputStream preUnmarshal(Downcall down)
-            throws LocationForward, FailureException {
+    public org.apache.yoko.orb.CORBA.InputStream preUnmarshal(Downcall down) throws LocationForward, FailureException {
         return down.preUnmarshal();
     }
 
-    public org.apache.yoko.orb.CORBA.InputStream preUnmarshal(Downcall down,
-            org.omg.CORBA.BooleanHolder uex) throws LocationForward,
-            FailureException {
+    public org.apache.yoko.orb.CORBA.InputStream preUnmarshal(Downcall down, BooleanHolder uex) throws LocationForward, FailureException {
         org.apache.yoko.orb.CORBA.InputStream in = down.preUnmarshal();
         uex.value = down.userException();
         return in;
     }
 
-    public void unmarshalEx(Downcall down, org.omg.CORBA.SystemException ex)
-            throws LocationForward, FailureException {
+    public void unmarshalEx(Downcall down, SystemException ex) throws LocationForward, FailureException {
         down.unmarshalEx(ex);
     }
 
-    public void postUnmarshal(Downcall down) throws LocationForward,
-            FailureException {
+    public void postUnmarshal(Downcall down) throws LocationForward, FailureException {
         down.postUnmarshal();
     }
 
@@ -309,20 +318,18 @@
         return down.unmarshalExceptionId();
     }
 
-    public void setUserException(Downcall down, org.omg.CORBA.UserException ex,
-            String exId) {
+    public void setUserException(Downcall down, UserException ex, String exId) {
         down.setUserException(ex, exId);
     }
 
-    public void setUserException(Downcall down, org.omg.CORBA.UserException ex) {
+    public void setUserException(Downcall down, UserException ex) {
         down.setUserException(ex);
     }
 
     //
     // Handle a FailureException
     //
-    public synchronized void handleFailureException(Downcall down,
-            FailureException ex) throws FailureException {
+    public synchronized void handleFailureException(Downcall down, FailureException ex) throws FailureException {
         //
         // Only called if there is really a failure
         //
@@ -335,24 +342,21 @@
         Client client = down.client();
         org.apache.yoko.orb.OCI.ProfileInfo profile = down.profileInfo();
 
-        for (int i = 0; i < clientProfilePairs_.size(); i++) {
-            ClientProfilePair pair = (ClientProfilePair) clientProfilePairs_
-                    .elementAt(i);
-            if (pair.client == client && pair.profile == profile) {
-                ClientManager clientManager = orbInstance_.getClientManager();
-
-                //
-                // Make sure the ORB has not been destroyed
-                //
-                if (clientManager == null)
-                    throw new org.omg.CORBA.BAD_INV_ORDER(
-                            MinorCodes
-                                    .describeBadInvOrder(org.apache.yoko.orb.OB.MinorCodes.MinorShutdownCalled),
+        final ClientManager clientManager = orbInstance_.getClientManager();
+        //
+        // Make sure the ORB has not been destroyed
+        //
+        if (clientManager == null)
+            throw new BAD_INV_ORDER(
+                    MinorCodes.describeBadInvOrder(
+                            org.apache.yoko.orb.OB.MinorCodes.MinorShutdownCalled),
                             org.apache.yoko.orb.OB.MinorCodes.MinorShutdownCalled,
-                            org.omg.CORBA.CompletionStatus.COMPLETED_NO);
+                            CompletionStatus.COMPLETED_NO);
 
+        for (ClientProfilePair pair : clientProfilePairs_) {
+            if (pair.client == client && pair.profile == profile) {
                 clientManager.releaseClient(pair.client, false);
-                clientProfilePairs_.removeElementAt(i);
+                clientProfilePairs_.remove(pair);
                 break;
             }
         }
@@ -362,10 +366,8 @@
         //
         try {
             throw ex.exception;
-        } catch (org.omg.CORBA.COMM_FAILURE e) {
-        } catch (org.omg.CORBA.TRANSIENT e) {
-        } catch (org.omg.CORBA.NO_RESPONSE e) {
-        } catch (org.omg.CORBA.SystemException e) {
+        } catch (COMM_FAILURE|TRANSIENT|NO_RESPONSE forceRetry) {
+        } catch (SystemException systemException) {
             throw ex; // Not "throw e;"!
         }
 
@@ -373,8 +375,7 @@
         // We can't retry if RETRY_STRICT or RETRY_NEVER is set and the
         // completion status is not COMPLETED_NO
         //
-        if (policies_.retry.mode != RETRY_ALWAYS.value
-                && ex.exception.completed != org.omg.CORBA.CompletionStatus.COMPLETED_NO) {
+        if (policies_.retry.mode != RETRY_ALWAYS.value && ex.exception.completed != CompletionStatus.COMPLETED_NO) {
             throw ex;
         }
 
@@ -389,7 +390,6 @@
         //
         // OK, let's continue with the next profile
         //
-        CoreTraceLevels coreTraceLevels = orbInstance_.getCoreTraceLevels();
         logger.log(Level.FINE, "trying next profile", ex.exception);
     }
 
@@ -422,7 +422,7 @@
                         logger.fine("Twoway invocations not supported, returning true"); 
                         return true;
                     }
-                } catch (org.omg.CORBA.SystemException ex) {
+                } catch (SystemException ex) {
                     logger.log(Level.FINE, "Exception occurred during locate request", ex); 
                     throw new FailureException(ex);
                 }
@@ -434,7 +434,7 @@
                 postUnmarshal(down);
                 logger.fine("Object located"); 
                 return true;
-            } catch (org.omg.CORBA.OBJECT_NOT_EXIST ex) {
+            } catch (OBJECT_NOT_EXIST ex) {
                 logger.log(Level.FINE, "Object does not exist", ex); 
                 return false;
             } catch (FailureException ex) {
@@ -472,8 +472,7 @@
     // Prepare a request from a portable stub
     //
     public org.apache.yoko.orb.CORBA.OutputStream setupRequest(
-            org.omg.CORBA.Object self, String operation,
-            boolean responseExpected) throws LocationForward, FailureException {
+            org.omg.CORBA.Object self, String operation, boolean responseExpected) throws LocationForward, FailureException {
         while (true) {
             org.apache.yoko.orb.OB.Downcall downcall = createDowncall(
                     operation, responseExpected);
@@ -502,8 +501,7 @@
     //
     // public org.apache.yoko.orb.CORBA.OutputStream
     public org.apache.yoko.orb.OB.CodeConverters setupPollingRequest(
-            org.omg.IOP.ServiceContextListHolder sclHolder,
-            org.apache.yoko.orb.CORBA.OutputStreamHolder out)
+            ServiceContextListHolder sclHolder, org.apache.yoko.orb.CORBA.OutputStreamHolder out)
             throws FailureException {
         //
         // Create buffer to contain out marshalable data
@@ -516,8 +514,7 @@
         org.apache.yoko.orb.OCI.ProfileInfoHolder info = new org.apache.yoko.orb.OCI.ProfileInfoHolder();
         Client client = getClientProfilePair(info);
 
-        out.value = new org.apache.yoko.orb.CORBA.OutputStream(buf, client
-                .codeConverters(), GIOP1_2);
+        out.value = new org.apache.yoko.orb.CORBA.OutputStream(buf, client.codeConverters(), GIOP1_2);
 
         sclHolder.value = client.getAMIRouterSCL();
 
@@ -557,28 +554,23 @@
         //
         Client client = getClientProfilePair(info);
 
-        out.value = new org.apache.yoko.orb.CORBA.OutputStream(buf, client
-                .codeConverters(), GIOP1_2);
-        org.omg.IOP.ServiceContext[] scl = client.getAMIRouterSCL();
+        out.value = new org.apache.yoko.orb.CORBA.OutputStream(buf, client.codeConverters(), GIOP1_2);
+        ServiceContext[] scl = client.getAMIRouterSCL();
 
-        GIOPOutgoingMessage outgoing = new GIOPOutgoingMessage(orbInstance_,
-                out.value, info.value);
+        GIOPOutgoingMessage outgoing = new GIOPOutgoingMessage(orbInstance_, out.value, info.value);
 
         //
         // Put the request header into the stream
         //
-        outgoing.writeRequestHeader(client.requestId(), operation,
-                responseExpected, scl);
+        outgoing.writeRequestHeader(client.requestId(), operation, responseExpected, scl);
 
         return outgoing;
     }
 
-    public void AMIRouterPostMarshal(GIOPOutgoingMessage outgoing,
-            org.apache.yoko.orb.CORBA.OutputStreamHolder out) {
+    public void AMIRouterPostMarshal(GIOPOutgoingMessage outgoing, org.apache.yoko.orb.CORBA.OutputStreamHolder out) {
         int pos = out.value._OB_pos();
         out.value._OB_pos(0);
-        outgoing.writeMessageHeader(org.omg.GIOP.MsgType_1_1.Request, false,
-                pos - 12);
+        outgoing.writeMessageHeader(MsgType_1_1.Request, false, pos - 12);
         out.value._OB_pos(pos);
 
         //
@@ -597,8 +589,8 @@
     public org.apache.yoko.orb.CORBA.InputStream invoke(
             org.omg.CORBA.Object self,
             org.apache.yoko.orb.CORBA.OutputStream out)
-            throws org.omg.CORBA.portable.ApplicationException,
-            org.omg.CORBA.portable.RemarshalException, LocationForward,
+            throws ApplicationException,
+            RemarshalException, LocationForward,
             FailureException {
         //
         // We should have an InvocationContext associated with the
@@ -612,7 +604,7 @@
         // If the DowncallStub has changed, then remarshal
         //
         if (ctx.downcallStub != this) {
-            throw new org.omg.CORBA.portable.RemarshalException();
+            throw new RemarshalException();
         }
 
         Downcall down = ctx.downcall;
@@ -643,7 +635,7 @@
                         // Extract the exception's repository ID
                         //
                         id = down.unmarshalExceptionId();
-                    } catch (org.omg.CORBA.SystemException ex) {
+                    } catch (SystemException ex) {
                         down.unmarshalEx(ex);
                     }
 
@@ -655,8 +647,7 @@
                     down.setUserException(id);
                     down.postUnmarshal();
 
-                    throw new org.omg.CORBA.portable.ApplicationException(id,
-                            in);
+                    throw new ApplicationException(id, in);
                 } else {
                     //
                     // We're using portable stubs, so we'll never
@@ -679,7 +670,7 @@
         //
         // If we reach this point, then we need to reinvoke
         //
-        throw new org.omg.CORBA.portable.RemarshalException();
+        throw new RemarshalException();
     }
 
     public org.omg.CORBA.Object getAMIPollTarget() {
@@ -688,15 +679,11 @@
         // generated stub, we will call this method to create the target
         // object for a polling request
         //
-        org.apache.yoko.orb.OB.ObjectFactory objectFactory = orbInstance_
-                .getObjectFactory();
+        org.apache.yoko.orb.OB.ObjectFactory objectFactory = orbInstance_.getObjectFactory();
         return objectFactory.createObject(IOR_);
     }
 
-    public org.omg.MessageRouting.PersistentRequest ami_poll_request(
-            org.omg.CORBA.portable.OutputStream out, String operation,
-            org.omg.IOP.ServiceContext[] scl)
-            throws org.omg.CORBA.portable.RemarshalException {
+    public PersistentRequest ami_poll_request(OutputStream out, String operation, ServiceContext[] scl) throws RemarshalException {
         //
         // setup the ORBInstance
         //
@@ -704,8 +691,7 @@
         Assert._OB_assert(out != null);
 
         //
-        // We should have an InvocationContext associated with the
-        // OutputStream
+        // We should have an InvocationContext associated with the OutputStream
         //
         org.apache.yoko.orb.CORBA.OutputStream o = (org.apache.yoko.orb.CORBA.OutputStream) out;
         InvocationContext ctx = (InvocationContext) o._OB_invocationContext();
@@ -715,19 +701,18 @@
         // If the DowncallStub has changed, then remarshal
         //
         if (ctx.downcallStub != this)
-            throw new org.omg.CORBA.portable.RemarshalException();
+            throw new RemarshalException();
 
         //
         // Obtain the ORB
         //
-        org.omg.CORBA.ORB orb = orbInstance_.getORB();
+        ORB orb = orbInstance_.getORB();
         Assert._OB_assert(orb != null);
 
         //
         // Obtain the PersistentRequestRouter
         //
-        org.omg.MessageRouting.PersistentRequestRouter router = org.apache.yoko.orb.OB.MessageRoutingUtil
-                .getPersistentRouterFromConfig(orbInstance_);
+        PersistentRequestRouter router = org.apache.yoko.orb.OB.MessageRoutingUtil.getPersistentRouterFromConfig(orbInstance_);
         org.apache.yoko.orb.OB.Assert._OB_assert(router != null);
 
         //
@@ -735,11 +720,10 @@
         //
         org.apache.yoko.orb.OCI.ProfileInfoHolder info = new org.apache.yoko.orb.OCI.ProfileInfoHolder();
         info.value = null;
-        Client client = null;
         try {
-            client = getClientProfilePair(info);
+            getClientProfilePair(info);
         } catch (org.apache.yoko.orb.OB.FailureException ex) {
-            throw new org.omg.CORBA.portable.RemarshalException();
+            throw new RemarshalException();
         }
 
         //
@@ -750,23 +734,21 @@
         //
         // Create the router to_visit list
         //
-        org.omg.MessageRouting.RouterListHolder to_visit = new org.omg.MessageRouting.RouterListHolder();
-        to_visit.value = new org.omg.MessageRouting.Router[0];
-        org.apache.yoko.orb.OB.MessageRoutingUtil.getRouterListFromComponents(
-                orbInstance_, info.value, to_visit);
+        RouterListHolder to_visit = new RouterListHolder();
+        to_visit.value = new Router[0];
+        org.apache.yoko.orb.OB.MessageRoutingUtil.getRouterListFromComponents(orbInstance_, info.value, to_visit);
 
         //
         // Obtain the target objects
         //
-        org.apache.yoko.orb.OB.ObjectFactory objectFactory = orbInstance_
-                .getObjectFactory();
+        org.apache.yoko.orb.OB.ObjectFactory objectFactory = orbInstance_.getObjectFactory();
         org.omg.CORBA.Object target = objectFactory.createObject(IOR_);
 
         //
         // Populate the RequestMessage payload
         //
-        org.omg.MessageRouting.RequestMessage payload = new org.omg.MessageRouting.RequestMessage();
-        // payload.service_contexts = new org.omg.IOP.ServiceContext[0];
+        RequestMessage payload = new RequestMessage();
+        // payload.service_contexts = new ServiceContext[0];
         //
         // XXX
         //
@@ -781,29 +763,25 @@
         payload.reserved[2] = 0;
         payload.operation = operation;
         payload.object_key = new byte[info.value.key.length];
-        System.arraycopy(info.value.key, 0, payload.object_key, 0,
-                info.value.key.length);
+        System.arraycopy(info.value.key, 0, payload.object_key, 0, info.value.key.length);
 
         o._OB_pos(0);
         org.apache.yoko.orb.OCI.Buffer buf = o._OB_buffer();
-        org.omg.MessageRouting.MessageBody messageBody = new org.omg.MessageRouting.MessageBody();
+        MessageBody messageBody = new MessageBody();
         messageBody.byte_order = false; // Java is always false
         messageBody.body = new byte[buf.rest_length()];
-        System.arraycopy(buf.data(), buf.pos(), messageBody.body, 0, buf
-                .rest_length());
+        System.arraycopy(buf.data(), buf.pos(), messageBody.body, 0, buf.rest_length());
         payload.body = messageBody;
 
         //
         // Empty QoS list
         //
-        org.omg.CORBA.Policy[] qosList = new org.omg.CORBA.Policy[0];
+        Policy[] qosList = new Policy[0];
 
         //
         // Create a new Persistent request
         //
-        org.omg.MessageRouting.PersistentRequest request = router
-                .create_persistent_request(index, to_visit.value, target,
-                        qosList, payload);
+        PersistentRequest request = router.create_persistent_request(index, to_visit.value, target, qosList, payload);
 
         //
         // Return the persistent request back to the stub
@@ -811,11 +789,7 @@
         return request;
     }
 
-    public boolean ami_callback_request(
-            org.omg.CORBA.portable.OutputStream out,
-            org.omg.Messaging.ReplyHandler reply,
-            org.apache.yoko.orb.OCI.ProfileInfo info)
-            throws org.omg.CORBA.portable.RemarshalException {
+    public boolean ami_callback_request(OutputStream out, ReplyHandler reply, org.apache.yoko.orb.OCI.ProfileInfo info) throws RemarshalException {
         //
         // We should have an InvocationContext associated with the
         // OutputStream
@@ -828,16 +802,14 @@
         // If the DowncallStub has changed, then remarshal
         //
         if (ctx.downcallStub != this)
-            throw new org.omg.CORBA.portable.RemarshalException();
+            throw new RemarshalException();
 
-        org.apache.yoko.orb.CORBA.InputStream tmpIn = (org.apache.yoko.orb.CORBA.InputStream) out
-                .create_input_stream();
+        org.apache.yoko.orb.CORBA.InputStream tmpIn = (org.apache.yoko.orb.CORBA.InputStream) out.create_input_stream();
 
         //
         // Unmarshal the message header
         //
-        org.omg.GIOP.MessageHeader_1_1 msgHeader = org.omg.GIOP.MessageHeader_1_2Helper
-                .read(tmpIn);
+        MessageHeader_1_1 msgHeader = MessageHeader_1_2Helper.read(tmpIn);
 
         //
         // Check the GIOP version
@@ -852,7 +824,7 @@
         //
         // Check the message type
         //
-        if (msgHeader.message_type != (byte) org.omg.GIOP.MsgType_1_1._Request) {
+        if (msgHeader.message_type != (byte) MsgType_1_1._Request) {
             //
             // Report error - throw exception
             //
@@ -862,35 +834,32 @@
         //
         // Create and populate a RequestInfo to send to the router
         //
-        org.omg.MessageRouting.RequestInfo requestInfo = new org.omg.MessageRouting.RequestInfo();
+        RequestInfo requestInfo = new RequestInfo();
 
         //
         // Unmarshal the request header
         // 
-        org.omg.GIOP.RequestHeader_1_2 requestHeader = org.omg.GIOP.RequestHeader_1_2Helper
-                .read(tmpIn);
+        RequestHeader_1_2 requestHeader = RequestHeader_1_2Helper.read(tmpIn);
 
         //
         // Create and populate a RequestInfo structure to send to the
         // Router
         //
-        org.omg.MessageRouting.RouterListHolder configRouterList = new org.omg.MessageRouting.RouterListHolder();
-        configRouterList.value = new org.omg.MessageRouting.Router[0];
+        RouterListHolder configRouterList = new RouterListHolder();
+        configRouterList.value = new Router[0];
 
         //
         // Populate the configRouterList
         //
-        org.apache.yoko.orb.OB.MessageRoutingUtil.getRouterListFromComponents(
-                orbInstance_, info, configRouterList);
+        org.apache.yoko.orb.OB.MessageRoutingUtil.getRouterListFromComponents(orbInstance_, info, configRouterList);
 
-        requestInfo.visited = new org.omg.MessageRouting.Router[0];
-        requestInfo.to_visit = new org.omg.MessageRouting.Router[0];
+        requestInfo.visited = new Router[0];
+        requestInfo.to_visit = new Router[0];
 
         //
         // Get the target for this request
         //
-        org.apache.yoko.orb.OB.ObjectFactory objectFactory = orbInstance_
-                .getObjectFactory();
+        org.apache.yoko.orb.OB.ObjectFactory objectFactory = orbInstance_.getObjectFactory();
         //
         // REVISIT: Should we be using IOR_ or origIOR_?
         //
@@ -904,24 +873,23 @@
         //
         // Get the reply destination for this request
         //
-        org.omg.MessageRouting.ReplyDestination replyDest = new org.omg.MessageRouting.ReplyDestination();
-        replyDest.handler_type = org.omg.MessageRouting.ReplyDisposition.TYPED;
+        ReplyDestination replyDest = new ReplyDestination();
+        replyDest.handler_type = ReplyDisposition.TYPED;
         replyDest.handler = reply;
         requestInfo.reply_destination = replyDest;
 
         //
         // Get the selected qos for this request
         //
-        org.omg.Messaging.PolicyValueSeqHolder invocPoliciesHolder = new org.omg.Messaging.PolicyValueSeqHolder();
-        invocPoliciesHolder.value = new org.omg.Messaging.PolicyValue[0];
-        org.apache.yoko.orb.OB.MessageRoutingUtil.getInvocationPolicyValues(
-                policies_, invocPoliciesHolder);
+        PolicyValueSeqHolder invocPoliciesHolder = new PolicyValueSeqHolder();
+        invocPoliciesHolder.value = new PolicyValue[0];
+        org.apache.yoko.orb.OB.MessageRoutingUtil.getInvocationPolicyValues(policies_, invocPoliciesHolder);
         requestInfo.selected_qos = invocPoliciesHolder.value;
 
         //
         // Create payload (RequestMessage) for this request
         //
-        org.omg.MessageRouting.RequestMessage requestMessage = new org.omg.MessageRouting.RequestMessage();
+        RequestMessage requestMessage = new RequestMessage();
         requestMessage.giop_version = new org.omg.GIOP.Version();
         requestMessage.giop_version.major = info.major;
         requestMessage.giop_version.minor = info.minor;
@@ -935,8 +903,8 @@
         // Add the invocation policies service context for this request.
         // Note that this can change from request to request
         //
-        org.omg.IOP.ServiceContext invocPoliciesSC = new org.omg.IOP.ServiceContext();
-        invocPoliciesSC.context_id = org.omg.IOP.INVOCATION_POLICIES.value;
+        ServiceContext invocPoliciesSC = new ServiceContext();
+        invocPoliciesSC.context_id = INVOCATION_POLICIES.value;
 
         //
         // Create an output stream an write the PolicyValueSeq
@@ -946,20 +914,17 @@
             org.apache.yoko.orb.CORBA.OutputStream scOut = new org.apache.yoko.orb.CORBA.OutputStream(
                     scBuf);
             scOut._OB_writeEndian();
-            org.omg.Messaging.PolicyValueSeqHelper.write(scOut,
-                    invocPoliciesHolder.value);
+            PolicyValueSeqHelper.write(scOut, invocPoliciesHolder.value);
             invocPoliciesSC.context_data = new byte[scOut._OB_pos()];
-            System.arraycopy(invocPoliciesSC.context_data, 0, scBuf.data(), 0,
-                    scBuf.length());
+            System.arraycopy(invocPoliciesSC.context_data, 0, scBuf.data(), 0, scBuf.length());
         }
 
         //
         // Add the service context to the list of current service contexts
         //
         int scLength = requestMessage.service_contexts.length;
-        org.omg.IOP.ServiceContext[] scList = new org.omg.IOP.ServiceContext[scLength + 1];
-        System.arraycopy(requestMessage.service_contexts, 0, scList, 0,
-                scLength);
+        ServiceContext[] scList = new ServiceContext[scLength + 1];
+        System.arraycopy(requestMessage.service_contexts, 0, scList, 0, scLength);
         scList[scLength] = invocPoliciesSC;
 
         //
@@ -990,7 +955,7 @@
         //
         // Get the body of the request message
         //
-        org.omg.MessageRouting.MessageBody messageBody = new org.omg.MessageRouting.MessageBody();
+        MessageBody messageBody = new MessageBody();
 
         //
         // Java is always big endian
@@ -1025,7 +990,7 @@
         int numRouters = configRouterList.value.length;
 
         for (int i = numRouters - 1; (delivered == false) && (i >= 0); --i) {
-            org.omg.MessageRouting.Router curRouter = configRouterList.value[i];
+            Router curRouter = configRouterList.value[i];
 
             //
             // We only add the routers that we have attempted to contact to
@@ -1033,7 +998,7 @@
             // the request, then the lower priority routers are not added
             //
             int curLength = requestInfo.to_visit.length;
-            org.omg.MessageRouting.Router[] toVisit = new org.omg.MessageRouting.Router[curLength + 1];
+            Router[] toVisit = new Router[curLength + 1];
             if (curLength > 0) {
                 System.arraycopy(requestInfo.to_visit, 0, toVisit, 1, curLength);
             }
@@ -1047,7 +1012,7 @@
                 // Success: stop processing
                 //
                 delivered = true;
-            } catch (org.omg.CORBA.SystemException ex) {
+            } catch (SystemException ex) {
                 logger.log(Level.FINE, "Failed to contact router: " + ex.getMessage(), ex); 
                 //
                 // Failure: try the next router in the list
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/OB/GIOPClient.java b/yoko-core/src/main/java/org/apache/yoko/orb/OB/GIOPClient.java
index 6f9d2ee..6756e8e 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/OB/GIOPClient.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/OB/GIOPClient.java
@@ -571,21 +571,11 @@
     //
     // Checks whether this client is equal to another client
     //
-    public boolean equal(Client cl) {
-        GIOPClient client = null;
-        try {
-            client = (GIOPClient) cl;
-        } catch (ClassCastException ex) {
-            return false;
-        }
+    public boolean matches(Client other) {
+        if (!!!(other instanceof GIOPClient)) return false;
+        GIOPClient that = (GIOPClient) other;
 
-        if (!connector_.equal(client.connector_))
-            return false;
-
-        if (!codeConverters().equals(client.codeConverters()))
-            return false;
-
-        return true;
+        return this.connector_.equal(that.connector_) && this.codeConverters().equals(that.codeConverters());
     }
 
     //
