diff --git a/pkgs/io/analysis_options.yaml b/pkgs/io/analysis_options.yaml
index cf2c891..a0cc074 100644
--- a/pkgs/io/analysis_options.yaml
+++ b/pkgs/io/analysis_options.yaml
@@ -1,3 +1,4 @@
+include: package:pedantic/analysis_options.yaml
 analyzer:
   strong-mode:
     implicit-casts: false
@@ -50,5 +51,7 @@
     - recursive_getters
     - slash_for_doc_comments
     - type_init_formals
+    - unnecessary_const
     - unnecessary_brace_in_string_interps
+    - unnecessary_new
     - unnecessary_this
diff --git a/pkgs/io/example/spawn_process.dart b/pkgs/io/example/spawn_process.dart
index 7654110..0529bf3 100644
--- a/pkgs/io/example/spawn_process.dart
+++ b/pkgs/io/example/spawn_process.dart
@@ -8,7 +8,7 @@
 
 /// Runs `dartfmt` commands and `pub publish`.
 Future<Null> main() async {
-  final manager = new ProcessManager();
+  final manager = ProcessManager();
 
   // Runs dartfmt --version and outputs the result via stdout.
   print('Running dartfmt --version');
diff --git a/pkgs/io/lib/src/ansi_code.dart b/pkgs/io/lib/src/ansi_code.dart
index 8b9c3a1..dc02174 100644
--- a/pkgs/io/lib/src/ansi_code.dart
+++ b/pkgs/io/lib/src/ansi_code.dart
@@ -38,16 +38,16 @@
   final String _name;
 
   /// A foreground color.
-  static const AnsiCodeType foreground = const AnsiCodeType._('foreground');
+  static const AnsiCodeType foreground = AnsiCodeType._('foreground');
 
   /// A style.
-  static const AnsiCodeType style = const AnsiCodeType._('style');
+  static const AnsiCodeType style = AnsiCodeType._('style');
 
   /// A background color.
-  static const AnsiCodeType background = const AnsiCodeType._('background');
+  static const AnsiCodeType background = AnsiCodeType._('background');
 
   /// A reset value.
-  static const AnsiCodeType reset = const AnsiCodeType._('reset');
+  static const AnsiCodeType reset = AnsiCodeType._('reset');
 
   const AnsiCodeType._(this._name);
 
@@ -81,7 +81,7 @@
   /// Represents the value as an unescaped literal suitable for scripts.
   String get escapeForScript => "$_ansiEscapeForScript[${code}m";
 
-  String _escapeValue({bool forScript: false}) {
+  String _escapeValue({bool forScript = false}) {
     forScript ??= false;
     return forScript ? escapeForScript : escape;
   }
@@ -96,7 +96,7 @@
   ///   * [value] is `null` or empty
   ///   * both [ansiOutputEnabled] and [forScript] are `false`.
   ///   * [type] is [AnsiCodeType.reset]
-  String wrap(String value, {bool forScript: false}) =>
+  String wrap(String value, {bool forScript = false}) =>
       _isNoop(type == AnsiCodeType.reset, value, forScript)
           ? value
           : "${_escapeValue(forScript: forScript)}$value"
@@ -121,7 +121,7 @@
 ///   * [codes] contains more than one value of type [AnsiCodeType.background].
 ///   * [codes] contains any value of type [AnsiCodeType.reset].
 String wrapWith(String value, Iterable<AnsiCode> codes,
-    {bool forScript: false}) {
+    {bool forScript = false}) {
   forScript ??= false;
   // Eliminate duplicates
   final myCodes = codes.toSet();
@@ -136,19 +136,19 @@
       case AnsiCodeType.foreground:
         foreground++;
         if (foreground > 1) {
-          throw new ArgumentError.value(codes, 'codes',
+          throw ArgumentError.value(codes, 'codes',
               "Cannot contain more than one foreground color code.");
         }
         break;
       case AnsiCodeType.background:
         background++;
         if (background > 1) {
-          throw new ArgumentError.value(codes, 'codes',
+          throw ArgumentError.value(codes, 'codes',
               "Cannot contain more than one foreground color code.");
         }
         break;
       case AnsiCodeType.reset:
-        throw new ArgumentError.value(
+        throw ArgumentError.value(
             codes, 'codes', "Cannot contain reset codes.");
         break;
     }
@@ -165,117 +165,107 @@
 // Style values
 //
 
-const styleBold = const AnsiCode._('bold', AnsiCodeType.style, 1, resetBold);
-const styleDim = const AnsiCode._('dim', AnsiCodeType.style, 2, resetDim);
-const styleItalic =
-    const AnsiCode._('italic', AnsiCodeType.style, 3, resetItalic);
+const styleBold = AnsiCode._('bold', AnsiCodeType.style, 1, resetBold);
+const styleDim = AnsiCode._('dim', AnsiCodeType.style, 2, resetDim);
+const styleItalic = AnsiCode._('italic', AnsiCodeType.style, 3, resetItalic);
 const styleUnderlined =
-    const AnsiCode._('underlined', AnsiCodeType.style, 4, resetUnderlined);
-const styleBlink = const AnsiCode._('blink', AnsiCodeType.style, 5, resetBlink);
-const styleReverse =
-    const AnsiCode._('reverse', AnsiCodeType.style, 7, resetReverse);
+    AnsiCode._('underlined', AnsiCodeType.style, 4, resetUnderlined);
+const styleBlink = AnsiCode._('blink', AnsiCodeType.style, 5, resetBlink);
+const styleReverse = AnsiCode._('reverse', AnsiCodeType.style, 7, resetReverse);
 
 /// Not widely supported.
-const styleHidden =
-    const AnsiCode._('hidden', AnsiCodeType.style, 8, resetHidden);
+const styleHidden = AnsiCode._('hidden', AnsiCodeType.style, 8, resetHidden);
 
 /// Not widely supported.
 const styleCrossedOut =
-    const AnsiCode._('crossed out', AnsiCodeType.style, 9, resetCrossedOut);
+    AnsiCode._('crossed out', AnsiCodeType.style, 9, resetCrossedOut);
 
 //
 // Reset values
 //
 
-const resetAll = const AnsiCode._('all', AnsiCodeType.reset, 0, null);
+const resetAll = AnsiCode._('all', AnsiCodeType.reset, 0, null);
 
 // NOTE: bold is weird. The reset code seems to be 22 sometimes – not 21
 // See https://gitlab.com/gnachman/iterm2/issues/3208
-const resetBold = const AnsiCode._('bold', AnsiCodeType.reset, 22, null);
-const resetDim = const AnsiCode._('dim', AnsiCodeType.reset, 22, null);
-const resetItalic = const AnsiCode._('italic', AnsiCodeType.reset, 23, null);
-const resetUnderlined =
-    const AnsiCode._('underlined', AnsiCodeType.reset, 24, null);
-const resetBlink = const AnsiCode._('blink', AnsiCodeType.reset, 25, null);
-const resetReverse = const AnsiCode._('reverse', AnsiCodeType.reset, 27, null);
-const resetHidden = const AnsiCode._('hidden', AnsiCodeType.reset, 28, null);
-const resetCrossedOut =
-    const AnsiCode._('crossed out', AnsiCodeType.reset, 29, null);
+const resetBold = AnsiCode._('bold', AnsiCodeType.reset, 22, null);
+const resetDim = AnsiCode._('dim', AnsiCodeType.reset, 22, null);
+const resetItalic = AnsiCode._('italic', AnsiCodeType.reset, 23, null);
+const resetUnderlined = AnsiCode._('underlined', AnsiCodeType.reset, 24, null);
+const resetBlink = AnsiCode._('blink', AnsiCodeType.reset, 25, null);
+const resetReverse = AnsiCode._('reverse', AnsiCodeType.reset, 27, null);
+const resetHidden = AnsiCode._('hidden', AnsiCodeType.reset, 28, null);
+const resetCrossedOut = AnsiCode._('crossed out', AnsiCodeType.reset, 29, null);
 
 //
 // Foreground values
 //
 
-const black = const AnsiCode._('black', AnsiCodeType.foreground, 30, resetAll);
-const red = const AnsiCode._('red', AnsiCodeType.foreground, 31, resetAll);
-const green = const AnsiCode._('green', AnsiCodeType.foreground, 32, resetAll);
-const yellow =
-    const AnsiCode._('yellow', AnsiCodeType.foreground, 33, resetAll);
-const blue = const AnsiCode._('blue', AnsiCodeType.foreground, 34, resetAll);
-const magenta =
-    const AnsiCode._('magenta', AnsiCodeType.foreground, 35, resetAll);
-const cyan = const AnsiCode._('cyan', AnsiCodeType.foreground, 36, resetAll);
+const black = AnsiCode._('black', AnsiCodeType.foreground, 30, resetAll);
+const red = AnsiCode._('red', AnsiCodeType.foreground, 31, resetAll);
+const green = AnsiCode._('green', AnsiCodeType.foreground, 32, resetAll);
+const yellow = AnsiCode._('yellow', AnsiCodeType.foreground, 33, resetAll);
+const blue = AnsiCode._('blue', AnsiCodeType.foreground, 34, resetAll);
+const magenta = AnsiCode._('magenta', AnsiCodeType.foreground, 35, resetAll);
+const cyan = AnsiCode._('cyan', AnsiCodeType.foreground, 36, resetAll);
 const lightGray =
-    const AnsiCode._('light gray', AnsiCodeType.foreground, 37, resetAll);
+    AnsiCode._('light gray', AnsiCodeType.foreground, 37, resetAll);
 const defaultForeground =
-    const AnsiCode._('default', AnsiCodeType.foreground, 39, resetAll);
-const darkGray =
-    const AnsiCode._('dark gray', AnsiCodeType.foreground, 90, resetAll);
-const lightRed =
-    const AnsiCode._('light red', AnsiCodeType.foreground, 91, resetAll);
+    AnsiCode._('default', AnsiCodeType.foreground, 39, resetAll);
+const darkGray = AnsiCode._('dark gray', AnsiCodeType.foreground, 90, resetAll);
+const lightRed = AnsiCode._('light red', AnsiCodeType.foreground, 91, resetAll);
 const lightGreen =
-    const AnsiCode._('light green', AnsiCodeType.foreground, 92, resetAll);
+    AnsiCode._('light green', AnsiCodeType.foreground, 92, resetAll);
 const lightYellow =
-    const AnsiCode._('light yellow', AnsiCodeType.foreground, 93, resetAll);
+    AnsiCode._('light yellow', AnsiCodeType.foreground, 93, resetAll);
 const lightBlue =
-    const AnsiCode._('light blue', AnsiCodeType.foreground, 94, resetAll);
+    AnsiCode._('light blue', AnsiCodeType.foreground, 94, resetAll);
 const lightMagenta =
-    const AnsiCode._('light magenta', AnsiCodeType.foreground, 95, resetAll);
+    AnsiCode._('light magenta', AnsiCodeType.foreground, 95, resetAll);
 const lightCyan =
-    const AnsiCode._('light cyan', AnsiCodeType.foreground, 96, resetAll);
-const white = const AnsiCode._('white', AnsiCodeType.foreground, 97, resetAll);
+    AnsiCode._('light cyan', AnsiCodeType.foreground, 96, resetAll);
+const white = AnsiCode._('white', AnsiCodeType.foreground, 97, resetAll);
 
 //
 // Background values
 //
 
 const backgroundBlack =
-    const AnsiCode._('black', AnsiCodeType.background, 40, resetAll);
-const backgroundRed =
-    const AnsiCode._('red', AnsiCodeType.background, 41, resetAll);
+    AnsiCode._('black', AnsiCodeType.background, 40, resetAll);
+const backgroundRed = AnsiCode._('red', AnsiCodeType.background, 41, resetAll);
 const backgroundGreen =
-    const AnsiCode._('green', AnsiCodeType.background, 42, resetAll);
+    AnsiCode._('green', AnsiCodeType.background, 42, resetAll);
 const backgroundYellow =
-    const AnsiCode._('yellow', AnsiCodeType.background, 43, resetAll);
+    AnsiCode._('yellow', AnsiCodeType.background, 43, resetAll);
 const backgroundBlue =
-    const AnsiCode._('blue', AnsiCodeType.background, 44, resetAll);
+    AnsiCode._('blue', AnsiCodeType.background, 44, resetAll);
 const backgroundMagenta =
-    const AnsiCode._('magenta', AnsiCodeType.background, 45, resetAll);
+    AnsiCode._('magenta', AnsiCodeType.background, 45, resetAll);
 const backgroundCyan =
-    const AnsiCode._('cyan', AnsiCodeType.background, 46, resetAll);
+    AnsiCode._('cyan', AnsiCodeType.background, 46, resetAll);
 const backgroundLightGray =
-    const AnsiCode._('light gray', AnsiCodeType.background, 47, resetAll);
+    AnsiCode._('light gray', AnsiCodeType.background, 47, resetAll);
 const backgroundDefault =
-    const AnsiCode._('default', AnsiCodeType.background, 49, resetAll);
+    AnsiCode._('default', AnsiCodeType.background, 49, resetAll);
 const backgroundDarkGray =
-    const AnsiCode._('dark gray', AnsiCodeType.background, 100, resetAll);
+    AnsiCode._('dark gray', AnsiCodeType.background, 100, resetAll);
 const backgroundLightRed =
-    const AnsiCode._('light red', AnsiCodeType.background, 101, resetAll);
+    AnsiCode._('light red', AnsiCodeType.background, 101, resetAll);
 const backgroundLightGreen =
-    const AnsiCode._('light green', AnsiCodeType.background, 102, resetAll);
+    AnsiCode._('light green', AnsiCodeType.background, 102, resetAll);
 const backgroundLightYellow =
-    const AnsiCode._('light yellow', AnsiCodeType.background, 103, resetAll);
+    AnsiCode._('light yellow', AnsiCodeType.background, 103, resetAll);
 const backgroundLightBlue =
-    const AnsiCode._('light blue', AnsiCodeType.background, 104, resetAll);
+    AnsiCode._('light blue', AnsiCodeType.background, 104, resetAll);
 const backgroundLightMagenta =
-    const AnsiCode._('light magenta', AnsiCodeType.background, 105, resetAll);
+    AnsiCode._('light magenta', AnsiCodeType.background, 105, resetAll);
 const backgroundLightCyan =
-    const AnsiCode._('light cyan', AnsiCodeType.background, 106, resetAll);
+    AnsiCode._('light cyan', AnsiCodeType.background, 106, resetAll);
 const backgroundWhite =
-    const AnsiCode._('white', AnsiCodeType.background, 107, resetAll);
+    AnsiCode._('white', AnsiCodeType.background, 107, resetAll);
 
 /// All of the [AnsiCode] values that represent [AnsiCodeType.style].
-const List<AnsiCode> styles = const [
+const List<AnsiCode> styles = [
   styleBold,
   styleDim,
   styleItalic,
@@ -287,7 +277,7 @@
 ];
 
 /// All of the [AnsiCode] values that represent [AnsiCodeType.foreground].
-const List<AnsiCode> foregroundColors = const [
+const List<AnsiCode> foregroundColors = [
   black,
   red,
   green,
@@ -308,7 +298,7 @@
 ];
 
 /// All of the [AnsiCode] values that represent [AnsiCodeType.background].
-const List<AnsiCode> backgroundColors = const [
+const List<AnsiCode> backgroundColors = [
   backgroundBlack,
   backgroundRed,
   backgroundGreen,
diff --git a/pkgs/io/lib/src/copy_path.dart b/pkgs/io/lib/src/copy_path.dart
index ed790ed..3b2f6cf 100644
--- a/pkgs/io/lib/src/copy_path.dart
+++ b/pkgs/io/lib/src/copy_path.dart
@@ -12,7 +12,7 @@
     return true;
   }
   if (p.isWithin(from, to)) {
-    throw new ArgumentError('Cannot copy from $from to $to');
+    throw ArgumentError('Cannot copy from $from to $to');
   }
   return false;
 }
@@ -30,15 +30,15 @@
   if (_doNothing(from, to)) {
     return;
   }
-  await new Directory(to).create(recursive: true);
-  await for (final file in new Directory(from).list(recursive: true)) {
+  await Directory(to).create(recursive: true);
+  await for (final file in Directory(from).list(recursive: true)) {
     final copyTo = p.join(to, p.relative(file.path, from: from));
     if (file is Directory) {
-      await new Directory(copyTo).create(recursive: true);
+      await Directory(copyTo).create(recursive: true);
     } else if (file is File) {
-      await new File(file.path).copy(copyTo);
+      await File(file.path).copy(copyTo);
     } else if (file is Link) {
-      await new Link(copyTo).create(await file.target(), recursive: true);
+      await Link(copyTo).create(await file.target(), recursive: true);
     }
   }
 }
@@ -56,15 +56,15 @@
   if (_doNothing(from, to)) {
     return;
   }
-  new Directory(to).createSync(recursive: true);
-  for (final file in new Directory(from).listSync(recursive: true)) {
+  Directory(to).createSync(recursive: true);
+  for (final file in Directory(from).listSync(recursive: true)) {
     final copyTo = p.join(to, p.relative(file.path, from: from));
     if (file is Directory) {
-      new Directory(copyTo).createSync(recursive: true);
+      Directory(copyTo).createSync(recursive: true);
     } else if (file is File) {
-      new File(file.path).copySync(copyTo);
+      File(file.path).copySync(copyTo);
     } else if (file is Link) {
-      new Link(copyTo).createSync(file.targetSync(), recursive: true);
+      Link(copyTo).createSync(file.targetSync(), recursive: true);
     }
   }
 }
diff --git a/pkgs/io/lib/src/exit_code.dart b/pkgs/io/lib/src/exit_code.dart
index 50d7f7e..e6334af 100644
--- a/pkgs/io/lib/src/exit_code.dart
+++ b/pkgs/io/lib/src/exit_code.dart
@@ -7,67 +7,67 @@
 /// [Source](https://www.freebsd.org/cgi/man.cgi?query=sysexits).
 class ExitCode {
   /// Command completed successfully.
-  static const success = const ExitCode._(0, 'success');
+  static const success = ExitCode._(0, 'success');
 
   /// Command was used incorrectly.
   ///
   /// This may occur if the wrong number of arguments was used, a bad flag, or
   /// bad syntax in a parameter.
-  static const usage = const ExitCode._(64, 'usage');
+  static const usage = ExitCode._(64, 'usage');
 
   /// Input data was used incorrectly.
   ///
   /// This should occur only for user data (not system files).
-  static const data = const ExitCode._(65, 'data');
+  static const data = ExitCode._(65, 'data');
 
   /// An input file (not a system file) did not exist or was not readable.
-  static const noInput = const ExitCode._(66, 'noInput');
+  static const noInput = ExitCode._(66, 'noInput');
 
   /// User specified did not exist.
-  static const noUser = const ExitCode._(67, 'noUser');
+  static const noUser = ExitCode._(67, 'noUser');
 
   /// Host specified did not exist.
-  static const noHost = const ExitCode._(68, 'noHost');
+  static const noHost = ExitCode._(68, 'noHost');
 
   /// A service is unavailable.
   ///
   /// This may occur if a support program or file does not exist. This may also
   /// be used as a catch-all error when something you wanted to do does not
   /// work, but you do not know why.
-  static const unavailable = const ExitCode._(69, 'unavailable');
+  static const unavailable = ExitCode._(69, 'unavailable');
 
   /// An internal software error has been detected.
   ///
   /// This should be limited to non-operating system related errors as possible.
-  static const software = const ExitCode._(70, 'software');
+  static const software = ExitCode._(70, 'software');
 
   /// An operating system error has been detected.
   ///
   /// This intended to be used for such thing as `cannot fork` or `cannot pipe`.
-  static const osError = const ExitCode._(71, 'osError');
+  static const osError = ExitCode._(71, 'osError');
 
   /// Some system file (e.g. `/etc/passwd`) does not exist or could not be read.
-  static const osFile = const ExitCode._(72, 'osFile');
+  static const osFile = ExitCode._(72, 'osFile');
 
   /// A (user specified) output file cannot be created.
-  static const cantCreate = const ExitCode._(73, 'cantCreate');
+  static const cantCreate = ExitCode._(73, 'cantCreate');
 
   /// An error occurred doing I/O on some file.
-  static const ioError = const ExitCode._(74, 'ioError');
+  static const ioError = ExitCode._(74, 'ioError');
 
   /// Temporary failure, indicating something is not really an error.
   ///
   /// In some cases, this can be re-attempted and will succeed later.
-  static const tempFail = const ExitCode._(75, 'tempFail');
+  static const tempFail = ExitCode._(75, 'tempFail');
 
   /// You did not have sufficient permissions to perform the operation.
   ///
   /// This is not intended for file system problems, which should use [noInput]
   /// or [cantCreate], but rather for higher-level permissions.
-  static const noPerm = const ExitCode._(77, 'noPerm');
+  static const noPerm = ExitCode._(77, 'noPerm');
 
   /// Something was found in an unconfigured or misconfigured state.
-  static const config = const ExitCode._(78, 'config');
+  static const config = ExitCode._(78, 'config');
 
   /// Exit code value.
   final int code;
diff --git a/pkgs/io/lib/src/permissions.dart b/pkgs/io/lib/src/permissions.dart
index 4267ded..0056bbf 100644
--- a/pkgs/io/lib/src/permissions.dart
+++ b/pkgs/io/lib/src/permissions.dart
@@ -26,7 +26,7 @@
 bool _hasPermission(
   FileStat stat,
   _FilePermission permission, {
-  _FilePermissionRole role: _FilePermissionRole.world,
+  _FilePermissionRole role = _FilePermissionRole.world,
 }) {
   final index = _permissionBitIndex(permission, role);
   return (stat.mode & (1 << index)) != 0;
@@ -55,7 +55,7 @@
 FutureOr<bool> isExecutable(
   String path, {
   bool isWindows,
-  FutureOr<FileStat> getStat(String path): FileStat.stat,
+  FutureOr<FileStat> getStat(String path) = FileStat.stat,
 }) {
   // Windows has no concept of executable.
   if (isWindows ?? Platform.isWindows) return true;
diff --git a/pkgs/io/lib/src/process_manager.dart b/pkgs/io/lib/src/process_manager.dart
index d66790d..28c5743 100644
--- a/pkgs/io/lib/src/process_manager.dart
+++ b/pkgs/io/lib/src/process_manager.dart
@@ -46,9 +46,9 @@
     stderr ??= io.stderr;
     isWindows ??= io.Platform.isWindows;
     if (isWindows) {
-      return new _WindowsProcessManager(stdin, stdout, stderr);
+      return _WindowsProcessManager(stdin, stdout, stderr);
     }
-    return new _UnixProcessManager(stdin, stdout, stderr);
+    return _UnixProcessManager(stdin, stdout, stderr);
   }
 
   final Stream<List<int>> _stdin;
@@ -69,9 +69,9 @@
     Iterable<String> arguments, {
     String workingDirectory,
     Map<String, String> environment,
-    bool includeParentEnvironment: true,
-    bool runInShell: false,
-    io.ProcessStartMode mode: io.ProcessStartMode.normal,
+    bool includeParentEnvironment = true,
+    bool runInShell = false,
+    io.ProcessStartMode mode = io.ProcessStartMode.normal,
   }) async {
     final process = io.Process.start(
       executable,
@@ -82,7 +82,7 @@
       runInShell: runInShell,
       mode: mode,
     );
-    return new _ForwardingSpawn(await process, _stdin, _stdout, _stderr);
+    return _ForwardingSpawn(await process, _stdin, _stdout, _stderr);
   }
 
   /// Spawns a process by invoking [executable] with [arguments].
@@ -97,9 +97,9 @@
     Iterable<String> arguments, {
     String workingDirectory,
     Map<String, String> environment,
-    bool includeParentEnvironment: true,
-    bool runInShell: false,
-    io.ProcessStartMode mode: io.ProcessStartMode.normal,
+    bool includeParentEnvironment = true,
+    bool runInShell = false,
+    io.ProcessStartMode mode = io.ProcessStartMode.normal,
   }) async {
     final process = io.Process.start(
       executable,
@@ -110,7 +110,7 @@
       runInShell: runInShell,
       mode: mode,
     );
-    return new _ForwardingSpawn(
+    return _ForwardingSpawn(
       await process,
       const Stream.empty(),
       _stdout,
@@ -128,9 +128,9 @@
     Iterable<String> arguments, {
     String workingDirectory,
     Map<String, String> environment,
-    bool includeParentEnvironment: true,
-    bool runInShell: false,
-    io.ProcessStartMode mode: io.ProcessStartMode.normal,
+    bool includeParentEnvironment = true,
+    bool runInShell = false,
+    io.ProcessStartMode mode = io.ProcessStartMode.normal,
   }) async {
     return io.Process.start(
       executable,
@@ -192,8 +192,8 @@
     io.IOSink stdout,
     io.IOSink stderr,
   ) {
-    final stdoutSelf = new StreamController<List<int>>();
-    final stderrSelf = new StreamController<List<int>>();
+    final stdoutSelf = StreamController<List<int>>();
+    final stderrSelf = StreamController<List<int>>();
     final stdInSub = stdin.listen(delegate.stdin.add);
     final stdOutSub = delegate.stdout.listen((event) {
       stdout.add(event);
@@ -203,7 +203,7 @@
       stderr.add(event);
       stderrSelf.add(event);
     });
-    return new _ForwardingSpawn._delegate(
+    return _ForwardingSpawn._delegate(
       delegate,
       stdInSub,
       stdOutSub,
diff --git a/pkgs/io/lib/src/shared_stdin.dart b/pkgs/io/lib/src/shared_stdin.dart
index bd71027..8bd59b1 100644
--- a/pkgs/io/lib/src/shared_stdin.dart
+++ b/pkgs/io/lib/src/shared_stdin.dart
@@ -17,7 +17,7 @@
 /// [SharedStdIn.terminate] *must* be invoked in order to close the underlying
 /// connection to [stdin], allowing your program to close automatically without
 /// hanging.
-final SharedStdIn sharedStdIn = new SharedStdIn(stdin);
+final SharedStdIn sharedStdIn = SharedStdIn(stdin);
 
 /// A singleton wrapper around `stdin` that allows new subscribers.
 ///
@@ -36,7 +36,7 @@
   /// Returns a future that completes with the next line.
   ///
   /// This is similar to the standard [Stdin.readLineSync], but asynchronous.
-  Future<String> nextLine({Encoding encoding: systemEncoding}) {
+  Future<String> nextLine({Encoding encoding = systemEncoding}) {
     return lines(encoding: encoding).first;
   }
 
@@ -51,7 +51,7 @@
   /// ```
   ///
   /// ... but asynchronous.
-  Stream<String> lines({Encoding encoding: systemEncoding}) {
+  Stream<String> lines({Encoding encoding = systemEncoding}) {
     return transform(utf8.decoder).transform(const LineSplitter());
   }
 
@@ -59,7 +59,7 @@
 
   StreamController<List<int>> _getCurrent() {
     if (_current == null) {
-      _current = new StreamController<List<int>>(
+      _current = StreamController<List<int>>(
           onCancel: () {
             _current = null;
           },
@@ -76,11 +76,11 @@
     bool cancelOnError,
   }) {
     if (_sub == null) {
-      throw new StateError('Stdin has already been terminated.');
+      throw StateError('Stdin has already been terminated.');
     }
     final controller = _getCurrent();
     if (controller.hasListener) {
-      throw new StateError(''
+      throw StateError(''
           'Subscriber already listening. The existing subscriber must cancel '
           'before another may be added.');
     }
@@ -95,7 +95,7 @@
   /// Terminates the connection to `stdin`, closing all subscription.
   Future<Null> terminate() async {
     if (_sub == null) {
-      throw new StateError('Stdin has already been terminated.');
+      throw StateError('Stdin has already been terminated.');
     }
     await _sub.cancel();
     await _current?.close();
diff --git a/pkgs/io/lib/src/shell_words.dart b/pkgs/io/lib/src/shell_words.dart
index 12e5d7e..279680b 100644
--- a/pkgs/io/lib/src/shell_words.dart
+++ b/pkgs/io/lib/src/shell_words.dart
@@ -22,9 +22,9 @@
 ///
 /// Throws a [FormatException] if [command] isn't a valid shell command.
 List<String> shellSplit(String command) {
-  final scanner = new StringScanner(command);
+  final scanner = StringScanner(command);
   final results = <String>[];
-  final token = new StringBuffer();
+  final token = StringBuffer();
 
   // Whether a token is being parsed, as opposed to a separator character. This
   // is different than just [token.isEmpty], because empty quoted tokens can
diff --git a/pkgs/io/pubspec.yaml b/pkgs/io/pubspec.yaml
index 8089bb3..c3a8299 100644
--- a/pkgs/io/pubspec.yaml
+++ b/pkgs/io/pubspec.yaml
@@ -1,12 +1,12 @@
 name: io
 description: >
   Utilities for the Dart VM Runtime.
-version: 0.3.3
+version: 0.3.4-dev
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/io
 
 environment:
-  sdk: ">=2.0.0-dev.54 <3.0.0"
+  sdk: ">=2.0.0 <3.0.0"
 
 dependencies:
   charcode: ^1.0.0
@@ -16,5 +16,6 @@
 
 dev_dependencies:
   dart_style: ^1.0.7
+  pedantic: ^1.2.0
   test: ^1.0.0
   test_descriptor: ^1.0.0
diff --git a/pkgs/io/test/process_manager_test.dart b/pkgs/io/test/process_manager_test.dart
index c80d5e7..d161a9e 100644
--- a/pkgs/io/test/process_manager_test.dart
+++ b/pkgs/io/test/process_manager_test.dart
@@ -21,7 +21,7 @@
   test('spawn functions should match the type definition of Process.start', () {
     final isStartProcess = const TypeMatcher<StartProcess>();
     expect(Process.start, isStartProcess);
-    final manager = new ProcessManager();
+    final manager = ProcessManager();
     expect(manager.spawn, isStartProcess);
     expect(manager.spawnBackground, isStartProcess);
     expect(manager.spawnDetached, isStartProcess);
@@ -29,19 +29,19 @@
 
   group('spawn', () {
     setUp(() async {
-      fakeStdIn = new StreamController<String>(sync: true);
-      sharedStdIn = new SharedStdIn(fakeStdIn.stream.map((s) => s.codeUnits));
+      fakeStdIn = StreamController<String>(sync: true);
+      sharedStdIn = SharedStdIn(fakeStdIn.stream.map((s) => s.codeUnits));
       stdoutLog = <String>[];
       stderrLog = <String>[];
 
-      final stdoutController = new StreamController<List<int>>(sync: true);
+      final stdoutController = StreamController<List<int>>(sync: true);
       stdoutController.stream.map(utf8.decode).listen(stdoutLog.add);
-      final stdout = new IOSink(stdoutController);
-      final stderrController = new StreamController<List<int>>(sync: true);
+      final stdout = IOSink(stdoutController);
+      final stderrController = StreamController<List<int>>(sync: true);
       stderrController.stream.map(utf8.decode).listen(stderrLog.add);
-      final stderr = new IOSink(stderrController);
+      final stderr = IOSink(stderrController);
 
-      processManager = new ProcessManager(
+      processManager = ProcessManager(
         stdin: sharedStdIn,
         stdout: stdout,
         stderr: stderr,
diff --git a/pkgs/io/test/shared_stdin_test.dart b/pkgs/io/test/shared_stdin_test.dart
index dea13ef..bdb311d 100644
--- a/pkgs/io/test/shared_stdin_test.dart
+++ b/pkgs/io/test/shared_stdin_test.dart
@@ -13,8 +13,8 @@
   SharedStdIn sharedStdIn;
 
   setUp(() async {
-    fakeStdIn = new StreamController<String>(sync: true);
-    sharedStdIn = new SharedStdIn(fakeStdIn.stream.map((s) => s.codeUnits));
+    fakeStdIn = StreamController<String>(sync: true);
+    sharedStdIn = SharedStdIn(fakeStdIn.stream.map((s) => s.codeUnits));
   });
 
   test('should allow a single subscriber', () async {
@@ -71,7 +71,7 @@
   test('should allow listening for new lines multiple times', () async {
     expect(sharedStdIn.nextLine(), completion('Hello World'));
     fakeStdIn.add('Hello World\n');
-    await new Future<Null>.value();
+    await Future<Null>.value();
 
     expect(sharedStdIn.nextLine(), completion('Hello World'));
     fakeStdIn.add('Hello World\n');
