diff --git a/clang/include/clang/Rewrite/Rewriter.h b/clang/include/clang/Rewrite/Rewriter.h
index afa018d9cb01..c3ee0175c36f 100644
--- a/clang/include/clang/Rewrite/Rewriter.h
+++ b/clang/include/clang/Rewrite/Rewriter.h
@@ -102,13 +102,19 @@ private:  // Methods only usable by Rewriter.
   /// inserted text at the position.
   unsigned getMappedOffset(unsigned OrigOffset,
                            bool AfterInserts = false) const{
-    return Deltas.getDeltaAt(OrigOffset+AfterInserts)+OrigOffset;
+    return Deltas.getDeltaAt(2*OrigOffset+AfterInserts)+OrigOffset;
   }
   
-  /// AddDelta - When a change is made that shifts around the text buffer, this
-  /// method is used to record that info.
-  void AddDelta(unsigned OrigOffset, int Change) {
-    return Deltas.AddDelta(OrigOffset, Change);
+  /// AddInsertDelta - When an insertion is made at a position, this
+  /// method is used to record that information.
+  void AddInsertDelta(unsigned OrigOffset, int Change) {
+    return Deltas.AddDelta(2*OrigOffset, Change);
+  }
+
+  /// AddReplaceDelta - When a replacement/deletion is made at a position, this
+  /// method is used to record that information.
+  void AddReplaceDelta(unsigned OrigOffset, int Change) {
+    return Deltas.AddDelta(2*OrigOffset+1, Change);
   }
 };
   
diff --git a/clang/lib/Rewrite/Rewriter.cpp b/clang/lib/Rewrite/Rewriter.cpp
index 805c61baed03..d81c38d6a466 100644
--- a/clang/lib/Rewrite/Rewriter.cpp
+++ b/clang/lib/Rewrite/Rewriter.cpp
@@ -31,7 +31,7 @@ void RewriteBuffer::RemoveText(unsigned OrigOffset, unsigned Size) {
   Buffer.erase(RealOffset, Size);
 
   // Add a delta so that future changes are offset correctly.
-  AddDelta(OrigOffset, -Size);
+  AddReplaceDelta(OrigOffset, -Size);
 }
 
 void RewriteBuffer::InsertText(unsigned OrigOffset,
@@ -45,7 +45,7 @@ void RewriteBuffer::InsertText(unsigned OrigOffset,
   Buffer.insert(RealOffset, StrData, StrData+StrLen);
   
   // Add a delta so that future changes are offset correctly.
-  AddDelta(OrigOffset, StrLen);
+  AddInsertDelta(OrigOffset, StrLen);
 }
 
 /// ReplaceText - This method replaces a range of characters in the input
@@ -53,11 +53,11 @@ void RewriteBuffer::InsertText(unsigned OrigOffset,
 /// operation.
 void RewriteBuffer::ReplaceText(unsigned OrigOffset, unsigned OrigLength,
                                 const char *NewStr, unsigned NewLength) {
-  unsigned RealOffset = getMappedOffset(OrigOffset, false);
+  unsigned RealOffset = getMappedOffset(OrigOffset, true);
   Buffer.erase(RealOffset, OrigLength);
   Buffer.insert(RealOffset, NewStr, NewStr+NewLength);
   if (OrigLength != NewLength)
-    AddDelta(OrigOffset, NewLength-OrigLength);
+    AddReplaceDelta(OrigOffset, NewLength-OrigLength);
 }
 
 
diff --git a/clang/test/Misc/emit-html-insert.c b/clang/test/Misc/emit-html-insert.c
new file mode 100644
index 000000000000..ac6b519a3a0d
--- /dev/null
+++ b/clang/test/Misc/emit-html-insert.c
@@ -0,0 +1,4 @@
+// RUN: clang-cc %s -emit-html -o - | grep ">< 10; }"
+
+int a(int x) { return x
+< 10; }