diff --git a/lib/Frontend/FixItRewriter.cpp b/lib/Frontend/FixItRewriter.cpp
index 0b04cf2..20d452e 100644
--- a/lib/Frontend/FixItRewriter.cpp
+++ b/lib/Frontend/FixItRewriter.cpp
@@ -93,7 +93,7 @@
     // completely ignore it, even if it's an error: fix-it locations
     // are meant to perform specific fix-ups even in the presence of
     // other errors.
-    if (Info.getNumCodeModificationHints() == 0)
+    if (Info.getNumFixItHints() == 0)
       return;
 
     // See if the location of the error is one that matches what the
@@ -122,10 +122,10 @@
 
   // Make sure that we can perform all of the modifications we
   // in this diagnostic.
-  bool CanRewrite = Info.getNumCodeModificationHints() > 0;
-  for (unsigned Idx = 0, Last = Info.getNumCodeModificationHints();
+  bool CanRewrite = Info.getNumFixItHints() > 0;
+  for (unsigned Idx = 0, Last = Info.getNumFixItHints();
        Idx < Last; ++Idx) {
-    const CodeModificationHint &Hint = Info.getCodeModificationHint(Idx);
+    const FixItHint &Hint = Info.getFixItHint(Idx);
     if (Hint.RemoveRange.isValid() &&
         Rewrite.getRangeSize(Hint.RemoveRange) == -1) {
       CanRewrite = false;
@@ -140,7 +140,7 @@
   }
 
   if (!CanRewrite) {
-    if (Info.getNumCodeModificationHints() > 0)
+    if (Info.getNumFixItHints() > 0)
       Diag(Info.getLocation(), diag::note_fixit_in_macro);
 
     // If this was an error, refuse to perform any rewriting.
@@ -152,9 +152,9 @@
   }
 
   bool Failed = false;
-  for (unsigned Idx = 0, Last = Info.getNumCodeModificationHints();
+  for (unsigned Idx = 0, Last = Info.getNumFixItHints();
        Idx < Last; ++Idx) {
-    const CodeModificationHint &Hint = Info.getCodeModificationHint(Idx);
+    const FixItHint &Hint = Info.getFixItHint(Idx);
     if (!Hint.RemoveRange.isValid()) {
       // We're adding code.
       if (Rewrite.InsertTextBefore(Hint.InsertionLoc, Hint.CodeToInsert))
diff --git a/lib/Frontend/HTMLDiagnostics.cpp b/lib/Frontend/HTMLDiagnostics.cpp
index da99cb8..022a34d 100644
--- a/lib/Frontend/HTMLDiagnostics.cpp
+++ b/lib/Frontend/HTMLDiagnostics.cpp
@@ -484,8 +484,7 @@
   // FIXME: This code is disabled because it seems to mangle the HTML
   // output. I'm leaving it here because it's generally the right idea,
   // but needs some help from someone more familiar with the rewriter.
-  for (const CodeModificationHint *Hint = P.code_modifications_begin(),
-                               *HintEnd = P.code_modifications_end();
+  for (const FixItHint *Hint = P.fixit_begin(), *HintEnd = P.fixit_end();
        Hint != HintEnd; ++Hint) {
     if (Hint->RemoveRange.isValid()) {
       HighlightRange(R, LPosInfo.first, Hint->RemoveRange,
diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp
index 24d51e2..4e91f8d 100644
--- a/lib/Frontend/TextDiagnosticPrinter.cpp
+++ b/lib/Frontend/TextDiagnosticPrinter.cpp
@@ -276,7 +276,7 @@
                                                 SourceRange *Ranges,
                                                 unsigned NumRanges,
                                                 SourceManager &SM,
-                                          const CodeModificationHint *Hints,
+                                                const FixItHint *Hints,
                                                 unsigned NumHints,
                                                 unsigned Columns) {
   assert(LangOpts && "Unexpected diagnostic outside source file processing");
@@ -409,7 +409,7 @@
 
   std::string FixItInsertionLine;
   if (NumHints && DiagOpts->ShowFixits) {
-    for (const CodeModificationHint *Hint = Hints, *LastHint = Hints + NumHints;
+    for (const FixItHint *Hint = Hints, *LastHint = Hints + NumHints;
          Hint != LastHint; ++Hint) {
       if (Hint->InsertionLoc.isValid()) {
         // We have an insertion hint. Determine whether the inserted
@@ -833,7 +833,7 @@
   if (DiagOpts->ShowCarets && Info.getLocation().isValid() &&
       ((LastLoc != Info.getLocation()) || Info.getNumRanges() ||
        (LastCaretDiagnosticWasNote && Level != Diagnostic::Note) ||
-       Info.getNumCodeModificationHints())) {
+       Info.getNumFixItHints())) {
     // Cache the LastLoc, it allows us to omit duplicate source/caret spewage.
     LastLoc = Info.getLocation();
     LastCaretDiagnosticWasNote = (Level == Diagnostic::Note);
@@ -845,9 +845,9 @@
     for (unsigned i = 0; i != NumRanges; ++i)
       Ranges[i] = Info.getRange(i);
 
-    unsigned NumHints = Info.getNumCodeModificationHints();
+    unsigned NumHints = Info.getNumFixItHints();
     for (unsigned idx = 0; idx < NumHints; ++idx) {
-      const CodeModificationHint &Hint = Info.getCodeModificationHint(idx);
+      const FixItHint &Hint = Info.getFixItHint(idx);
       if (Hint.RemoveRange.isValid()) {
         assert(NumRanges < 20 && "Out of space");
         Ranges[NumRanges++] = Hint.RemoveRange;
@@ -855,8 +855,8 @@
     }
 
     EmitCaretDiagnostic(LastLoc, Ranges, NumRanges, LastLoc.getManager(),
-                        Info.getCodeModificationHints(),
-                        Info.getNumCodeModificationHints(),
+                        Info.getFixItHints(),
+                        Info.getNumFixItHints(),
                         DiagOpts->MessageLength);
   }
 
