[231681] Potential duplicate restyling in StucturedPresentationReconciler
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java
index 83d926c..900fea7 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/StructuredPresentationReconciler.java
@@ -608,8 +608,13 @@
 				System.out.println(TRACE_PREFIX + "calculated simple text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
 				System.out.flush();
 			}
+			
+			boolean damageOverlaps = processRecordedDamages(damage, document);
+			if(_trace && _traceTime) {
+				System.out.println(TRACE_PREFIX + "processed recorded structured text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
+			}
 
-			if (damage != null && document != null) {
+			if (damage != null && document != null && !damageOverlaps) {
 				processDamage(damage, document);
 				if(_trace && _traceTime) {
 					System.out.println(TRACE_PREFIX + "processed simple text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -617,10 +622,6 @@
 				}
 			}
 
-			processRecordedDamages();
-			if(_trace && _traceTime) {
-				System.out.println(TRACE_PREFIX + "processed recorded structured text damage at " + (System.currentTimeMillis() - time0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
 			fDocumentPartitioningChanged= false;
 			fChangedDocumentPartitions= null;
 			if(_trace) {
@@ -1028,14 +1029,32 @@
 	}
 	
 	void processRecordedDamages() {
+		processRecordedDamages(null, null);
+	}
+	
+	boolean processRecordedDamages(IRegion damage, IDocument document) {
 		RecordedDamage[] recordings = null;
+		boolean recordingOverlaps = false;
 		synchronized (fRecordedDamages) {
 			recordings = (RecordedDamage[]) fRecordedDamages.toArray(new RecordedDamage[fRecordedDamages.size()]);
 			fRecordedDamages.clear();
 		}
 		for (int i = 0; i < recordings.length; i++) {
+			if (isOverlappingRegion(damage, recordings[i].damage) && document == recordings[i].document)
+				recordingOverlaps = true;
 			processDamage(recordings[i].damage, recordings[i].document);
 		}
+		return recordingOverlaps;
+	}
+	
+	private boolean isOverlappingRegion(IRegion base, IRegion damage) {
+		if(base == null || damage == null)
+			return false;
+		
+		int baseEnd = base.getOffset() + base.getLength();
+		int damageEnd = damage.getOffset() + damage.getLength();
+		
+		return damage.getOffset() <= base.getOffset() && (damageEnd >= baseEnd);
 	}
 
 	/**