Index: /trunk/src/VBox/Main/glue/glue-java.xsl
===================================================================
--- /trunk/src/VBox/Main/glue/glue-java.xsl	(revision 61364)
+++ /trunk/src/VBox/Main/glue/glue-java.xsl	(revision 61365)
@@ -4543,12 +4543,10 @@
     private final static ReferenceQueue<IUnknown> refQ = new ReferenceQueue<IUnknown>();
 
-    private final VboxPortType port;
     private final ConcurrentMap<String, ManagedObj> map = new ConcurrentHashMap<String, ManagedObj>();
     private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
     private final ObjRefMgrCleanupThread objRefMgrCleanup;
 
-    public ObjectRefManager(VboxPortType port)
-    {
-        this.port = port;
+    public ObjectRefManager()
+    {
         this.objRefMgrCleanup = new ObjRefMgrCleanupThread(this, 100);
         this.objRefMgrCleanup.start();
@@ -4597,4 +4595,5 @@
     public void registerObj(IUnknown obj)
     {
+        assert lock.getReadLockCount() > 0;
         ManagedObjRef ref = new ManagedObjRef(obj);
 
@@ -4607,5 +4606,5 @@
         {
             /* Create new. */
-            mgrobj = new ManagedObj(obj.getWrapped());
+            mgrobj = new ManagedObj(obj.getWrapped(), obj.getRemoteWSPort());
             mgrobj.addObject(ref);
             map.put(obj.getWrapped(), mgrobj);
@@ -4621,6 +4620,4 @@
     public ManagedObj unregisterObj(ManagedObjRef objRef)
     {
-        assert lock.isWriteLockedByCurrentThread();
-
         ManagedObj obj = this.map.get(objRef.objId);
 
@@ -4635,9 +4632,11 @@
     public void releaseRemoteObj(ManagedObj obj)
     {
+        assert lock.isWriteLockedByCurrentThread();
+
         if (!obj.isReferenced())
         {
             try
             {
-                this.port.iManagedObjectRefRelease(obj.objId);
+                obj.port.iManagedObjectRefRelease(obj.objId);
             }
             catch (InvalidObjectFaultMsg e)
@@ -4663,9 +4662,11 @@
     {
         private final String                               objId;
+        private final VboxPortType                         port;
         private final ConcurrentLinkedQueue<ManagedObjRef> refQ;
 
-        ManagedObj(String objId)
+        ManagedObj(String objId,  VboxPortType port)
         {
           this.objId = objId;
+          this.port  = port;
           this.refQ  = new ConcurrentLinkedQueue<ManagedObjRef>();
         }
@@ -4897,8 +4898,8 @@
 {
     private static PortPool pool = new PortPool(true);
+    private static final ObjectRefManager objMgr = new ObjectRefManager();
     protected VboxPortType port;
 
     private IVirtualBox vbox;
-    private ObjectRefManager objMgr;
 
     private VirtualBoxManager()
@@ -4917,5 +4918,4 @@
     {
         this.port = pool.getPort();
-        this.objMgr = new ObjectRefManager(this.port);
         try
         {
@@ -4938,5 +4938,13 @@
 
             String handle = port.iWebsessionManagerLogon(username, passwd);
-            this.vbox = new IVirtualBox(handle, this.objMgr, port);
+            this.objMgr.preventObjRelease();
+            try
+            {
+                this.vbox = new IVirtualBox(handle, this.objMgr, port);
+            }
+            finally
+            {
+                this.objMgr.allowObjRelease();
+            }
         }
         catch (Throwable t)
@@ -4956,6 +4964,4 @@
     {
         this.port = pool.getPort();
-        this.objMgr = new ObjectRefManager(this.port);
-
         try
         {
@@ -4970,5 +4976,13 @@
                 put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
             String handle = port.iWebsessionManagerLogon(username, passwd);
-            this.vbox = new IVirtualBox(handle, this.objMgr, port);
+            this.objMgr.preventObjRelease();
+            try
+            {
+                this.vbox = new IVirtualBox(handle, this.objMgr, port);
+            }
+            finally
+            {
+                this.objMgr.allowObjRelease();
+            }
         }
         catch (Throwable t)
@@ -5031,5 +5045,13 @@
         {
             String handle = port.iWebsessionManagerGetSessionObject(this.vbox.getWrapped());
-            return new ISession(handle, this.objMgr, port);
+            this.objMgr.preventObjRelease();
+            try
+            {
+                return new ISession(handle, this.objMgr, port);
+            }
+            finally
+            {
+                this.objMgr.allowObjRelease();
+            }
         }
         catch (InvalidObjectFaultMsg e)
