diff --git a/changelog.md b/changelog.md
index c59af54..356d69e 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,12 @@
 # webkit_inspection_protocol.dart
 
+## 0.3.0
+- Expose the `runtime` domain.
+- Expose the `log` domain.
+- Deprecated the `console` domain.
+- Fix a bug in `Page.reload()`.
+- Remove the use of parts.
+
 ## 0.2.2
 - Make the package strong mode clean.
 
diff --git a/lib/src/console.dart b/lib/src/console.dart
index df87c3c..ec69683 100644
--- a/lib/src/console.dart
+++ b/lib/src/console.dart
@@ -1,27 +1,27 @@
 // Copyright 2015 Google. All rights reserved. Use of this source code is
 // governed by a BSD-style license that can be found in the LICENSE file.
 
-part of wip;
+import 'dart:async';
 
+import '../webkit_inspection_protocol.dart';
+
+@Deprecated('This domain is deprecated - use Runtime or Log instead')
 class WipConsole extends WipDomain {
   WipConsole(WipConnection connection) : super(connection);
 
-  Future enable() => _sendCommand('Console.enable');
-  Future disable() => _sendCommand('Console.disable');
-  Future clearMessages() => _sendCommand('Console.clearMessages');
+  Future enable() => sendCommand('Console.enable');
+  Future disable() => sendCommand('Console.disable');
+  Future clearMessages() => sendCommand('Console.clearMessages');
 
-  Stream<ConsoleMessageEvent> get onMessage => _eventStream(
+  Stream<ConsoleMessageEvent> get onMessage => eventStream(
       'Console.messageAdded',
       (WipEvent event) => new ConsoleMessageEvent(event));
-  Stream<ConsoleClearedEvent> get onCleared => _eventStream(
+  Stream<ConsoleClearedEvent> get onCleared => eventStream(
       'Console.messagesCleared',
       (WipEvent event) => new ConsoleClearedEvent(event));
 }
 
-/**
- * See [WipConsole.onMessage].
- */
-class ConsoleMessageEvent extends _WrappedWipEvent {
+class ConsoleMessageEvent extends WrappedWipEvent {
   ConsoleMessageEvent(WipEvent event) : super(event);
 
   Map get _message => params['message'];
@@ -42,7 +42,7 @@
   String toString() => text;
 }
 
-class ConsoleClearedEvent extends _WrappedWipEvent {
+class ConsoleClearedEvent extends WrappedWipEvent {
   ConsoleClearedEvent(WipEvent event) : super(event);
 }
 
diff --git a/lib/src/debugger.dart b/lib/src/debugger.dart
index f10d12a..980b500 100644
--- a/lib/src/debugger.dart
+++ b/lib/src/debugger.dart
@@ -1,7 +1,10 @@
 // Copyright 2015 Google. All rights reserved. Use of this source code is
 // governed by a BSD-style license that can be found in the LICENSE file.
 
-part of wip;
+import 'dart:async';
+import 'dart:collection';
+
+import '../webkit_inspection_protocol.dart';
 
 class WipDebugger extends WipDomain {
   final _scripts = <String, WipScript>{};
@@ -15,31 +18,33 @@
     });
   }
 
-  Future enable() => _sendCommand('Debugger.enable');
-  Future disable() => _sendCommand('Debugger.disable');
+  Future enable() => sendCommand('Debugger.enable');
+  Future disable() => sendCommand('Debugger.disable');
 
   Future<String> getScriptSource(String scriptId) async =>
-      (await _sendCommand('Debugger.getScriptSource', {'scriptId': scriptId}))
+      (await sendCommand('Debugger.getScriptSource',
+              params: {'scriptId': scriptId}))
           .result['scriptSource'];
 
-  Future pause() => _sendCommand('Debugger.pause');
-  Future resume() => _sendCommand('Debugger.resume');
+  Future pause() => sendCommand('Debugger.pause');
+  Future resume() => sendCommand('Debugger.resume');
 
-  Future stepInto() => _sendCommand('Debugger.stepInto');
-  Future stepOut() => _sendCommand('Debugger.stepOut');
-  Future stepOver() => _sendCommand('Debugger.stepOver');
+  Future stepInto() => sendCommand('Debugger.stepInto');
+  Future stepOut() => sendCommand('Debugger.stepOut');
+  Future stepOver() => sendCommand('Debugger.stepOver');
 
-  Future setPauseOnExceptions(PauseState state) => _sendCommand(
-      'Debugger.setPauseOnExceptions', {'state': _pauseStateToString(state)});
+  Future setPauseOnExceptions(PauseState state) =>
+      sendCommand('Debugger.setPauseOnExceptions',
+          params: {'state': _pauseStateToString(state)});
 
-  Stream<DebuggerPausedEvent> get onPaused => _eventStream(
+  Stream<DebuggerPausedEvent> get onPaused => eventStream(
       'Debugger.paused', (WipEvent event) => new DebuggerPausedEvent(event));
-  Stream<GlobalObjectClearedEvent> get onGlobalObjectCleared => _eventStream(
+  Stream<GlobalObjectClearedEvent> get onGlobalObjectCleared => eventStream(
       'Debugger.globalObjectCleared',
       (WipEvent event) => new GlobalObjectClearedEvent(event));
-  Stream<DebuggerResumedEvent> get onResumed => _eventStream(
+  Stream<DebuggerResumedEvent> get onResumed => eventStream(
       'Debugger.resumed', (WipEvent event) => new DebuggerResumedEvent(event));
-  Stream<ScriptParsedEvent> get onScriptParsed => _eventStream(
+  Stream<ScriptParsedEvent> get onScriptParsed => eventStream(
       'Debugger.scriptParsed',
       (WipEvent event) => new ScriptParsedEvent(event));
 
@@ -61,7 +66,7 @@
 
 enum PauseState { all, none, uncaught }
 
-class ScriptParsedEvent extends _WrappedWipEvent {
+class ScriptParsedEvent extends WrappedWipEvent {
   final WipScript script;
 
   ScriptParsedEvent(WipEvent event)
@@ -69,15 +74,15 @@
         super(event);
 }
 
-class GlobalObjectClearedEvent extends _WrappedWipEvent {
+class GlobalObjectClearedEvent extends WrappedWipEvent {
   GlobalObjectClearedEvent(WipEvent event) : super(event);
 }
 
-class DebuggerResumedEvent extends _WrappedWipEvent {
+class DebuggerResumedEvent extends WrappedWipEvent {
   DebuggerResumedEvent(WipEvent event) : super(event);
 }
 
-class DebuggerPausedEvent extends _WrappedWipEvent {
+class DebuggerPausedEvent extends WrappedWipEvent {
   DebuggerPausedEvent(WipEvent event) : super(event);
 
   String get reason => params['reason'];
diff --git a/lib/src/dom.dart b/lib/src/dom.dart
index edb32a5..f1c33b1 100644
--- a/lib/src/dom.dart
+++ b/lib/src/dom.dart
@@ -1,7 +1,10 @@
 // Copyright 2015 Google. All rights reserved. Use of this source code is
 // governed by a BSD-style license that can be found in the LICENSE file.
 
-part of wip;
+import 'dart:async';
+import 'dart:collection';
+
+import '../webkit_inspection_protocol.dart';
 
 /// Implementation of the
 /// https://developer.chrome.com/devtools/docs/protocol/1.1/dom
@@ -10,18 +13,18 @@
 
   Future<Map<String, String>> getAttributes(int nodeId) async {
     WipResponse resp =
-        await _sendCommand('DOM.getAttributes', {'nodeId': nodeId});
+        await sendCommand('DOM.getAttributes', params: {'nodeId': nodeId});
     return _attributeListToMap(resp.result['attributes']);
   }
 
   Future<Node> getDocument() async =>
-      new Node((await _sendCommand('DOM.getDocument')).result['root']);
+      new Node((await sendCommand('DOM.getDocument')).result['root']);
 
   Future<String> getOuterHtml(int nodeId) async =>
-      (await _sendCommand('DOM.getOuterHTML', {'nodeId': nodeId}))
+      (await sendCommand('DOM.getOuterHTML', params: {'nodeId': nodeId}))
           .result['root'];
 
-  Future hideHighlight() => _sendCommand('DOM.hideHighlight');
+  Future hideHighlight() => sendCommand('DOM.hideHighlight');
 
   Future highlightNode(int nodeId,
       {Rgba borderColor,
@@ -51,7 +54,7 @@
       params['highlightConfig']['showInfo'] = showInfo;
     }
 
-    return _sendCommand('DOM.highlightNode', params);
+    return sendCommand('DOM.highlightNode', params: params);
   }
 
   Future highlightRect(int x, int y, int width, int height,
@@ -71,7 +74,7 @@
       params['outlineColor'] = outlineColor;
     }
 
-    return _sendCommand('DOM.highlightRect', params);
+    return sendCommand('DOM.highlightRect', params: params);
   }
 
   Future<int> moveTo(int nodeId, int targetNodeId,
@@ -82,33 +85,35 @@
       params['insertBeforeNodeId'] = insertBeforeNodeId;
     }
 
-    var resp = await _sendCommand('DOM.moveTo', params);
+    var resp = await sendCommand('DOM.moveTo', params: params);
     return resp.result['nodeId'];
   }
 
   Future<int> querySelector(int nodeId, String selector) async {
-    var resp = await _sendCommand(
-        'DOM.querySelector', {'nodeId': nodeId, 'selector': selector});
+    var resp = await sendCommand('DOM.querySelector',
+        params: {'nodeId': nodeId, 'selector': selector});
     return resp.result['nodeId'];
   }
 
   Future<List<int>> querySelectorAll(int nodeId, String selector) async {
-    var resp = await _sendCommand(
-        'DOM.querySelectorAll', {'nodeId': nodeId, 'selector': selector});
+    var resp = await sendCommand('DOM.querySelectorAll',
+        params: {'nodeId': nodeId, 'selector': selector});
     return resp.result['nodeIds'];
   }
 
   Future removeAttribute(int nodeId, String name) =>
-      _sendCommand('DOM.removeAttribute', {'nodeId': nodeId, 'name': name});
+      sendCommand('DOM.removeAttribute',
+          params: {'nodeId': nodeId, 'name': name});
 
   Future removeNode(int nodeId) =>
-      _sendCommand('DOM.removeNode', {'nodeId': nodeId});
+      sendCommand('DOM.removeNode', params: {'nodeId': nodeId});
 
   Future requestChildNodes(int nodeId) =>
-      _sendCommand('DOM.requestChildNodes', {'nodeId': nodeId});
+      sendCommand('DOM.requestChildNodes', params: {'nodeId': nodeId});
 
   Future<int> requestNode(String objectId) async {
-    var resp = await _sendCommand('DOM.requestNode', {'objectId': objectId});
+    var resp =
+        await sendCommand('DOM.requestNode', params: {'objectId': objectId});
     return resp.result['nodeId'];
   }
 
@@ -118,60 +123,62 @@
       params['objectGroup'] = objectGroup;
     }
 
-    var resp = await _sendCommand('DOM.resolveNode', params);
+    var resp = await sendCommand('DOM.resolveNode', params: params);
     return new WipRemoteObject(resp.result['object']);
   }
 
   Future setAttributeValue(int nodeId, String name, String value) =>
-      _sendCommand('DOM.setAttributeValue',
-          {'nodeId': nodeId, 'name': name, 'value': value});
+      sendCommand('DOM.setAttributeValue',
+          params: {'nodeId': nodeId, 'name': name, 'value': value});
 
   Future setAttributesAsText(int nodeId, String text, {String name}) {
     var params = {'nodeId': nodeId, 'text': text};
     if (name != null) {
       params['name'] = name;
     }
-    return _sendCommand('DOM.setAttributeValue', params);
+    return sendCommand('DOM.setAttributeValue', params: params);
   }
 
   Future<int> setNodeName(int nodeId, String name) async {
-    var resp =
-        await _sendCommand('DOM.setNodeName', {'nodeId': nodeId, 'name': name});
+    var resp = await sendCommand('DOM.setNodeName',
+        params: {'nodeId': nodeId, 'name': name});
     return resp.result['nodeId'];
   }
 
   Future setNodeValue(int nodeId, String value) =>
-      _sendCommand('DOM.setNodeValue', {'nodeId': nodeId, 'value': value});
+      sendCommand('DOM.setNodeValue',
+          params: {'nodeId': nodeId, 'value': value});
 
-  Future setOuterHtml(int nodeId, String outerHtml) => _sendCommand(
-      'DOM.setOuterHTML', {'nodeId': nodeId, 'outerHtml': outerHtml});
+  Future setOuterHtml(int nodeId, String outerHtml) =>
+      sendCommand('DOM.setOuterHTML',
+          params: {'nodeId': nodeId, 'outerHtml': outerHtml});
 
-  Stream<AttributeModifiedEvent> get onAttributeModified => _eventStream(
+  Stream<AttributeModifiedEvent> get onAttributeModified => eventStream(
       'DOM.attributeModified',
       (WipEvent event) => new AttributeModifiedEvent(event));
-  Stream<AttributeRemovedEvent> get onAttributeRemoved => _eventStream(
+  Stream<AttributeRemovedEvent> get onAttributeRemoved => eventStream(
       'DOM.attributeRemoved',
       (WipEvent event) => new AttributeRemovedEvent(event));
-  Stream<CharacterDataModifiedEvent> get onCharacterDataModified =>
-      _eventStream('DOM.characterDataModified',
-          (WipEvent event) => new CharacterDataModifiedEvent(event));
-  Stream<ChildNodeCountUpdatedEvent> get onChildNodeCountUpdated =>
-      _eventStream('DOM.childNodeCountUpdated',
-          (WipEvent event) => new ChildNodeCountUpdatedEvent(event));
-  Stream<ChildNodeInsertedEvent> get onChildNodeInserted => _eventStream(
+  Stream<CharacterDataModifiedEvent> get onCharacterDataModified => eventStream(
+      'DOM.characterDataModified',
+      (WipEvent event) => new CharacterDataModifiedEvent(event));
+  Stream<ChildNodeCountUpdatedEvent> get onChildNodeCountUpdated => eventStream(
+      'DOM.childNodeCountUpdated',
+      (WipEvent event) => new ChildNodeCountUpdatedEvent(event));
+  Stream<ChildNodeInsertedEvent> get onChildNodeInserted => eventStream(
       'DOM.childNodeInserted',
       (WipEvent event) => new ChildNodeInsertedEvent(event));
-  Stream<ChildNodeRemovedEvent> get onChildNodeRemoved => _eventStream(
+  Stream<ChildNodeRemovedEvent> get onChildNodeRemoved => eventStream(
       'DOM.childNodeRemoved',
       (WipEvent event) => new ChildNodeRemovedEvent(event));
-  Stream<DocumentUpdatedEvent> get onDocumentUpdated => _eventStream(
+  Stream<DocumentUpdatedEvent> get onDocumentUpdated => eventStream(
       'DOM.documentUpdated',
       (WipEvent event) => new DocumentUpdatedEvent(event));
-  Stream<SetChildNodesEvent> get onSetChildNodes => _eventStream(
+  Stream<SetChildNodesEvent> get onSetChildNodes => eventStream(
       'DOM.setChildNodes', (WipEvent event) => new SetChildNodesEvent(event));
 }
 
-class AttributeModifiedEvent extends _WrappedWipEvent {
+class AttributeModifiedEvent extends WrappedWipEvent {
   AttributeModifiedEvent(WipEvent event) : super(event);
 
   int get nodeId => params['nodeId'];
@@ -179,28 +186,28 @@
   String get value => params['value'];
 }
 
-class AttributeRemovedEvent extends _WrappedWipEvent {
+class AttributeRemovedEvent extends WrappedWipEvent {
   AttributeRemovedEvent(WipEvent event) : super(event);
 
   int get nodeId => params['nodeId'];
   String get name => params['name'];
 }
 
-class CharacterDataModifiedEvent extends _WrappedWipEvent {
+class CharacterDataModifiedEvent extends WrappedWipEvent {
   CharacterDataModifiedEvent(WipEvent event) : super(event);
 
   int get nodeId => params['nodeId'];
   String get characterData => params['characterData'];
 }
 
-class ChildNodeCountUpdatedEvent extends _WrappedWipEvent {
+class ChildNodeCountUpdatedEvent extends WrappedWipEvent {
   ChildNodeCountUpdatedEvent(WipEvent event) : super(event);
 
   int get nodeId => params['nodeId'];
   int get childNodeCount => params['childNodeCount'];
 }
 
-class ChildNodeInsertedEvent extends _WrappedWipEvent {
+class ChildNodeInsertedEvent extends WrappedWipEvent {
   ChildNodeInsertedEvent(WipEvent event) : super(event);
 
   int get parentNodeId => params['parentNodeId'];
@@ -214,18 +221,18 @@
   }
 }
 
-class ChildNodeRemovedEvent extends _WrappedWipEvent {
+class ChildNodeRemovedEvent extends WrappedWipEvent {
   ChildNodeRemovedEvent(WipEvent event) : super(event);
 
   int get parentNodeId => params['parentNodeId'];
   int get nodeId => params['nodeId'];
 }
 
-class DocumentUpdatedEvent extends _WrappedWipEvent {
+class DocumentUpdatedEvent extends WrappedWipEvent {
   DocumentUpdatedEvent(WipEvent event) : super(event);
 }
 
-class SetChildNodesEvent extends _WrappedWipEvent {
+class SetChildNodesEvent extends WrappedWipEvent {
   SetChildNodesEvent(WipEvent event) : super(event);
 
   int get nodeId => params['parentId'];
diff --git a/lib/src/log.dart b/lib/src/log.dart
new file mode 100644
index 0000000..17bc49e
--- /dev/null
+++ b/lib/src/log.dart
@@ -0,0 +1,39 @@
+// Copyright 2017 Google. All rights reserved. Use of this source code is
+// governed by a BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../webkit_inspection_protocol.dart';
+
+class WipLog extends WipDomain {
+  WipLog(WipConnection connection) : super(connection);
+
+  Future enable() => sendCommand('Log.enable');
+  Future disable() => sendCommand('Log.disable');
+
+  Stream<LogEntry> get onEntryAdded =>
+      eventStream('Log.entryAdded', (WipEvent event) => new LogEntry(event));
+}
+
+class LogEntry extends WrappedWipEvent {
+  LogEntry(WipEvent event) : super(event);
+
+  Map<String, dynamic> get _entry => params['entry'];
+
+  /// Log entry source. Allowed values: xml, javascript, network, storage,
+  /// appcache, rendering, security, deprecation, worker, violation,
+  /// intervention, other.
+  String get source => _entry['source'];
+
+  /// Log entry severity. Allowed values: verbose, info, warning, error.
+  String get level => _entry['level'];
+
+  /// Logged text.
+  String get text => _entry['text'];
+
+  /// URL of the resource if known.
+  @optional
+  String get url => _entry['url'];
+
+  String toString() => text;
+}
diff --git a/lib/src/page.dart b/lib/src/page.dart
index 7bb20a1..8959a16 100644
--- a/lib/src/page.dart
+++ b/lib/src/page.dart
@@ -1,15 +1,18 @@
 // Copyright 2015 Google. All rights reserved. Use of this source code is
 // governed by a BSD-style license that can be found in the LICENSE file.
 
-part of wip;
+import 'dart:async';
+
+import '../webkit_inspection_protocol.dart';
 
 class WipPage extends WipDomain {
   WipPage(WipConnection connection) : super(connection);
 
-  Future enable() => _sendCommand('Page.enable');
-  Future disable() => _sendCommand('Page.disable');
+  Future enable() => sendCommand('Page.enable');
+  Future disable() => sendCommand('Page.disable');
 
-  Future navigate(String url) => _sendCommand('Page.navigate', {'url': url});
+  Future navigate(String url) =>
+      sendCommand('Page.navigate', params: {'url': url});
 
   Future reload({bool ignoreCache, String scriptToEvaluateOnLoad}) {
     var params = {};
@@ -22,6 +25,6 @@
       params['scriptToEvaluateOnLoad'] = scriptToEvaluateOnLoad;
     }
 
-    return _sendCommand('Page.navigate', params);
+    return sendCommand('Page.reload', params: params);
   }
 }
diff --git a/lib/src/runtime.dart b/lib/src/runtime.dart
new file mode 100644
index 0000000..c14f7c5
--- /dev/null
+++ b/lib/src/runtime.dart
@@ -0,0 +1,153 @@
+// Copyright 2015 Google. All rights reserved. Use of this source code is
+// governed by a BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:math';
+
+import '../webkit_inspection_protocol.dart';
+
+class WipRuntime extends WipDomain {
+  WipRuntime(WipConnection connection) : super(connection);
+
+  Future enable() => sendCommand('Runtime.enable');
+  Future disable() => sendCommand('Runtime.disable');
+
+  Stream<ConsoleAPIEvent> get onConsoleAPICalled => eventStream(
+      'Runtime.consoleAPICalled',
+      (WipEvent event) => new ConsoleAPIEvent(event));
+
+  Stream<ExceptionThrownEvent> get onExceptionThrown => eventStream(
+      'Runtime.exceptionThrown',
+      (WipEvent event) => new ExceptionThrownEvent(event));
+}
+
+class ConsoleAPIEvent extends WrappedWipEvent {
+  ConsoleAPIEvent(WipEvent event) : super(event);
+
+  /// Type of the call. Allowed values: log, debug, info, error, warning, dir,
+  /// dirxml, table, trace, clear, startGroup, startGroupCollapsed, endGroup,
+  /// assert, profile, profileEnd.
+  String get type => params['type'];
+
+  /// Call arguments.
+  List<RemoteObject> get args =>
+      (params['args'] as List).map((m) => new RemoteObject(m)).toList();
+
+  // TODO: stackTrace, StackTrace, Stack trace captured when the call was made.
+}
+
+class ExceptionThrownEvent extends WrappedWipEvent {
+  ExceptionThrownEvent(WipEvent event) : super(event);
+
+  /// Timestamp of the exception.
+  int get timestamp => params['timestamp'];
+
+  ExceptionDetails get exceptionDetails =>
+      new ExceptionDetails(params['exceptionDetails']);
+}
+
+class ExceptionDetails {
+  final Map<String, dynamic> _map;
+
+  ExceptionDetails(this._map);
+
+  /// Exception id.
+  int get exceptionId => _map['exceptionId'];
+
+  /// Exception text, which should be used together with exception object when
+  /// available.
+  String get text => _map['text'];
+
+  /// Line number of the exception location (0-based).
+  int get lineNumber => _map['lineNumber'];
+
+  /// Column number of the exception location (0-based).
+  int get columnNumber => _map['columnNumber'];
+
+  /// URL of the exception location, to be used when the script was not
+  /// reported.
+  @optional
+  String get url => _map['url'];
+
+  /// Script ID of the exception location.
+  @optional
+  String get scriptId => _map['scriptId'];
+
+  /// JavaScript stack trace if available.
+  @optional
+  StackTrace get stackTrace =>
+      _map['stackTrace'] == null ? null : new StackTrace(_map['stackTrace']);
+
+  /// Exception object if available.
+  @optional
+  RemoteObject get exception =>
+      _map['exception'] == null ? null : new RemoteObject(_map['exception']);
+
+  String toString() => text;
+}
+
+class StackTrace {
+  final Map<String, dynamic> _map;
+
+  StackTrace(this._map);
+
+  /// String label of this stack trace. For async traces this may be a name of
+  /// the function that initiated the async call.
+  @optional
+  String get description => _map['description'];
+
+  List<CallFrame> get callFrames =>
+      (_map['callFrames'] as List).map((m) => new CallFrame(m)).toList();
+
+  // TODO: parent, StackTrace, Asynchronous JavaScript stack trace that preceded
+  // this stack, if available.
+
+  List<String> printFrames() {
+    List<CallFrame> frames = callFrames;
+
+    int width = frames.fold(0, (int val, CallFrame frame) {
+      return max(val, frame.functionName.length);
+    });
+
+    return frames.map((CallFrame frame) {
+      return '${frame.functionName}()'.padRight(width + 2) +
+          ' ${frame.url} ${frame.lineNumber}:${frame.columnNumber}';
+    }).toList();
+  }
+
+  String toString() => callFrames.map((f) => '  $f').join('\n');
+}
+
+class CallFrame {
+  final Map<String, dynamic> _map;
+
+  CallFrame(this._map);
+
+  /// JavaScript function name.
+  String get functionName => _map['functionName'];
+
+  /// JavaScript script id.
+  String get scriptId => _map['scriptId'];
+
+  /// JavaScript script name or url.
+  String get url => _map['url'];
+
+  /// JavaScript script line number (0-based).
+  int get lineNumber => _map['lineNumber'];
+
+  /// JavaScript script column number (0-based).
+  int get columnNumber => _map['columnNumber'];
+
+  String toString() => '$functionName() ($url $lineNumber:$columnNumber)';
+}
+
+class RemoteObject {
+  final Map<String, dynamic> _map;
+
+  RemoteObject(this._map);
+
+  String get type => _map['type'];
+  String get value => _map['value'];
+
+  String toString() => '$type $value';
+}
diff --git a/lib/webkit_inspection_protocol.dart b/lib/webkit_inspection_protocol.dart
index 46ff1d9..1596c1b 100644
--- a/lib/webkit_inspection_protocol.dart
+++ b/lib/webkit_inspection_protocol.dart
@@ -6,25 +6,25 @@
  */
 library wip;
 
-import 'dart:async'
-    show
-        Completer,
-        EventSink,
-        Future,
-        Stream,
-        StreamController,
-        StreamTransformer;
-import 'dart:collection' show UnmodifiableListView, UnmodifiableMapView;
-import 'dart:convert' show JSON, UTF8;
+import 'dart:async';
+import 'dart:convert';
 import 'dart:io' show HttpClient, HttpClientResponse, WebSocket;
 
 import 'package:logging/logging.dart' show Logger;
-import 'package:logging/logging.dart';
 
-part 'src/console.dart';
-part 'src/debugger.dart';
-part 'src/dom.dart';
-part 'src/page.dart';
+import 'src/console.dart';
+import 'src/debugger.dart';
+import 'src/dom.dart';
+import 'src/log.dart';
+import 'src/page.dart';
+import 'src/runtime.dart';
+
+export 'src/console.dart';
+export 'src/debugger.dart';
+export 'src/dom.dart';
+export 'src/log.dart';
+export 'src/page.dart';
+export 'src/runtime.dart';
 
 /**
  * A class to connect to a Chrome instance and reflect on its available tabs.
@@ -119,7 +119,7 @@
  * A Webkit Inspection Protocol (WIP) connection.
  */
 class WipConnection {
-  static final _log = new Logger('WipConnection');
+  static final _logger = new Logger('WipConnection');
 
   /**
    * The WebSocket URL.
@@ -130,19 +130,31 @@
 
   int _nextId = 0;
 
-  var _console;
+  WipConsole _console; // ignore: deprecated_member_use
+  @Deprecated('This domain is deprecated - use Runtime or Log instead')
   WipConsole get console => _console;
-  var _debugger;
+
+  WipDebugger _debugger;
   WipDebugger get debugger => _debugger;
-  var _dom;
+
+  WipDom _dom;
   WipDom get dom => _dom;
-  var _page;
+
+  WipPage _page;
   WipPage get page => _page;
 
-  final _completers = <int, Completer<WipResponse>>{};
+  WipLog _log;
+  WipLog get log => _log;
 
-  final _closeController = new StreamController<WipConnection>.broadcast();
-  final _notificationController = new StreamController<WipEvent>.broadcast();
+  WipRuntime _runtime;
+  WipRuntime get runtime => _runtime;
+
+  final Map _completers = <int, Completer<WipResponse>>{};
+
+  final StreamController _closeController =
+      new StreamController<WipConnection>.broadcast();
+  final StreamController _notificationController =
+      new StreamController<WipEvent>.broadcast();
 
   static Future<WipConnection> connect(String url) {
     return WebSocket.connect(url).then((socket) {
@@ -151,10 +163,12 @@
   }
 
   WipConnection._(this.url, this._ws) {
-    _console = new WipConsole(this);
+    _console = new WipConsole(this); // ignore: deprecated_member_use
     _debugger = new WipDebugger(this);
     _dom = new WipDom(this);
     _page = new WipPage(this);
+    _log = new WipLog(this);
+    _runtime = new WipRuntime(this);
 
     _ws.listen((data) {
       var json = JSON.decode(data);
@@ -176,7 +190,7 @@
 
   Future<WipResponse> sendCommand(String method,
       [Map<String, dynamic> params]) {
-    _log.finest('Sending command: $method($params)');
+    _logger.finest('Sending command: $method($params)');
     var completer = new Completer<WipResponse>();
     var json = {'id': _nextId++, 'method': method};
     if (params != null) {
@@ -188,7 +202,7 @@
   }
 
   void _handleNotification(Map<String, dynamic> json) {
-    _log.finest('Received notification: $json');
+    _logger.finest('Received notification: $json');
     _notificationController.add(new WipEvent(json));
   }
 
@@ -196,10 +210,10 @@
     var completer = _completers.remove(event['id']);
 
     if (event.containsKey('error')) {
-      _log.info('Received error: $event');
+      _logger.info('Received error: $event');
       completer.completeError(new WipError(event));
     } else {
-      _log.finest('Received response: $event');
+      _logger.finest('Received response: $event');
       completer.complete(new WipResponse(event));
     }
   }
@@ -246,9 +260,10 @@
 
 typedef WipEvent WipEventTransformer(WipEvent event);
 
-abstract class WipDomain {
-  static final _log = new Logger('WipDomain');
+/// @optional
+const String optional = 'optional';
 
+abstract class WipDomain {
   Map<String, Stream> _eventStreams = {};
 
   final WipConnection connection;
@@ -262,27 +277,31 @@
     }).bind(connection.onClose);
   }
 
-  Stream<WipEvent> _eventStream(
-          String method, WipEventTransformer transformer) =>
-      _eventStreams.putIfAbsent(
-          method,
-          () => new StreamTransformer.fromHandlers(
-                  handleData: (WipEvent event, EventSink<WipEvent> sink) {
-                if (event.method == method) {
-                  _log.finest('Transforming $event to $method');
-                  sink.add(transformer(event));
-                }
-              }).bind(connection.onNotification));
+  Stream<WipEvent> eventStream(String method, WipEventTransformer transformer) {
+    return _eventStreams.putIfAbsent(
+      method,
+      () => new StreamTransformer.fromHandlers(
+            handleData: (WipEvent event, EventSink<WipEvent> sink) {
+              if (event.method == method) {
+                sink.add(transformer(event));
+              }
+            },
+          ).bind(connection.onNotification),
+    );
+  }
 
-  Future<WipResponse> _sendCommand(String method,
-          [Map<String, dynamic> params]) =>
-      connection.sendCommand(method, params);
+  Future<WipResponse> sendCommand(
+    String method, {
+    Map<String, dynamic> params,
+  }) {
+    return connection.sendCommand(method, params);
+  }
 }
 
-class _WrappedWipEvent implements WipEvent {
+class WrappedWipEvent implements WipEvent {
   final WipEvent _wrapped;
 
-  _WrappedWipEvent(this._wrapped);
+  WrappedWipEvent(this._wrapped);
 
   @override
   String get method => _wrapped.method;
diff --git a/pubspec.yaml b/pubspec.yaml
index 725aacc..651f690 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: webkit_inspection_protocol
-version: 0.2.2
+version: 0.3.0
 description: A client for the Webkit Inspection Protocol (WIP).
 
 homepage: https://github.com/google/webkit_inspection_protocol.dart
diff --git a/test/console_test.dart b/test/console_test.dart
index 866c4fc..139e06b 100644
--- a/test/console_test.dart
+++ b/test/console_test.dart
@@ -13,7 +13,7 @@
 
 main() {
   group('WipConsole', () {
-    WipConsole console;
+    WipConsole console; // ignore: deprecated_member_use
     List<ConsoleMessageEvent> events = [];
     var subs = [];
 
@@ -32,6 +32,7 @@
     }
 
     setUp(() async {
+      // ignore: deprecated_member_use
       console = (await wipConnection).console;
       await console.clearMessages();
       events.clear();
