diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp
index 777d5e8..aa715e6 100644
--- a/lib/Format/Format.cpp
+++ b/lib/Format/Format.cpp
@@ -193,36 +193,34 @@
   }
 
 private:
-  void indentBlockComment(const FormatToken &Tok, int BaseIndent) {
+  void indentBlockComment(const FormatToken &Tok, int Indent) {
     SourceLocation TokenLoc = Tok.Tok.getLocation();
+    int IndentDelta = Indent - SourceMgr.getSpellingColumnNumber(TokenLoc) + 1;
     const char *Start = SourceMgr.getCharacterData(TokenLoc);
     const char *Current = Start;
     const char *TokEnd = Current + Tok.TokenLength;
+    llvm::SmallVector<SourceLocation, 16> LineStarts;
     while (Current < TokEnd) {
       if (*Current == '\n') {
         ++Current;
-        SourceLocation Loc = TokenLoc.getLocWithOffset(Current - Start);
-        int Indent = BaseIndent;
-        int Spaces = 0;
-        while (Current < TokEnd && *Current == ' ') {
-          ++Spaces;
-          ++Current;
-        }
-        if (Current < TokEnd && *Current == '*')
-          ++Indent;
-        else
-          Indent += 3;
-
-        if (Spaces < Indent)
-          Replaces.insert(tooling::Replacement(
-              SourceMgr, Loc, 0, std::string(Indent - Spaces, ' ')));
-        else if (Spaces > Indent)
-          Replaces.insert(
-              tooling::Replacement(SourceMgr, Loc, Spaces - Indent, ""));
+        LineStarts.push_back(TokenLoc.getLocWithOffset(Current - Start));
+        // If we need to outdent the line, check that it's indented enough.
+        for (int i = 0; i < -IndentDelta; ++i, ++Current)
+          if (Current >= TokEnd || *Current != ' ')
+            return;
       } else {
         ++Current;
       }
     }
+
+    for (size_t i = 0; i < LineStarts.size(); ++i) {
+      if (IndentDelta > 0)
+        Replaces.insert(tooling::Replacement(SourceMgr, LineStarts[i], 0,
+                                             std::string(IndentDelta, ' ')));
+      else if (IndentDelta < 0)
+        Replaces.insert(
+            tooling::Replacement(SourceMgr, LineStarts[i], -IndentDelta, ""));
+    }
   }
 
   std::string getNewLineText(unsigned NewLines, unsigned Spaces) {
diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp
index ca7ed62..4034d1a 100644
--- a/unittests/Format/FormatTest.cpp
+++ b/unittests/Format/FormatTest.cpp
@@ -619,14 +619,6 @@
                    "   * comment.\n"
                    "   */\n"
                    "  void f() {}"));
-  EXPECT_EQ("/*\n"
-            "   A comment.\n"
-            " */\n"
-            "void f() {}",
-            format("  /*\n"
-                   "           A comment.\n"
-                   "   */\n"
-                   "   void f() {}"));
   EXPECT_EQ("class C {\n"
             "  /*\n"
             "   * Another multi-line\n"
@@ -641,6 +633,22 @@
                    " */\n"
                    "void f() {}\n"
                    "};"));
+  EXPECT_EQ("/*\n"
+            "  1. This is a comment with non-trivial formatting.\n"
+            "     1.1. We have to indent/outdent all lines equally\n"
+            "         1.1.1. to keep the formatting.\n"
+            " */",
+            format("  /*\n"
+                   "    1. This is a comment with non-trivial formatting.\n"
+                   "       1.1. We have to indent/outdent all lines equally\n"
+                   "           1.1.1. to keep the formatting.\n"
+                   "   */"));
+  EXPECT_EQ("/*\n"
+            " Don't try to outdent if there's not enough inentation.\n"
+            " */",
+            format("  /*\n"
+                   " Don't try to outdent if there's not enough inentation.\n"
+                   " */"));
 }
 
 TEST_F(FormatTest, CommentsInStaticInitializers) {
