Index: unittests/Tooling/RefactoringTest.cpp
===================================================================
--- unittests/Tooling/RefactoringTest.cpp	(revision 158236)
+++ unittests/Tooling/RefactoringTest.cpp	(working copy)
@@ -111,10 +111,10 @@
   FileID ID = Context.createInMemoryFile("input.cpp",
                                          "line1\nline2\nline3\nline4");
   Replacements Replaces;
-  Replaces.insert(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
-                              5, "replaced"));
-  Replaces.insert(Replacement(Context.Sources, Context.getLocation(ID, 3, 1),
-                              5, "other"));
+  Replaces.push_back(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
+                                 5, "replaced"));
+  Replaces.push_back(Replacement(Context.Sources, Context.getLocation(ID, 3, 1),
+                                 5, "other"));
   EXPECT_TRUE(applyAllReplacements(Replaces, Context.Rewrite));
   EXPECT_EQ("line1\nreplaced\nother\nline4", Context.getRewrittenText(ID));
 }
@@ -123,12 +123,12 @@
   FileID ID = Context.createInMemoryFile("input.cpp",
                                          "line1\nline2\nline3\nline4");
   Replacements Replaces;
-  Replaces.insert(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
-                              5, "replaced"));
-  Replaces.insert(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
-                              5, "replaced"));
-  Replaces.insert(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
-                              5, "replaced"));
+  Replaces.push_back(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
+                                 5, "replaced"));
+  Replaces.push_back(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
+                                 5, "replaced"));
+  Replaces.push_back(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
+                                 5, "replaced"));
   EXPECT_TRUE(applyAllReplacements(Replaces, Context.Rewrite));
   EXPECT_EQ("line1\nreplaced\nline3\nline4", Context.getRewrittenText(ID));
 }
@@ -139,12 +139,12 @@
   FileID IDa = Context.createInMemoryFile("a.cpp", "text");
   FileID IDz = Context.createInMemoryFile("z.cpp", "text");
   Replacements Replaces;
-  Replaces.insert(Replacement(Context.Sources, Context.getLocation(IDa, 1, 1),
-                              4, "a"));
-  Replaces.insert(Replacement(Context.Sources, SourceLocation(),
-                              5, "2"));
-  Replaces.insert(Replacement(Context.Sources, Context.getLocation(IDz, 1, 1),
-                              4, "z"));
+  Replaces.push_back(Replacement(Context.Sources, Context.getLocation(IDa, 1, 1),
+                                 4, "a"));
+  Replaces.push_back(Replacement(Context.Sources, SourceLocation(),
+                                 5, "2"));
+  Replaces.push_back(Replacement(Context.Sources, Context.getLocation(IDz, 1, 1),
+                                 4, "z"));
   EXPECT_FALSE(applyAllReplacements(Replaces, Context.Rewrite));
   EXPECT_EQ("a", Context.getRewrittenText(IDa));
   EXPECT_EQ("z", Context.getRewrittenText(IDz));
@@ -196,8 +196,8 @@
 TEST_F(FlushRewrittenFilesTest, StoresChangesOnDisk) {
   FileID ID = createFile("input.cpp", "line1\nline2\nline3\nline4");
   Replacements Replaces;
-  Replaces.insert(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
-                              5, "replaced"));
+  Replaces.push_back(Replacement(Context.Sources, Context.getLocation(ID, 2, 1),
+                                 5, "replaced"));
   EXPECT_TRUE(applyAllReplacements(Replaces, Context.Rewrite));
   EXPECT_FALSE(Context.Rewrite.overwriteChangedFiles());
   EXPECT_EQ("line1\nreplaced\nline3\nline4",
Index: lib/Tooling/Refactoring.cpp
===================================================================
--- lib/Tooling/Refactoring.cpp	(revision 158236)
+++ lib/Tooling/Refactoring.cpp	(working copy)
@@ -19,6 +19,7 @@
 #include "clang/Rewrite/Rewriter.h"
 #include "clang/Tooling/Refactoring.h"
 #include "llvm/Support/raw_os_ostream.h"
+#include <algorithm>
 
 namespace clang {
 namespace tooling {
@@ -79,12 +80,12 @@
   return result;
 }
 
-bool Replacement::Less::operator()(const Replacement &R1,
+bool Replacement::Equal::operator()(const Replacement &R1,
                                    const Replacement &R2) const {
-  if (R1.FilePath != R2.FilePath) return R1.FilePath < R2.FilePath;
-  if (R1.Offset != R2.Offset) return R1.Offset < R2.Offset;
-  if (R1.Length != R2.Length) return R1.Length < R2.Length;
-  return R1.ReplacementText < R2.ReplacementText;
+  return R1.FilePath == R2.FilePath
+    && R1.Offset == R2.Offset
+    && R1.Length == R2.Length
+    && R1.ReplacementText == R2.ReplacementText;
 }
 
 void Replacement::setFromSourceLocation(SourceManager &Sources,
@@ -123,6 +124,17 @@
 
 bool applyAllReplacements(Replacements &Replaces, Rewriter &Rewrite) {
   bool Result = true;
+  for(Replacements::iterator B = Replaces.begin(),
+                             I = B,
+                             E = Replaces.end();
+      I != E; ++I) {
+    Replacements::iterator S = std::search(I+1,E,I,I+1,Replacement::Equal());
+    if (S != E)
+    {
+      I = Replaces.erase(I)-1;
+      E = Replaces.end();
+    }
+  }
   for (Replacements::const_iterator I = Replaces.begin(),
                                     E = Replaces.end();
        I != E; ++I) {
Index: include/clang/Tooling/Refactoring.h
===================================================================
--- include/clang/Tooling/Refactoring.h	(revision 158236)
+++ include/clang/Tooling/Refactoring.h	(working copy)
@@ -22,8 +22,8 @@
 #include "llvm/ADT/StringRef.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Tooling/Tooling.h"
-#include <set>
 #include <string>
+#include <vector>
 
 namespace clang {
 
@@ -83,7 +83,7 @@
   std::string toString() const;
 
   /// \brief Comparator to be able to use Replacement in std::set for uniquing.
-  class Less {
+  class Equal {
   public:
     bool operator()(const Replacement &R1, const Replacement &R2) const;
   };
@@ -101,8 +101,7 @@
 };
 
 /// \brief A set of Replacements.
-/// FIXME: Change to a vector and deduplicate in the RefactoringTool.
-typedef std::set<Replacement, Replacement::Less> Replacements;
+typedef std::vector<Replacement> Replacements;
 
 /// \brief Apply all replacements on the Rewriter.
 ///
