Index: RTIA/ObjectManagement.cc
===================================================================
RCS file: /sources/certi/certi/RTIA/ObjectManagement.cc,v
retrieving revision 3.30
diff -u -r3.30 ObjectManagement.cc
--- RTIA/ObjectManagement.cc	16 Nov 2007 15:45:01 -0000	3.30
+++ RTIA/ObjectManagement.cc	4 Dec 2007 17:33:28 -0000
@@ -397,9 +397,10 @@
 }
 
 // ----------------------------------------------------------------------------
-//! deleteObject
+//! deleteObject with time
 EventRetractionHandle
 ObjectManagement::deleteObject(ObjectHandle theObjectHandle,
+			       FederationTime theTime,	
                                const char *theTag,
                                TypeException &e)
 {
@@ -407,6 +408,8 @@
 
     req.type = NetworkMessage::DELETE_OBJECT ;
     req.object = theObjectHandle ;
+    req.setBoolean(true);
+    req.date = theTime;
     req.federation = fm->_numero_federation ;
     req.federate = fm->federate ;
 
@@ -416,17 +419,45 @@
 
     e = rep.exception ;
 
-   if (e == e_NO_EXCEPTION)
+    if (e == e_NO_EXCEPTION) {
         rootObject->deleteObjectInstance(fm->federate, theObjectHandle, theTag);
+    }
 
     return rep.eventRetraction ;
 }
 
 // ----------------------------------------------------------------------------
-//! removeObject
+//! deleteObject without time
+void
+ObjectManagement::deleteObject(ObjectHandle theObjectHandle,
+                               const char *theTag,
+                               TypeException &e)
+{
+    NetworkMessage req, rep ;
+
+    req.type = NetworkMessage::DELETE_OBJECT ;
+    req.object = theObjectHandle ;
+    req.setBoolean(false);
+    req.federation = fm->_numero_federation ;
+    req.federate = fm->federate ;
+
+    strcpy(req.label, theTag);
+    comm->sendMessage(&req);
+    comm->waitMessage(&rep, NetworkMessage::DELETE_OBJECT, req.federate);
+
+    e = rep.exception ;
+
+    if (e == e_NO_EXCEPTION) {
+        rootObject->deleteObjectInstance(fm->federate, theObjectHandle, theTag);
+    }
+}
+
+// ----------------------------------------------------------------------------
+//! removeObject with time
 void
 ObjectManagement::removeObject(ObjectHandle the_object,
                                FederateHandle the_federate,
+			       FederationTime theTime,
                                const char *the_tag,
                                EventRetractionHandle the_event,
                                TypeException &)
@@ -437,22 +468,33 @@
     req.setObject(the_object);
     req.setEventRetraction(the_event);
     req.setTag(the_tag);
+    req.setBoolean(true);
 
     // BUG: On fait quoi de la reponse ?
     comm->requestFederateService(&req, &rep);
 
-    rootObject->deleteObjectInstance(the_federate, the_object, the_tag);
+    rootObject->deleteObjectInstance(the_federate, the_object, theTime, the_tag);
 }
 
 // ----------------------------------------------------------------------------
-//! removeObject
+//! removeObject without time
 void
-ObjectManagement::removeObject(ObjectHandle,
-                               ObjectRemovalReason,
+ObjectManagement::removeObject(ObjectHandle the_object,
+                               FederateHandle the_federate,
+                               const char *the_tag,
                                TypeException &)
 {
-    printf("ObjectManagement.cc: RemoveObject(2) not implemented.\n");
-    throw RTIinternalError("");
+    Message req, rep ;
+
+    req.type = Message::REMOVE_OBJECT_INSTANCE ;
+    req.setObject(the_object);
+    req.setTag(the_tag);
+    req.setBoolean(false);
+    
+    // BUG: On fait quoi de la reponse ?
+    comm->requestFederateService(&req, &rep);
+
+    rootObject->deleteObjectInstance(the_federate, the_object, the_tag);
 }
 
 // ----------------------------------------------------------------------------
Index: RTIA/ObjectManagement.hh
===================================================================
RCS file: /sources/certi/certi/RTIA/ObjectManagement.hh,v
retrieving revision 3.16
diff -u -r3.16 ObjectManagement.hh
--- RTIA/ObjectManagement.hh	6 Nov 2007 10:05:06 -0000	3.16
+++ RTIA/ObjectManagement.hh	4 Dec 2007 17:33:28 -0000
@@ -125,15 +125,26 @@
                             TypeException &e);
 
     EventRetractionHandle deleteObject(ObjectHandle theObjectHandle,
+    				       FederationTime theTime,	
                                        const char *theTag,
                                        TypeException &e);
 
+    void deleteObject(ObjectHandle theObjectHandle,
+    		      const char *theTag,
+		      TypeException &e);
+
     void removeObject(ObjectHandle theObjectHandle,
                       FederateHandle theFederateHandle,
+		      FederationTime theTime,
                       const char *theTag,
                       EventRetractionHandle theHandle,
                       TypeException &e);
 
+    void removeObject(ObjectHandle theObjectHandle,
+                      FederateHandle theFederateHandle,
+                      const char *theTag,
+                      TypeException &e);
+
     void removeObject(ObjectHandle theObject,
                       ObjectRemovalReason theReason,
                       TypeException &e);
Index: RTIA/RTIA_federate.cc
===================================================================
RCS file: /sources/certi/certi/RTIA/RTIA_federate.cc,v
retrieving revision 3.54
diff -u -r3.54 RTIA_federate.cc
--- RTIA/RTIA_federate.cc	29 Nov 2007 16:51:15 -0000	3.54
+++ RTIA/RTIA_federate.cc	4 Dec 2007 17:33:28 -0000
@@ -408,10 +408,35 @@
       }
         break ;
 
-      case Message::DELETE_OBJECT_INSTANCE:
-        D.Out(pdTrace, "Receiving Message from Federate, type DeleteObject.");
-        rep.setEventRetraction(om->deleteObject(req->getObject(), req->getTag(),
-                                                e));
+      case Message::DELETE_OBJECT_INSTANCE: {
+          
+	G.Out(pdGendoc,"D_O_I into RTIA::chooseFederateProcessing") ;
+
+	try {
+	    if ( req->getBoolean() ) {
+        	D.Out(pdTrace, 
+	"Receiving Message from Federate, type DeleteObjectInstance with \
+	 TIMESTAMP.");
+                rep.setEventRetraction(
+			om->deleteObject(
+				req->getObject(), 
+				req->getFederationTime(),
+				req->getTag(), 
+				e));
+	    }
+	    else {
+        	D.Out(pdTrace, 
+	"Receiving Message from Federate, type DeleteObjectInstance without \
+	 TIMESTAMP.");
+		om->deleteObject(
+			req->getObject(), 
+			req->getTag(), 
+			e);
+	    }
+	} catch (Exception *e) {
+	    throw e;
+	}
+      }
         break ;
 
       case Message::CHANGE_ATTRIBUTE_TRANSPORTATION_TYPE:
Index: RTIA/RTIA_network.cc
===================================================================
RCS file: /sources/certi/certi/RTIA/RTIA_network.cc,v
retrieving revision 3.15
diff -u -r3.15 RTIA_network.cc
--- RTIA/RTIA_network.cc	29 Nov 2007 16:51:15 -0000	3.15
+++ RTIA/RTIA_network.cc	4 Dec 2007 17:33:28 -0000
@@ -190,15 +190,17 @@
 
       case NetworkMessage::REMOVE_OBJECT:
       {
-          D.Out(pdTrace, "Receving Message from RTIG, type NetworkMessage::REMOVE_OBJECT.");
+          D.Out(pdTrace, "Receving Message from RTIG, \
+	  		  type NetworkMessage::REMOVE_OBJECT.");
 
-          if (tm->requestContraintState()) {
+          if (tm->requestContraintState() && msg->getBoolean()) {
               // Verify that received TSO timestamp is >= current
               // time + lookahead
               queues->insertTsoMessage(msg);
           }
-          else
+          else {
               queues->insertFifoMessage(msg);
+	  }
 
           break ;
       }
Index: RTIA/TimeManagement.cc
===================================================================
RCS file: /sources/certi/certi/RTIA/TimeManagement.cc,v
retrieving revision 3.23
diff -u -r3.23 TimeManagement.cc
--- RTIA/TimeManagement.cc	27 Nov 2007 14:39:49 -0000	3.23
+++ RTIA/TimeManagement.cc	4 Dec 2007 17:33:28 -0000
@@ -222,11 +222,20 @@
       }
 
       case NetworkMessage::REMOVE_OBJECT:
-        om->removeObject(msg.object,
-                         msg.federate,
-                         msg.label,
-                         msg.eventRetraction,
-                         msg.exception);
+          if (msg.getBoolean()) {
+        	om->removeObject(msg.object,
+                		 msg.federate,
+				 msg.date,
+                         	 msg.label,
+                         	 msg.eventRetraction,
+                         	 msg.exception);
+	  }
+	  else {
+        	om->removeObject(msg.object,
+                		 msg.federate,
+                         	 msg.label,
+                         	 msg.exception);
+	  }
         break ;
 
       case NetworkMessage::INFORM_ATTRIBUTE_OWNERSHIP:
Index: RTIG/Federation.cc
===================================================================
RCS file: /sources/certi/certi/RTIG/Federation.cc,v
retrieving revision 3.70
diff -u -r3.70 Federation.cc
--- RTIG/Federation.cc	29 Nov 2007 16:51:15 -0000	3.70
+++ RTIG/Federation.cc	4 Dec 2007 17:33:28 -0000
@@ -727,6 +727,35 @@
 /** Removes an object instance from federation.
     @param federate Federate requesting removal
     @param id Object handle
+    @param theTime Federation Time
+    @param tag Label for this operation
+ */
+void
+Federation::deleteObject(FederateHandle federate,
+                         ObjectHandle id,
+			 FederationTime theTime,
+                         const char *tag)
+    throw (FederateNotExecutionMember,
+           DeletePrivilegeNotHeld,
+           ObjectNotKnown,
+           SaveInProgress,
+           RestoreInProgress,
+	   InvalidFederationTime,
+           RTIinternalError)
+{
+    // It may throw FederateNotExecutionMember.
+    this->check(federate);
+
+    D.Out(pdRegister, "Federation %d: Federate %d destroys object %d.",
+          this->handle, federate, id);
+    
+    root->deleteObjectInstance(federate, id, theTime, tag);
+    objectHandles.free(id);
+}
+// ----------------------------------------------------------------------------
+/** Removes an object instance from federation.
+    @param federate Federate requesting removal
+    @param id Object handle
     @param tag Label for this operation
  */
 void
Index: RTIG/Federation.hh
===================================================================
RCS file: /sources/certi/certi/RTIG/Federation.hh,v
retrieving revision 3.43
diff -u -r3.43 Federation.hh
--- RTIG/Federation.hh	16 Nov 2007 15:04:22 -0000	3.43
+++ RTIG/Federation.hh	4 Dec 2007 17:33:28 -0000
@@ -222,6 +222,18 @@
 
     void deleteObject(FederateHandle theFederateHandle,
                       ObjectHandle theObjectHandle,
+		      FederationTime theTime,
+                      const char *theUserTag)
+        throw (FederateNotExecutionMember,
+               DeletePrivilegeNotHeld,
+               ObjectNotKnown,
+               SaveInProgress,
+               RestoreInProgress,
+	       InvalidFederationTime,
+               RTIinternalError);
+
+    void deleteObject(FederateHandle theFederateHandle,
+                      ObjectHandle theObjectHandle,
                       const char *theUserTag)
         throw (FederateNotExecutionMember,
                DeletePrivilegeNotHeld,
Index: RTIG/FederationsList.cc
===================================================================
RCS file: /sources/certi/certi/RTIG/FederationsList.cc,v
retrieving revision 3.45
diff -u -r3.45 FederationsList.cc
--- RTIG/FederationsList.cc	16 Nov 2007 15:04:22 -0000	3.45
+++ RTIG/FederationsList.cc	4 Dec 2007 17:33:29 -0000
@@ -241,7 +241,37 @@
 }
 
 // ----------------------------------------------------------------------------
-// destroyObject
+// destroyObject with time
+void
+FederationsList::destroyObject(Handle handle,
+			       FederateHandle federate,
+			       ObjectHandle id,
+			       FederationTime theTime,
+			       const char *tag)
+    throw (FederateNotExecutionMember,
+           FederationExecutionDoesNotExist,
+           DeletePrivilegeNotHeld,
+           ObjectNotKnown,
+           SaveInProgress,
+           RestoreInProgress,
+	   InvalidFederationTime,
+           RTIinternalError)
+{
+    Federation *federation = NULL ;
+
+    // It may throw RTIinternalError.
+    checkHandle(handle);
+    checkHandle(federate);
+
+    // It may throw FederationExecutionDoesNotExist.
+    searchFederation(handle, federation);
+
+    federation->deleteObject(federate, id, theTime, tag);
+
+}
+
+// ----------------------------------------------------------------------------
+// destroyObject without time
 void
 FederationsList::destroyObject(Handle handle,
                                FederateHandle federate,
Index: RTIG/FederationsList.hh
===================================================================
RCS file: /sources/certi/certi/RTIG/FederationsList.hh,v
retrieving revision 3.35
diff -u -r3.35 FederationsList.hh
--- RTIG/FederationsList.hh	16 Nov 2007 15:04:22 -0000	3.35
+++ RTIG/FederationsList.hh	4 Dec 2007 17:33:29 -0000
@@ -259,7 +259,21 @@
                SaveInProgress,
                RestoreInProgress,
                RTIinternalError);
-
+    
+    void destroyObject(Handle theHandle,
+    		       FederateHandle theFederateHandle,
+		       ObjectHandle theObjectHandle,
+		       FederationTime theTime,
+		       const char *theUserTag)
+        throw (FederateNotExecutionMember,
+               FederationExecutionDoesNotExist,
+               DeletePrivilegeNotHeld,
+               ObjectNotKnown,
+               SaveInProgress,
+               RestoreInProgress,
+	       InvalidFederationTime,
+               RTIinternalError);
+ 
     void destroyObject(Handle theHandle,
                        FederateHandle theFederateHandle,
                        ObjectHandle theObjectHandle,
Index: RTIG/RTIG_processing.cc
===================================================================
RCS file: /sources/certi/certi/RTIG/RTIG_processing.cc,v
retrieving revision 3.44
diff -u -r3.44 RTIG_processing.cc
--- RTIG/RTIG_processing.cc	16 Nov 2007 15:04:22 -0000	3.44
+++ RTIG/RTIG_processing.cc	4 Dec 2007 17:33:29 -0000
@@ -789,16 +789,27 @@
 }
 
 // ----------------------------------------------------------------------------
-// processdeleteObject
+// processDeleteObject
 void
 RTIG::processDeleteObject(Socket *link, NetworkMessage *req)
 {
+    G.Out(pdGendoc,"BEGIN ** DELETE OBJECT INSTANCE service **");
+    G.Out(pdGendoc,"enter RTIG::processDeleteObject");
     auditServer << "ObjID = %u" << req->object ;
 
-    federations.destroyObject(req->federation,
-                               req->federate,
-                               req->object,
-                               req->label);
+    if ( req->getBoolean() ) {
+    	federations.destroyObject(req->federation,
+        	                  req->federate,
+                                  req->object,
+				  req->date,
+                                  req->label);
+    }
+    else {
+    	federations.destroyObject(req->federation,
+        	                  req->federate,
+                                  req->object,
+                                  req->label);
+    }
 
     D.Out(pdRegister, "Object # %u of Federation %u has been deleted.",
           req->object, req->federation);
@@ -810,6 +821,9 @@
     rep.object = req->object ;
 
     rep.write(link); // send answer to RTIA
+    
+    G.Out(pdGendoc,"exit RTIG::processDeleteObject");
+    G.Out(pdGendoc,"END ** DELETE OBJECT INSTANCE **");
 }
 
 // ----------------------------------------------------------------------------
Index: libCERTI/Message_R.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/Message_R.cc,v
retrieving revision 3.8
diff -u -r3.8 Message_R.cc
--- libCERTI/Message_R.cc	13 Nov 2007 13:25:40 -0000	3.8
+++ libCERTI/Message_R.cc	4 Dec 2007 17:33:29 -0000
@@ -318,6 +318,7 @@
             readName(body);
             readLabel(body);
             readResignAction(body);
+            boolean = body.readLongInt();
             break ;
 
           // Body contains object 
Index: libCERTI/Message_W.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/Message_W.cc,v
retrieving revision 3.9
diff -u -r3.9 Message_W.cc
--- libCERTI/Message_W.cc	13 Nov 2007 13:25:40 -0000	3.9
+++ libCERTI/Message_W.cc	4 Dec 2007 17:33:29 -0000
@@ -326,6 +326,7 @@
             body.writeString(name);
             body.writeString(label);
             writeResignAction(body);
+	    body.writeLongInt(boolean);
             break ;
 
           // Body contains object  
Index: libCERTI/NetworkMessage_RW.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/NetworkMessage_RW.cc,v
retrieving revision 3.33
diff -u -r3.33 NetworkMessage_RW.cc
--- libCERTI/NetworkMessage_RW.cc	29 Nov 2007 16:51:15 -0000	3.33
+++ libCERTI/NetworkMessage_RW.cc	4 Dec 2007 17:33:29 -0000
@@ -169,6 +169,7 @@
       case DELETE_OBJECT:
       case REMOVE_OBJECT:
 	object = body.readLongInt();
+	boolean = body.readLongInt();   // true means with time
 	readLabel(body);
 	break ;
 
@@ -358,6 +359,8 @@
       case ANNOUNCE_SYNCHRONIZATION_POINT:
       case DELETE_OBJECT:
       case REMOVE_OBJECT:
+        date = Header.VP.O_I.date;
+	break;
       case CLOSE_CONNEXION:
       case RESIGN_FEDERATION_EXECUTION:
       case IS_ATTRIBUTE_OWNED_BY_FEDERATE:
@@ -601,6 +604,7 @@
       case DELETE_OBJECT:
       case REMOVE_OBJECT:
 	body.writeLongInt(object);
+	body.writeLongInt(boolean);    // true means with time (stored in header)
 	body.writeString(label);
 	break ;
 
@@ -868,9 +872,14 @@
 	break ;
 
       case DELETE_OBJECT:
+        Header.bodySize = 1;
+	Header.VP.O_I.date = date;
+	break;
       case REMOVE_OBJECT:
 	// body Contains ObjectHandle, and label
 	Header.bodySize = 1 ;
+        if ( boolean)
+	    Header.VP.O_I.date = date ;
 	break ;
 
 	// -- time Variable Part(No body)[Continued] --
Index: libCERTI/ObjectClass.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/ObjectClass.cc,v
retrieving revision 3.40
diff -u -r3.40 ObjectClass.cc
--- libCERTI/ObjectClass.cc	29 Nov 2007 16:51:15 -0000	3.40
+++ libCERTI/ObjectClass.cc	4 Dec 2007 17:33:29 -0000
@@ -313,20 +313,23 @@
 }
 
 // ----------------------------------------------------------------------------
-/*! Delete the object instance 'theObjectHandle', and starts to
-  broadcast the RemoveObject message. Return a BroadcastList of
-  Federates, in order to allow our ObjectClassSet to go on with
-  the message broadcasting, by giving the list to our parent
-  class.
+/* Delete Instance with time.
+   Delete the object instance 'theObjectHandle', and starts to
+   broadcast the RemoveObject message. Return a BroadcastList of
+   Federates, in order to allow our ObjectClassSet to go on with
+   the message broadcasting, by giving the list to our parent
+   class.
 */
 ObjectClassBroadcastList *
 ObjectClass::deleteInstance(FederateHandle the_federate,
                             ObjectHandle the_object,
+			    FederationTime theTime,
                             const char *the_tag)
     throw (DeletePrivilegeNotHeld,
            ObjectNotKnown,
            RTIinternalError)
 {
+
     // 1. Pre-conditions checking(may throw ObjectNotKnown)
     Object *object = getInstanceWithID(the_object);
 
@@ -360,7 +363,82 @@
         answer->exception = e_NO_EXCEPTION ;
         answer->objectClass = handle ; // Class Handle
         answer->object = the_object ;
-        strcpy(answer->label, the_tag);
+        
+	// with time
+        answer->date = theTime ;
+        answer->boolean = true ;
+        
+	strcpy(answer->label, the_tag);
+
+        ocbList = new ObjectClassBroadcastList(answer, 0);
+        broadcastClassMessage(ocbList);
+    }
+    else {
+        D.Out(pdRegister,
+              "Object %u deleted in class %u, no broadcast to do.",
+              the_object, handle);
+    }
+
+    // Return the BroadcastList in case it had to be passed to the parent
+    // class.
+    return ocbList ;
+}
+
+// ----------------------------------------------------------------------------
+/* Delete Instance without time.
+   Delete the object instance 'theObjectHandle', and starts to
+   broadcast the RemoveObject message. Return a BroadcastList of
+   Federates, in order to allow our ObjectClassSet to go on with
+   the message broadcasting, by giving the list to our parent
+   class.
+*/
+ObjectClassBroadcastList *
+ObjectClass::deleteInstance(FederateHandle the_federate,
+                            ObjectHandle the_object,
+                            const char *the_tag)
+    throw (DeletePrivilegeNotHeld,
+           ObjectNotKnown,
+           RTIinternalError)
+{
+    // 1. Pre-conditions checking(may throw ObjectNotKnown)
+    Object *object = getInstanceWithID(the_object);
+
+    // Is the Federate really the Object Owner?(Checked only on RTIG)
+    if ((server != 0) && (object->getOwner() != the_federate)) {
+        D.Out(pdExcept, "Delete Object %d: Federate %d not owner.",
+              the_object, the_federate);
+        throw DeletePrivilegeNotHeld("");
+    }
+
+    // 2. Remove Instance from list.
+    list<Object *>::iterator o ;
+    for (o = objectSet.begin(); o != objectSet.end(); o++) {
+        if ((*o)->getHandle() == the_object) {
+            objectSet.erase(o); // i is dereferenced.
+            break ;
+        }
+    }
+
+    // 3. Prepare and broadcast message.
+    ObjectClassBroadcastList *ocbList = NULL ;
+    if (server != NULL) {
+        D.Out(pdRegister,
+              "Object %u deleted in class %u, now broadcasting...",
+              the_object, handle);
+
+        NetworkMessage *answer = new NetworkMessage ;
+        answer->type = NetworkMessage::REMOVE_OBJECT ;
+        answer->federation = server->federation();
+        answer->federate = the_federate ;
+        answer->exception = e_NO_EXCEPTION ;
+        answer->objectClass = handle ; // Class Handle
+        answer->object = the_object ;
+        
+	// without time
+        answer->date = 0 ;
+        answer->boolean = false ;
+        
+	strcpy(answer->label, the_tag);
 
         ocbList = new ObjectClassBroadcastList(answer, 0);
         broadcastClassMessage(ocbList);
Index: libCERTI/ObjectClass.hh
===================================================================
RCS file: /sources/certi/certi/libCERTI/ObjectClass.hh,v
retrieving revision 3.30
diff -u -r3.30 ObjectClass.hh
--- libCERTI/ObjectClass.hh	31 Oct 2007 10:30:22 -0000	3.30
+++ libCERTI/ObjectClass.hh	4 Dec 2007 17:33:29 -0000
@@ -176,6 +176,14 @@
     // Instance Management
     ObjectClassBroadcastList *deleteInstance(FederateHandle theFederateHandle,
                                              ObjectHandle theObjectHandle,
+					     FederationTime theTime,
+                                             const char *theUserTag)
+        throw (DeletePrivilegeNotHeld,
+               ObjectNotKnown,
+               RTIinternalError);
+
+    ObjectClassBroadcastList *deleteInstance(FederateHandle theFederateHandle,
+                                             ObjectHandle theObjectHandle,
                                              const char *theUserTag)
         throw (DeletePrivilegeNotHeld,
                ObjectNotKnown,
Index: libCERTI/ObjectClassSet.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/ObjectClassSet.cc,v
retrieving revision 3.30
diff -u -r3.30 ObjectClassSet.cc
--- libCERTI/ObjectClassSet.cc	29 Nov 2007 16:51:16 -0000	3.30
+++ libCERTI/ObjectClassSet.cc	4 Dec 2007 17:33:29 -0000
@@ -132,7 +132,50 @@
 }
 
 // ----------------------------------------------------------------------------
-//! deleteObject.
+//! deleteObject with time.
+void
+ObjectClassSet::deleteObject(FederateHandle federate,
+                             ObjectHandle object,
+			     FederationTime theTime,
+                             const char *tag)
+    throw (DeletePrivilegeNotHeld, ObjectNotKnown, RTIinternalError)
+{
+    // It may throw ObjectNotKnown
+    ObjectClass *oclass = getInstanceClass(object);
+
+    D.Out(pdRegister,
+          "Federate %d attempts to delete instance %d in class %d.",
+          federate, object, oclass->getHandle());
+
+    // It may throw a bunch of exceptions.
+    ObjectClassBroadcastList *ocbList = oclass->deleteInstance(federate,
+                                                               object,
+							       theTime,
+                                                               tag);
+
+    // Broadcast RemoveObject message recursively
+    ObjectClassHandle current_class = 0 ;
+    if (ocbList != 0) {
+
+        current_class = oclass->getSuperclass();
+
+        while (current_class) {
+            D.Out(pdRegister,
+                  "Broadcasting Remove msg to parent class %d for instance %d.",
+                  current_class, object);
+
+            // It may throw ObjectClassNotDefined
+            oclass = getWithHandle(current_class);
+            oclass->broadcastClassMessage(ocbList);
+
+            current_class = oclass->getSuperclass();
+        }
+
+        delete ocbList ;
+    }
+}
+// ----------------------------------------------------------------------------
+//! deleteObject without time.
 void
 ObjectClassSet::deleteObject(FederateHandle federate,
                              ObjectHandle object,
Index: libCERTI/ObjectClassSet.hh
===================================================================
RCS file: /sources/certi/certi/libCERTI/ObjectClassSet.hh,v
retrieving revision 3.25
diff -u -r3.25 ObjectClassSet.hh
--- libCERTI/ObjectClassSet.hh	19 Nov 2007 09:29:03 -0000	3.25
+++ libCERTI/ObjectClassSet.hh	4 Dec 2007 17:33:29 -0000
@@ -92,6 +92,12 @@
     // Object Instance Management
     void deleteObject(FederateHandle theFederateHandle,
                       ObjectHandle theObjectHandle,
+		      FederationTime theTime,
+                      const char *theTag)
+        throw (DeletePrivilegeNotHeld, ObjectNotKnown, RTIinternalError);
+
+    void deleteObject(FederateHandle theFederateHandle,
+                      ObjectHandle theObjectHandle,
                       const char *theTag)
         throw (DeletePrivilegeNotHeld, ObjectNotKnown, RTIinternalError);
 
Index: libCERTI/RootObject.cc
===================================================================
RCS file: /sources/certi/certi/libCERTI/RootObject.cc,v
retrieving revision 3.30
diff -u -r3.30 RootObject.cc
--- libCERTI/RootObject.cc	4 Dec 2007 11:00:58 -0000	3.30
+++ libCERTI/RootObject.cc	4 Dec 2007 17:33:29 -0000
@@ -258,6 +258,18 @@
 void
 RootObject::deleteObjectInstance(FederateHandle the_federate,
                                  ObjectHandle the_object,
+				 FederationTime theTime,
+                                 const char *the_tag)
+    throw (DeletePrivilegeNotHeld, ObjectNotKnown, RTIinternalError)
+{
+    ObjectClasses->deleteObject(the_federate, the_object, theTime, the_tag);
+    objects->deleteObjectInstance(the_federate, the_object, the_tag);
+}
+
+// ----------------------------------------------------------------------------
+void
+RootObject::deleteObjectInstance(FederateHandle the_federate,
+                                 ObjectHandle the_object,
                                  const char *the_tag)
     throw (DeletePrivilegeNotHeld, ObjectNotKnown, RTIinternalError)
 {
Index: libCERTI/RootObject.hh
===================================================================
RCS file: /sources/certi/certi/libCERTI/RootObject.hh,v
retrieving revision 3.25
diff -u -r3.25 RootObject.hh
--- libCERTI/RootObject.hh	19 Nov 2007 14:07:04 -0000	3.25
+++ libCERTI/RootObject.hh	4 Dec 2007 17:33:29 -0000
@@ -88,6 +88,10 @@
                ObjectAlreadyRegistered,
                RTIinternalError);
     
+    void deleteObjectInstance(FederateHandle, ObjectHandle, 
+    			      FederationTime theTime, const char *)
+        throw (DeletePrivilegeNotHeld, ObjectNotKnown, RTIinternalError);
+
     void deleteObjectInstance(FederateHandle, ObjectHandle, const char *)
         throw (DeletePrivilegeNotHeld, ObjectNotKnown, RTIinternalError);
 
Index: libRTI/RTIambPrivateRefs.cc
===================================================================
RCS file: /sources/certi/certi/libRTI/RTIambPrivateRefs.cc,v
retrieving revision 3.7
diff -u -r3.7 RTIambPrivateRefs.cc
--- libRTI/RTIambPrivateRefs.cc	27 Nov 2007 08:55:54 -0000	3.7
+++ libRTI/RTIambPrivateRefs.cc	4 Dec 2007 17:33:29 -0000
@@ -67,7 +67,7 @@
     }
 
     D.Out(pdDebug, "sending request to RTIA.");
-
+    
     is_reentrant = true ;
     try {
         req->write(socketUn);
Index: libRTI/RTIambassador.cc
===================================================================
RCS file: /sources/certi/certi/libRTI/RTIambassador.cc,v
retrieving revision 3.59
diff -u -r3.59 RTIambassador.cc
--- libRTI/RTIambassador.cc	27 Nov 2007 08:55:54 -0000	3.59
+++ libRTI/RTIambassador.cc	4 Dec 2007 17:33:29 -0000
@@ -389,10 +389,18 @@
                   } break ;
 
               case Message::REMOVE_OBJECT_INSTANCE: {
-                  privateRefs->fed_amb->removeObjectInstance(vers_Fed.getObject(),
+                  if (vers_Fed.getBoolean()) {
+                      privateRefs->fed_amb->removeObjectInstance(
+                                                vers_Fed.getObject(),
                                                 vers_Fed.getFedTime(),
                                                 vers_Fed.getTag(),
                                                 vers_Fed.getEventRetraction());
+		  }
+		  else {
+                      privateRefs->fed_amb->removeObjectInstance(
+                                                vers_Fed.getObject(),
+                                                vers_Fed.getTag());
+		  }
               } break ;
 
               case Message::PROVIDE_ATTRIBUTE_VALUE_UPDATE: {
@@ -1227,7 +1235,13 @@
 }
 
 // ----------------------------------------------------------------------------
-// Delete Object
+/** Delete Object with time
+    This service (HLA 1.3) deletes an object instance.
+    As the federation time argument is supplied, an event retraction designator is returned.
+    @param theObject Object designator
+    @param theTime Federation time
+    @param theTag user supplied tag
+*/
 EventRetractionHandle
 RTI::RTIambassador::deleteObjectInstance(ObjectHandle theObject,
                                     const FedTime& theTime,
@@ -1248,11 +1262,18 @@
     req.setFedTime(theTime);
     req.setTag(theTag);
 
+    req.setBoolean(true);
+
     privateRefs->executeService(&req, &rep);
     return rep.getEventRetraction();
 }
 
 // ----------------------------------------------------------------------------
+/** Delete Object without time
+    This service (HLA 1.3) deletes an object instance.
+    @param theObject Object designator
+    @param theTag user supplied tag
+*/
 void
 RTI::RTIambassador::deleteObjectInstance(ObjectHandle theObject,
                                     const char *theTag)
@@ -1260,12 +1281,13 @@
 	   RTI::ConcurrentAccessAttempted, RTI::FederateNotExecutionMember, 
 	   RTI::DeletePrivilegeNotHeld, RTI::ObjectNotKnown)
 {
-    throw UnimplementedService("");
     Message req, rep ;
 
     req.type = Message::DELETE_OBJECT_INSTANCE ;
     req.setObject(theObject);
     req.setTag(theTag);
+    
+    req.setBoolean(false);
 
     privateRefs->executeService(&req, &rep);
 }
