diff --git a/weinre.web/client/InspectorBackendStub.js b/weinre.web/client/InspectorBackendStub.js
index 56c912d..8b6532a 100644
--- a/weinre.web/client/InspectorBackendStub.js
+++ b/weinre.web/client/InspectorBackendStub.js
@@ -5,7 +5,6 @@
  * Copyright (c) 2010, 2011 IBM Corporation
  */
 
-
 (function() {
     var InspectorBackendImpl = require("weinre/client/InspectorBackendImpl")
     window.InspectorBackend = new InspectorBackendImpl()
diff --git a/weinre.web/demo/weinre-demo-min.html b/weinre.web/demo/weinre-demo-min.html
index 74db41a..f25c759 100644
--- a/weinre.web/demo/weinre-demo-min.html
+++ b/weinre.web/demo/weinre-demo-min.html
@@ -32,6 +32,7 @@
 <h1 class="blue">this is a blue h1 element</h1>
 <h1 style="color:red">this is a red h1 element</h1>
 <p>Some text, <i>some italic text</i>, and <b>some bold text</b>.
+
 <div id="metrics">a div</div>
 </body>
 
diff --git a/weinre.web/demo/weinre-demo-pieces.html b/weinre.web/demo/weinre-demo-pieces.html
index 28af1fd..3b75e09 100644
--- a/weinre.web/demo/weinre-demo-pieces.html
+++ b/weinre.web/demo/weinre-demo-pieces.html
@@ -72,6 +72,7 @@
 <h1 class="blue">this is a blue h1 element</h1>
 <h1 style="color:red">this is a red h1 element</h1>
 <p>Some text, <i>some italic text</i>, and <b>some bold text</b>.
+
 <div id="metrics">a div</div>
 </body>
 
diff --git a/weinre.web/interfaces/interfaces.js b/weinre.web/interfaces/interfaces.js
index 069d4bf..206a562 100644
--- a/weinre.web/interfaces/interfaces.js
+++ b/weinre.web/interfaces/interfaces.js
@@ -32,8 +32,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function onLoad() {
     e_interfaceList  = document.getElementById("interface-list")
     e_interfaceName  = document.getElementById("interface-name")
@@ -47,8 +45,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function setUpShowCheckBoxes() {
     setUpShowCheckBox(e_showIdl,        "show-Idl")
     setUpShowCheckBox(e_showJavaScript, "show-JavaScript")
@@ -56,8 +52,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function setUpShowCheckBox(element, key) {
     var value = localStorage.getItem(key)
     if (null == value) 
@@ -72,8 +66,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function el_showCheckBoxClicked(event) {
     var element = event.target
     
@@ -83,8 +75,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function reapplyDisplayStyles() {
     reapplyDisplayStyle(".show-Idl",        e_showIdl.checked)
     reapplyDisplayStyle(".show-JavaScript", e_showJavaScript.checked)
@@ -92,8 +82,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function reapplyDisplayStyle(className, value) {
     value = value ? "block" : "none"
     ;[].slice.call(document.querySelectorAll(className)).forEach(function(element) {
@@ -102,8 +90,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function populateInterfacesList(intfs) {
     e_interfaceList.innerHTML = ""
         
@@ -133,8 +119,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function el_interfaceClicked(event) {
     event.preventDefault()
 
@@ -142,8 +126,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function showInterface(interfaceName) {
     var intf = Interfaces[interfaceName]
     
@@ -163,8 +145,6 @@
 window.showInterface = showInterface
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function showInterfaceIdl(intf, html) {
     html.push("<div class='show-Idl'><h3>IDL</h3><pre>")
     html.push("interface {")
@@ -184,8 +164,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function showInterfaceIdlMethod(method, html) {
     var line = "\n   "
     
@@ -197,8 +175,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getIdlParameterList(parameters) {
     var result = []
     
@@ -218,8 +194,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getIdlType(type) {
     var result
     
@@ -239,8 +213,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 IDL2Java = {
     string: "String",
     any:    "Object",
@@ -250,8 +222,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getJavaType(type) {
     var result
     
@@ -276,8 +246,6 @@
 
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function showInterfaceIdlAttribute(attribute, html) {
     var line = "<tr><td>" + Indent + "attribute "
         
@@ -288,8 +256,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function showInterfaceJavaScript(intf, html) {
     html.push("<div class='show-JavaScript'><h3>JavaScript</h3><pre>")
     
@@ -307,8 +273,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function showInterfaceJavaScriptMethod(intf, method, html) {
     var line = ""
         
@@ -321,8 +285,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getJavaScriptParameterList(parameters, returnType) {
     var result = []
     
@@ -342,8 +304,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getJavaScriptParameterListSimple(parameters, returnType) {
     var result = []
     
@@ -357,8 +317,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getJavaScriptCallbackParameterListSimple(parameters) {
     var result = []
     
@@ -371,8 +329,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function showInterfaceJava(intf, html) {
     html.push("<div class='show-Java'><h3>Java</h3><pre>")
 
@@ -384,8 +340,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function showInterfaceJavaMethod(intf, method, html) {
     var line = ""
         
@@ -402,8 +356,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getJavaParameterList(parameters, returnType) {
     var result = []
     
@@ -423,8 +375,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getJavaParameterListSimple(parameters, returnType) {
     var result = []
 
@@ -440,8 +390,6 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getJavaCallbackParameterListSimple(parameters) {
     var result = []
     
@@ -458,27 +406,19 @@
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function toArray(arrayLike) {
     return [].slice.call(arrayLike)
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 ExBreak = new Error("breaks out of loops")
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function exBreak() {
     throw ExBreak
 }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function allowExBreak(func) {
     try {
         func.call()
diff --git a/weinre.web/modules/weinre/client/Client.scoop b/weinre.web/modules/weinre/client/Client.scoop
index 4d69f6a..d6a388f 100644
--- a/weinre.web/modules/weinre/client/Client.scoop
+++ b/weinre.web/modules/weinre/client/Client.scoop
@@ -18,22 +18,16 @@
 require ./RemotePanel
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class Client
     this.initialize()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static
     var AutoConnect = true
     
     Weinre.showNotImplemented()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method autoConnect(value)
     if (arguments.length >= 1) {
         AutoConnect = !!value
@@ -46,8 +40,6 @@
     return AutoConnect
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method autoConnect(value)
     if (arguments.length >= 1) {
         return Client.autoConnect(value)
@@ -57,8 +49,6 @@
     }
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method initialize
 
     // validate InspectorFrontendHost against IDL
@@ -81,14 +71,10 @@
     webSocket.registerInterface("WebInspector", WebInspector, false)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method uiAvailable
     return WebInspector.panels && WebInspector.panels.remote
     
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method _installRemotePanelEventually
     var self = this
     
@@ -106,8 +92,6 @@
 
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method _installRemotePanel
 
     WebInspector.panels.remote = new RemotePanel();
@@ -131,8 +115,6 @@
     if (button) button.style.display = "none"
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method onLoaded
 
     this._installRemotePanel()
@@ -147,8 +129,6 @@
     Weinre.WeinreClientCommands.registerClient(Binding(this, this.cb_registerClient))
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method cb_registerClient(clientId)
     Weinre.clientId = clientId
     Weinre.connectorId = clientId
@@ -162,8 +142,6 @@
     Weinre.webSocket.getWebSocket().addEventListener("close", Binding(this, this.cb_webSocketClosed))
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method cb_webSocketClosed
     
     // use a delay, otherwise reloading will cause this stuff to flash
@@ -174,7 +152,5 @@
     }, 1000)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method main
     Weinre.client = new Client()
diff --git a/weinre.web/modules/weinre/client/ConnectorList.scoop b/weinre.web/modules/weinre/client/ConnectorList.scoop
index 37ebd65..1f6dddd 100644
--- a/weinre.web/modules/weinre/client/ConnectorList.scoop
+++ b/weinre.web/modules/weinre/client/ConnectorList.scoop
@@ -9,8 +9,6 @@
 require ./DOMTemplates as dt
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 class ConnectorList(title)
     this.connectors   = {}
     this.noneItem     = dt.LI("none")
@@ -20,14 +18,10 @@
     this.noneItem.addStyleClass("weinre-connector-item")
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getElement
     return this.div
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method add(connector)
     if (this.connectors[connector.id]) return
     
@@ -50,8 +44,6 @@
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getNewestConnectorId(ignoring)
     var newest = 0
     
@@ -64,8 +56,6 @@
     return newest
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getConnectorInsertionPoint(connector)
     for (var i=0; i<this.ulConnectors.childNodes.length; i++) {
         var childNode = this.ulConnectors.childNodes[i]
@@ -78,8 +68,6 @@
     return null
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method remove(id, fast)
     var self = this
     var element = this.getConnectorElement(id)
@@ -106,8 +94,6 @@
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _remove(element)
     this.ulConnectors.removeChild(element)
     if (this.getConnectors().length == 0) {
@@ -115,16 +101,12 @@
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method removeAll()
     this.getConnectors().forEach(function(connector) {
         this.remove(connector.id, true)
     }, this)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getConnectors()
     var result = []
     for (var id in this.connectors) {
@@ -136,8 +118,6 @@
     return result
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getConnectorElement(id)
     var connector = this.connectors[id]
     if (!connector) return null
@@ -145,8 +125,6 @@
     return connector.element
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method setCurrent(id)
     this.getConnectors().forEach(function(connector) {
         connector.element.removeStyleClass("current")
@@ -158,8 +136,6 @@
     element.addStyleClass("current")
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method setState(id, state)
     if (typeof id == "string") {
         var element = this.getConnectorElement(id)
diff --git a/weinre.web/modules/weinre/client/DOMTemplates.scoop b/weinre.web/modules/weinre/client/DOMTemplates.scoop
index 42c6acb..937e548 100644
--- a/weinre.web/modules/weinre/client/DOMTemplates.scoop
+++ b/weinre.web/modules/weinre/client/DOMTemplates.scoop
@@ -22,8 +22,6 @@
 require ../common/Ex
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 class DOMTemplates
 
 static 
@@ -31,8 +29,6 @@
     ElementNames = ElementNames.split(" ")
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getElementFunction(elementName)
     return function() {
         var element = document.createElement(elementName)
@@ -49,20 +45,14 @@
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function addToElement_String(element, aString)
     addToElement_Node(element, document.createTextNode(aString))
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function addToElement_Node(element, anElement)
     element.appendChild(anElement)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function addToElement_Object(element, anObject)
     for (var key in anObject) {
         if (!anObject.hasOwnProperty(key)) continue
@@ -79,8 +69,6 @@
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static 
     ElementNames.forEach(function(elementName) {
         DOMTemplates[elementName] = getElementFunction(elementName)
diff --git a/weinre.web/modules/weinre/client/InspectorFrontendHostImpl.scoop b/weinre.web/modules/weinre/client/InspectorFrontendHostImpl.scoop
index e490b4a..6552093 100644
--- a/weinre.web/modules/weinre/client/InspectorFrontendHostImpl.scoop
+++ b/weinre.web/modules/weinre/client/InspectorFrontendHostImpl.scoop
@@ -10,112 +10,76 @@
 require ../common/IDLTools
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class InspectorFrontendHostImpl
         
     this._getPlatformAndPort()
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method loaded
     // WebInspector.Settings.initialize()
     
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method closeWindow
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method disconnectFromBackend
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method bringToFront
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method inspectedURLChanged(newURL)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method requestAttachWindow
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method requestDetachWindow
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method setAttachedWindowHeight(height)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method moveWindowBy(x, y)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method setExtensionAPI(script)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method localizedStringsURL
     return "nls/English.lproj/localizedStrings.js";
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method hiddenPanels
     return "audits,profiles,resources,timeline,network"
 //    return "audits,profiles,resources,scripts,timeline,network"
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method copyText(text)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method platform
     return "weinre"
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method port
     return "weinre"
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method showContextMenu(event, items)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method sendMessageToBackend(message)
     var object = JSON.parse(message)
     if (object[0] == "setInjectedScriptSource") {
@@ -124,8 +88,6 @@
     console.log(arguments.callee.signature + "(" + JSON.stringify(object,null,4) + ")")
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method _getPlatformAndPort
     this._platform       = "weinre"
     this._platformFlavor = "weinre"
diff --git a/weinre.web/modules/weinre/client/RemotePanel.scoop b/weinre.web/modules/weinre/client/RemotePanel.scoop
index db89c43..1cd0d22 100644
--- a/weinre.web/modules/weinre/client/RemotePanel.scoop
+++ b/weinre.web/modules/weinre/client/RemotePanel.scoop
@@ -13,16 +13,12 @@
 require ./DOMTemplates as dt
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class RemotePanel < WebInspector.Panel
     super("remote")
 
     this.initialize()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method autoConnect(value)
     if (arguments.length >= 1) {
         this._autoConnect = !!value
@@ -31,8 +27,6 @@
     return this._autoConnect
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method initialize()
     this.autoConnect(false)
     
@@ -73,8 +67,6 @@
     this.reset();
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method addClient(client) 
     this.clientList.add(client)
     
@@ -100,20 +92,14 @@
     this.targetList.setState(id, state)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method getNewestTargetId(ignoring)
     return this.targetList.getNewestConnectorId(ignoring)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method afterInitialConnection
     this.clientList.afterInitialConnection()
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method reset
     this.clientList.removeAll()
     this.targetList.removeAll()
@@ -122,15 +108,11 @@
     Weinre.WeinreClientCommands.getClients(Binding(this, "cb_getClients"))
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method connectionClosed
     this.clientList.removeAll()
     this.targetList.removeAll()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method cb_getTargets(targets)
     targets.forEach(function(target) {
         this.addTarget(target)
@@ -145,52 +127,36 @@
     
     
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method cb_getClients(clients)
     clients.forEach(function(client) {
         this.addClient(client)
     }, this)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 getter toolbarItemClass
     return "remote"
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 getter toolbarItemLabel
     return "Remote"
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 getter statusBarItems
     return []
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 getter defaultFocusedElement
     return this.contentElement
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method show
     super()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method hide()
     super()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method setServerProperties(properties)
     var table = "<table>"
     var keys = []
@@ -220,14 +186,10 @@
 //=============================================================================
     
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 class TargetList < ConnectorList
     super("Targets")
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getListItem(target)
     var self = this
     var text = target.hostName + " [id: " + target.id + "]" + " - " + target.url 
@@ -247,8 +209,6 @@
     return item
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method connectToTarget(targetId, event)
     if (event) {
         event.preventDefault()
@@ -267,23 +227,17 @@
 //=============================================================================
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 class ClientList < ConnectorList
     super("Clients")
 
     this.noneItem.innerHTML = "Waiting for connection..."
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method afterInitialConnection()
     this.noneItem.innerHTML = "Connection lost, reload this page to reconnect."
     this.noneItem.addStyleClass("error")
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getListItem(client)
     var text = client.hostName + " [id: " + client.id + "]"
     
diff --git a/weinre.web/modules/weinre/client/WeinreClientEventsImpl.scoop b/weinre.web/modules/weinre/client/WeinreClientEventsImpl.scoop
index 9b59e0c..73df852 100644
--- a/weinre.web/modules/weinre/client/WeinreClientEventsImpl.scoop
+++ b/weinre.web/modules/weinre/client/WeinreClientEventsImpl.scoop
@@ -10,22 +10,16 @@
 require ../common/Weinre
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class WeinreClientEventsImpl(client)
     this.client = client
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method clientRegistered(clientDescription)
     if (this.client.uiAvailable()) {
         WebInspector.panels.remote.addClient(clientDescription)
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method targetRegistered(targetDescription)
     if (this.client.uiAvailable()) {
         WebInspector.panels.remote.addTarget(targetDescription)
@@ -36,24 +30,18 @@
     Weinre.WeinreClientCommands.connectTarget(Weinre.clientId, targetDescription.id)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method clientUnregistered(/*int*/ clientId)
     if (this.client.uiAvailable()) {
         WebInspector.panels.remote.removeClient(clientId)
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method targetUnregistered(/*int*/ targetId)
     if (this.client.uiAvailable()) {
         WebInspector.panels.remote.removeTarget(targetId)
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method connectionCreated(/*int*/ clientId, /*int*/ targetId)
     if (this.client.uiAvailable()) {
         WebInspector.panels.remote.setClientState(clientId, "connected") 
@@ -65,8 +53,6 @@
     Weinre.targetId = targetId
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method connectionDestroyed(/*int*/ clientId, /*int*/ targetId)
     if (this.client.uiAvailable()) {
         WebInspector.panels.remote.setClientState(clientId, "not-connected") 
@@ -87,14 +73,10 @@
     console.log("autoconnecting to " + nextTargetId)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method sendCallback(/*int*/ callbackId, /*any*/ result)
     Callback.invoke(callbackId, result)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method serverProperties(/*any*/ properties)
     if (this.client.uiAvailable()) {
         WebInspector.panels.remote.setServerProperties(properties)
diff --git a/weinre.web/modules/weinre/common/Binding.scoop b/weinre.web/modules/weinre/common/Binding.scoop
index 57d1c7c..cc46b97 100644
--- a/weinre.web/modules/weinre/common/Binding.scoop
+++ b/weinre.web/modules/weinre/common/Binding.scoop
@@ -9,8 +9,6 @@
 require ./Ex
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 class Binding(receiver, method)
 
     if (receiver == null) throw new Ex(arguments, "receiver argument for Binding constructor was null")
diff --git a/weinre.web/modules/weinre/common/Callback.scoop b/weinre.web/modules/weinre/common/Callback.scoop
index 29a587a..ed0756a 100644
--- a/weinre.web/modules/weinre/common/Callback.scoop
+++ b/weinre.web/modules/weinre/common/Callback.scoop
@@ -9,28 +9,20 @@
 require ./Ex
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 class Callback
     throw new Ex(arguments, "this class is not intended to be instantiated")
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static 
     var CallbackTable = {}
     var CallbackIndex = 1
     var ConnectorId   = "???"
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method setConnectorId(connectorId)
     ConnectorId = connectorId
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method register(callback)
     if (typeof callback == "function") callback = [null, callback]
     if (typeof callback.slice != "function") throw new Ex(arguments, "callback must be an array or function")
@@ -52,14 +44,10 @@
     return index
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method deregister(index)
     delete CallbackTable[index]
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method invoke(index, args)
     var callback = CallbackTable[index]
     if (!callback) throw new Ex(arguments, "callback " + index + " not registered or already invoked")
diff --git a/weinre.web/modules/weinre/common/EventListeners.scoop b/weinre.web/modules/weinre/common/EventListeners.scoop
index f2702e6..d40bafe 100644
--- a/weinre.web/modules/weinre/common/EventListeners.scoop
+++ b/weinre.web/modules/weinre/common/EventListeners.scoop
@@ -9,20 +9,14 @@
 require ./Ex
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 class EventListeners
     this._listeners = []
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method add(listener, useCapture)
     this._listeners.push([listener, useCapture])
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method remove(listener, useCapture)
     for (var i=0; i<this._listeners.length; i++) {
         var listener = this._listeners[i]
@@ -34,8 +28,6 @@
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method fire(event)
     this._listeners.slice().forEach(function(listener) {
         var listener = listener[0]
diff --git a/weinre.web/modules/weinre/common/Ex.scoop b/weinre.web/modules/weinre/common/Ex.scoop
index 4f4a331..f392b2c 100644
--- a/weinre.web/modules/weinre/common/Ex.scoop
+++ b/weinre.web/modules/weinre/common/Ex.scoop
@@ -9,8 +9,6 @@
 require ./StackTrace
 
 //-----------------------------------------------------------------------------
-// returns a new Error object after dumping a stack trace
-//-----------------------------------------------------------------------------
 class Ex(args, message)
     if (!args || !args.callee) {
         throw Ex(arguments, "first parameter must be an Arguments object") 
diff --git a/weinre.web/modules/weinre/common/IDLTools.scoop b/weinre.web/modules/weinre/common/IDLTools.scoop
index d4a9fc6..b86d6b6 100644
--- a/weinre.web/modules/weinre/common/IDLTools.scoop
+++ b/weinre.web/modules/weinre/common/IDLTools.scoop
@@ -10,21 +10,15 @@
 require ./Callback
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 class IDLTools
     throw new Ex(arguments, "this class is not intended to be instantiated")
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static
     var IDLs = {}
     IDLTools._idls = IDLs
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method addIDLs(idls)
     idls.forEach(function(idl){
         idl.interfaces.forEach(function(intf){
@@ -34,14 +28,10 @@
     })
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method getIDL(name)
     return IDLs[name]
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method getIDLsMatching(regex)
     var results = []
     
@@ -54,8 +44,6 @@
     return results
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method validateAgainstIDL(klass, interfaceName)
     var intf = IDLTools.getIDL(interfaceName)
     var messagePrefix = "IDL validation for " + interfaceName + ": "
@@ -100,8 +88,6 @@
     })
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method buildProxyForIDL(proxyObject, interfaceName)
     var intf = IDLTools.getIDL(interfaceName)
     var messagePrefix = "building proxy for IDL " + interfaceName + ": "
@@ -112,8 +98,6 @@
     })
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function getProxyMethod(intf, method)
     var result = function proxyMethod() {
         var callbackId = null
diff --git a/weinre.web/modules/weinre/common/StackTrace.scoop b/weinre.web/modules/weinre/common/StackTrace.scoop
index b6ad618..a46b602 100644
--- a/weinre.web/modules/weinre/common/StackTrace.scoop
+++ b/weinre.web/modules/weinre/common/StackTrace.scoop
@@ -7,8 +7,6 @@
  */
 
 //-----------------------------------------------------------------------------
-// return a stack trace - an array of lines, one per stack frame
-//-----------------------------------------------------------------------------
 class StackTrace(args)
     if (!args || !args.callee) {
         throw Error("first parameter to " + arguments.callee.signature + " must be an Arguments object") 
diff --git a/weinre.web/modules/weinre/common/WebSocketXhr.scoop b/weinre.web/modules/weinre/common/WebSocketXhr.scoop
index 1744838..f717a34 100644
--- a/weinre.web/modules/weinre/common/WebSocketXhr.scoop
+++ b/weinre.web/modules/weinre/common/WebSocketXhr.scoop
@@ -11,14 +11,10 @@
 require ./EventListeners
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 class WebSocketXhr(url)
     this.initialize(url)
     
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static
     WebSocketXhr.CONNECTING = 0
     WebSocketXhr.OPEN       = 1
@@ -26,8 +22,6 @@
     WebSocketXhr.CLOSED     = 3
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method initialize(url)
     this.readyState      = WebSocketXhr.CONNECTING 
     this._url            = url
@@ -45,14 +39,10 @@
     this._getChannel()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _getChannel
     this._xhr(this._url, "POST", "", this._handleXhrResponseGetChannel)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _handleXhrResponseGetChannel(xhr)
     if (xhr.status != 200) return this._handleXhrResponseError(xhr)
 
@@ -84,8 +74,6 @@
     this._readLoop()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _readLoop
     if (this.readyState == WebSocketXhr.CLOSED) return
     if (this.readyState == WebSocketXhr.CLOSING) return
@@ -93,8 +81,6 @@
     this._xhr(this._urlChannel, "GET", "", this._handleXhrResponseGet)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _handleXhrResponseGet(xhr)
     var self = this
     
@@ -119,8 +105,6 @@
     })
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method send(data)
     if (typeof data != "string") throw new Ex(arguments, this.constructor.name + "." + this.caller)
 
@@ -130,8 +114,6 @@
     this._sendQueued();
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _sendQueued
     if (this._queuedSends.length == 0) return
     if (this.readyState == WebSocketXhr.CLOSED) return
@@ -145,8 +127,6 @@
     this._xhr(this._urlChannel, "POST", datum, this._handleXhrResponseSend)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _handleXhrResponseSend(xhr)
     var httpSocket = this
     
@@ -156,8 +136,6 @@
     window.setTimeout(function() {httpSocket._sendQueued()}, 0)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method close
     this._sendInProgress = true
     this.readyState = WebSocketXhr.CLOSING
@@ -168,20 +146,14 @@
     this.readyState = WebSocketXhr.CLOSED
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method addEventListener(type, listener, useCapture)
     this._getListeners(type).add(listener, useCapture)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method removeEventListener(type, listener, useCapture)
     this._getListeners(type).remove(listener, useCapture)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _fireEventListeners(type, event)
     if (this.readyState == WebSocketXhr.CLOSED) return
     
@@ -189,8 +161,6 @@
     this._getListeners(type).fire(event)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _getListeners(type)
     var listeners = this._listeners[type]
     if (null == listeners) throw new Ex(arguments, "invalid event listener type: '" + type + "'")
@@ -198,8 +168,6 @@
     return listeners
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _handleXhrResponseError(xhr)
     if (xhr.status == 404) {
         this.close()
@@ -215,8 +183,6 @@
     console.log("error from XHR invocation: " + xhr.status + ": " + xhr.statusText)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _xhr(url, method, data, handler)
     if (null == handler) throw new Ex(arguments, "handler must not be null")
     
@@ -231,8 +197,6 @@
     xhr.send(data)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 function _xhrEventHandler(event)
     var xhr = event.target
     if (xhr.readyState != 4) return
diff --git a/weinre.web/modules/weinre/target/CSSStore.scoop b/weinre.web/modules/weinre/target/CSSStore.scoop
index 48d0f51..a3c4478 100644
--- a/weinre.web/modules/weinre/target/CSSStore.scoop
+++ b/weinre.web/modules/weinre/target/CSSStore.scoop
@@ -7,33 +7,23 @@
  */
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class CSSStore
     this.__styleMap    = {}
     this.__nextId      = 0
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 static
     var Properties = []
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method addCSSProperties(properties)
     Properties = properties
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getStyle(styleId)
     return this.__styleMap[styleId]
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getStyleId(style)
     if (style.__weinre_id) { 
         return style.__weinre_id
@@ -45,8 +35,6 @@
     return style.__weinre_id
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getInlineStyle(node)
     var styleObject = this.buildObjectForStyle(node.style, true)
     for (var i=0; i<styleObject.cssProperties.length; i++) {
@@ -55,8 +43,6 @@
     return styleObject
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getComputedStyle(node)
     if (!node) return {}
     if (node.nodeType != Node.ELEMENT_NODE) return {}
@@ -65,8 +51,6 @@
     return styleObject
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getMatchedCSSRules(node)
     var result = []
     
@@ -92,24 +76,18 @@
     return result
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getStyleAttributes(node)
     var result = {}
     
     return result
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getPseudoElements(node)
     var result = []
     
     return result
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method buildObjectForStyle(style, bind)
     var result = {
         width:         null,
@@ -143,8 +121,6 @@
     return result
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method populateObjectWithStyleProperties(style, result)
     var properties = []
     var shorthandValues = {}
@@ -171,8 +147,6 @@
     result.shorthandValues = shorthandValues
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method _nextId
     return "" + (++this.__nextId)
     
@@ -190,7 +164,6 @@
 function fallbackMatchesSelector(element, selector)
     return false
     
-    
 //-----------------------------------------------------------------------------
 static
     var elementMatchesSelector
diff --git a/weinre.web/modules/weinre/target/Console.scoop b/weinre.web/modules/weinre/target/Console.scoop
index de75962..940b695 100644
--- a/weinre.web/modules/weinre/target/Console.scoop
+++ b/weinre.web/modules/weinre/target/Console.scoop
@@ -9,13 +9,9 @@
 require ../common/Weinre
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class Console
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 static
     var UsingRemote = false
     
@@ -54,9 +50,6 @@
         Debug: 4
     }
 
-
-//-----------------------------------------------------------------------------
-// 
 //-----------------------------------------------------------------------------
 static method useRemote(value)
     if (arguments.length == 0) return UsingRemote
@@ -73,8 +66,6 @@
     return oldValue
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method log
     var messageParts = []
     
@@ -94,109 +85,73 @@
     Weinre.wi.ConsoleNotify.addConsoleMessage(payload)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method debug
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method error
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method info
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method warn
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method dir
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method dirxml
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method trace
     Weinre.notImplemented(arguments.callee.signature)
     
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method assert(condition)
     Weinre.notImplemented(arguments.callee.signature)
     
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method count
     Weinre.notImplemented(arguments.callee.signature)
     
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method markTimeline
     Weinre.notImplemented(arguments.callee.signature)
     
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method lastWMLErrorMessage
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method profile(title)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method profileEnd(title)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method time(title)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method timeEnd(title)
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method group
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method groupCollapsed
     Weinre.notImplemented(arguments.callee.signature)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method groupEnd
     Weinre.notImplemented(arguments.callee.signature)
diff --git a/weinre.web/modules/weinre/target/ElementHighlighter.scoop b/weinre.web/modules/weinre/target/ElementHighlighter.scoop
index 49654f7..d9c3b60 100644
--- a/weinre.web/modules/weinre/target/ElementHighlighter.scoop
+++ b/weinre.web/modules/weinre/target/ElementHighlighter.scoop
@@ -10,8 +10,6 @@
 require ../common/Weinre
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class ElementHighlighter
     this.boxMargin  = document.createElement("div")
     this.boxBorder  = document.createElement("div")
@@ -57,8 +55,6 @@
     document.body.appendChild(this.boxMargin)
     
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method on(element)
     if (null == element) return
     if (element.nodeType != Node.ELEMENT_NODE) return
@@ -67,20 +63,14 @@
     this.boxMargin.style.display = "block"
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method off
     this.boxMargin.style.display = "none"
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 getter element
     return this.boxMargin
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method calculateMetrics(element)
 
     var metrics = getMetrics(element)
@@ -105,10 +95,6 @@
     this.boxContent.style.bottom = metrics.paddingBottom + "px"
     this.boxContent.style.right  = metrics.paddingRight  + "px"
     
-    
-    
-//-----------------------------------------------------------------------------
-// 
 //-----------------------------------------------------------------------------
 function getMetrics(element)
     var result = {}
@@ -166,7 +152,5 @@
     return result
     
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 function fromPx(string) 
     return parseInt(string.replace(/px$/,""))
diff --git a/weinre.web/modules/weinre/target/NodeStore.scoop b/weinre.web/modules/weinre/target/NodeStore.scoop
index 5c8debb..2ddd83a 100644
--- a/weinre.web/modules/weinre/target/NodeStore.scoop
+++ b/weinre.web/modules/weinre/target/NodeStore.scoop
@@ -7,8 +7,6 @@
  */
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class NodeStore
     this.__nodeMap      = {}
     this.__nodeDataMap  = {}
@@ -28,14 +26,10 @@
     return this.inspectedNodes[index]
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getNode(nodeId)
     return this.__nodeMap[nodeId]
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getNodeId(node)
     if (node.__weinre_id) { 
         return node.__weinre_id
@@ -47,20 +41,14 @@
     return node.__weinre_id
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method getNodeData(nodeId, depth)
     return this.serializeNode(this.getNode(nodeId), depth)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method nextNodeId()
     return "" + (++this.__nextId)
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method serializeNode(node, depth)
     var nodeName  = ""
     var nodeValue = null
@@ -128,8 +116,6 @@
     return nodeData
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method serializeNodeChildren(node, depth)
     var result   = []
     var childIds = this.childNodeIds(node)
@@ -152,14 +138,10 @@
     return result
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method childNodeCount(node)
     return this.childNodeIds(node).length
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method childNodeIds(node)
     var ids = []
     
@@ -171,8 +153,6 @@
     return ids
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method isToBeSkipped(node)
     if (!node) return true
     if (node.__weinreHighlighter) return true 
diff --git a/weinre.web/modules/weinre/target/Target.scoop b/weinre.web/modules/weinre/target/Target.scoop
index 1d42973..a2e45eb 100644
--- a/weinre.web/modules/weinre/target/Target.scoop
+++ b/weinre.web/modules/weinre/target/Target.scoop
@@ -42,14 +42,10 @@
 require ./WiRuntimeImpl
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class Target
     this.initialize()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 static method main
     Weinre.target = new Target()
     
@@ -58,8 +54,6 @@
     }
     
 //------------------------------------------------------------------------------
-//
-//------------------------------------------------------------------------------
 method setWeinreServerURLFromScriptSrc()
     if (window.WeinreServerURL) return
     
@@ -86,8 +80,6 @@
     throw new Ex(arguments, message)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method initialize()
     this.setWeinreServerURLFromScriptSrc()
     
@@ -157,14 +149,10 @@
     Weinre.cssStore  = new CSSStore()
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method cb_webSocketOpened()
     Weinre.WeinreTargetCommands.registerTarget(window.location.href, Binding(this, this.cb_registerTarget))
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method cb_registerTarget(targetId)
     Weinre.targetId    = targetId
     Weinre.connectorId = targetId
@@ -172,13 +160,9 @@
     Callback.setConnectorId(targetId)
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method onLoaded()
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 method setDocument()
     Weinre.elementHighlighter = new ElementHighlighter()
     
diff --git a/weinre.web/modules/weinre/target/WeinreTargetEventsImpl.scoop b/weinre.web/modules/weinre/target/WeinreTargetEventsImpl.scoop
index b70d9c5..1147e80 100644
--- a/weinre.web/modules/weinre/target/WeinreTargetEventsImpl.scoop
+++ b/weinre.web/modules/weinre/target/WeinreTargetEventsImpl.scoop
@@ -12,13 +12,9 @@
 require ./Console
 
 //-----------------------------------------------------------------------------
-// 
-//-----------------------------------------------------------------------------
 class WeinreTargetEventsImpl
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method connectionCreated(/*string*/ clientId, /*string*/ targetId)
     var message = "weinre: target " + targetId + " connected to client " + clientId
     
@@ -32,8 +28,6 @@
     Weinre.target.setDocument()
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method connectionDestroyed(/*string*/ clientId, /*string*/ targetId)
     var message = "weinre: target " + targetId + " disconnected from client " + clientId
     
@@ -45,7 +39,5 @@
     }
 
 //-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
 method sendCallback(/*int*/ callbackId, /*any*/ result)
     Callback.invoke(callbackId, result)
diff --git a/weinre.web/modules/weinre/target/WiDOMImpl.scoop b/weinre.web/modules/weinre/target/WiDOMImpl.scoop
index b8c0772..f52af3c 100644
--- a/weinre.web/modules/weinre/target/WiDOMImpl.scoop
+++ b/weinre.web/modules/weinre/target/WiDOMImpl.scoop
@@ -73,13 +73,11 @@
     // callback: function(/*int*/ outNodeId, /*any[]*/ listenersArray)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method copyNode(/*int*/ nodeId, callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method removeNode(/*int*/ nodeId, callback)
     var node = Weinre.nodeStore.getNode(nodeId)
@@ -145,19 +143,16 @@
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method searchCanceled(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method pushNodeByPathToFrontend(/*string*/ path, callback)
     // callback: function(/*int*/ nodeId)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method resolveNode(/*int*/ nodeId, callback)
     var result = Weinre.injectedScript.resolveNode(nodeId)
diff --git a/weinre.web/modules/weinre/target/WiDOMStorageImpl.scoop b/weinre.web/modules/weinre/target/WiDOMStorageImpl.scoop
index ce86423..b3cd513 100644
--- a/weinre.web/modules/weinre/target/WiDOMStorageImpl.scoop
+++ b/weinre.web/modules/weinre/target/WiDOMStorageImpl.scoop
@@ -16,13 +16,11 @@
     // callback: function(/*any[]*/ entries)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method setDOMStorageItem(/*int*/ storageId, /*string*/ key, /*string*/ value, callback)
     // callback: function(/*boolean*/ success)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method removeDOMStorageItem(/*int*/ storageId, /*string*/ key, callback)
     // callback: function(/*boolean*/ success)
diff --git a/weinre.web/modules/weinre/target/WiDebuggerImpl.scoop b/weinre.web/modules/weinre/target/WiDebuggerImpl.scoop
index 7891621..76a4c4b 100644
--- a/weinre.web/modules/weinre/target/WiDebuggerImpl.scoop
+++ b/weinre.web/modules/weinre/target/WiDebuggerImpl.scoop
@@ -16,91 +16,76 @@
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method deactivateBreakpoints(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method setJavaScriptBreakpoint(/*string*/ url, /*int*/ lineNumber, /*int*/ columnNumber, /*string*/ condition, /*boolean*/ enabled, callback)
     // callback: function(/*string*/ breakpointId, /*any[]*/ locations)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method setJavaScriptBreakpointBySourceId(/*string*/ sourceId, /*int*/ lineNumber, /*int*/ columnNumber, /*string*/ condition, /*boolean*/ enabled, callback)
     // callback: function(/*string*/ breakpointId, /*int*/ actualLineNumber, /*int*/ actualColumnNumber)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method removeJavaScriptBreakpoint(/*string*/ breakpointId, callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method continueToLocation(/*string*/ sourceId, /*int*/ lineNumber, /*int*/ columnNumber, callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method stepOver(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method stepInto(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method stepOut(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method pause(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method resume(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method editScriptSource(/*string*/ sourceID, /*string*/ newContent, callback)
     // callback: function(/*boolean*/ success, /*string*/ result, /*any*/ newCallFrames)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method getScriptSource(/*string*/ sourceID, callback)
     // callback: function(/*string*/ scriptSource)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method setPauseOnExceptionsState(/*int*/ pauseOnExceptionsState, callback)
     // callback: function(/*int*/ newState)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method evaluateOnCallFrame(/*any*/ callFrameId, /*string*/ expression, /*string*/ objectGroup, /*boolean*/ includeCommandLineAPI, callback)
     // callback: function(/*any*/ result)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method getCompletionsOnCallFrame(/*any*/ callFrameId, /*string*/ expression, /*boolean*/ includeCommandLineAPI, callback)
     // callback: function(/*any*/ result)
diff --git a/weinre.web/modules/weinre/target/WiFileSystemImpl.scoop b/weinre.web/modules/weinre/target/WiFileSystemImpl.scoop
index e55006d..7060a53 100644
--- a/weinre.web/modules/weinre/target/WiFileSystemImpl.scoop
+++ b/weinre.web/modules/weinre/target/WiFileSystemImpl.scoop
@@ -16,7 +16,6 @@
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method revealFolderInOS(/*string*/ path, callback)
     // callback: function()
diff --git a/weinre.web/modules/weinre/target/WiInspectorImpl.scoop b/weinre.web/modules/weinre/target/WiInspectorImpl.scoop
index ae743e7..f0f2934 100644
--- a/weinre.web/modules/weinre/target/WiInspectorImpl.scoop
+++ b/weinre.web/modules/weinre/target/WiInspectorImpl.scoop
@@ -16,43 +16,36 @@
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method removeAllScriptsToEvaluateOnLoad(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method reloadPage(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method populateScriptObjects(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method openInInspectedWindow(/*string*/ url, callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method setSearchingForNode(/*boolean*/ enabled, callback)
     // callback: function(/*boolean*/ newState)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method didEvaluateForTestInFrontend(/*int*/ testCallId, /*string*/ jsonResult, callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method highlightDOMNode(/*int*/ nodeId, callback)
     var node = Weinre.nodeStore.getNode(nodeId)
@@ -80,79 +73,66 @@
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method hideFrameHighlight(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method setExtraHeaders(/*any*/ headers, callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method setUserAgentOverride(/*string*/ userAgent, callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method getCookies(callback)
     // callback: function(/*any[]*/ cookies, /*string*/ cookiesString)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method deleteCookie(/*string*/ cookieName, /*string*/ domain, callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method startTimelineProfiler(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method stopTimelineProfiler(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method enableDebugger(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method disableDebugger(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method enableProfiler(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method disableProfiler(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method startProfiling(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method stopProfiling(callback)
     // callback: function()
diff --git a/weinre.web/modules/weinre/target/WiProfilerImpl.scoop b/weinre.web/modules/weinre/target/WiProfilerImpl.scoop
index e2eba28..33cbac7 100644
--- a/weinre.web/modules/weinre/target/WiProfilerImpl.scoop
+++ b/weinre.web/modules/weinre/target/WiProfilerImpl.scoop
@@ -16,25 +16,21 @@
     // callback: function(/*any[]*/ headers)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method getProfile(/*string*/ type, /*int*/ uid, callback)
     // callback: function(/*any*/ profile)
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method removeProfile(/*string*/ type, /*int*/ uid, callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method clearProfiles(callback)
     // callback: function()
     Weinre.notImplemented(arguments.callee.signature)
 
-
 //-----------------------------------------------------------------------------
 method takeHeapSnapshot(/*boolean*/ detailed, callback)
     // callback: function()
