lints!
diff --git a/pkgs/markdown/analysis_options.yaml b/pkgs/markdown/analysis_options.yaml
index 5d0d0c2..9d40fb5 100644
--- a/pkgs/markdown/analysis_options.yaml
+++ b/pkgs/markdown/analysis_options.yaml
@@ -1,26 +1,21 @@
 analyzer:
- strong-mode: true
- errors:
-   unused_element: error
-   unused_import: error
-   unused_local_variable: error
-   dead_code: error
+  strong-mode:
+    implicit-casts: false
+  errors:
+    dead_code: error
+    override_on_non_overriding_method: error
+    unused_element: error
+    unused_import: error
+    unused_local_variable: error
 linter:
   rules:
-    #- always_declare_return_types
-    #- always_specify_types
     #- annotate_overrides
-    #- avoid_as
     - avoid_empty_else
     - avoid_init_to_null
-    - avoid_null_checks_in_equality_operators
-    #- avoid_return_types_on_setters
+    - avoid_return_types_on_setters
     - await_only_futures
     - camel_case_types
-    - cancel_subscriptions
-    #- close_sinks
     - comment_references
-    - constant_identifier_names
     - control_flow_in_finally
     - directives_ordering
     - empty_catches
@@ -28,30 +23,18 @@
     - empty_statements
     - hash_and_equals
     - implementation_imports
-    - iterable_contains_unrelated_type
     - library_names
     - library_prefixes
-    - list_remove_unrelated_type
-    #- non_constant_identifier_names
-    #- one_member_abstracts
+    - non_constant_identifier_names
+    - omit_local_variable_types
     - only_throw_errors
-    - overridden_fields
-    - package_api_docs
-    - package_names
-    - package_prefixed_library_names
     - prefer_final_fields
     - prefer_is_not_empty
-    #- public_member_api_docs
+    #- prefer_single_quotes
     - slash_for_doc_comments
-    #- sort_constructors_first
-    #- sort_unnamed_constructors_first
-    - super_goes_last
+    - test_types_in_equals
     - test_types_in_equals
     - throw_in_finally
-    #- type_annotate_public_apis
     - type_init_formals
-    #- unawaited_futures
-    - unnecessary_brace_in_string_interps
-    #- unnecessary_getters_setters
     - unrelated_type_equality_checks
     - valid_regexps
diff --git a/pkgs/markdown/example/app.dart b/pkgs/markdown/example/app.dart
index 1af874b..e0f4c53 100644
--- a/pkgs/markdown/example/app.dart
+++ b/pkgs/markdown/example/app.dart
@@ -32,7 +32,7 @@
   versionSpan.text = 'v${md.version}';
   markdownInput.onKeyUp.listen(_renderMarkdown);
 
-  String savedMarkdown = window.localStorage['markdown'];
+  var savedMarkdown = window.localStorage['markdown'];
 
   if (savedMarkdown != null &&
       savedMarkdown.isNotEmpty &&
diff --git a/pkgs/markdown/lib/src/block_parser.dart b/pkgs/markdown/lib/src/block_parser.dart
index a25636c..1b09329 100644
--- a/pkgs/markdown/lib/src/block_parser.dart
+++ b/pkgs/markdown/lib/src/block_parser.dart
@@ -221,7 +221,7 @@
 
   bool canParse(BlockParser parser) {
     if (!_interperableAsParagraph(parser.current)) return false;
-    int i = 1;
+    var i = 1;
     while (true) {
       var nextLine = parser.peek(i);
       if (nextLine == null) {
@@ -241,7 +241,7 @@
 
   Node parse(BlockParser parser) {
     var lines = <String>[];
-    var tag;
+    String tag;
     while (!parser.isDone) {
       var match = _setextPattern.firstMatch(parser.current);
       if (match == null) {
@@ -534,15 +534,13 @@
 /// In practice this means that the syntax dominates; it is allowed to eat
 /// many lines, including blank lines, before matching its `endPattern`.
 class LongBlockHtmlSyntax extends BlockHtmlSyntax {
-  final RegExp _pattern;
+  final RegExp pattern;
   final RegExp _endPattern;
 
-  LongBlockHtmlSyntax(pattern, endPattern)
-      : _pattern = new RegExp(pattern),
+  LongBlockHtmlSyntax(String pattern, String endPattern)
+      : pattern = new RegExp(pattern),
         _endPattern = new RegExp(endPattern);
 
-  RegExp get pattern => _pattern;
-
   Node parse(BlockParser parser) {
     var childLines = <String>[];
     // Eat until we hit [endPattern].
@@ -723,7 +721,7 @@
 
   /// Removes any trailing empty lines and notes whether any items are separated
   /// by such lines.
-  bool removeTrailingEmptyLines(List items) {
+  bool removeTrailingEmptyLines(List<ListItem> items) {
     var anyEmpty = false;
     for (var i = 0; i < items.length; i++) {
       if (items[i].lines.length == 1) continue;
@@ -803,7 +801,8 @@
     }).toList();
   }
 
-  Node parseRow(BlockParser parser, List<String> alignments, String cellType) {
+  Element parseRow(
+      BlockParser parser, List<String> alignments, String cellType) {
     var line = parser.current
         .replaceFirst(_openingPipe, '')
         .replaceFirst(_closingPipe, '');
@@ -812,7 +811,7 @@
     var row = <Element>[];
     String preCell;
 
-    for (String cell in cells) {
+    for (var cell in cells) {
       if (preCell != null) {
         cell = preCell + cell;
         preCell = null;
@@ -873,7 +872,7 @@
     bool lineStartsReflinkDefinition(int i) =>
         lines[i].startsWith(_reflinkDefinitionStart);
 
-    int i = 0;
+    var i = 0;
     loopOverDefinitions:
     while (true) {
       // Check for reflink definitions.
diff --git a/pkgs/markdown/lib/src/document.dart b/pkgs/markdown/lib/src/document.dart
index aa45092..7aeb97e 100644
--- a/pkgs/markdown/lib/src/document.dart
+++ b/pkgs/markdown/lib/src/document.dart
@@ -33,7 +33,7 @@
 
   /// Parses the given [lines] of Markdown to a series of AST nodes.
   List<Node> parseLines(List<String> lines) {
-    List<Node> nodes = new BlockParser(lines, this).parseLines();
+    var nodes = new BlockParser(lines, this).parseLines();
     _parseInlineContent(nodes);
     return nodes;
   }
@@ -42,10 +42,10 @@
   List<Node> parseInline(String text) => new InlineParser(text, this).parse();
 
   void _parseInlineContent(List<Node> nodes) {
-    for (int i = 0; i < nodes.length; i++) {
+    for (var i = 0; i < nodes.length; i++) {
       var node = nodes[i];
       if (node is UnparsedContent) {
-        List<Node> inlineNodes = parseInline(node.textContent);
+        var inlineNodes = parseInline(node.textContent);
         nodes.removeAt(i);
         nodes.insertAll(i, inlineNodes);
         i += inlineNodes.length - 1;
diff --git a/pkgs/markdown/lib/src/html_renderer.dart b/pkgs/markdown/lib/src/html_renderer.dart
index 0e545d1..2429ced 100644
--- a/pkgs/markdown/lib/src/html_renderer.dart
+++ b/pkgs/markdown/lib/src/html_renderer.dart
@@ -105,8 +105,8 @@
       return id;
     }
 
-    int suffix = 2;
-    String suffixedId = '$id-$suffix';
+    var suffix = 2;
+    var suffixedId = '$id-$suffix';
     while (uniqueIds.contains(suffixedId)) {
       suffixedId = '$id-${suffix++}';
     }
diff --git a/pkgs/markdown/lib/src/inline_parser.dart b/pkgs/markdown/lib/src/inline_parser.dart
index 9b884ef..8c66d6e 100644
--- a/pkgs/markdown/lib/src/inline_parser.dart
+++ b/pkgs/markdown/lib/src/inline_parser.dart
@@ -383,9 +383,9 @@
 
       return new Link(null, url, title);
     } else {
-      var id;
+      String id;
       String _contents() {
-        int offset = pattern.pattern.length - 1;
+        var offset = pattern.pattern.length - 1;
         return parser.source.substring(state.startPos + offset, parser.pos);
       }
 
diff --git a/pkgs/markdown/tool/dartdoc-compare.dart b/pkgs/markdown/tool/dartdoc-compare.dart
index b6b0a94..f98fec2 100644
--- a/pkgs/markdown/tool/dartdoc-compare.dart
+++ b/pkgs/markdown/tool/dartdoc-compare.dart
@@ -23,7 +23,7 @@
     ..addFlag(_help, abbr: "h", hide: true);
 
   var options = parser.parse(arguments);
-  if (options[_help]) {
+  if (options[_help] as bool) {
     print(parser.usage);
     exitCode = 0;
     return;
@@ -36,12 +36,12 @@
     return;
   }
   var comparer = new DartdocCompare(
-      options[_dartdocDir],
-      options[_markdownBefore],
-      options[_markdownAfter],
-      absolute(options[_dartdocDir], "bin/dartdoc.dart"),
-      absolute(options[_dartdocDir], "pubspec.yaml"),
-      options[_sdk]);
+      options[_dartdocDir] as String,
+      options[_markdownBefore] as String,
+      options[_markdownAfter] as String,
+      absolute(options[_dartdocDir] as String, "bin/dartdoc.dart"),
+      absolute(options[_dartdocDir] as String, "pubspec.yaml"),
+      options[_sdk] as bool);
 
   String path;
   if (comparer.sdk) {
@@ -72,15 +72,15 @@
 
   bool compare(String package) {
     // Generate docs with Markdown "A".
-    var out_before = _runDartdoc(markdownBefore, package);
+    var outBefore = _runDartdoc(markdownBefore, package);
 
     // Generate docs with Markdown "B".
-    var out_after = _runDartdoc(markdownAfter, package);
+    var outAfter = _runDartdoc(markdownAfter, package);
 
     // Compare outputs
-    var diffOptions = ["-r", "-B", out_before, out_after];
+    var diffOptions = ["-r", "-B", outBefore, outAfter];
     var result = Process.runSync("diff", diffOptions, runInShell: true);
-    var nlines = "\n".allMatches(result.stdout).length;
+    var nlines = "\n".allMatches(result.stdout as String).length;
     print("Diff lines: $nlines");
     print("diff ${diffOptions.join(" ")}");
     return result.exitCode == 0;
@@ -120,7 +120,7 @@
     var dartdocPubspec =
         loadYaml(new File(dartdocPubspecPath).readAsStringSync()) as Map;
     // make modifiable copy
-    dartdocPubspec = JSON.decode(JSON.encode(dartdocPubspec));
+    dartdocPubspec = JSON.decode(JSON.encode(dartdocPubspec)) as Map;
 
     dartdocPubspec['dependencies']['markdown'] = {
       'git': {
diff --git a/pkgs/markdown/tool/stats.dart b/pkgs/markdown/tool/stats.dart
index ec1c7b7..d488dc5 100644
--- a/pkgs/markdown/tool/stats.dart
+++ b/pkgs/markdown/tool/stats.dart
@@ -49,7 +49,7 @@
     return;
   }
 
-  if (options['help']) {
+  if (options['help'] as bool) {
     print(parser.usage);
     return;
   }
@@ -67,7 +67,7 @@
     return;
   }
 
-  final testPrefix = options['flavor'];
+  final testPrefix = options['flavor'] as String;
 
   var baseUrl = 'http://spec.commonmark.org/0.28/';
   ExtensionSet extensionSet;
@@ -343,7 +343,12 @@
       this.markdown, this.html);
 
   factory CommonMarkTestCase.fromJson(Map<String, dynamic> json) {
-    return new CommonMarkTestCase(json['example'], json['section'],
-        json['start_line'], json['end_line'], json['markdown'], json['html']);
+    return new CommonMarkTestCase(
+        json['example'] as int,
+        json['section'] as String,
+        json['start_line'] as int,
+        json['end_line'] as int,
+        json['markdown'] as String,
+        json['html'] as String);
   }
 }