diff --git a/src/lint/linter/ArcanistJSHintLinter.php b/src/lint/linter/ArcanistJSHintLinter.php
--- a/src/lint/linter/ArcanistJSHintLinter.php
+++ b/src/lint/linter/ArcanistJSHintLinter.php
@@ -17,7 +17,7 @@
   }
 
   public function getInfoDescription() {
-    return pht('Use `jshint` to detect issues with Javascript source files.');
+    return pht('Use `jshint` to detect issues with JavaScript source files.');
   }
 
   public function getLinterName() {
diff --git a/src/lint/linter/ArcanistLinter.php b/src/lint/linter/ArcanistLinter.php
--- a/src/lint/linter/ArcanistLinter.php
+++ b/src/lint/linter/ArcanistLinter.php
@@ -73,12 +73,15 @@
     return 1.0;
   }
 
+  /**
+   * TODO: This should be `final`.
+   */
   public function setCustomSeverityMap(array $map) {
     $this->customSeverityMap = $map;
     return $this;
   }
 
-  public function setCustomSeverityRules(array $rules) {
+  final public function setCustomSeverityRules(array $rules) {
     $this->customSeverityRules = $rules;
     return $this;
   }
@@ -192,17 +195,17 @@
       return $map[$code];
     }
 
-    $map = $this->getLintSeverityMap();
-    if (isset($map[$code])) {
-      return $map[$code];
-    }
-
     foreach ($this->customSeverityRules as $rule => $severity) {
       if (preg_match($rule, $code)) {
         return $severity;
       }
     }
 
+    $map = $this->getLintSeverityMap();
+    if (isset($map[$code])) {
+      return $map[$code];
+    }
+
     return $this->getDefaultMessageSeverity($code);
   }
 
diff --git a/src/lint/linter/ArcanistMergeConflictLinter.php b/src/lint/linter/ArcanistMergeConflictLinter.php
--- a/src/lint/linter/ArcanistMergeConflictLinter.php
+++ b/src/lint/linter/ArcanistMergeConflictLinter.php
@@ -25,8 +25,10 @@
     return 'merge-conflict';
   }
 
-  public function willLintPaths(array $paths) {
-    return;
+  public function getLintNameMap() {
+    return array(
+      self::LINT_MERGECONFLICT => pht('Unresolved merge conflict'),
+    );
   }
 
   public function lintPath($path) {
@@ -45,10 +47,4 @@
     }
   }
 
-  public function getLintNameMap() {
-    return array(
-      self::LINT_MERGECONFLICT => pht('Unresolved merge conflict'),
-    );
-  }
-
 }
diff --git a/src/lint/linter/ArcanistTextLinter.php b/src/lint/linter/ArcanistTextLinter.php
--- a/src/lint/linter/ArcanistTextLinter.php
+++ b/src/lint/linter/ArcanistTextLinter.php
@@ -123,13 +123,18 @@
   }
 
   protected function lintNewlines($path) {
-    $pos = strpos($this->getData($path), "\r");
+
+    $data = $this->getData($path);
+    $pos  = strpos($this->getData($path), "\r");
+
     if ($pos !== false) {
       $this->raiseLintAtOffset(
-        $pos,
+        0,
         self::LINT_DOS_NEWLINE,
         'You must use ONLY Unix linebreaks ("\n") in source code.',
-        "\r");
+        $data,
+        str_replace("\r\n", "\n", $data));
+
       if ($this->isMessageEnabled(self::LINT_DOS_NEWLINE)) {
         $this->stopAllLinters();
       }
diff --git a/src/lint/linter/__tests__/text/dos-newline.lint-test b/src/lint/linter/__tests__/text/dos-newline.lint-test
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/__tests__/text/dos-newline.lint-test
@@ -0,0 +1,7 @@
+The quick brown fox
+jumps over the lazy dog.
+~~~~~~~~~~
+error:1:1
+~~~~~~~~~~
+The quick brown fox
+jumps over the lazy dog.