diff --git a/cli.js b/cli.js
index 065951f..5447dd5 100755
--- a/cli.js
+++ b/cli.js
@@ -13,10 +13,8 @@
 // the License.
 
 var fs = require('fs');
-var util = require('util');
 var Fiber = require('fibers');
 var optimist = require('optimist');
-var child_process = require('child_process');
 
 var couchjs = require('./couchjs');
 var package_json = require('./package.json');
diff --git a/console.js b/console.js
index 0fda066..18e7241 100644
--- a/console.js
+++ b/console.js
@@ -41,7 +41,7 @@
   };
 
   var on_err = function (er) {
-    module.exports.error('Uncaught error:\n%s', er.stack || er.message || JSON.stringify(er))
+    module.exports.error('Uncaught error:\n%s', er.stack || er.message || JSON.stringify(er));
 
     if (er.stack) {
       er = ['fatal', 'unknown_error', er.stack];
diff --git a/couchjs.js b/couchjs.js
index 84c21e0..ccc1aa9 100644
--- a/couchjs.js
+++ b/couchjs.js
@@ -14,6 +14,7 @@
 
 var vm = require('vm');
 var Fiber = require('fibers');
+var util = require('util');
 
 var XML = require('./xml');
 var log = require('./console').log;
@@ -23,11 +24,6 @@
   'waiting':null
 };
 
-Error.prototype.toSource = Error.prototype.toSource || toSource;
-Error.prototype.toString = Error.prototype.toString || toSource;
-Function.prototype.toSource = Function.prototype.toSource || toSource;
-Function.prototype.toString = Function.prototype.toString || toSource;
-
 
 function print(line) {
   log('STDOUT %s: %s', process.pid, line);
@@ -71,9 +67,10 @@
 
 function evalcx (source, sandbox) {
   sandbox = sandbox || {};
+  var func;
   //log('evalcx in %j: %j', Object.keys(sandbox), source)
 
-  if (source == '') {
+  if (source === '') {
     return sandbox;
   }
 
@@ -87,7 +84,7 @@
     var id = Math.floor(Math.random() * 1000*1000);
     var filename = '_couchdb:' + id + '.js';
     var script = vm.createScript(source, filename);
-    var func = script.runInNewContext(sandbox);
+    func = script.runInNewContext(sandbox);
   } catch (er) {
     log('Error making code: %s', er.stack);
     return sandbox;
@@ -109,7 +106,7 @@
 
 
 function toSource() {
-  if (typeof this == 'function') {
+  if (typeof this === 'function') {
     return '' + this;
   }
 
@@ -120,6 +117,11 @@
   return util.inspect(this);
 }
 
+Error.prototype.toSource = Error.prototype.toSource || toSource;
+Error.prototype.toString = Error.prototype.toString || toSource;
+Function.prototype.toSource = Function.prototype.toSource || toSource;
+Function.prototype.toString = Function.prototype.toString || toSource;
+
 module.exports = {
   'print': print,
   'readline': readline,
diff --git a/inspector.js b/inspector.js
index 343770f..48182e5 100755
--- a/inspector.js
+++ b/inspector.js
@@ -12,47 +12,12 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
-module.exports = start;
-
-if (require.main === module) {
-  main();
-}
 
 
-var fs = require('fs');
-var util = require('util');
-var child_process = require('child_process');
+var cp = require('child_process');
 var log = require('./console').log;
 
-function start (debugPort) {
-
-  if (!debugPort || typeof debugPort !== 'number') {
-    throw new Error('Need a listen debugPort');
-  }
-
-  var webPort = debugPort + 1;
-
-  var cmd = __filename;
-  var args = [debugPort, webPort];
-  var opts = {
-    'cwd': __dirname,
-    'stdio': 'pipe',
-    'detached': false
-  };
-
-  log('Start inspector: %s %j %j', cmd, args, opts);
-
-  var inspector = child_process.spawn(cmd, args, opts);
-
-  watch_inspector(inspector);
-
-  log('Enable remote debug pid=%d port=%d', process.pid, debugPort);
-
-  process.debugPort = debugPort;
-  process.kill(process.pid, 'SIGUSR1');
-}
-
-function watch_inspector(child) {
+function watchInspector(child) {
 
   child.stderr.on('data', function(body) {
     log('Inspector STDERR: %s', body);
@@ -74,6 +39,33 @@
 
 }
 
+function start (debugPort) {
+
+  if (!debugPort || typeof debugPort !== 'number') {
+    throw new Error('Need a listen debugPort');
+  }
+
+  var webPort = debugPort + 1;
+  var cmd = __filename;
+  var args = [debugPort, webPort];
+  var opts = {
+    'cwd': __dirname,
+    'stdio': 'pipe',
+    'detached': false
+  };
+
+  log('Start inspector: %s %j %j', cmd, args, opts);
+
+  var inspector = cp.spawn(cmd, args, opts);
+
+  watchInspector(inspector);
+
+  log('Enable remote debug pid=%d port=%d', process.pid, debugPort);
+
+  process.debugPort = debugPort;
+  process.kill(process.pid, 'SIGUSR1');
+}
+
 function main() {
   var debugPort = +process.argv[2];
   var webPort = +process.argv[3];
@@ -101,3 +93,9 @@
     console.log('Error:\n%s', er.stack);
   });
 }
+
+module.exports = start;
+
+if (require.main === module) {
+  main();
+}
diff --git a/stream.js b/stream.js
index d0c192c..ebffc30 100644
--- a/stream.js
+++ b/stream.js
@@ -12,16 +12,29 @@
 
 // Text line stream
 
-module.exports = LineStream;
-module.exports.v2 = LineStream2;
-
 var stream = require('stream');
 var util = require('util');
 
 
-util.inherits(LineStream2, stream.Transform);
+function LineStream() {
 
-function LineStream2 () {
+  var self = this;
+  stream.call(self);
+
+  self.readable = true;
+  self.writable = true;
+
+  self.buffer = '';
+  self.downstream = null;
+
+  self.on('pipe', function(upstream) {
+    upstream.on('end', function(data, encoding) {
+      self.emit('end', data, encoding);
+    });
+  });
+}
+
+function LineStream2() {
 
   if (!(this instanceof LineStream2)) {
     return new LineStream2();
@@ -31,6 +44,8 @@
   this.setEncoding('utf8');
 }
 
+util.inherits(LineStream2, stream.Transform);
+
 LineStream2.prototype._transform = function(message, encoding, done) {
   var self = this;
 
@@ -52,25 +67,9 @@
 
 util.inherits(LineStream, stream);
 
-function LineStream () {
-  var self = this;
-  stream.call(self);
-
-  self.readable = true;
-  self.writable = true;
-
-  self.buffer = '';
-  self.downstream = null;
-
-  self.on('pipe', function(upstream) {
-    upstream.on('end', function(data, encoding) {
-      self.emit('end', data, encoding);
-    });
-  });
-}
 
 
-LineStream.prototype.write = function(data, encoding) {
+LineStream.prototype.write = function(data) {
   var self = this;
 
   data = data || '';
@@ -88,7 +87,7 @@
 };
 
 
-LineStream.prototype.end = function(data, encoding) {
+LineStream.prototype.end = function(data) {
   var self = this;
 
   self.is_ending = true;
@@ -109,3 +108,8 @@
   // The write() method sometimes returns this value, so if there was an error, make write() return false.
   return false;
 };
+
+
+module.exports = LineStream;
+module.exports.v2 = LineStream2;
+
diff --git a/test/experiment.js b/test/experiment.js
index fedf6d0..9197ec6 100644
--- a/test/experiment.js
+++ b/test/experiment.js
@@ -14,7 +14,6 @@
 var util = require('util');
 
 var STATE = 'wait';
-var v = 'vm';
 
 function main() {
   process.debugPort = 5859;
