remote deletion handles conflict with locally applied insertion when deletion starts at a lower index/offset and extends into/over the insertion, by splitting the deletion up - ensures deletion of correct parts before and after the inserted, conflicting text - next up is adapting ColaSynchronizer to deal with this
diff --git a/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaDeletion.java b/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaDeletion.java
index 6e73773..fe5d11c 100644
--- a/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaDeletion.java
+++ b/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaDeletion.java
@@ -12,6 +12,7 @@
 package org.eclipse.ecf.docshare.cola;
 
 import org.eclipse.ecf.core.util.Trace;
+import org.eclipse.ecf.docshare.messages.UpdateMessage;
 import org.eclipse.ecf.internal.docshare.Activator;
 import org.eclipse.ecf.internal.docshare.DocshareDebugOptions;
 
@@ -116,12 +117,22 @@
 					//remote remains unchanged, deletion happens fully before local insertion
 					//local insertion needs to be moved left by full length of deletion
 					localAppliedMsg.setOffset(localAppliedMsg.getOffset() - remoteTransformedMsg.getLengthOfReplacedText());
-				} else if ((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) >= localAppliedMsg.getOffset()) {
+				} else if ((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) >= localAppliedMsg.getOffset()) { //TODO optimize away, "if" just here for clarity, "else" would be enough
 					//remote deletion reaches into local insertion and potentially over it
-					//local insertion needs to be moved left by overlap
 					//remote deletion needs to be split apart
-					//TODO needs to be implemented and requires appropriate modification in ColaSynchronizer
-					throw new IllegalArgumentException("NOT IMPLEMENTED OPERATIONAL TRANSFORM");
+					UpdateMessage deletionFirstMsg = new UpdateMessage(remoteTransformedMsg.getOffset(), localAppliedMsg.getOffset() - remoteTransformedMsg.getOffset(), remoteTransformedMsg.getText());
+					ColaUpdateMessage deletionFirstPart = new ColaUpdateMessage(deletionFirstMsg, remoteTransformedMsg.getLocalOperationsCount(), remoteTransformedMsg.getRemoteOperationsCount());
+					remoteTransformedMsg.addToSplitUpRepresentation(deletionFirstPart);
+
+					UpdateMessage deletionSecondMsg = new UpdateMessage(localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfInsertedText(), remoteTransformedMsg.getLengthOfReplacedText() - deletionFirstPart.getLengthOfReplacedText(), remoteTransformedMsg.getText());
+					ColaUpdateMessage deletionSecondPart = new ColaUpdateMessage(deletionSecondMsg, remoteTransformedMsg.getLocalOperationsCount(), remoteTransformedMsg.getRemoteOperationsCount());
+					remoteTransformedMsg.addToSplitUpRepresentation(deletionSecondPart);
+
+					remoteTransformedMsg.setSplitUp(true);
+
+					//local insertion needs to be moved left by overlap
+					localAppliedMsg.setOffset(remoteTransformedMsg.getOffset());
+
 				}
 			} else if (remoteTransformedMsg.getOffset() >= localAppliedMsg.getOffset()) {
 				//remote del needs to be moved right by full length of insertion