Index: include/omniORB4/internal/request.h
===================================================================
--- include/omniORB4/internal/request.h	(revision 6323)
+++ include/omniORB4/internal/request.h	(working copy)
@@ -75,6 +75,27 @@
     pd_context = CORBA::Context::_duplicate(ctx);
   }
 
+  inline _CORBA_Boolean isCalledBack()
+  {
+    omni_tracedmutex_lock l(sd_lock);
+    return !pd_do_callback;
+  }
+
+  inline void waitForCallback()
+  {
+    omni_tracedmutex_lock l(sd_lock);
+    
+    if (!pd_do_callback)
+      return;
+
+    if (!pd_cond)
+      pd_cond = new omni_tracedcondition(&sd_lock,
+                                         "DIICallDescriptor::pd_cond");
+
+    while (pd_do_callback)
+      pd_cond->wait();
+  }
+
 private:
   RequestImpl*             pd_req;
   CORBA::NVList_var        pd_arguments;
Index: src/lib/omniORB/dynamic/request.cc
===================================================================
--- src/lib/omniORB/dynamic/request.cc	(revision 6323)
+++ src/lib/omniORB/dynamic/request.cc	(working copy)
@@ -165,6 +165,14 @@
     pd_environment->exception(getException());
 
   omniAMI::DIIPollableImpl::_PD_instance._replyReady();
+
+  {
+    omni_tracedmutex_lock l(sd_lock);
+    pd_do_callback = 0;
+    if (pd_cond)
+      pd_cond->broadcast();
+  }
+
   pd_req->decrRefCount();
 }
 
@@ -530,7 +538,7 @@
   if (pd_state == RS_DONE_DEFERRED)
     return;
 
-  pd_cd.wait();
+  pd_cd.waitForCallback();
   pd_state = RS_DONE_DEFERRED;
   omniAMI::DIIPollableImpl::_PD_instance._replyCollected();
 
@@ -565,7 +573,7 @@
 		  BAD_INV_ORDER_ResultAlreadyReceived,
 		  CORBA::COMPLETED_NO);
 
-  if (!pd_cd.isComplete())
+  if (!pd_cd.isCalledBack())
     return 0;
 
   pd_state = RS_POLLED_DONE_DEFERRED;
