diff --git a/weinre.server/src/weinre/server/Channel.java b/weinre.server/src/weinre/server/Channel.java
index 71294d2..11889b2 100644
--- a/weinre.server/src/weinre/server/Channel.java
+++ b/weinre.server/src/weinre/server/Channel.java
@@ -8,6 +8,7 @@
 package weinre.server;
 
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -35,6 +36,7 @@
     private Map<String,Object>    serviceMap;
     private String                remoteHost;
     private String                remoteAddress;
+    private PrintWriter           messageLog;
     
     //---------------------------------------------------------------
     public Channel(String pathPrefix, String name, String id, String remoteHost, String remoteAddress) {
@@ -49,6 +51,7 @@
         this.connector          = null;
         this.serviceMap         = new HashMap<String,Object>();
         this.lastRead           = System.currentTimeMillis();
+        this.messageLog         = Main.getSettings().getMessageLog();
     }
 
     //---------------------------------------------------------------
@@ -186,6 +189,7 @@
         if (isClosed()) return;
         
         requestQueue.add(json);
+        log(json);
     }
 
     //---------------------------------------------------------------
@@ -193,6 +197,24 @@
         if (isClosed()) return;
         
         responseQueue.add(json);
+        log(json);
+    }
+
+    //---------------------------------------------------------------
+    private void log(String json) {
+        if (null == messageLog) return;
+        
+        JSONObject jObject;
+        try {
+            jObject = new JSONObject(json);
+            jObject.put("_to", getName() + "#" + getId());
+        }
+        catch (JSONException e) {
+            return;
+        }
+        
+        messageLog.print(jObject.toString(true));
+        messageLog.println(",");
     }
 
     //---------------------------------------------------------------
diff --git a/weinre.server/src/weinre/server/Main.java b/weinre.server/src/weinre/server/Main.java
index 1d8ae96..4968fee 100644
--- a/weinre.server/src/weinre/server/Main.java
+++ b/weinre.server/src/weinre/server/Main.java
@@ -8,6 +8,7 @@
 package weinre.server;
 
 import java.io.PrintStream;
+import java.io.PrintWriter;
 
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.util.log.Log;
@@ -56,6 +57,12 @@
         Settings = ServerSettings.getOptions(args);
         if (null == Settings) System.exit(0);
         
+        if (null != Settings.getMessageLog()) {
+            Settings.getMessageLog().println("[");
+        }
+        
+        Runtime.getRuntime().addShutdownHook(onShutdownThread());
+        
         consoleStdout = ConsoleOutputStream.newPrintStream(this, System.out, true);
         consoleStderr = ConsoleOutputStream.newPrintStream(this, System.err, false);
 
@@ -71,6 +78,19 @@
     }
     
     //---------------------------------------------------------------
+    private Thread onShutdownThread() {
+        return new Thread(new Runnable() {
+            public void run() {
+                PrintWriter messageLog = Settings.getMessageLog();
+                if (null == messageLog) return;
+                
+                messageLog.println("null ]");
+                messageLog.close();
+            }
+        });
+    }
+    
+    //---------------------------------------------------------------
     public int exit() {
         if (null != server) {
             try {
diff --git a/weinre.server/src/weinre/server/MessageHandler.java b/weinre.server/src/weinre/server/MessageHandler.java
index 29942b2..bbddc9f 100644
--- a/weinre.server/src/weinre/server/MessageHandler.java
+++ b/weinre.server/src/weinre/server/MessageHandler.java
@@ -7,6 +7,7 @@
 
 package weinre.server;
 
+import java.io.PrintWriter;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -18,6 +19,7 @@
 
 //-------------------------------------------------------------------
 public class MessageHandler {
+    private PrintWriter messageLog;
 
     //---------------------------------------------------------------
     static public void start() {
@@ -43,6 +45,7 @@
     
     //---------------------------------------------------------------
     private MessageHandler() {
+        messageLog = Main.getSettings().getMessageLog();
     }
     
     //---------------------------------------------------------------
@@ -70,6 +73,13 @@
                     try {
                         request = acc.getString(i);
                         accRequest = new JSONObject(request);
+                        accRequest.put("_from", channel.getName() + "#" + channel.getId());
+                        
+                        if (null != messageLog) {
+                            messageLog.print(accRequest.toString(true));
+                            messageLog.println(",");
+                        }
+                        
                     }
                     catch (JSONException e) {
                         Main.warn("error parsing request: " + e + ": '" + request + "'");
diff --git a/weinre.server/src/weinre/server/ServerSettings.java b/weinre.server/src/weinre/server/ServerSettings.java
index b7a63b5..a2c73c7 100644
--- a/weinre.server/src/weinre/server/ServerSettings.java
+++ b/weinre.server/src/weinre/server/ServerSettings.java
@@ -7,6 +7,10 @@
 
 package weinre.server;
 
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
 import java.net.SocketException;
@@ -38,6 +42,7 @@
     private int         readTimeoutSeconds = 5;
     private int         deathTimeoutSeconds;
     private Properties  fileProperties;
+    private PrintWriter messageLog;
     
     //---------------------------------------------------------------
     static public ServerSettings getOptions(String[] commandLine) {
@@ -65,6 +70,7 @@
         options.addOption("reuseAddr",    true,  "force bind the port if already bound [true|false]");
         options.addOption("readTimeout",  true,  "seconds before timing out HTTP GETs");
         options.addOption("deathTimeout", true,  "seconds before considering connector dead");
+        options.addOption("messageLog",   true,  "file to log messages to");
        
         return options;
     }
@@ -126,6 +132,7 @@
         reuseAddr           = getBooleanFromOption(commandLine, "reuseAddr",    reuseAddr);
         readTimeoutSeconds  = getIntFromOption(commandLine,     "readTimeout",  readTimeoutSeconds,   0, 0x00FFFFFF);
         deathTimeoutSeconds = getIntFromOption(commandLine,     "deathTimeout", readTimeoutSeconds*3, 0, 0x00FFFF);
+        messageLog          = getPrintWriterFromOption(commandLine, "messageLog");
 
         // handle verbose logging
         if (commandLine.hasOption("verbose")) {
@@ -188,7 +195,29 @@
 
         return result;
     }
-    
+
+    //---------------------------------------------------------------
+    private PrintWriter getPrintWriterFromOption(CommandLine commandLine, String name) {
+        
+        String fileName = commandLine.getOptionValue(name);
+        if (null == fileName) {
+            fileName = fileProperties.getProperty(name);
+        }
+
+        if (null == fileName) return null;
+        
+        File file = new File(fileName);
+        
+        try {
+            FileWriter fileWriter = new FileWriter(file);
+            return new PrintWriter(fileWriter);
+        } 
+        catch (IOException e) {
+            error(name + " parameter file name '" + fileName + "' cannot be opened for writing.");
+            return null;
+        }
+    }
+
     //---------------------------------------------------------------
     private void error(String message) {
         System.out.println("error with command-line option: " + message);
@@ -266,7 +295,12 @@
     public boolean reuseAddr() {
         return reuseAddr;
     }
-    
+
+    //---------------------------------------------------------------
+    public PrintWriter getMessageLog() {
+        return messageLog;
+    }
+
     //---------------------------------------------------------------
     public String getNiceHostName() {
         String hostName = getBoundHostValue();
